row_msa.cc 138 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495
  1. /*
  2. * Copyright 2016 The LibYuv Project Authors. All rights reserved.
  3. *
  4. * Use of this source code is governed by a BSD-style license
  5. * that can be found in the LICENSE file in the root of the source
  6. * tree. An additional intellectual property rights grant can be found
  7. * in the file PATENTS. All contributing project authors may
  8. * be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #include <string.h>
  11. #include "libyuv/row.h"
  12. // This module is for GCC MSA
  13. #if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa)
  14. #include "libyuv/macros_msa.h"
  15. #ifdef __cplusplus
  16. namespace libyuv {
  17. extern "C" {
  18. #endif
  19. #define ALPHA_VAL (-1)
  20. // Fill YUV -> RGB conversion constants into vectors
  21. #define YUVTORGB_SETUP(yuvconst, ub, vr, ug, vg, bb, bg, br, yg) \
  22. { \
  23. ub = __msa_fill_w(yuvconst->kUVToB[0]); \
  24. vr = __msa_fill_w(yuvconst->kUVToR[1]); \
  25. ug = __msa_fill_w(yuvconst->kUVToG[0]); \
  26. vg = __msa_fill_w(yuvconst->kUVToG[1]); \
  27. bb = __msa_fill_w(yuvconst->kUVBiasB[0]); \
  28. bg = __msa_fill_w(yuvconst->kUVBiasG[0]); \
  29. br = __msa_fill_w(yuvconst->kUVBiasR[0]); \
  30. yg = __msa_fill_w(yuvconst->kYToRgb[0]); \
  31. }
  32. // Load YUV 422 pixel data
  33. #define READYUV422(psrc_y, psrc_u, psrc_v, out_y, out_u, out_v) \
  34. { \
  35. uint64 y_m; \
  36. uint32 u_m, v_m; \
  37. v4i32 zero_m = {0}; \
  38. y_m = LD(psrc_y); \
  39. u_m = LW(psrc_u); \
  40. v_m = LW(psrc_v); \
  41. out_y = (v16u8)__msa_insert_d((v2i64)zero_m, 0, (int64)y_m); \
  42. out_u = (v16u8)__msa_insert_w(zero_m, 0, (int32)u_m); \
  43. out_v = (v16u8)__msa_insert_w(zero_m, 0, (int32)v_m); \
  44. }
  45. // Clip input vector elements between 0 to 255
  46. #define CLIP_0TO255(in0, in1, in2, in3, in4, in5) \
  47. { \
  48. v4i32 max_m = __msa_ldi_w(0xFF); \
  49. \
  50. in0 = __msa_maxi_s_w(in0, 0); \
  51. in1 = __msa_maxi_s_w(in1, 0); \
  52. in2 = __msa_maxi_s_w(in2, 0); \
  53. in3 = __msa_maxi_s_w(in3, 0); \
  54. in4 = __msa_maxi_s_w(in4, 0); \
  55. in5 = __msa_maxi_s_w(in5, 0); \
  56. in0 = __msa_min_s_w(max_m, in0); \
  57. in1 = __msa_min_s_w(max_m, in1); \
  58. in2 = __msa_min_s_w(max_m, in2); \
  59. in3 = __msa_min_s_w(max_m, in3); \
  60. in4 = __msa_min_s_w(max_m, in4); \
  61. in5 = __msa_min_s_w(max_m, in5); \
  62. }
  63. // Convert 8 pixels of YUV 420 to RGB.
  64. #define YUVTORGB(in_y, in_uv, ubvr, ugvg, bb, bg, br, yg, out_b, out_g, out_r) \
  65. { \
  66. v8i16 vec0_m, vec1_m; \
  67. v4i32 reg0_m, reg1_m, reg2_m, reg3_m, reg4_m; \
  68. v4i32 reg5_m, reg6_m, reg7_m; \
  69. v16i8 zero_m = {0}; \
  70. \
  71. vec0_m = (v8i16)__msa_ilvr_b((v16i8)in_y, (v16i8)in_y); \
  72. vec1_m = (v8i16)__msa_ilvr_b((v16i8)zero_m, (v16i8)in_uv); \
  73. reg0_m = (v4i32)__msa_ilvr_h((v8i16)zero_m, (v8i16)vec0_m); \
  74. reg1_m = (v4i32)__msa_ilvl_h((v8i16)zero_m, (v8i16)vec0_m); \
  75. reg2_m = (v4i32)__msa_ilvr_h((v8i16)zero_m, (v8i16)vec1_m); \
  76. reg3_m = (v4i32)__msa_ilvl_h((v8i16)zero_m, (v8i16)vec1_m); \
  77. reg0_m *= yg; \
  78. reg1_m *= yg; \
  79. reg2_m *= ubvr; \
  80. reg3_m *= ubvr; \
  81. reg0_m = __msa_srai_w(reg0_m, 16); \
  82. reg1_m = __msa_srai_w(reg1_m, 16); \
  83. reg4_m = __msa_dotp_s_w((v8i16)vec1_m, (v8i16)ugvg); \
  84. reg5_m = __msa_ilvev_w(reg2_m, reg2_m); \
  85. reg6_m = __msa_ilvev_w(reg3_m, reg3_m); \
  86. reg7_m = __msa_ilvr_w(reg4_m, reg4_m); \
  87. reg2_m = __msa_ilvod_w(reg2_m, reg2_m); \
  88. reg3_m = __msa_ilvod_w(reg3_m, reg3_m); \
  89. reg4_m = __msa_ilvl_w(reg4_m, reg4_m); \
  90. reg5_m = reg0_m - reg5_m; \
  91. reg6_m = reg1_m - reg6_m; \
  92. reg2_m = reg0_m - reg2_m; \
  93. reg3_m = reg1_m - reg3_m; \
  94. reg7_m = reg0_m - reg7_m; \
  95. reg4_m = reg1_m - reg4_m; \
  96. reg5_m += bb; \
  97. reg6_m += bb; \
  98. reg7_m += bg; \
  99. reg4_m += bg; \
  100. reg2_m += br; \
  101. reg3_m += br; \
  102. reg5_m = __msa_srai_w(reg5_m, 6); \
  103. reg6_m = __msa_srai_w(reg6_m, 6); \
  104. reg7_m = __msa_srai_w(reg7_m, 6); \
  105. reg4_m = __msa_srai_w(reg4_m, 6); \
  106. reg2_m = __msa_srai_w(reg2_m, 6); \
  107. reg3_m = __msa_srai_w(reg3_m, 6); \
  108. CLIP_0TO255(reg5_m, reg6_m, reg7_m, reg4_m, reg2_m, reg3_m); \
  109. out_b = __msa_pckev_h((v8i16)reg6_m, (v8i16)reg5_m); \
  110. out_g = __msa_pckev_h((v8i16)reg4_m, (v8i16)reg7_m); \
  111. out_r = __msa_pckev_h((v8i16)reg3_m, (v8i16)reg2_m); \
  112. }
  113. // Pack and Store 8 ARGB values.
  114. #define STOREARGB(in0, in1, in2, in3, pdst_argb) \
  115. { \
  116. v8i16 vec0_m, vec1_m; \
  117. v16u8 dst0_m, dst1_m; \
  118. vec0_m = (v8i16)__msa_ilvev_b((v16i8)in1, (v16i8)in0); \
  119. vec1_m = (v8i16)__msa_ilvev_b((v16i8)in3, (v16i8)in2); \
  120. dst0_m = (v16u8)__msa_ilvr_h(vec1_m, vec0_m); \
  121. dst1_m = (v16u8)__msa_ilvl_h(vec1_m, vec0_m); \
  122. ST_UB2(dst0_m, dst1_m, pdst_argb, 16); \
  123. }
  124. // Takes ARGB input and calculates Y.
  125. #define ARGBTOY(argb0, argb1, argb2, argb3, const0, const1, const2, shift, \
  126. y_out) \
  127. { \
  128. v16u8 vec0_m, vec1_m, vec2_m, vec3_m; \
  129. v8u16 reg0_m, reg1_m; \
  130. \
  131. vec0_m = (v16u8)__msa_pckev_h((v8i16)argb1, (v8i16)argb0); \
  132. vec1_m = (v16u8)__msa_pckev_h((v8i16)argb3, (v8i16)argb2); \
  133. vec2_m = (v16u8)__msa_pckod_h((v8i16)argb1, (v8i16)argb0); \
  134. vec3_m = (v16u8)__msa_pckod_h((v8i16)argb3, (v8i16)argb2); \
  135. reg0_m = __msa_dotp_u_h(vec0_m, const0); \
  136. reg1_m = __msa_dotp_u_h(vec1_m, const0); \
  137. reg0_m = __msa_dpadd_u_h(reg0_m, vec2_m, const1); \
  138. reg1_m = __msa_dpadd_u_h(reg1_m, vec3_m, const1); \
  139. reg0_m += const2; \
  140. reg1_m += const2; \
  141. reg0_m = (v8u16)__msa_srai_h((v8i16)reg0_m, shift); \
  142. reg1_m = (v8u16)__msa_srai_h((v8i16)reg1_m, shift); \
  143. y_out = (v16u8)__msa_pckev_b((v16i8)reg1_m, (v16i8)reg0_m); \
  144. }
  145. // Loads current and next row of ARGB input and averages it to calculate U and V
  146. #define READ_ARGB(s_ptr, t_ptr, argb0, argb1, argb2, argb3) \
  147. { \
  148. v16u8 src0_m, src1_m, src2_m, src3_m, src4_m, src5_m, src6_m, src7_m; \
  149. v16u8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \
  150. v16u8 vec8_m, vec9_m; \
  151. v8u16 reg0_m, reg1_m, reg2_m, reg3_m, reg4_m, reg5_m, reg6_m, reg7_m; \
  152. v8u16 reg8_m, reg9_m; \
  153. \
  154. src0_m = (v16u8)__msa_ld_b((v16i8*)s, 0); \
  155. src1_m = (v16u8)__msa_ld_b((v16i8*)s, 16); \
  156. src2_m = (v16u8)__msa_ld_b((v16i8*)s, 32); \
  157. src3_m = (v16u8)__msa_ld_b((v16i8*)s, 48); \
  158. src4_m = (v16u8)__msa_ld_b((v16i8*)t, 0); \
  159. src5_m = (v16u8)__msa_ld_b((v16i8*)t, 16); \
  160. src6_m = (v16u8)__msa_ld_b((v16i8*)t, 32); \
  161. src7_m = (v16u8)__msa_ld_b((v16i8*)t, 48); \
  162. vec0_m = (v16u8)__msa_ilvr_b((v16i8)src0_m, (v16i8)src4_m); \
  163. vec1_m = (v16u8)__msa_ilvr_b((v16i8)src1_m, (v16i8)src5_m); \
  164. vec2_m = (v16u8)__msa_ilvr_b((v16i8)src2_m, (v16i8)src6_m); \
  165. vec3_m = (v16u8)__msa_ilvr_b((v16i8)src3_m, (v16i8)src7_m); \
  166. vec4_m = (v16u8)__msa_ilvl_b((v16i8)src0_m, (v16i8)src4_m); \
  167. vec5_m = (v16u8)__msa_ilvl_b((v16i8)src1_m, (v16i8)src5_m); \
  168. vec6_m = (v16u8)__msa_ilvl_b((v16i8)src2_m, (v16i8)src6_m); \
  169. vec7_m = (v16u8)__msa_ilvl_b((v16i8)src3_m, (v16i8)src7_m); \
  170. reg0_m = __msa_hadd_u_h(vec0_m, vec0_m); \
  171. reg1_m = __msa_hadd_u_h(vec1_m, vec1_m); \
  172. reg2_m = __msa_hadd_u_h(vec2_m, vec2_m); \
  173. reg3_m = __msa_hadd_u_h(vec3_m, vec3_m); \
  174. reg4_m = __msa_hadd_u_h(vec4_m, vec4_m); \
  175. reg5_m = __msa_hadd_u_h(vec5_m, vec5_m); \
  176. reg6_m = __msa_hadd_u_h(vec6_m, vec6_m); \
  177. reg7_m = __msa_hadd_u_h(vec7_m, vec7_m); \
  178. reg8_m = (v8u16)__msa_pckev_d((v2i64)reg4_m, (v2i64)reg0_m); \
  179. reg9_m = (v8u16)__msa_pckev_d((v2i64)reg5_m, (v2i64)reg1_m); \
  180. reg8_m += (v8u16)__msa_pckod_d((v2i64)reg4_m, (v2i64)reg0_m); \
  181. reg9_m += (v8u16)__msa_pckod_d((v2i64)reg5_m, (v2i64)reg1_m); \
  182. reg0_m = (v8u16)__msa_pckev_d((v2i64)reg6_m, (v2i64)reg2_m); \
  183. reg1_m = (v8u16)__msa_pckev_d((v2i64)reg7_m, (v2i64)reg3_m); \
  184. reg0_m += (v8u16)__msa_pckod_d((v2i64)reg6_m, (v2i64)reg2_m); \
  185. reg1_m += (v8u16)__msa_pckod_d((v2i64)reg7_m, (v2i64)reg3_m); \
  186. reg8_m = (v8u16)__msa_srai_h((v8i16)reg8_m, 2); \
  187. reg9_m = (v8u16)__msa_srai_h((v8i16)reg9_m, 2); \
  188. reg0_m = (v8u16)__msa_srai_h((v8i16)reg0_m, 2); \
  189. reg1_m = (v8u16)__msa_srai_h((v8i16)reg1_m, 2); \
  190. argb0 = (v16u8)__msa_pckev_b((v16i8)reg9_m, (v16i8)reg8_m); \
  191. argb1 = (v16u8)__msa_pckev_b((v16i8)reg1_m, (v16i8)reg0_m); \
  192. src0_m = (v16u8)__msa_ld_b((v16i8*)s, 64); \
  193. src1_m = (v16u8)__msa_ld_b((v16i8*)s, 80); \
  194. src2_m = (v16u8)__msa_ld_b((v16i8*)s, 96); \
  195. src3_m = (v16u8)__msa_ld_b((v16i8*)s, 112); \
  196. src4_m = (v16u8)__msa_ld_b((v16i8*)t, 64); \
  197. src5_m = (v16u8)__msa_ld_b((v16i8*)t, 80); \
  198. src6_m = (v16u8)__msa_ld_b((v16i8*)t, 96); \
  199. src7_m = (v16u8)__msa_ld_b((v16i8*)t, 112); \
  200. vec2_m = (v16u8)__msa_ilvr_b((v16i8)src0_m, (v16i8)src4_m); \
  201. vec3_m = (v16u8)__msa_ilvr_b((v16i8)src1_m, (v16i8)src5_m); \
  202. vec4_m = (v16u8)__msa_ilvr_b((v16i8)src2_m, (v16i8)src6_m); \
  203. vec5_m = (v16u8)__msa_ilvr_b((v16i8)src3_m, (v16i8)src7_m); \
  204. vec6_m = (v16u8)__msa_ilvl_b((v16i8)src0_m, (v16i8)src4_m); \
  205. vec7_m = (v16u8)__msa_ilvl_b((v16i8)src1_m, (v16i8)src5_m); \
  206. vec8_m = (v16u8)__msa_ilvl_b((v16i8)src2_m, (v16i8)src6_m); \
  207. vec9_m = (v16u8)__msa_ilvl_b((v16i8)src3_m, (v16i8)src7_m); \
  208. reg0_m = __msa_hadd_u_h(vec2_m, vec2_m); \
  209. reg1_m = __msa_hadd_u_h(vec3_m, vec3_m); \
  210. reg2_m = __msa_hadd_u_h(vec4_m, vec4_m); \
  211. reg3_m = __msa_hadd_u_h(vec5_m, vec5_m); \
  212. reg4_m = __msa_hadd_u_h(vec6_m, vec6_m); \
  213. reg5_m = __msa_hadd_u_h(vec7_m, vec7_m); \
  214. reg6_m = __msa_hadd_u_h(vec8_m, vec8_m); \
  215. reg7_m = __msa_hadd_u_h(vec9_m, vec9_m); \
  216. reg8_m = (v8u16)__msa_pckev_d((v2i64)reg4_m, (v2i64)reg0_m); \
  217. reg9_m = (v8u16)__msa_pckev_d((v2i64)reg5_m, (v2i64)reg1_m); \
  218. reg8_m += (v8u16)__msa_pckod_d((v2i64)reg4_m, (v2i64)reg0_m); \
  219. reg9_m += (v8u16)__msa_pckod_d((v2i64)reg5_m, (v2i64)reg1_m); \
  220. reg0_m = (v8u16)__msa_pckev_d((v2i64)reg6_m, (v2i64)reg2_m); \
  221. reg1_m = (v8u16)__msa_pckev_d((v2i64)reg7_m, (v2i64)reg3_m); \
  222. reg0_m += (v8u16)__msa_pckod_d((v2i64)reg6_m, (v2i64)reg2_m); \
  223. reg1_m += (v8u16)__msa_pckod_d((v2i64)reg7_m, (v2i64)reg3_m); \
  224. reg8_m = (v8u16)__msa_srai_h((v8i16)reg8_m, 2); \
  225. reg9_m = (v8u16)__msa_srai_h((v8i16)reg9_m, 2); \
  226. reg0_m = (v8u16)__msa_srai_h((v8i16)reg0_m, 2); \
  227. reg1_m = (v8u16)__msa_srai_h((v8i16)reg1_m, 2); \
  228. argb2 = (v16u8)__msa_pckev_b((v16i8)reg9_m, (v16i8)reg8_m); \
  229. argb3 = (v16u8)__msa_pckev_b((v16i8)reg1_m, (v16i8)reg0_m); \
  230. }
  231. // Takes ARGB input and calculates U and V.
  232. #define ARGBTOUV(argb0, argb1, argb2, argb3, const0, const1, const2, const3, \
  233. shf0, shf1, shf2, shf3, v_out, u_out) \
  234. { \
  235. v16u8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \
  236. v8u16 reg0_m, reg1_m, reg2_m, reg3_m; \
  237. \
  238. vec0_m = (v16u8)__msa_vshf_b(shf0, (v16i8)argb1, (v16i8)argb0); \
  239. vec1_m = (v16u8)__msa_vshf_b(shf0, (v16i8)argb3, (v16i8)argb2); \
  240. vec2_m = (v16u8)__msa_vshf_b(shf1, (v16i8)argb1, (v16i8)argb0); \
  241. vec3_m = (v16u8)__msa_vshf_b(shf1, (v16i8)argb3, (v16i8)argb2); \
  242. vec4_m = (v16u8)__msa_vshf_b(shf2, (v16i8)argb1, (v16i8)argb0); \
  243. vec5_m = (v16u8)__msa_vshf_b(shf2, (v16i8)argb3, (v16i8)argb2); \
  244. vec6_m = (v16u8)__msa_vshf_b(shf3, (v16i8)argb1, (v16i8)argb0); \
  245. vec7_m = (v16u8)__msa_vshf_b(shf3, (v16i8)argb3, (v16i8)argb2); \
  246. reg0_m = __msa_dotp_u_h(vec0_m, const1); \
  247. reg1_m = __msa_dotp_u_h(vec1_m, const1); \
  248. reg2_m = __msa_dotp_u_h(vec4_m, const1); \
  249. reg3_m = __msa_dotp_u_h(vec5_m, const1); \
  250. reg0_m += const3; \
  251. reg1_m += const3; \
  252. reg2_m += const3; \
  253. reg3_m += const3; \
  254. reg0_m -= __msa_dotp_u_h(vec2_m, const0); \
  255. reg1_m -= __msa_dotp_u_h(vec3_m, const0); \
  256. reg2_m -= __msa_dotp_u_h(vec6_m, const2); \
  257. reg3_m -= __msa_dotp_u_h(vec7_m, const2); \
  258. v_out = (v16u8)__msa_pckod_b((v16i8)reg1_m, (v16i8)reg0_m); \
  259. u_out = (v16u8)__msa_pckod_b((v16i8)reg3_m, (v16i8)reg2_m); \
  260. }
  261. // Load I444 pixel data
  262. #define READI444(psrc_y, psrc_u, psrc_v, out_y, out_u, out_v) \
  263. { \
  264. uint64 y_m, u_m, v_m; \
  265. v2i64 zero_m = {0}; \
  266. y_m = LD(psrc_y); \
  267. u_m = LD(psrc_u); \
  268. v_m = LD(psrc_v); \
  269. out_y = (v16u8)__msa_insert_d(zero_m, 0, (int64)y_m); \
  270. out_u = (v16u8)__msa_insert_d(zero_m, 0, (int64)u_m); \
  271. out_v = (v16u8)__msa_insert_d(zero_m, 0, (int64)v_m); \
  272. }
  273. void MirrorRow_MSA(const uint8* src, uint8* dst, int width) {
  274. int x;
  275. v16u8 src0, src1, src2, src3;
  276. v16u8 dst0, dst1, dst2, dst3;
  277. v16i8 shuffler = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
  278. src += width - 64;
  279. for (x = 0; x < width; x += 64) {
  280. LD_UB4(src, 16, src3, src2, src1, src0);
  281. VSHF_B2_UB(src3, src3, src2, src2, shuffler, shuffler, dst3, dst2);
  282. VSHF_B2_UB(src1, src1, src0, src0, shuffler, shuffler, dst1, dst0);
  283. ST_UB4(dst0, dst1, dst2, dst3, dst, 16);
  284. dst += 64;
  285. src -= 64;
  286. }
  287. }
  288. void ARGBMirrorRow_MSA(const uint8* src, uint8* dst, int width) {
  289. int x;
  290. v16u8 src0, src1, src2, src3;
  291. v16u8 dst0, dst1, dst2, dst3;
  292. v16i8 shuffler = {12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3};
  293. src += width * 4 - 64;
  294. for (x = 0; x < width; x += 16) {
  295. LD_UB4(src, 16, src3, src2, src1, src0);
  296. VSHF_B2_UB(src3, src3, src2, src2, shuffler, shuffler, dst3, dst2);
  297. VSHF_B2_UB(src1, src1, src0, src0, shuffler, shuffler, dst1, dst0);
  298. ST_UB4(dst0, dst1, dst2, dst3, dst, 16);
  299. dst += 64;
  300. src -= 64;
  301. }
  302. }
  303. void I422ToYUY2Row_MSA(const uint8* src_y,
  304. const uint8* src_u,
  305. const uint8* src_v,
  306. uint8* dst_yuy2,
  307. int width) {
  308. int x;
  309. v16u8 src_u0, src_v0, src_y0, src_y1, vec_uv0, vec_uv1;
  310. v16u8 dst_yuy2_0, dst_yuy2_1, dst_yuy2_2, dst_yuy2_3;
  311. for (x = 0; x < width; x += 32) {
  312. src_u0 = LD_UB(src_u);
  313. src_v0 = LD_UB(src_v);
  314. LD_UB2(src_y, 16, src_y0, src_y1);
  315. ILVRL_B2_UB(src_v0, src_u0, vec_uv0, vec_uv1);
  316. ILVRL_B2_UB(vec_uv0, src_y0, dst_yuy2_0, dst_yuy2_1);
  317. ILVRL_B2_UB(vec_uv1, src_y1, dst_yuy2_2, dst_yuy2_3);
  318. ST_UB4(dst_yuy2_0, dst_yuy2_1, dst_yuy2_2, dst_yuy2_3, dst_yuy2, 16);
  319. src_u += 16;
  320. src_v += 16;
  321. src_y += 32;
  322. dst_yuy2 += 64;
  323. }
  324. }
  325. void I422ToUYVYRow_MSA(const uint8* src_y,
  326. const uint8* src_u,
  327. const uint8* src_v,
  328. uint8* dst_uyvy,
  329. int width) {
  330. int x;
  331. v16u8 src_u0, src_v0, src_y0, src_y1, vec_uv0, vec_uv1;
  332. v16u8 dst_uyvy0, dst_uyvy1, dst_uyvy2, dst_uyvy3;
  333. for (x = 0; x < width; x += 32) {
  334. src_u0 = LD_UB(src_u);
  335. src_v0 = LD_UB(src_v);
  336. LD_UB2(src_y, 16, src_y0, src_y1);
  337. ILVRL_B2_UB(src_v0, src_u0, vec_uv0, vec_uv1);
  338. ILVRL_B2_UB(src_y0, vec_uv0, dst_uyvy0, dst_uyvy1);
  339. ILVRL_B2_UB(src_y1, vec_uv1, dst_uyvy2, dst_uyvy3);
  340. ST_UB4(dst_uyvy0, dst_uyvy1, dst_uyvy2, dst_uyvy3, dst_uyvy, 16);
  341. src_u += 16;
  342. src_v += 16;
  343. src_y += 32;
  344. dst_uyvy += 64;
  345. }
  346. }
  347. void I422ToARGBRow_MSA(const uint8* src_y,
  348. const uint8* src_u,
  349. const uint8* src_v,
  350. uint8* rgb_buf,
  351. const struct YuvConstants* yuvconstants,
  352. int width) {
  353. int x;
  354. v16u8 src0, src1, src2;
  355. v8i16 vec0, vec1, vec2;
  356. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  357. v4i32 vec_ubvr, vec_ugvg;
  358. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  359. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  360. vec_br, vec_yg);
  361. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  362. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  363. for (x = 0; x < width; x += 8) {
  364. READYUV422(src_y, src_u, src_v, src0, src1, src2);
  365. src1 = (v16u8)__msa_ilvr_b((v16i8)src2, (v16i8)src1);
  366. YUVTORGB(src0, src1, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  367. vec0, vec1, vec2);
  368. STOREARGB(vec0, vec1, vec2, alpha, rgb_buf);
  369. src_y += 8;
  370. src_u += 4;
  371. src_v += 4;
  372. rgb_buf += 32;
  373. }
  374. }
  375. void I422ToRGBARow_MSA(const uint8* src_y,
  376. const uint8* src_u,
  377. const uint8* src_v,
  378. uint8* rgb_buf,
  379. const struct YuvConstants* yuvconstants,
  380. int width) {
  381. int x;
  382. v16u8 src0, src1, src2;
  383. v8i16 vec0, vec1, vec2;
  384. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  385. v4i32 vec_ubvr, vec_ugvg;
  386. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  387. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  388. vec_br, vec_yg);
  389. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  390. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  391. for (x = 0; x < width; x += 8) {
  392. READYUV422(src_y, src_u, src_v, src0, src1, src2);
  393. src1 = (v16u8)__msa_ilvr_b((v16i8)src2, (v16i8)src1);
  394. YUVTORGB(src0, src1, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  395. vec0, vec1, vec2);
  396. STOREARGB(alpha, vec0, vec1, vec2, rgb_buf);
  397. src_y += 8;
  398. src_u += 4;
  399. src_v += 4;
  400. rgb_buf += 32;
  401. }
  402. }
  403. void I422AlphaToARGBRow_MSA(const uint8* src_y,
  404. const uint8* src_u,
  405. const uint8* src_v,
  406. const uint8* src_a,
  407. uint8* rgb_buf,
  408. const struct YuvConstants* yuvconstants,
  409. int width) {
  410. int x;
  411. int64 data_a;
  412. v16u8 src0, src1, src2, src3;
  413. v8i16 vec0, vec1, vec2;
  414. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  415. v4i32 vec_ubvr, vec_ugvg;
  416. v4i32 zero = {0};
  417. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  418. vec_br, vec_yg);
  419. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  420. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  421. for (x = 0; x < width; x += 8) {
  422. data_a = LD(src_a);
  423. READYUV422(src_y, src_u, src_v, src0, src1, src2);
  424. src1 = (v16u8)__msa_ilvr_b((v16i8)src2, (v16i8)src1);
  425. src3 = (v16u8)__msa_insert_d((v2i64)zero, 0, data_a);
  426. YUVTORGB(src0, src1, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  427. vec0, vec1, vec2);
  428. src3 = (v16u8)__msa_ilvr_b((v16i8)src3, (v16i8)src3);
  429. STOREARGB(vec0, vec1, vec2, src3, rgb_buf);
  430. src_y += 8;
  431. src_u += 4;
  432. src_v += 4;
  433. src_a += 8;
  434. rgb_buf += 32;
  435. }
  436. }
  437. void I422ToRGB24Row_MSA(const uint8* src_y,
  438. const uint8* src_u,
  439. const uint8* src_v,
  440. uint8* rgb_buf,
  441. const struct YuvConstants* yuvconstants,
  442. int32 width) {
  443. int x;
  444. int64 data_u, data_v;
  445. v16u8 src0, src1, src2, src3, src4, dst0, dst1, dst2;
  446. v8i16 vec0, vec1, vec2, vec3, vec4, vec5;
  447. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  448. v4i32 vec_ubvr, vec_ugvg;
  449. v16u8 reg0, reg1, reg2, reg3;
  450. v2i64 zero = {0};
  451. v16i8 shuffler0 = {0, 1, 16, 2, 3, 17, 4, 5, 18, 6, 7, 19, 8, 9, 20, 10};
  452. v16i8 shuffler1 = {0, 21, 1, 2, 22, 3, 4, 23, 5, 6, 24, 7, 8, 25, 9, 10};
  453. v16i8 shuffler2 = {26, 6, 7, 27, 8, 9, 28, 10,
  454. 11, 29, 12, 13, 30, 14, 15, 31};
  455. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  456. vec_br, vec_yg);
  457. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  458. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  459. for (x = 0; x < width; x += 16) {
  460. src0 = (v16u8)__msa_ld_b((v16u8*)src_y, 0);
  461. data_u = LD(src_u);
  462. data_v = LD(src_v);
  463. src1 = (v16u8)__msa_insert_d(zero, 0, data_u);
  464. src2 = (v16u8)__msa_insert_d(zero, 0, data_v);
  465. src1 = (v16u8)__msa_ilvr_b((v16i8)src2, (v16i8)src1);
  466. src3 = (v16u8)__msa_sldi_b((v16i8)src0, (v16i8)src0, 8);
  467. src4 = (v16u8)__msa_sldi_b((v16i8)src1, (v16i8)src1, 8);
  468. YUVTORGB(src0, src1, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  469. vec0, vec1, vec2);
  470. YUVTORGB(src3, src4, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  471. vec3, vec4, vec5);
  472. reg0 = (v16u8)__msa_ilvev_b((v16i8)vec1, (v16i8)vec0);
  473. reg2 = (v16u8)__msa_ilvev_b((v16i8)vec4, (v16i8)vec3);
  474. reg3 = (v16u8)__msa_pckev_b((v16i8)vec5, (v16i8)vec2);
  475. reg1 = (v16u8)__msa_sldi_b((v16i8)reg2, (v16i8)reg0, 11);
  476. dst0 = (v16u8)__msa_vshf_b(shuffler0, (v16i8)reg3, (v16i8)reg0);
  477. dst1 = (v16u8)__msa_vshf_b(shuffler1, (v16i8)reg3, (v16i8)reg1);
  478. dst2 = (v16u8)__msa_vshf_b(shuffler2, (v16i8)reg3, (v16i8)reg2);
  479. ST_UB2(dst0, dst1, rgb_buf, 16);
  480. ST_UB(dst2, (rgb_buf + 32));
  481. src_y += 16;
  482. src_u += 8;
  483. src_v += 8;
  484. rgb_buf += 48;
  485. }
  486. }
  487. // TODO(fbarchard): Consider AND instead of shift to isolate 5 upper bits of R.
  488. void I422ToRGB565Row_MSA(const uint8* src_y,
  489. const uint8* src_u,
  490. const uint8* src_v,
  491. uint8* dst_rgb565,
  492. const struct YuvConstants* yuvconstants,
  493. int width) {
  494. int x;
  495. v16u8 src0, src1, src2, dst0;
  496. v8i16 vec0, vec1, vec2;
  497. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  498. v4i32 vec_ubvr, vec_ugvg;
  499. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  500. vec_br, vec_yg);
  501. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  502. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  503. for (x = 0; x < width; x += 8) {
  504. READYUV422(src_y, src_u, src_v, src0, src1, src2);
  505. src1 = (v16u8)__msa_ilvr_b((v16i8)src2, (v16i8)src1);
  506. YUVTORGB(src0, src1, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  507. vec0, vec2, vec1);
  508. vec0 = __msa_srai_h(vec0, 3);
  509. vec1 = __msa_srai_h(vec1, 3);
  510. vec2 = __msa_srai_h(vec2, 2);
  511. vec1 = __msa_slli_h(vec1, 11);
  512. vec2 = __msa_slli_h(vec2, 5);
  513. vec0 |= vec1;
  514. dst0 = (v16u8)(vec2 | vec0);
  515. ST_UB(dst0, dst_rgb565);
  516. src_y += 8;
  517. src_u += 4;
  518. src_v += 4;
  519. dst_rgb565 += 16;
  520. }
  521. }
  522. // TODO(fbarchard): Consider AND instead of shift to isolate 4 upper bits of G.
  523. void I422ToARGB4444Row_MSA(const uint8* src_y,
  524. const uint8* src_u,
  525. const uint8* src_v,
  526. uint8* dst_argb4444,
  527. const struct YuvConstants* yuvconstants,
  528. int width) {
  529. int x;
  530. v16u8 src0, src1, src2, dst0;
  531. v8i16 vec0, vec1, vec2;
  532. v8u16 reg0, reg1, reg2;
  533. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  534. v4i32 vec_ubvr, vec_ugvg;
  535. v8u16 const_0xF000 = (v8u16)__msa_fill_h(0xF000);
  536. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  537. vec_br, vec_yg);
  538. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  539. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  540. for (x = 0; x < width; x += 8) {
  541. READYUV422(src_y, src_u, src_v, src0, src1, src2);
  542. src1 = (v16u8)__msa_ilvr_b((v16i8)src2, (v16i8)src1);
  543. YUVTORGB(src0, src1, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  544. vec0, vec1, vec2);
  545. reg0 = (v8u16)__msa_srai_h(vec0, 4);
  546. reg1 = (v8u16)__msa_srai_h(vec1, 4);
  547. reg2 = (v8u16)__msa_srai_h(vec2, 4);
  548. reg1 = (v8u16)__msa_slli_h((v8i16)reg1, 4);
  549. reg2 = (v8u16)__msa_slli_h((v8i16)reg2, 8);
  550. reg1 |= const_0xF000;
  551. reg0 |= reg2;
  552. dst0 = (v16u8)(reg1 | reg0);
  553. ST_UB(dst0, dst_argb4444);
  554. src_y += 8;
  555. src_u += 4;
  556. src_v += 4;
  557. dst_argb4444 += 16;
  558. }
  559. }
  560. void I422ToARGB1555Row_MSA(const uint8* src_y,
  561. const uint8* src_u,
  562. const uint8* src_v,
  563. uint8* dst_argb1555,
  564. const struct YuvConstants* yuvconstants,
  565. int width) {
  566. int x;
  567. v16u8 src0, src1, src2, dst0;
  568. v8i16 vec0, vec1, vec2;
  569. v8u16 reg0, reg1, reg2;
  570. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  571. v4i32 vec_ubvr, vec_ugvg;
  572. v8u16 const_0x8000 = (v8u16)__msa_fill_h(0x8000);
  573. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  574. vec_br, vec_yg);
  575. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  576. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  577. for (x = 0; x < width; x += 8) {
  578. READYUV422(src_y, src_u, src_v, src0, src1, src2);
  579. src1 = (v16u8)__msa_ilvr_b((v16i8)src2, (v16i8)src1);
  580. YUVTORGB(src0, src1, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  581. vec0, vec1, vec2);
  582. reg0 = (v8u16)__msa_srai_h(vec0, 3);
  583. reg1 = (v8u16)__msa_srai_h(vec1, 3);
  584. reg2 = (v8u16)__msa_srai_h(vec2, 3);
  585. reg1 = (v8u16)__msa_slli_h((v8i16)reg1, 5);
  586. reg2 = (v8u16)__msa_slli_h((v8i16)reg2, 10);
  587. reg1 |= const_0x8000;
  588. reg0 |= reg2;
  589. dst0 = (v16u8)(reg1 | reg0);
  590. ST_UB(dst0, dst_argb1555);
  591. src_y += 8;
  592. src_u += 4;
  593. src_v += 4;
  594. dst_argb1555 += 16;
  595. }
  596. }
  597. void YUY2ToYRow_MSA(const uint8* src_yuy2, uint8* dst_y, int width) {
  598. int x;
  599. v16u8 src0, src1, src2, src3, dst0, dst1;
  600. for (x = 0; x < width; x += 32) {
  601. LD_UB4(src_yuy2, 16, src0, src1, src2, src3);
  602. dst0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  603. dst1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2);
  604. ST_UB2(dst0, dst1, dst_y, 16);
  605. src_yuy2 += 64;
  606. dst_y += 32;
  607. }
  608. }
  609. void YUY2ToUVRow_MSA(const uint8* src_yuy2,
  610. int src_stride_yuy2,
  611. uint8* dst_u,
  612. uint8* dst_v,
  613. int width) {
  614. const uint8* src_yuy2_next = src_yuy2 + src_stride_yuy2;
  615. int x;
  616. v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  617. v16u8 vec0, vec1, dst0, dst1;
  618. for (x = 0; x < width; x += 32) {
  619. LD_UB4(src_yuy2, 16, src0, src1, src2, src3);
  620. LD_UB4(src_yuy2_next, 16, src4, src5, src6, src7);
  621. src0 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  622. src1 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2);
  623. src2 = (v16u8)__msa_pckod_b((v16i8)src5, (v16i8)src4);
  624. src3 = (v16u8)__msa_pckod_b((v16i8)src7, (v16i8)src6);
  625. vec0 = __msa_aver_u_b(src0, src2);
  626. vec1 = __msa_aver_u_b(src1, src3);
  627. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  628. dst1 = (v16u8)__msa_pckod_b((v16i8)vec1, (v16i8)vec0);
  629. ST_UB(dst0, dst_u);
  630. ST_UB(dst1, dst_v);
  631. src_yuy2 += 64;
  632. src_yuy2_next += 64;
  633. dst_u += 16;
  634. dst_v += 16;
  635. }
  636. }
  637. void YUY2ToUV422Row_MSA(const uint8* src_yuy2,
  638. uint8* dst_u,
  639. uint8* dst_v,
  640. int width) {
  641. int x;
  642. v16u8 src0, src1, src2, src3, dst0, dst1;
  643. for (x = 0; x < width; x += 32) {
  644. LD_UB4(src_yuy2, 16, src0, src1, src2, src3);
  645. src0 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  646. src1 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2);
  647. dst0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  648. dst1 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  649. ST_UB(dst0, dst_u);
  650. ST_UB(dst1, dst_v);
  651. src_yuy2 += 64;
  652. dst_u += 16;
  653. dst_v += 16;
  654. }
  655. }
  656. void UYVYToYRow_MSA(const uint8* src_uyvy, uint8* dst_y, int width) {
  657. int x;
  658. v16u8 src0, src1, src2, src3, dst0, dst1;
  659. for (x = 0; x < width; x += 32) {
  660. LD_UB4(src_uyvy, 16, src0, src1, src2, src3);
  661. dst0 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  662. dst1 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2);
  663. ST_UB2(dst0, dst1, dst_y, 16);
  664. src_uyvy += 64;
  665. dst_y += 32;
  666. }
  667. }
  668. void UYVYToUVRow_MSA(const uint8* src_uyvy,
  669. int src_stride_uyvy,
  670. uint8* dst_u,
  671. uint8* dst_v,
  672. int width) {
  673. const uint8* src_uyvy_next = src_uyvy + src_stride_uyvy;
  674. int x;
  675. v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  676. v16u8 vec0, vec1, dst0, dst1;
  677. for (x = 0; x < width; x += 32) {
  678. LD_UB4(src_uyvy, 16, src0, src1, src2, src3);
  679. LD_UB4(src_uyvy_next, 16, src4, src5, src6, src7);
  680. src0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  681. src1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2);
  682. src2 = (v16u8)__msa_pckev_b((v16i8)src5, (v16i8)src4);
  683. src3 = (v16u8)__msa_pckev_b((v16i8)src7, (v16i8)src6);
  684. vec0 = __msa_aver_u_b(src0, src2);
  685. vec1 = __msa_aver_u_b(src1, src3);
  686. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  687. dst1 = (v16u8)__msa_pckod_b((v16i8)vec1, (v16i8)vec0);
  688. ST_UB(dst0, dst_u);
  689. ST_UB(dst1, dst_v);
  690. src_uyvy += 64;
  691. src_uyvy_next += 64;
  692. dst_u += 16;
  693. dst_v += 16;
  694. }
  695. }
  696. void UYVYToUV422Row_MSA(const uint8* src_uyvy,
  697. uint8* dst_u,
  698. uint8* dst_v,
  699. int width) {
  700. int x;
  701. v16u8 src0, src1, src2, src3, dst0, dst1;
  702. for (x = 0; x < width; x += 32) {
  703. LD_UB4(src_uyvy, 16, src0, src1, src2, src3);
  704. src0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  705. src1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2);
  706. dst0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  707. dst1 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  708. ST_UB(dst0, dst_u);
  709. ST_UB(dst1, dst_v);
  710. src_uyvy += 64;
  711. dst_u += 16;
  712. dst_v += 16;
  713. }
  714. }
  715. void ARGBToYRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
  716. int x;
  717. v16u8 src0, src1, src2, src3, vec0, vec1, vec2, vec3, dst0;
  718. v8u16 reg0, reg1, reg2, reg3, reg4, reg5;
  719. v16i8 zero = {0};
  720. v8u16 const_0x19 = (v8u16)__msa_ldi_h(0x19);
  721. v8u16 const_0x81 = (v8u16)__msa_ldi_h(0x81);
  722. v8u16 const_0x42 = (v8u16)__msa_ldi_h(0x42);
  723. v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080);
  724. for (x = 0; x < width; x += 16) {
  725. src0 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 0);
  726. src1 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 16);
  727. src2 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 32);
  728. src3 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 48);
  729. vec0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  730. vec1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2);
  731. vec2 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  732. vec3 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2);
  733. reg0 = (v8u16)__msa_ilvev_b(zero, (v16i8)vec0);
  734. reg1 = (v8u16)__msa_ilvev_b(zero, (v16i8)vec1);
  735. reg2 = (v8u16)__msa_ilvev_b(zero, (v16i8)vec2);
  736. reg3 = (v8u16)__msa_ilvev_b(zero, (v16i8)vec3);
  737. reg4 = (v8u16)__msa_ilvod_b(zero, (v16i8)vec0);
  738. reg5 = (v8u16)__msa_ilvod_b(zero, (v16i8)vec1);
  739. reg0 *= const_0x19;
  740. reg1 *= const_0x19;
  741. reg2 *= const_0x81;
  742. reg3 *= const_0x81;
  743. reg4 *= const_0x42;
  744. reg5 *= const_0x42;
  745. reg0 += reg2;
  746. reg1 += reg3;
  747. reg0 += reg4;
  748. reg1 += reg5;
  749. reg0 += const_0x1080;
  750. reg1 += const_0x1080;
  751. reg0 = (v8u16)__msa_srai_h((v8i16)reg0, 8);
  752. reg1 = (v8u16)__msa_srai_h((v8i16)reg1, 8);
  753. dst0 = (v16u8)__msa_pckev_b((v16i8)reg1, (v16i8)reg0);
  754. ST_UB(dst0, dst_y);
  755. src_argb0 += 64;
  756. dst_y += 16;
  757. }
  758. }
  759. void ARGBToUVRow_MSA(const uint8* src_argb0,
  760. int src_stride_argb,
  761. uint8* dst_u,
  762. uint8* dst_v,
  763. int width) {
  764. int x;
  765. const uint8* src_argb0_next = src_argb0 + src_stride_argb;
  766. v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  767. v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9;
  768. v8u16 reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9;
  769. v16u8 dst0, dst1;
  770. v8u16 const_0x70 = (v8u16)__msa_ldi_h(0x70);
  771. v8u16 const_0x4A = (v8u16)__msa_ldi_h(0x4A);
  772. v8u16 const_0x26 = (v8u16)__msa_ldi_h(0x26);
  773. v8u16 const_0x5E = (v8u16)__msa_ldi_h(0x5E);
  774. v8u16 const_0x12 = (v8u16)__msa_ldi_h(0x12);
  775. v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
  776. for (x = 0; x < width; x += 32) {
  777. src0 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 0);
  778. src1 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 16);
  779. src2 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 32);
  780. src3 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 48);
  781. src4 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 64);
  782. src5 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 80);
  783. src6 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 96);
  784. src7 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 112);
  785. vec0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  786. vec1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2);
  787. vec2 = (v16u8)__msa_pckev_b((v16i8)src5, (v16i8)src4);
  788. vec3 = (v16u8)__msa_pckev_b((v16i8)src7, (v16i8)src6);
  789. vec4 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  790. vec5 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2);
  791. vec6 = (v16u8)__msa_pckod_b((v16i8)src5, (v16i8)src4);
  792. vec7 = (v16u8)__msa_pckod_b((v16i8)src7, (v16i8)src6);
  793. vec8 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  794. vec9 = (v16u8)__msa_pckev_b((v16i8)vec3, (v16i8)vec2);
  795. vec4 = (v16u8)__msa_pckev_b((v16i8)vec5, (v16i8)vec4);
  796. vec5 = (v16u8)__msa_pckev_b((v16i8)vec7, (v16i8)vec6);
  797. vec0 = (v16u8)__msa_pckod_b((v16i8)vec1, (v16i8)vec0);
  798. vec1 = (v16u8)__msa_pckod_b((v16i8)vec3, (v16i8)vec2);
  799. reg0 = __msa_hadd_u_h(vec8, vec8);
  800. reg1 = __msa_hadd_u_h(vec9, vec9);
  801. reg2 = __msa_hadd_u_h(vec4, vec4);
  802. reg3 = __msa_hadd_u_h(vec5, vec5);
  803. reg4 = __msa_hadd_u_h(vec0, vec0);
  804. reg5 = __msa_hadd_u_h(vec1, vec1);
  805. src0 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 0);
  806. src1 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 16);
  807. src2 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 32);
  808. src3 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 48);
  809. src4 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 64);
  810. src5 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 80);
  811. src6 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 96);
  812. src7 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 112);
  813. vec0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  814. vec1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2);
  815. vec2 = (v16u8)__msa_pckev_b((v16i8)src5, (v16i8)src4);
  816. vec3 = (v16u8)__msa_pckev_b((v16i8)src7, (v16i8)src6);
  817. vec4 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  818. vec5 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2);
  819. vec6 = (v16u8)__msa_pckod_b((v16i8)src5, (v16i8)src4);
  820. vec7 = (v16u8)__msa_pckod_b((v16i8)src7, (v16i8)src6);
  821. vec8 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  822. vec9 = (v16u8)__msa_pckev_b((v16i8)vec3, (v16i8)vec2);
  823. vec4 = (v16u8)__msa_pckev_b((v16i8)vec5, (v16i8)vec4);
  824. vec5 = (v16u8)__msa_pckev_b((v16i8)vec7, (v16i8)vec6);
  825. vec0 = (v16u8)__msa_pckod_b((v16i8)vec1, (v16i8)vec0);
  826. vec1 = (v16u8)__msa_pckod_b((v16i8)vec3, (v16i8)vec2);
  827. reg0 += __msa_hadd_u_h(vec8, vec8);
  828. reg1 += __msa_hadd_u_h(vec9, vec9);
  829. reg2 += __msa_hadd_u_h(vec4, vec4);
  830. reg3 += __msa_hadd_u_h(vec5, vec5);
  831. reg4 += __msa_hadd_u_h(vec0, vec0);
  832. reg5 += __msa_hadd_u_h(vec1, vec1);
  833. reg0 = (v8u16)__msa_srai_h((v8i16)reg0, 2);
  834. reg1 = (v8u16)__msa_srai_h((v8i16)reg1, 2);
  835. reg2 = (v8u16)__msa_srai_h((v8i16)reg2, 2);
  836. reg3 = (v8u16)__msa_srai_h((v8i16)reg3, 2);
  837. reg4 = (v8u16)__msa_srai_h((v8i16)reg4, 2);
  838. reg5 = (v8u16)__msa_srai_h((v8i16)reg5, 2);
  839. reg6 = reg0 * const_0x70;
  840. reg7 = reg1 * const_0x70;
  841. reg8 = reg2 * const_0x4A;
  842. reg9 = reg3 * const_0x4A;
  843. reg6 += const_0x8080;
  844. reg7 += const_0x8080;
  845. reg8 += reg4 * const_0x26;
  846. reg9 += reg5 * const_0x26;
  847. reg0 *= const_0x12;
  848. reg1 *= const_0x12;
  849. reg2 *= const_0x5E;
  850. reg3 *= const_0x5E;
  851. reg4 *= const_0x70;
  852. reg5 *= const_0x70;
  853. reg2 += reg0;
  854. reg3 += reg1;
  855. reg4 += const_0x8080;
  856. reg5 += const_0x8080;
  857. reg6 -= reg8;
  858. reg7 -= reg9;
  859. reg4 -= reg2;
  860. reg5 -= reg3;
  861. reg6 = (v8u16)__msa_srai_h((v8i16)reg6, 8);
  862. reg7 = (v8u16)__msa_srai_h((v8i16)reg7, 8);
  863. reg4 = (v8u16)__msa_srai_h((v8i16)reg4, 8);
  864. reg5 = (v8u16)__msa_srai_h((v8i16)reg5, 8);
  865. dst0 = (v16u8)__msa_pckev_b((v16i8)reg7, (v16i8)reg6);
  866. dst1 = (v16u8)__msa_pckev_b((v16i8)reg5, (v16i8)reg4);
  867. ST_UB(dst0, dst_u);
  868. ST_UB(dst1, dst_v);
  869. src_argb0 += 128;
  870. src_argb0_next += 128;
  871. dst_u += 16;
  872. dst_v += 16;
  873. }
  874. }
  875. void ARGBToRGB24Row_MSA(const uint8* src_argb, uint8* dst_rgb, int width) {
  876. int x;
  877. v16u8 src0, src1, src2, src3, dst0, dst1, dst2;
  878. v16i8 shuffler0 = {0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18, 20};
  879. v16i8 shuffler1 = {5, 6, 8, 9, 10, 12, 13, 14,
  880. 16, 17, 18, 20, 21, 22, 24, 25};
  881. v16i8 shuffler2 = {10, 12, 13, 14, 16, 17, 18, 20,
  882. 21, 22, 24, 25, 26, 28, 29, 30};
  883. for (x = 0; x < width; x += 16) {
  884. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0);
  885. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16);
  886. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb, 32);
  887. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb, 48);
  888. dst0 = (v16u8)__msa_vshf_b(shuffler0, (v16i8)src1, (v16i8)src0);
  889. dst1 = (v16u8)__msa_vshf_b(shuffler1, (v16i8)src2, (v16i8)src1);
  890. dst2 = (v16u8)__msa_vshf_b(shuffler2, (v16i8)src3, (v16i8)src2);
  891. ST_UB2(dst0, dst1, dst_rgb, 16);
  892. ST_UB(dst2, (dst_rgb + 32));
  893. src_argb += 64;
  894. dst_rgb += 48;
  895. }
  896. }
  897. void ARGBToRAWRow_MSA(const uint8* src_argb, uint8* dst_rgb, int width) {
  898. int x;
  899. v16u8 src0, src1, src2, src3, dst0, dst1, dst2;
  900. v16i8 shuffler0 = {2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, 18, 17, 16, 22};
  901. v16i8 shuffler1 = {5, 4, 10, 9, 8, 14, 13, 12,
  902. 18, 17, 16, 22, 21, 20, 26, 25};
  903. v16i8 shuffler2 = {8, 14, 13, 12, 18, 17, 16, 22,
  904. 21, 20, 26, 25, 24, 30, 29, 28};
  905. for (x = 0; x < width; x += 16) {
  906. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0);
  907. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16);
  908. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb, 32);
  909. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb, 48);
  910. dst0 = (v16u8)__msa_vshf_b(shuffler0, (v16i8)src1, (v16i8)src0);
  911. dst1 = (v16u8)__msa_vshf_b(shuffler1, (v16i8)src2, (v16i8)src1);
  912. dst2 = (v16u8)__msa_vshf_b(shuffler2, (v16i8)src3, (v16i8)src2);
  913. ST_UB2(dst0, dst1, dst_rgb, 16);
  914. ST_UB(dst2, (dst_rgb + 32));
  915. src_argb += 64;
  916. dst_rgb += 48;
  917. }
  918. }
  919. void ARGBToRGB565Row_MSA(const uint8* src_argb, uint8* dst_rgb, int width) {
  920. int x;
  921. v16u8 src0, src1, dst0;
  922. v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  923. v16i8 zero = {0};
  924. for (x = 0; x < width; x += 8) {
  925. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0);
  926. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16);
  927. vec0 = (v16u8)__msa_srai_b((v16i8)src0, 3);
  928. vec1 = (v16u8)__msa_slli_b((v16i8)src0, 3);
  929. vec2 = (v16u8)__msa_srai_b((v16i8)src0, 5);
  930. vec4 = (v16u8)__msa_srai_b((v16i8)src1, 3);
  931. vec5 = (v16u8)__msa_slli_b((v16i8)src1, 3);
  932. vec6 = (v16u8)__msa_srai_b((v16i8)src1, 5);
  933. vec1 = (v16u8)__msa_sldi_b(zero, (v16i8)vec1, 1);
  934. vec2 = (v16u8)__msa_sldi_b(zero, (v16i8)vec2, 1);
  935. vec5 = (v16u8)__msa_sldi_b(zero, (v16i8)vec5, 1);
  936. vec6 = (v16u8)__msa_sldi_b(zero, (v16i8)vec6, 1);
  937. vec3 = (v16u8)__msa_sldi_b(zero, (v16i8)src0, 2);
  938. vec7 = (v16u8)__msa_sldi_b(zero, (v16i8)src1, 2);
  939. vec0 = __msa_binsli_b(vec0, vec1, 2);
  940. vec1 = __msa_binsli_b(vec2, vec3, 4);
  941. vec4 = __msa_binsli_b(vec4, vec5, 2);
  942. vec5 = __msa_binsli_b(vec6, vec7, 4);
  943. vec0 = (v16u8)__msa_ilvev_b((v16i8)vec1, (v16i8)vec0);
  944. vec4 = (v16u8)__msa_ilvev_b((v16i8)vec5, (v16i8)vec4);
  945. dst0 = (v16u8)__msa_pckev_h((v8i16)vec4, (v8i16)vec0);
  946. ST_UB(dst0, dst_rgb);
  947. src_argb += 32;
  948. dst_rgb += 16;
  949. }
  950. }
  951. void ARGBToARGB1555Row_MSA(const uint8* src_argb, uint8* dst_rgb, int width) {
  952. int x;
  953. v16u8 src0, src1, dst0;
  954. v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9;
  955. v16i8 zero = {0};
  956. for (x = 0; x < width; x += 8) {
  957. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0);
  958. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16);
  959. vec0 = (v16u8)__msa_srai_b((v16i8)src0, 3);
  960. vec1 = (v16u8)__msa_slli_b((v16i8)src0, 2);
  961. vec2 = (v16u8)__msa_srai_b((v16i8)vec0, 3);
  962. vec1 = (v16u8)__msa_sldi_b(zero, (v16i8)vec1, 1);
  963. vec2 = (v16u8)__msa_sldi_b(zero, (v16i8)vec2, 1);
  964. vec3 = (v16u8)__msa_srai_b((v16i8)src0, 1);
  965. vec5 = (v16u8)__msa_srai_b((v16i8)src1, 3);
  966. vec6 = (v16u8)__msa_slli_b((v16i8)src1, 2);
  967. vec7 = (v16u8)__msa_srai_b((v16i8)vec5, 3);
  968. vec6 = (v16u8)__msa_sldi_b(zero, (v16i8)vec6, 1);
  969. vec7 = (v16u8)__msa_sldi_b(zero, (v16i8)vec7, 1);
  970. vec8 = (v16u8)__msa_srai_b((v16i8)src1, 1);
  971. vec3 = (v16u8)__msa_sldi_b(zero, (v16i8)vec3, 2);
  972. vec8 = (v16u8)__msa_sldi_b(zero, (v16i8)vec8, 2);
  973. vec4 = (v16u8)__msa_sldi_b(zero, (v16i8)src0, 3);
  974. vec9 = (v16u8)__msa_sldi_b(zero, (v16i8)src1, 3);
  975. vec0 = __msa_binsli_b(vec0, vec1, 2);
  976. vec5 = __msa_binsli_b(vec5, vec6, 2);
  977. vec1 = __msa_binsli_b(vec2, vec3, 5);
  978. vec6 = __msa_binsli_b(vec7, vec8, 5);
  979. vec1 = __msa_binsli_b(vec1, vec4, 0);
  980. vec6 = __msa_binsli_b(vec6, vec9, 0);
  981. vec0 = (v16u8)__msa_ilvev_b((v16i8)vec1, (v16i8)vec0);
  982. vec1 = (v16u8)__msa_ilvev_b((v16i8)vec6, (v16i8)vec5);
  983. dst0 = (v16u8)__msa_pckev_h((v8i16)vec1, (v8i16)vec0);
  984. ST_UB(dst0, dst_rgb);
  985. src_argb += 32;
  986. dst_rgb += 16;
  987. }
  988. }
  989. void ARGBToARGB4444Row_MSA(const uint8* src_argb, uint8* dst_rgb, int width) {
  990. int x;
  991. v16u8 src0, src1;
  992. v16u8 vec0, vec1;
  993. v16u8 dst0;
  994. v16i8 zero = {0};
  995. for (x = 0; x < width; x += 8) {
  996. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0);
  997. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16);
  998. vec0 = (v16u8)__msa_srai_b((v16i8)src0, 4);
  999. vec1 = (v16u8)__msa_srai_b((v16i8)src1, 4);
  1000. src0 = (v16u8)__msa_sldi_b(zero, (v16i8)src0, 1);
  1001. src1 = (v16u8)__msa_sldi_b(zero, (v16i8)src1, 1);
  1002. vec0 = __msa_binsli_b(vec0, src0, 3);
  1003. vec1 = __msa_binsli_b(vec1, src1, 3);
  1004. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1005. ST_UB(dst0, dst_rgb);
  1006. src_argb += 32;
  1007. dst_rgb += 16;
  1008. }
  1009. }
  1010. void ARGBToUV444Row_MSA(const uint8* src_argb,
  1011. uint8* dst_u,
  1012. uint8* dst_v,
  1013. int32 width) {
  1014. int32 x;
  1015. v16u8 src0, src1, src2, src3, reg0, reg1, reg2, reg3, dst0, dst1;
  1016. v8u16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  1017. v8u16 vec8, vec9, vec10, vec11;
  1018. v8u16 const_112 = (v8u16)__msa_ldi_h(112);
  1019. v8u16 const_74 = (v8u16)__msa_ldi_h(74);
  1020. v8u16 const_38 = (v8u16)__msa_ldi_h(38);
  1021. v8u16 const_94 = (v8u16)__msa_ldi_h(94);
  1022. v8u16 const_18 = (v8u16)__msa_ldi_h(18);
  1023. v8u16 const_32896 = (v8u16)__msa_fill_h(32896);
  1024. v16i8 zero = {0};
  1025. for (x = width; x > 0; x -= 16) {
  1026. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0);
  1027. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16);
  1028. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb, 32);
  1029. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb, 48);
  1030. reg0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  1031. reg1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2);
  1032. reg2 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  1033. reg3 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2);
  1034. src0 = (v16u8)__msa_pckev_b((v16i8)reg1, (v16i8)reg0);
  1035. src1 = (v16u8)__msa_pckev_b((v16i8)reg3, (v16i8)reg2);
  1036. src2 = (v16u8)__msa_pckod_b((v16i8)reg1, (v16i8)reg0);
  1037. vec0 = (v8u16)__msa_ilvr_b(zero, (v16i8)src0);
  1038. vec1 = (v8u16)__msa_ilvl_b(zero, (v16i8)src0);
  1039. vec2 = (v8u16)__msa_ilvr_b(zero, (v16i8)src1);
  1040. vec3 = (v8u16)__msa_ilvl_b(zero, (v16i8)src1);
  1041. vec4 = (v8u16)__msa_ilvr_b(zero, (v16i8)src2);
  1042. vec5 = (v8u16)__msa_ilvl_b(zero, (v16i8)src2);
  1043. vec10 = vec0 * const_18;
  1044. vec11 = vec1 * const_18;
  1045. vec8 = vec2 * const_94;
  1046. vec9 = vec3 * const_94;
  1047. vec6 = vec4 * const_112;
  1048. vec7 = vec5 * const_112;
  1049. vec0 *= const_112;
  1050. vec1 *= const_112;
  1051. vec2 *= const_74;
  1052. vec3 *= const_74;
  1053. vec4 *= const_38;
  1054. vec5 *= const_38;
  1055. vec8 += vec10;
  1056. vec9 += vec11;
  1057. vec6 += const_32896;
  1058. vec7 += const_32896;
  1059. vec0 += const_32896;
  1060. vec1 += const_32896;
  1061. vec2 += vec4;
  1062. vec3 += vec5;
  1063. vec0 -= vec2;
  1064. vec1 -= vec3;
  1065. vec6 -= vec8;
  1066. vec7 -= vec9;
  1067. vec0 = (v8u16)__msa_srai_h((v8i16)vec0, 8);
  1068. vec1 = (v8u16)__msa_srai_h((v8i16)vec1, 8);
  1069. vec6 = (v8u16)__msa_srai_h((v8i16)vec6, 8);
  1070. vec7 = (v8u16)__msa_srai_h((v8i16)vec7, 8);
  1071. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1072. dst1 = (v16u8)__msa_pckev_b((v16i8)vec7, (v16i8)vec6);
  1073. ST_UB(dst0, dst_u);
  1074. ST_UB(dst1, dst_v);
  1075. src_argb += 64;
  1076. dst_u += 16;
  1077. dst_v += 16;
  1078. }
  1079. }
  1080. void ARGBMultiplyRow_MSA(const uint8* src_argb0,
  1081. const uint8* src_argb1,
  1082. uint8* dst_argb,
  1083. int width) {
  1084. int x;
  1085. v16u8 src0, src1, dst0;
  1086. v8u16 vec0, vec1, vec2, vec3;
  1087. v4u32 reg0, reg1, reg2, reg3;
  1088. v8i16 zero = {0};
  1089. for (x = 0; x < width; x += 4) {
  1090. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
  1091. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb1, 0);
  1092. vec0 = (v8u16)__msa_ilvr_b((v16i8)src0, (v16i8)src0);
  1093. vec1 = (v8u16)__msa_ilvl_b((v16i8)src0, (v16i8)src0);
  1094. vec2 = (v8u16)__msa_ilvr_b((v16i8)zero, (v16i8)src1);
  1095. vec3 = (v8u16)__msa_ilvl_b((v16i8)zero, (v16i8)src1);
  1096. reg0 = (v4u32)__msa_ilvr_h(zero, (v8i16)vec0);
  1097. reg1 = (v4u32)__msa_ilvl_h(zero, (v8i16)vec0);
  1098. reg2 = (v4u32)__msa_ilvr_h(zero, (v8i16)vec1);
  1099. reg3 = (v4u32)__msa_ilvl_h(zero, (v8i16)vec1);
  1100. reg0 *= (v4u32)__msa_ilvr_h(zero, (v8i16)vec2);
  1101. reg1 *= (v4u32)__msa_ilvl_h(zero, (v8i16)vec2);
  1102. reg2 *= (v4u32)__msa_ilvr_h(zero, (v8i16)vec3);
  1103. reg3 *= (v4u32)__msa_ilvl_h(zero, (v8i16)vec3);
  1104. reg0 = (v4u32)__msa_srai_w((v4i32)reg0, 16);
  1105. reg1 = (v4u32)__msa_srai_w((v4i32)reg1, 16);
  1106. reg2 = (v4u32)__msa_srai_w((v4i32)reg2, 16);
  1107. reg3 = (v4u32)__msa_srai_w((v4i32)reg3, 16);
  1108. vec0 = (v8u16)__msa_pckev_h((v8i16)reg1, (v8i16)reg0);
  1109. vec1 = (v8u16)__msa_pckev_h((v8i16)reg3, (v8i16)reg2);
  1110. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1111. ST_UB(dst0, dst_argb);
  1112. src_argb0 += 16;
  1113. src_argb1 += 16;
  1114. dst_argb += 16;
  1115. }
  1116. }
  1117. void ARGBAddRow_MSA(const uint8* src_argb0,
  1118. const uint8* src_argb1,
  1119. uint8* dst_argb,
  1120. int width) {
  1121. int x;
  1122. v16u8 src0, src1, src2, src3, dst0, dst1;
  1123. for (x = 0; x < width; x += 8) {
  1124. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
  1125. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
  1126. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb1, 0);
  1127. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb1, 16);
  1128. dst0 = __msa_adds_u_b(src0, src2);
  1129. dst1 = __msa_adds_u_b(src1, src3);
  1130. ST_UB2(dst0, dst1, dst_argb, 16);
  1131. src_argb0 += 32;
  1132. src_argb1 += 32;
  1133. dst_argb += 32;
  1134. }
  1135. }
  1136. void ARGBSubtractRow_MSA(const uint8* src_argb0,
  1137. const uint8* src_argb1,
  1138. uint8* dst_argb,
  1139. int width) {
  1140. int x;
  1141. v16u8 src0, src1, src2, src3, dst0, dst1;
  1142. for (x = 0; x < width; x += 8) {
  1143. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
  1144. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
  1145. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb1, 0);
  1146. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb1, 16);
  1147. dst0 = __msa_subs_u_b(src0, src2);
  1148. dst1 = __msa_subs_u_b(src1, src3);
  1149. ST_UB2(dst0, dst1, dst_argb, 16);
  1150. src_argb0 += 32;
  1151. src_argb1 += 32;
  1152. dst_argb += 32;
  1153. }
  1154. }
  1155. void ARGBAttenuateRow_MSA(const uint8* src_argb, uint8* dst_argb, int width) {
  1156. int x;
  1157. v16u8 src0, src1, dst0, dst1;
  1158. v8u16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9;
  1159. v4u32 reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7;
  1160. v8i16 zero = {0};
  1161. v16u8 mask = {0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255};
  1162. for (x = 0; x < width; x += 8) {
  1163. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0);
  1164. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16);
  1165. vec0 = (v8u16)__msa_ilvr_b((v16i8)src0, (v16i8)src0);
  1166. vec1 = (v8u16)__msa_ilvl_b((v16i8)src0, (v16i8)src0);
  1167. vec2 = (v8u16)__msa_ilvr_b((v16i8)src1, (v16i8)src1);
  1168. vec3 = (v8u16)__msa_ilvl_b((v16i8)src1, (v16i8)src1);
  1169. vec4 = (v8u16)__msa_fill_h(vec0[3]);
  1170. vec5 = (v8u16)__msa_fill_h(vec0[7]);
  1171. vec6 = (v8u16)__msa_fill_h(vec1[3]);
  1172. vec7 = (v8u16)__msa_fill_h(vec1[7]);
  1173. vec4 = (v8u16)__msa_pckev_d((v2i64)vec5, (v2i64)vec4);
  1174. vec5 = (v8u16)__msa_pckev_d((v2i64)vec7, (v2i64)vec6);
  1175. vec6 = (v8u16)__msa_fill_h(vec2[3]);
  1176. vec7 = (v8u16)__msa_fill_h(vec2[7]);
  1177. vec8 = (v8u16)__msa_fill_h(vec3[3]);
  1178. vec9 = (v8u16)__msa_fill_h(vec3[7]);
  1179. vec6 = (v8u16)__msa_pckev_d((v2i64)vec7, (v2i64)vec6);
  1180. vec7 = (v8u16)__msa_pckev_d((v2i64)vec9, (v2i64)vec8);
  1181. reg0 = (v4u32)__msa_ilvr_h(zero, (v8i16)vec4);
  1182. reg1 = (v4u32)__msa_ilvl_h(zero, (v8i16)vec4);
  1183. reg2 = (v4u32)__msa_ilvr_h(zero, (v8i16)vec5);
  1184. reg3 = (v4u32)__msa_ilvl_h(zero, (v8i16)vec5);
  1185. reg4 = (v4u32)__msa_ilvr_h(zero, (v8i16)vec6);
  1186. reg5 = (v4u32)__msa_ilvl_h(zero, (v8i16)vec6);
  1187. reg6 = (v4u32)__msa_ilvr_h(zero, (v8i16)vec7);
  1188. reg7 = (v4u32)__msa_ilvl_h(zero, (v8i16)vec7);
  1189. reg0 *= (v4u32)__msa_ilvr_h(zero, (v8i16)vec0);
  1190. reg1 *= (v4u32)__msa_ilvl_h(zero, (v8i16)vec0);
  1191. reg2 *= (v4u32)__msa_ilvr_h(zero, (v8i16)vec1);
  1192. reg3 *= (v4u32)__msa_ilvl_h(zero, (v8i16)vec1);
  1193. reg4 *= (v4u32)__msa_ilvr_h(zero, (v8i16)vec2);
  1194. reg5 *= (v4u32)__msa_ilvl_h(zero, (v8i16)vec2);
  1195. reg6 *= (v4u32)__msa_ilvr_h(zero, (v8i16)vec3);
  1196. reg7 *= (v4u32)__msa_ilvl_h(zero, (v8i16)vec3);
  1197. reg0 = (v4u32)__msa_srai_w((v4i32)reg0, 24);
  1198. reg1 = (v4u32)__msa_srai_w((v4i32)reg1, 24);
  1199. reg2 = (v4u32)__msa_srai_w((v4i32)reg2, 24);
  1200. reg3 = (v4u32)__msa_srai_w((v4i32)reg3, 24);
  1201. reg4 = (v4u32)__msa_srai_w((v4i32)reg4, 24);
  1202. reg5 = (v4u32)__msa_srai_w((v4i32)reg5, 24);
  1203. reg6 = (v4u32)__msa_srai_w((v4i32)reg6, 24);
  1204. reg7 = (v4u32)__msa_srai_w((v4i32)reg7, 24);
  1205. vec0 = (v8u16)__msa_pckev_h((v8i16)reg1, (v8i16)reg0);
  1206. vec1 = (v8u16)__msa_pckev_h((v8i16)reg3, (v8i16)reg2);
  1207. vec2 = (v8u16)__msa_pckev_h((v8i16)reg5, (v8i16)reg4);
  1208. vec3 = (v8u16)__msa_pckev_h((v8i16)reg7, (v8i16)reg6);
  1209. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1210. dst1 = (v16u8)__msa_pckev_b((v16i8)vec3, (v16i8)vec2);
  1211. dst0 = __msa_bmnz_v(dst0, src0, mask);
  1212. dst1 = __msa_bmnz_v(dst1, src1, mask);
  1213. ST_UB2(dst0, dst1, dst_argb, 16);
  1214. src_argb += 32;
  1215. dst_argb += 32;
  1216. }
  1217. }
  1218. void ARGBToRGB565DitherRow_MSA(const uint8* src_argb,
  1219. uint8* dst_rgb,
  1220. uint32 dither4,
  1221. int width) {
  1222. int x;
  1223. v16u8 src0, src1, dst0, vec0, vec1;
  1224. v8i16 vec_d0;
  1225. v8i16 reg0, reg1, reg2;
  1226. v16i8 zero = {0};
  1227. v8i16 max = __msa_ldi_h(0xFF);
  1228. vec_d0 = (v8i16)__msa_fill_w(dither4);
  1229. vec_d0 = (v8i16)__msa_ilvr_b(zero, (v16i8)vec_d0);
  1230. for (x = 0; x < width; x += 8) {
  1231. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0);
  1232. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16);
  1233. vec0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  1234. vec1 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  1235. reg0 = (v8i16)__msa_ilvev_b(zero, (v16i8)vec0);
  1236. reg1 = (v8i16)__msa_ilvev_b(zero, (v16i8)vec1);
  1237. reg2 = (v8i16)__msa_ilvod_b(zero, (v16i8)vec0);
  1238. reg0 += vec_d0;
  1239. reg1 += vec_d0;
  1240. reg2 += vec_d0;
  1241. reg0 = __msa_maxi_s_h((v8i16)reg0, 0);
  1242. reg1 = __msa_maxi_s_h((v8i16)reg1, 0);
  1243. reg2 = __msa_maxi_s_h((v8i16)reg2, 0);
  1244. reg0 = __msa_min_s_h((v8i16)max, (v8i16)reg0);
  1245. reg1 = __msa_min_s_h((v8i16)max, (v8i16)reg1);
  1246. reg2 = __msa_min_s_h((v8i16)max, (v8i16)reg2);
  1247. reg0 = __msa_srai_h(reg0, 3);
  1248. reg2 = __msa_srai_h(reg2, 3);
  1249. reg1 = __msa_srai_h(reg1, 2);
  1250. reg2 = __msa_slli_h(reg2, 11);
  1251. reg1 = __msa_slli_h(reg1, 5);
  1252. reg0 |= reg1;
  1253. dst0 = (v16u8)(reg0 | reg2);
  1254. ST_UB(dst0, dst_rgb);
  1255. src_argb += 32;
  1256. dst_rgb += 16;
  1257. }
  1258. }
  1259. void ARGBShuffleRow_MSA(const uint8* src_argb,
  1260. uint8* dst_argb,
  1261. const uint8* shuffler,
  1262. int width) {
  1263. int x;
  1264. v16u8 src0, src1, dst0, dst1;
  1265. v16i8 vec0;
  1266. v16i8 shuffler_vec = {0, 0, 0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 12};
  1267. int32 val = LW((int32*)shuffler);
  1268. vec0 = (v16i8)__msa_fill_w(val);
  1269. shuffler_vec += vec0;
  1270. for (x = 0; x < width; x += 8) {
  1271. src0 = (v16u8)__msa_ld_b((v16u8*)src_argb, 0);
  1272. src1 = (v16u8)__msa_ld_b((v16u8*)src_argb, 16);
  1273. dst0 = (v16u8)__msa_vshf_b(shuffler_vec, (v16i8)src0, (v16i8)src0);
  1274. dst1 = (v16u8)__msa_vshf_b(shuffler_vec, (v16i8)src1, (v16i8)src1);
  1275. ST_UB2(dst0, dst1, dst_argb, 16);
  1276. src_argb += 32;
  1277. dst_argb += 32;
  1278. }
  1279. }
  1280. void ARGBShadeRow_MSA(const uint8* src_argb,
  1281. uint8* dst_argb,
  1282. int width,
  1283. uint32 value) {
  1284. int x;
  1285. v16u8 src0, dst0;
  1286. v8u16 vec0, vec1;
  1287. v4u32 reg0, reg1, reg2, reg3, rgba_scale;
  1288. v8i16 zero = {0};
  1289. rgba_scale[0] = value;
  1290. rgba_scale = (v4u32)__msa_ilvr_b((v16i8)rgba_scale, (v16i8)rgba_scale);
  1291. rgba_scale = (v4u32)__msa_ilvr_h(zero, (v8i16)rgba_scale);
  1292. for (x = 0; x < width; x += 4) {
  1293. src0 = (v16u8)__msa_ld_b((v16u8*)src_argb, 0);
  1294. vec0 = (v8u16)__msa_ilvr_b((v16i8)src0, (v16i8)src0);
  1295. vec1 = (v8u16)__msa_ilvl_b((v16i8)src0, (v16i8)src0);
  1296. reg0 = (v4u32)__msa_ilvr_h(zero, (v8i16)vec0);
  1297. reg1 = (v4u32)__msa_ilvl_h(zero, (v8i16)vec0);
  1298. reg2 = (v4u32)__msa_ilvr_h(zero, (v8i16)vec1);
  1299. reg3 = (v4u32)__msa_ilvl_h(zero, (v8i16)vec1);
  1300. reg0 *= rgba_scale;
  1301. reg1 *= rgba_scale;
  1302. reg2 *= rgba_scale;
  1303. reg3 *= rgba_scale;
  1304. reg0 = (v4u32)__msa_srai_w((v4i32)reg0, 24);
  1305. reg1 = (v4u32)__msa_srai_w((v4i32)reg1, 24);
  1306. reg2 = (v4u32)__msa_srai_w((v4i32)reg2, 24);
  1307. reg3 = (v4u32)__msa_srai_w((v4i32)reg3, 24);
  1308. vec0 = (v8u16)__msa_pckev_h((v8i16)reg1, (v8i16)reg0);
  1309. vec1 = (v8u16)__msa_pckev_h((v8i16)reg3, (v8i16)reg2);
  1310. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1311. ST_UB(dst0, dst_argb);
  1312. src_argb += 16;
  1313. dst_argb += 16;
  1314. }
  1315. }
  1316. void ARGBGrayRow_MSA(const uint8* src_argb, uint8* dst_argb, int width) {
  1317. int x;
  1318. v16u8 src0, src1, vec0, vec1, dst0, dst1;
  1319. v8u16 reg0;
  1320. v16u8 const_0x26 = (v16u8)__msa_ldi_h(0x26);
  1321. v16u8 const_0x4B0F = (v16u8)__msa_fill_h(0x4B0F);
  1322. for (x = 0; x < width; x += 8) {
  1323. src0 = (v16u8)__msa_ld_b((v16u8*)src_argb, 0);
  1324. src1 = (v16u8)__msa_ld_b((v16u8*)src_argb, 16);
  1325. vec0 = (v16u8)__msa_pckev_h((v8i16)src1, (v8i16)src0);
  1326. vec1 = (v16u8)__msa_pckod_h((v8i16)src1, (v8i16)src0);
  1327. reg0 = __msa_dotp_u_h(vec0, const_0x4B0F);
  1328. reg0 = __msa_dpadd_u_h(reg0, vec1, const_0x26);
  1329. reg0 = (v8u16)__msa_srari_h((v8i16)reg0, 7);
  1330. vec0 = (v16u8)__msa_ilvev_b((v16i8)reg0, (v16i8)reg0);
  1331. vec1 = (v16u8)__msa_ilvod_b((v16i8)vec1, (v16i8)vec0);
  1332. dst0 = (v16u8)__msa_ilvr_b((v16i8)vec1, (v16i8)vec0);
  1333. dst1 = (v16u8)__msa_ilvl_b((v16i8)vec1, (v16i8)vec0);
  1334. ST_UB2(dst0, dst1, dst_argb, 16);
  1335. src_argb += 32;
  1336. dst_argb += 32;
  1337. }
  1338. }
  1339. void ARGBSepiaRow_MSA(uint8* dst_argb, int width) {
  1340. int x;
  1341. v16u8 src0, src1, dst0, dst1, vec0, vec1, vec2, vec3, vec4, vec5;
  1342. v8u16 reg0, reg1, reg2;
  1343. v16u8 const_0x4411 = (v16u8)__msa_fill_h(0x4411);
  1344. v16u8 const_0x23 = (v16u8)__msa_ldi_h(0x23);
  1345. v16u8 const_0x5816 = (v16u8)__msa_fill_h(0x5816);
  1346. v16u8 const_0x2D = (v16u8)__msa_ldi_h(0x2D);
  1347. v16u8 const_0x6218 = (v16u8)__msa_fill_h(0x6218);
  1348. v16u8 const_0x32 = (v16u8)__msa_ldi_h(0x32);
  1349. v8u16 const_0xFF = (v8u16)__msa_ldi_h(0xFF);
  1350. for (x = 0; x < width; x += 8) {
  1351. src0 = (v16u8)__msa_ld_b((v16u8*)dst_argb, 0);
  1352. src1 = (v16u8)__msa_ld_b((v16u8*)dst_argb, 16);
  1353. vec0 = (v16u8)__msa_pckev_h((v8i16)src1, (v8i16)src0);
  1354. vec1 = (v16u8)__msa_pckod_h((v8i16)src1, (v8i16)src0);
  1355. vec3 = (v16u8)__msa_pckod_b((v16i8)vec1, (v16i8)vec1);
  1356. reg0 = (v8u16)__msa_dotp_u_h(vec0, const_0x4411);
  1357. reg1 = (v8u16)__msa_dotp_u_h(vec0, const_0x5816);
  1358. reg2 = (v8u16)__msa_dotp_u_h(vec0, const_0x6218);
  1359. reg0 = (v8u16)__msa_dpadd_u_h(reg0, vec1, const_0x23);
  1360. reg1 = (v8u16)__msa_dpadd_u_h(reg1, vec1, const_0x2D);
  1361. reg2 = (v8u16)__msa_dpadd_u_h(reg2, vec1, const_0x32);
  1362. reg0 = (v8u16)__msa_srai_h((v8i16)reg0, 7);
  1363. reg1 = (v8u16)__msa_srai_h((v8i16)reg1, 7);
  1364. reg2 = (v8u16)__msa_srai_h((v8i16)reg2, 7);
  1365. reg1 = (v8u16)__msa_min_u_h((v8u16)reg1, const_0xFF);
  1366. reg2 = (v8u16)__msa_min_u_h((v8u16)reg2, const_0xFF);
  1367. vec0 = (v16u8)__msa_pckev_b((v16i8)reg0, (v16i8)reg0);
  1368. vec1 = (v16u8)__msa_pckev_b((v16i8)reg1, (v16i8)reg1);
  1369. vec2 = (v16u8)__msa_pckev_b((v16i8)reg2, (v16i8)reg2);
  1370. vec4 = (v16u8)__msa_ilvr_b((v16i8)vec2, (v16i8)vec0);
  1371. vec5 = (v16u8)__msa_ilvr_b((v16i8)vec3, (v16i8)vec1);
  1372. dst0 = (v16u8)__msa_ilvr_b((v16i8)vec5, (v16i8)vec4);
  1373. dst1 = (v16u8)__msa_ilvl_b((v16i8)vec5, (v16i8)vec4);
  1374. ST_UB2(dst0, dst1, dst_argb, 16);
  1375. dst_argb += 32;
  1376. }
  1377. }
  1378. void ARGB4444ToARGBRow_MSA(const uint8* src_argb4444,
  1379. uint8* dst_argb,
  1380. int width) {
  1381. int x;
  1382. v16u8 src0, src1;
  1383. v8u16 vec0, vec1, vec2, vec3;
  1384. v16u8 dst0, dst1, dst2, dst3;
  1385. for (x = 0; x < width; x += 16) {
  1386. src0 = (v16u8)__msa_ld_b((v16u8*)src_argb4444, 0);
  1387. src1 = (v16u8)__msa_ld_b((v16u8*)src_argb4444, 16);
  1388. vec0 = (v8u16)__msa_andi_b(src0, 0x0F);
  1389. vec1 = (v8u16)__msa_andi_b(src1, 0x0F);
  1390. vec2 = (v8u16)__msa_andi_b(src0, 0xF0);
  1391. vec3 = (v8u16)__msa_andi_b(src1, 0xF0);
  1392. vec0 |= (v8u16)__msa_slli_b((v16i8)vec0, 4);
  1393. vec1 |= (v8u16)__msa_slli_b((v16i8)vec1, 4);
  1394. vec2 |= (v8u16)__msa_srli_b((v16i8)vec2, 4);
  1395. vec3 |= (v8u16)__msa_srli_b((v16i8)vec3, 4);
  1396. dst0 = (v16u8)__msa_ilvr_b((v16i8)vec2, (v16i8)vec0);
  1397. dst1 = (v16u8)__msa_ilvl_b((v16i8)vec2, (v16i8)vec0);
  1398. dst2 = (v16u8)__msa_ilvr_b((v16i8)vec3, (v16i8)vec1);
  1399. dst3 = (v16u8)__msa_ilvl_b((v16i8)vec3, (v16i8)vec1);
  1400. ST_UB4(dst0, dst1, dst2, dst3, dst_argb, 16);
  1401. src_argb4444 += 32;
  1402. dst_argb += 64;
  1403. }
  1404. }
  1405. void ARGB1555ToARGBRow_MSA(const uint8* src_argb1555,
  1406. uint8* dst_argb,
  1407. int width) {
  1408. int x;
  1409. v8u16 src0, src1;
  1410. v8u16 vec0, vec1, vec2, vec3, vec4, vec5;
  1411. v16u8 reg0, reg1, reg2, reg3, reg4, reg5, reg6;
  1412. v16u8 dst0, dst1, dst2, dst3;
  1413. v8u16 const_0x1F = (v8u16)__msa_ldi_h(0x1F);
  1414. for (x = 0; x < width; x += 16) {
  1415. src0 = (v8u16)__msa_ld_h((v8u16*)src_argb1555, 0);
  1416. src1 = (v8u16)__msa_ld_h((v8u16*)src_argb1555, 16);
  1417. vec0 = src0 & const_0x1F;
  1418. vec1 = src1 & const_0x1F;
  1419. src0 = (v8u16)__msa_srli_h((v8i16)src0, 5);
  1420. src1 = (v8u16)__msa_srli_h((v8i16)src1, 5);
  1421. vec2 = src0 & const_0x1F;
  1422. vec3 = src1 & const_0x1F;
  1423. src0 = (v8u16)__msa_srli_h((v8i16)src0, 5);
  1424. src1 = (v8u16)__msa_srli_h((v8i16)src1, 5);
  1425. vec4 = src0 & const_0x1F;
  1426. vec5 = src1 & const_0x1F;
  1427. src0 = (v8u16)__msa_srli_h((v8i16)src0, 5);
  1428. src1 = (v8u16)__msa_srli_h((v8i16)src1, 5);
  1429. reg0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1430. reg1 = (v16u8)__msa_pckev_b((v16i8)vec3, (v16i8)vec2);
  1431. reg2 = (v16u8)__msa_pckev_b((v16i8)vec5, (v16i8)vec4);
  1432. reg3 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  1433. reg4 = (v16u8)__msa_slli_b((v16i8)reg0, 3);
  1434. reg5 = (v16u8)__msa_slli_b((v16i8)reg1, 3);
  1435. reg6 = (v16u8)__msa_slli_b((v16i8)reg2, 3);
  1436. reg4 |= (v16u8)__msa_srai_b((v16i8)reg0, 2);
  1437. reg5 |= (v16u8)__msa_srai_b((v16i8)reg1, 2);
  1438. reg6 |= (v16u8)__msa_srai_b((v16i8)reg2, 2);
  1439. reg3 = -reg3;
  1440. reg0 = (v16u8)__msa_ilvr_b((v16i8)reg6, (v16i8)reg4);
  1441. reg1 = (v16u8)__msa_ilvl_b((v16i8)reg6, (v16i8)reg4);
  1442. reg2 = (v16u8)__msa_ilvr_b((v16i8)reg3, (v16i8)reg5);
  1443. reg3 = (v16u8)__msa_ilvl_b((v16i8)reg3, (v16i8)reg5);
  1444. dst0 = (v16u8)__msa_ilvr_b((v16i8)reg2, (v16i8)reg0);
  1445. dst1 = (v16u8)__msa_ilvl_b((v16i8)reg2, (v16i8)reg0);
  1446. dst2 = (v16u8)__msa_ilvr_b((v16i8)reg3, (v16i8)reg1);
  1447. dst3 = (v16u8)__msa_ilvl_b((v16i8)reg3, (v16i8)reg1);
  1448. ST_UB4(dst0, dst1, dst2, dst3, dst_argb, 16);
  1449. src_argb1555 += 32;
  1450. dst_argb += 64;
  1451. }
  1452. }
  1453. void RGB565ToARGBRow_MSA(const uint8* src_rgb565, uint8* dst_argb, int width) {
  1454. int x;
  1455. v8u16 src0, src1, vec0, vec1, vec2, vec3, vec4, vec5;
  1456. v8u16 reg0, reg1, reg2, reg3, reg4, reg5;
  1457. v16u8 res0, res1, res2, res3, dst0, dst1, dst2, dst3;
  1458. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  1459. v8u16 const_0x1F = (v8u16)__msa_ldi_h(0x1F);
  1460. v8u16 const_0x7E0 = (v8u16)__msa_fill_h(0x7E0);
  1461. v8u16 const_0xF800 = (v8u16)__msa_fill_h(0xF800);
  1462. for (x = 0; x < width; x += 16) {
  1463. src0 = (v8u16)__msa_ld_h((v8u16*)src_rgb565, 0);
  1464. src1 = (v8u16)__msa_ld_h((v8u16*)src_rgb565, 16);
  1465. vec0 = src0 & const_0x1F;
  1466. vec1 = src0 & const_0x7E0;
  1467. vec2 = src0 & const_0xF800;
  1468. vec3 = src1 & const_0x1F;
  1469. vec4 = src1 & const_0x7E0;
  1470. vec5 = src1 & const_0xF800;
  1471. reg0 = (v8u16)__msa_slli_h((v8i16)vec0, 3);
  1472. reg1 = (v8u16)__msa_srli_h((v8i16)vec1, 3);
  1473. reg2 = (v8u16)__msa_srli_h((v8i16)vec2, 8);
  1474. reg3 = (v8u16)__msa_slli_h((v8i16)vec3, 3);
  1475. reg4 = (v8u16)__msa_srli_h((v8i16)vec4, 3);
  1476. reg5 = (v8u16)__msa_srli_h((v8i16)vec5, 8);
  1477. reg0 |= (v8u16)__msa_srli_h((v8i16)vec0, 2);
  1478. reg1 |= (v8u16)__msa_srli_h((v8i16)vec1, 9);
  1479. reg2 |= (v8u16)__msa_srli_h((v8i16)vec2, 13);
  1480. reg3 |= (v8u16)__msa_srli_h((v8i16)vec3, 2);
  1481. reg4 |= (v8u16)__msa_srli_h((v8i16)vec4, 9);
  1482. reg5 |= (v8u16)__msa_srli_h((v8i16)vec5, 13);
  1483. res0 = (v16u8)__msa_ilvev_b((v16i8)reg2, (v16i8)reg0);
  1484. res1 = (v16u8)__msa_ilvev_b((v16i8)alpha, (v16i8)reg1);
  1485. res2 = (v16u8)__msa_ilvev_b((v16i8)reg5, (v16i8)reg3);
  1486. res3 = (v16u8)__msa_ilvev_b((v16i8)alpha, (v16i8)reg4);
  1487. dst0 = (v16u8)__msa_ilvr_b((v16i8)res1, (v16i8)res0);
  1488. dst1 = (v16u8)__msa_ilvl_b((v16i8)res1, (v16i8)res0);
  1489. dst2 = (v16u8)__msa_ilvr_b((v16i8)res3, (v16i8)res2);
  1490. dst3 = (v16u8)__msa_ilvl_b((v16i8)res3, (v16i8)res2);
  1491. ST_UB4(dst0, dst1, dst2, dst3, dst_argb, 16);
  1492. src_rgb565 += 32;
  1493. dst_argb += 64;
  1494. }
  1495. }
  1496. void RGB24ToARGBRow_MSA(const uint8* src_rgb24, uint8* dst_argb, int width) {
  1497. int x;
  1498. v16u8 src0, src1, src2;
  1499. v16u8 vec0, vec1, vec2;
  1500. v16u8 dst0, dst1, dst2, dst3;
  1501. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  1502. v16i8 shuffler = {0, 1, 2, 16, 3, 4, 5, 17, 6, 7, 8, 18, 9, 10, 11, 19};
  1503. for (x = 0; x < width; x += 16) {
  1504. src0 = (v16u8)__msa_ld_b((v16i8*)src_rgb24, 0);
  1505. src1 = (v16u8)__msa_ld_b((v16i8*)src_rgb24, 16);
  1506. src2 = (v16u8)__msa_ld_b((v16i8*)src_rgb24, 32);
  1507. vec0 = (v16u8)__msa_sldi_b((v16i8)src1, (v16i8)src0, 12);
  1508. vec1 = (v16u8)__msa_sldi_b((v16i8)src2, (v16i8)src1, 8);
  1509. vec2 = (v16u8)__msa_sldi_b((v16i8)src2, (v16i8)src2, 4);
  1510. dst0 = (v16u8)__msa_vshf_b(shuffler, (v16i8)alpha, (v16i8)src0);
  1511. dst1 = (v16u8)__msa_vshf_b(shuffler, (v16i8)alpha, (v16i8)vec0);
  1512. dst2 = (v16u8)__msa_vshf_b(shuffler, (v16i8)alpha, (v16i8)vec1);
  1513. dst3 = (v16u8)__msa_vshf_b(shuffler, (v16i8)alpha, (v16i8)vec2);
  1514. ST_UB4(dst0, dst1, dst2, dst3, dst_argb, 16);
  1515. src_rgb24 += 48;
  1516. dst_argb += 64;
  1517. }
  1518. }
  1519. void RAWToARGBRow_MSA(const uint8* src_raw, uint8* dst_argb, int width) {
  1520. int x;
  1521. v16u8 src0, src1, src2;
  1522. v16u8 vec0, vec1, vec2;
  1523. v16u8 dst0, dst1, dst2, dst3;
  1524. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  1525. v16i8 mask = {2, 1, 0, 16, 5, 4, 3, 17, 8, 7, 6, 18, 11, 10, 9, 19};
  1526. for (x = 0; x < width; x += 16) {
  1527. src0 = (v16u8)__msa_ld_b((v16i8*)src_raw, 0);
  1528. src1 = (v16u8)__msa_ld_b((v16i8*)src_raw, 16);
  1529. src2 = (v16u8)__msa_ld_b((v16i8*)src_raw, 32);
  1530. vec0 = (v16u8)__msa_sldi_b((v16i8)src1, (v16i8)src0, 12);
  1531. vec1 = (v16u8)__msa_sldi_b((v16i8)src2, (v16i8)src1, 8);
  1532. vec2 = (v16u8)__msa_sldi_b((v16i8)src2, (v16i8)src2, 4);
  1533. dst0 = (v16u8)__msa_vshf_b(mask, (v16i8)alpha, (v16i8)src0);
  1534. dst1 = (v16u8)__msa_vshf_b(mask, (v16i8)alpha, (v16i8)vec0);
  1535. dst2 = (v16u8)__msa_vshf_b(mask, (v16i8)alpha, (v16i8)vec1);
  1536. dst3 = (v16u8)__msa_vshf_b(mask, (v16i8)alpha, (v16i8)vec2);
  1537. ST_UB4(dst0, dst1, dst2, dst3, dst_argb, 16);
  1538. src_raw += 48;
  1539. dst_argb += 64;
  1540. }
  1541. }
  1542. void ARGB1555ToYRow_MSA(const uint8* src_argb1555, uint8* dst_y, int width) {
  1543. int x;
  1544. v8u16 src0, src1, vec0, vec1, vec2, vec3, vec4, vec5;
  1545. v8u16 reg0, reg1, reg2, reg3, reg4, reg5;
  1546. v16u8 dst0;
  1547. v8u16 const_0x19 = (v8u16)__msa_ldi_h(0x19);
  1548. v8u16 const_0x81 = (v8u16)__msa_ldi_h(0x81);
  1549. v8u16 const_0x42 = (v8u16)__msa_ldi_h(0x42);
  1550. v8u16 const_0x1F = (v8u16)__msa_ldi_h(0x1F);
  1551. v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080);
  1552. for (x = 0; x < width; x += 16) {
  1553. src0 = (v8u16)__msa_ld_b((v8i16*)src_argb1555, 0);
  1554. src1 = (v8u16)__msa_ld_b((v8i16*)src_argb1555, 16);
  1555. vec0 = src0 & const_0x1F;
  1556. vec1 = src1 & const_0x1F;
  1557. src0 = (v8u16)__msa_srai_h((v8i16)src0, 5);
  1558. src1 = (v8u16)__msa_srai_h((v8i16)src1, 5);
  1559. vec2 = src0 & const_0x1F;
  1560. vec3 = src1 & const_0x1F;
  1561. src0 = (v8u16)__msa_srai_h((v8i16)src0, 5);
  1562. src1 = (v8u16)__msa_srai_h((v8i16)src1, 5);
  1563. vec4 = src0 & const_0x1F;
  1564. vec5 = src1 & const_0x1F;
  1565. reg0 = (v8u16)__msa_slli_h((v8i16)vec0, 3);
  1566. reg1 = (v8u16)__msa_slli_h((v8i16)vec1, 3);
  1567. reg0 |= (v8u16)__msa_srai_h((v8i16)vec0, 2);
  1568. reg1 |= (v8u16)__msa_srai_h((v8i16)vec1, 2);
  1569. reg2 = (v8u16)__msa_slli_h((v8i16)vec2, 3);
  1570. reg3 = (v8u16)__msa_slli_h((v8i16)vec3, 3);
  1571. reg2 |= (v8u16)__msa_srai_h((v8i16)vec2, 2);
  1572. reg3 |= (v8u16)__msa_srai_h((v8i16)vec3, 2);
  1573. reg4 = (v8u16)__msa_slli_h((v8i16)vec4, 3);
  1574. reg5 = (v8u16)__msa_slli_h((v8i16)vec5, 3);
  1575. reg4 |= (v8u16)__msa_srai_h((v8i16)vec4, 2);
  1576. reg5 |= (v8u16)__msa_srai_h((v8i16)vec5, 2);
  1577. reg0 *= const_0x19;
  1578. reg1 *= const_0x19;
  1579. reg2 *= const_0x81;
  1580. reg3 *= const_0x81;
  1581. reg4 *= const_0x42;
  1582. reg5 *= const_0x42;
  1583. reg0 += reg2;
  1584. reg1 += reg3;
  1585. reg0 += reg4;
  1586. reg1 += reg5;
  1587. reg0 += const_0x1080;
  1588. reg1 += const_0x1080;
  1589. reg0 = (v8u16)__msa_srai_h((v8i16)reg0, 8);
  1590. reg1 = (v8u16)__msa_srai_h((v8i16)reg1, 8);
  1591. dst0 = (v16u8)__msa_pckev_b((v16i8)reg1, (v16i8)reg0);
  1592. ST_UB(dst0, dst_y);
  1593. src_argb1555 += 32;
  1594. dst_y += 16;
  1595. }
  1596. }
  1597. void RGB565ToYRow_MSA(const uint8* src_rgb565, uint8* dst_y, int width) {
  1598. int x;
  1599. v8u16 src0, src1, vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  1600. v8u16 reg0, reg1, reg2, reg3, reg4, reg5;
  1601. v4u32 res0, res1, res2, res3;
  1602. v16u8 dst0;
  1603. v4u32 const_0x810019 = (v4u32)__msa_fill_w(0x810019);
  1604. v4u32 const_0x010042 = (v4u32)__msa_fill_w(0x010042);
  1605. v8i16 const_0x1080 = __msa_fill_h(0x1080);
  1606. v8u16 const_0x1F = (v8u16)__msa_ldi_h(0x1F);
  1607. v8u16 const_0x7E0 = (v8u16)__msa_fill_h(0x7E0);
  1608. v8u16 const_0xF800 = (v8u16)__msa_fill_h(0xF800);
  1609. for (x = 0; x < width; x += 16) {
  1610. src0 = (v8u16)__msa_ld_b((v8i16*)src_rgb565, 0);
  1611. src1 = (v8u16)__msa_ld_b((v8i16*)src_rgb565, 16);
  1612. vec0 = src0 & const_0x1F;
  1613. vec1 = src0 & const_0x7E0;
  1614. vec2 = src0 & const_0xF800;
  1615. vec3 = src1 & const_0x1F;
  1616. vec4 = src1 & const_0x7E0;
  1617. vec5 = src1 & const_0xF800;
  1618. reg0 = (v8u16)__msa_slli_h((v8i16)vec0, 3);
  1619. reg1 = (v8u16)__msa_srli_h((v8i16)vec1, 3);
  1620. reg2 = (v8u16)__msa_srli_h((v8i16)vec2, 8);
  1621. reg3 = (v8u16)__msa_slli_h((v8i16)vec3, 3);
  1622. reg4 = (v8u16)__msa_srli_h((v8i16)vec4, 3);
  1623. reg5 = (v8u16)__msa_srli_h((v8i16)vec5, 8);
  1624. reg0 |= (v8u16)__msa_srli_h((v8i16)vec0, 2);
  1625. reg1 |= (v8u16)__msa_srli_h((v8i16)vec1, 9);
  1626. reg2 |= (v8u16)__msa_srli_h((v8i16)vec2, 13);
  1627. reg3 |= (v8u16)__msa_srli_h((v8i16)vec3, 2);
  1628. reg4 |= (v8u16)__msa_srli_h((v8i16)vec4, 9);
  1629. reg5 |= (v8u16)__msa_srli_h((v8i16)vec5, 13);
  1630. vec0 = (v8u16)__msa_ilvr_h((v8i16)reg1, (v8i16)reg0);
  1631. vec1 = (v8u16)__msa_ilvl_h((v8i16)reg1, (v8i16)reg0);
  1632. vec2 = (v8u16)__msa_ilvr_h((v8i16)reg4, (v8i16)reg3);
  1633. vec3 = (v8u16)__msa_ilvl_h((v8i16)reg4, (v8i16)reg3);
  1634. vec4 = (v8u16)__msa_ilvr_h(const_0x1080, (v8i16)reg2);
  1635. vec5 = (v8u16)__msa_ilvl_h(const_0x1080, (v8i16)reg2);
  1636. vec6 = (v8u16)__msa_ilvr_h(const_0x1080, (v8i16)reg5);
  1637. vec7 = (v8u16)__msa_ilvl_h(const_0x1080, (v8i16)reg5);
  1638. res0 = __msa_dotp_u_w(vec0, (v8u16)const_0x810019);
  1639. res1 = __msa_dotp_u_w(vec1, (v8u16)const_0x810019);
  1640. res2 = __msa_dotp_u_w(vec2, (v8u16)const_0x810019);
  1641. res3 = __msa_dotp_u_w(vec3, (v8u16)const_0x810019);
  1642. res0 = __msa_dpadd_u_w(res0, vec4, (v8u16)const_0x010042);
  1643. res1 = __msa_dpadd_u_w(res1, vec5, (v8u16)const_0x010042);
  1644. res2 = __msa_dpadd_u_w(res2, vec6, (v8u16)const_0x010042);
  1645. res3 = __msa_dpadd_u_w(res3, vec7, (v8u16)const_0x010042);
  1646. res0 = (v4u32)__msa_srai_w((v4i32)res0, 8);
  1647. res1 = (v4u32)__msa_srai_w((v4i32)res1, 8);
  1648. res2 = (v4u32)__msa_srai_w((v4i32)res2, 8);
  1649. res3 = (v4u32)__msa_srai_w((v4i32)res3, 8);
  1650. vec0 = (v8u16)__msa_pckev_h((v8i16)res1, (v8i16)res0);
  1651. vec1 = (v8u16)__msa_pckev_h((v8i16)res3, (v8i16)res2);
  1652. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1653. ST_UB(dst0, dst_y);
  1654. src_rgb565 += 32;
  1655. dst_y += 16;
  1656. }
  1657. }
  1658. void RGB24ToYRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
  1659. int x;
  1660. v16u8 src0, src1, src2, reg0, reg1, reg2, reg3, dst0;
  1661. v8u16 vec0, vec1, vec2, vec3;
  1662. v8u16 const_0x8119 = (v8u16)__msa_fill_h(0x8119);
  1663. v8u16 const_0x42 = (v8u16)__msa_fill_h(0x42);
  1664. v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080);
  1665. v16i8 mask0 = {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12};
  1666. v16i8 mask1 = {12, 13, 14, 15, 15, 16, 17, 18,
  1667. 18, 19, 20, 21, 21, 22, 23, 24};
  1668. v16i8 mask2 = {8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20};
  1669. v16i8 mask3 = {4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 13, 14, 15, 16};
  1670. v16i8 zero = {0};
  1671. for (x = 0; x < width; x += 16) {
  1672. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
  1673. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
  1674. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 32);
  1675. reg0 = (v16u8)__msa_vshf_b(mask0, zero, (v16i8)src0);
  1676. reg1 = (v16u8)__msa_vshf_b(mask1, (v16i8)src1, (v16i8)src0);
  1677. reg2 = (v16u8)__msa_vshf_b(mask2, (v16i8)src2, (v16i8)src1);
  1678. reg3 = (v16u8)__msa_vshf_b(mask3, zero, (v16i8)src2);
  1679. vec0 = (v8u16)__msa_pckev_h((v8i16)reg1, (v8i16)reg0);
  1680. vec1 = (v8u16)__msa_pckev_h((v8i16)reg3, (v8i16)reg2);
  1681. vec2 = (v8u16)__msa_pckod_h((v8i16)reg1, (v8i16)reg0);
  1682. vec3 = (v8u16)__msa_pckod_h((v8i16)reg3, (v8i16)reg2);
  1683. vec0 = __msa_dotp_u_h((v16u8)vec0, (v16u8)const_0x8119);
  1684. vec1 = __msa_dotp_u_h((v16u8)vec1, (v16u8)const_0x8119);
  1685. vec0 = __msa_dpadd_u_h(vec0, (v16u8)vec2, (v16u8)const_0x42);
  1686. vec1 = __msa_dpadd_u_h(vec1, (v16u8)vec3, (v16u8)const_0x42);
  1687. vec0 += const_0x1080;
  1688. vec1 += const_0x1080;
  1689. vec0 = (v8u16)__msa_srai_h((v8i16)vec0, 8);
  1690. vec1 = (v8u16)__msa_srai_h((v8i16)vec1, 8);
  1691. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1692. ST_UB(dst0, dst_y);
  1693. src_argb0 += 48;
  1694. dst_y += 16;
  1695. }
  1696. }
  1697. void RAWToYRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
  1698. int x;
  1699. v16u8 src0, src1, src2, reg0, reg1, reg2, reg3, dst0;
  1700. v8u16 vec0, vec1, vec2, vec3;
  1701. v8u16 const_0x8142 = (v8u16)__msa_fill_h(0x8142);
  1702. v8u16 const_0x19 = (v8u16)__msa_fill_h(0x19);
  1703. v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080);
  1704. v16i8 mask0 = {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12};
  1705. v16i8 mask1 = {12, 13, 14, 15, 15, 16, 17, 18,
  1706. 18, 19, 20, 21, 21, 22, 23, 24};
  1707. v16i8 mask2 = {8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20};
  1708. v16i8 mask3 = {4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 13, 14, 15, 16};
  1709. v16i8 zero = {0};
  1710. for (x = 0; x < width; x += 16) {
  1711. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
  1712. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
  1713. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 32);
  1714. reg0 = (v16u8)__msa_vshf_b(mask0, zero, (v16i8)src0);
  1715. reg1 = (v16u8)__msa_vshf_b(mask1, (v16i8)src1, (v16i8)src0);
  1716. reg2 = (v16u8)__msa_vshf_b(mask2, (v16i8)src2, (v16i8)src1);
  1717. reg3 = (v16u8)__msa_vshf_b(mask3, zero, (v16i8)src2);
  1718. vec0 = (v8u16)__msa_pckev_h((v8i16)reg1, (v8i16)reg0);
  1719. vec1 = (v8u16)__msa_pckev_h((v8i16)reg3, (v8i16)reg2);
  1720. vec2 = (v8u16)__msa_pckod_h((v8i16)reg1, (v8i16)reg0);
  1721. vec3 = (v8u16)__msa_pckod_h((v8i16)reg3, (v8i16)reg2);
  1722. vec0 = __msa_dotp_u_h((v16u8)vec0, (v16u8)const_0x8142);
  1723. vec1 = __msa_dotp_u_h((v16u8)vec1, (v16u8)const_0x8142);
  1724. vec0 = __msa_dpadd_u_h(vec0, (v16u8)vec2, (v16u8)const_0x19);
  1725. vec1 = __msa_dpadd_u_h(vec1, (v16u8)vec3, (v16u8)const_0x19);
  1726. vec0 += const_0x1080;
  1727. vec1 += const_0x1080;
  1728. vec0 = (v8u16)__msa_srai_h((v8i16)vec0, 8);
  1729. vec1 = (v8u16)__msa_srai_h((v8i16)vec1, 8);
  1730. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1731. ST_UB(dst0, dst_y);
  1732. src_argb0 += 48;
  1733. dst_y += 16;
  1734. }
  1735. }
  1736. void ARGB1555ToUVRow_MSA(const uint8* src_argb1555,
  1737. int src_stride_argb1555,
  1738. uint8* dst_u,
  1739. uint8* dst_v,
  1740. int width) {
  1741. int x;
  1742. const uint16* s = (const uint16*)src_argb1555;
  1743. const uint16* t = (const uint16*)(src_argb1555 + src_stride_argb1555);
  1744. int64_t res0, res1;
  1745. v8u16 src0, src1, src2, src3, reg0, reg1, reg2, reg3;
  1746. v8u16 vec0, vec1, vec2, vec3, vec4, vec5, vec6;
  1747. v16u8 dst0;
  1748. v8u16 const_0x70 = (v8u16)__msa_ldi_h(0x70);
  1749. v8u16 const_0x4A = (v8u16)__msa_ldi_h(0x4A);
  1750. v8u16 const_0x26 = (v8u16)__msa_ldi_h(0x26);
  1751. v8u16 const_0x5E = (v8u16)__msa_ldi_h(0x5E);
  1752. v8u16 const_0x12 = (v8u16)__msa_ldi_h(0x12);
  1753. v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
  1754. v8u16 const_0x1F = (v8u16)__msa_ldi_h(0x1F);
  1755. for (x = 0; x < width; x += 16) {
  1756. src0 = (v8u16)__msa_ld_b((v8i16*)s, 0);
  1757. src1 = (v8u16)__msa_ld_b((v8i16*)s, 16);
  1758. src2 = (v8u16)__msa_ld_b((v8i16*)t, 0);
  1759. src3 = (v8u16)__msa_ld_b((v8i16*)t, 16);
  1760. vec0 = src0 & const_0x1F;
  1761. vec1 = src1 & const_0x1F;
  1762. vec0 += src2 & const_0x1F;
  1763. vec1 += src3 & const_0x1F;
  1764. vec0 = (v8u16)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1765. src0 = (v8u16)__msa_srai_h((v8i16)src0, 5);
  1766. src1 = (v8u16)__msa_srai_h((v8i16)src1, 5);
  1767. src2 = (v8u16)__msa_srai_h((v8i16)src2, 5);
  1768. src3 = (v8u16)__msa_srai_h((v8i16)src3, 5);
  1769. vec2 = src0 & const_0x1F;
  1770. vec3 = src1 & const_0x1F;
  1771. vec2 += src2 & const_0x1F;
  1772. vec3 += src3 & const_0x1F;
  1773. vec2 = (v8u16)__msa_pckev_b((v16i8)vec3, (v16i8)vec2);
  1774. src0 = (v8u16)__msa_srai_h((v8i16)src0, 5);
  1775. src1 = (v8u16)__msa_srai_h((v8i16)src1, 5);
  1776. src2 = (v8u16)__msa_srai_h((v8i16)src2, 5);
  1777. src3 = (v8u16)__msa_srai_h((v8i16)src3, 5);
  1778. vec4 = src0 & const_0x1F;
  1779. vec5 = src1 & const_0x1F;
  1780. vec4 += src2 & const_0x1F;
  1781. vec5 += src3 & const_0x1F;
  1782. vec4 = (v8u16)__msa_pckev_b((v16i8)vec5, (v16i8)vec4);
  1783. vec0 = __msa_hadd_u_h((v16u8)vec0, (v16u8)vec0);
  1784. vec2 = __msa_hadd_u_h((v16u8)vec2, (v16u8)vec2);
  1785. vec4 = __msa_hadd_u_h((v16u8)vec4, (v16u8)vec4);
  1786. vec6 = (v8u16)__msa_slli_h((v8i16)vec0, 1);
  1787. vec6 |= (v8u16)__msa_srai_h((v8i16)vec0, 6);
  1788. vec0 = (v8u16)__msa_slli_h((v8i16)vec2, 1);
  1789. vec0 |= (v8u16)__msa_srai_h((v8i16)vec2, 6);
  1790. vec2 = (v8u16)__msa_slli_h((v8i16)vec4, 1);
  1791. vec2 |= (v8u16)__msa_srai_h((v8i16)vec4, 6);
  1792. reg0 = vec6 * const_0x70;
  1793. reg1 = vec0 * const_0x4A;
  1794. reg2 = vec2 * const_0x70;
  1795. reg3 = vec0 * const_0x5E;
  1796. reg0 += const_0x8080;
  1797. reg1 += vec2 * const_0x26;
  1798. reg2 += const_0x8080;
  1799. reg3 += vec6 * const_0x12;
  1800. reg0 -= reg1;
  1801. reg2 -= reg3;
  1802. reg0 = (v8u16)__msa_srai_h((v8i16)reg0, 8);
  1803. reg2 = (v8u16)__msa_srai_h((v8i16)reg2, 8);
  1804. dst0 = (v16u8)__msa_pckev_b((v16i8)reg2, (v16i8)reg0);
  1805. res0 = __msa_copy_u_d((v2i64)dst0, 0);
  1806. res1 = __msa_copy_u_d((v2i64)dst0, 1);
  1807. SD(res0, dst_u);
  1808. SD(res1, dst_v);
  1809. s += 16;
  1810. t += 16;
  1811. dst_u += 8;
  1812. dst_v += 8;
  1813. }
  1814. }
  1815. void RGB565ToUVRow_MSA(const uint8* src_rgb565,
  1816. int src_stride_rgb565,
  1817. uint8* dst_u,
  1818. uint8* dst_v,
  1819. int width) {
  1820. int x;
  1821. const uint16* s = (const uint16*)src_rgb565;
  1822. const uint16* t = (const uint16*)(src_rgb565 + src_stride_rgb565);
  1823. int64_t res0, res1;
  1824. v8u16 src0, src1, src2, src3, reg0, reg1, reg2, reg3;
  1825. v8u16 vec0, vec1, vec2, vec3, vec4, vec5;
  1826. v16u8 dst0;
  1827. v8u16 const_0x70 = (v8u16)__msa_ldi_h(0x70);
  1828. v8u16 const_0x4A = (v8u16)__msa_ldi_h(0x4A);
  1829. v8u16 const_0x26 = (v8u16)__msa_ldi_h(0x26);
  1830. v8u16 const_0x5E = (v8u16)__msa_ldi_h(0x5E);
  1831. v8u16 const_0x12 = (v8u16)__msa_ldi_h(0x12);
  1832. v8u16 const_32896 = (v8u16)__msa_fill_h(0x8080);
  1833. v8u16 const_0x1F = (v8u16)__msa_ldi_h(0x1F);
  1834. v8u16 const_0x3F = (v8u16)__msa_fill_h(0x3F);
  1835. for (x = 0; x < width; x += 16) {
  1836. src0 = (v8u16)__msa_ld_b((v8i16*)s, 0);
  1837. src1 = (v8u16)__msa_ld_b((v8i16*)s, 16);
  1838. src2 = (v8u16)__msa_ld_b((v8i16*)t, 0);
  1839. src3 = (v8u16)__msa_ld_b((v8i16*)t, 16);
  1840. vec0 = src0 & const_0x1F;
  1841. vec1 = src1 & const_0x1F;
  1842. vec0 += src2 & const_0x1F;
  1843. vec1 += src3 & const_0x1F;
  1844. vec0 = (v8u16)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  1845. src0 = (v8u16)__msa_srai_h((v8i16)src0, 5);
  1846. src1 = (v8u16)__msa_srai_h((v8i16)src1, 5);
  1847. src2 = (v8u16)__msa_srai_h((v8i16)src2, 5);
  1848. src3 = (v8u16)__msa_srai_h((v8i16)src3, 5);
  1849. vec2 = src0 & const_0x3F;
  1850. vec3 = src1 & const_0x3F;
  1851. vec2 += src2 & const_0x3F;
  1852. vec3 += src3 & const_0x3F;
  1853. vec1 = (v8u16)__msa_pckev_b((v16i8)vec3, (v16i8)vec2);
  1854. src0 = (v8u16)__msa_srai_h((v8i16)src0, 6);
  1855. src1 = (v8u16)__msa_srai_h((v8i16)src1, 6);
  1856. src2 = (v8u16)__msa_srai_h((v8i16)src2, 6);
  1857. src3 = (v8u16)__msa_srai_h((v8i16)src3, 6);
  1858. vec4 = src0 & const_0x1F;
  1859. vec5 = src1 & const_0x1F;
  1860. vec4 += src2 & const_0x1F;
  1861. vec5 += src3 & const_0x1F;
  1862. vec2 = (v8u16)__msa_pckev_b((v16i8)vec5, (v16i8)vec4);
  1863. vec0 = __msa_hadd_u_h((v16u8)vec0, (v16u8)vec0);
  1864. vec1 = __msa_hadd_u_h((v16u8)vec1, (v16u8)vec1);
  1865. vec2 = __msa_hadd_u_h((v16u8)vec2, (v16u8)vec2);
  1866. vec3 = (v8u16)__msa_slli_h((v8i16)vec0, 1);
  1867. vec3 |= (v8u16)__msa_srai_h((v8i16)vec0, 6);
  1868. vec4 = (v8u16)__msa_slli_h((v8i16)vec2, 1);
  1869. vec4 |= (v8u16)__msa_srai_h((v8i16)vec2, 6);
  1870. reg0 = vec3 * const_0x70;
  1871. reg1 = vec1 * const_0x4A;
  1872. reg2 = vec4 * const_0x70;
  1873. reg3 = vec1 * const_0x5E;
  1874. reg0 += const_32896;
  1875. reg1 += vec4 * const_0x26;
  1876. reg2 += const_32896;
  1877. reg3 += vec3 * const_0x12;
  1878. reg0 -= reg1;
  1879. reg2 -= reg3;
  1880. reg0 = (v8u16)__msa_srai_h((v8i16)reg0, 8);
  1881. reg2 = (v8u16)__msa_srai_h((v8i16)reg2, 8);
  1882. dst0 = (v16u8)__msa_pckev_b((v16i8)reg2, (v16i8)reg0);
  1883. res0 = __msa_copy_u_d((v2i64)dst0, 0);
  1884. res1 = __msa_copy_u_d((v2i64)dst0, 1);
  1885. SD(res0, dst_u);
  1886. SD(res1, dst_v);
  1887. s += 16;
  1888. t += 16;
  1889. dst_u += 8;
  1890. dst_v += 8;
  1891. }
  1892. }
  1893. void RGB24ToUVRow_MSA(const uint8* src_rgb0,
  1894. int src_stride_rgb,
  1895. uint8* dst_u,
  1896. uint8* dst_v,
  1897. int width) {
  1898. int x;
  1899. const uint8* s = src_rgb0;
  1900. const uint8* t = src_rgb0 + src_stride_rgb;
  1901. int64 res0, res1;
  1902. v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  1903. v16u8 inp0, inp1, inp2, inp3, inp4, inp5;
  1904. v8u16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  1905. v8i16 reg0, reg1, reg2, reg3;
  1906. v16u8 dst0;
  1907. v8u16 const_0x70 = (v8u16)__msa_fill_h(0x70);
  1908. v8u16 const_0x4A = (v8u16)__msa_fill_h(0x4A);
  1909. v8u16 const_0x26 = (v8u16)__msa_fill_h(0x26);
  1910. v8u16 const_0x5E = (v8u16)__msa_fill_h(0x5E);
  1911. v8u16 const_0x12 = (v8u16)__msa_fill_h(0x12);
  1912. v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
  1913. v16i8 mask = {0, 1, 2, 16, 3, 4, 5, 17, 6, 7, 8, 18, 9, 10, 11, 19};
  1914. v16i8 zero = {0};
  1915. for (x = 0; x < width; x += 16) {
  1916. inp0 = (v16u8)__msa_ld_b((v16i8*)s, 0);
  1917. inp1 = (v16u8)__msa_ld_b((v16i8*)s, 16);
  1918. inp2 = (v16u8)__msa_ld_b((v16i8*)s, 32);
  1919. inp3 = (v16u8)__msa_ld_b((v16i8*)t, 0);
  1920. inp4 = (v16u8)__msa_ld_b((v16i8*)t, 16);
  1921. inp5 = (v16u8)__msa_ld_b((v16i8*)t, 32);
  1922. src1 = (v16u8)__msa_sldi_b((v16i8)inp1, (v16i8)inp0, 12);
  1923. src5 = (v16u8)__msa_sldi_b((v16i8)inp4, (v16i8)inp3, 12);
  1924. src2 = (v16u8)__msa_sldi_b((v16i8)inp2, (v16i8)inp1, 8);
  1925. src6 = (v16u8)__msa_sldi_b((v16i8)inp5, (v16i8)inp4, 8);
  1926. src3 = (v16u8)__msa_sldi_b((v16i8)inp2, (v16i8)inp2, 4);
  1927. src7 = (v16u8)__msa_sldi_b((v16i8)inp5, (v16i8)inp5, 4);
  1928. src0 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)inp0);
  1929. src1 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src1);
  1930. src2 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src2);
  1931. src3 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src3);
  1932. src4 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)inp3);
  1933. src5 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src5);
  1934. src6 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src6);
  1935. src7 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src7);
  1936. vec0 = (v8u16)__msa_ilvr_b((v16i8)src4, (v16i8)src0);
  1937. vec1 = (v8u16)__msa_ilvl_b((v16i8)src4, (v16i8)src0);
  1938. vec2 = (v8u16)__msa_ilvr_b((v16i8)src5, (v16i8)src1);
  1939. vec3 = (v8u16)__msa_ilvl_b((v16i8)src5, (v16i8)src1);
  1940. vec4 = (v8u16)__msa_ilvr_b((v16i8)src6, (v16i8)src2);
  1941. vec5 = (v8u16)__msa_ilvl_b((v16i8)src6, (v16i8)src2);
  1942. vec6 = (v8u16)__msa_ilvr_b((v16i8)src7, (v16i8)src3);
  1943. vec7 = (v8u16)__msa_ilvl_b((v16i8)src7, (v16i8)src3);
  1944. vec0 = (v8u16)__msa_hadd_u_h((v16u8)vec0, (v16u8)vec0);
  1945. vec1 = (v8u16)__msa_hadd_u_h((v16u8)vec1, (v16u8)vec1);
  1946. vec2 = (v8u16)__msa_hadd_u_h((v16u8)vec2, (v16u8)vec2);
  1947. vec3 = (v8u16)__msa_hadd_u_h((v16u8)vec3, (v16u8)vec3);
  1948. vec4 = (v8u16)__msa_hadd_u_h((v16u8)vec4, (v16u8)vec4);
  1949. vec5 = (v8u16)__msa_hadd_u_h((v16u8)vec5, (v16u8)vec5);
  1950. vec6 = (v8u16)__msa_hadd_u_h((v16u8)vec6, (v16u8)vec6);
  1951. vec7 = (v8u16)__msa_hadd_u_h((v16u8)vec7, (v16u8)vec7);
  1952. reg0 = (v8i16)__msa_pckev_d((v2i64)vec1, (v2i64)vec0);
  1953. reg1 = (v8i16)__msa_pckev_d((v2i64)vec3, (v2i64)vec2);
  1954. reg2 = (v8i16)__msa_pckev_d((v2i64)vec5, (v2i64)vec4);
  1955. reg3 = (v8i16)__msa_pckev_d((v2i64)vec7, (v2i64)vec6);
  1956. reg0 += (v8i16)__msa_pckod_d((v2i64)vec1, (v2i64)vec0);
  1957. reg1 += (v8i16)__msa_pckod_d((v2i64)vec3, (v2i64)vec2);
  1958. reg2 += (v8i16)__msa_pckod_d((v2i64)vec5, (v2i64)vec4);
  1959. reg3 += (v8i16)__msa_pckod_d((v2i64)vec7, (v2i64)vec6);
  1960. reg0 = __msa_srai_h((v8i16)reg0, 2);
  1961. reg1 = __msa_srai_h((v8i16)reg1, 2);
  1962. reg2 = __msa_srai_h((v8i16)reg2, 2);
  1963. reg3 = __msa_srai_h((v8i16)reg3, 2);
  1964. vec4 = (v8u16)__msa_pckev_h(reg1, reg0);
  1965. vec5 = (v8u16)__msa_pckev_h(reg3, reg2);
  1966. vec6 = (v8u16)__msa_pckod_h(reg1, reg0);
  1967. vec7 = (v8u16)__msa_pckod_h(reg3, reg2);
  1968. vec0 = (v8u16)__msa_pckev_h((v8i16)vec5, (v8i16)vec4);
  1969. vec1 = (v8u16)__msa_pckev_h((v8i16)vec7, (v8i16)vec6);
  1970. vec2 = (v8u16)__msa_pckod_h((v8i16)vec5, (v8i16)vec4);
  1971. vec3 = vec0 * const_0x70;
  1972. vec4 = vec1 * const_0x4A;
  1973. vec5 = vec2 * const_0x26;
  1974. vec2 *= const_0x70;
  1975. vec1 *= const_0x5E;
  1976. vec0 *= const_0x12;
  1977. reg0 = __msa_subv_h((v8i16)vec3, (v8i16)vec4);
  1978. reg1 = __msa_subv_h((v8i16)const_0x8080, (v8i16)vec5);
  1979. reg2 = __msa_subv_h((v8i16)vec2, (v8i16)vec1);
  1980. reg3 = __msa_subv_h((v8i16)const_0x8080, (v8i16)vec0);
  1981. reg0 += reg1;
  1982. reg2 += reg3;
  1983. reg0 = __msa_srai_h(reg0, 8);
  1984. reg2 = __msa_srai_h(reg2, 8);
  1985. dst0 = (v16u8)__msa_pckev_b((v16i8)reg2, (v16i8)reg0);
  1986. res0 = __msa_copy_u_d((v2i64)dst0, 0);
  1987. res1 = __msa_copy_u_d((v2i64)dst0, 1);
  1988. SD(res0, dst_u);
  1989. SD(res1, dst_v);
  1990. t += 48;
  1991. s += 48;
  1992. dst_u += 8;
  1993. dst_v += 8;
  1994. }
  1995. }
  1996. void RAWToUVRow_MSA(const uint8* src_rgb0,
  1997. int src_stride_rgb,
  1998. uint8* dst_u,
  1999. uint8* dst_v,
  2000. int width) {
  2001. int x;
  2002. const uint8* s = src_rgb0;
  2003. const uint8* t = src_rgb0 + src_stride_rgb;
  2004. int64 res0, res1;
  2005. v16u8 inp0, inp1, inp2, inp3, inp4, inp5;
  2006. v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  2007. v8u16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  2008. v8i16 reg0, reg1, reg2, reg3;
  2009. v16u8 dst0;
  2010. v8u16 const_0x70 = (v8u16)__msa_fill_h(0x70);
  2011. v8u16 const_0x4A = (v8u16)__msa_fill_h(0x4A);
  2012. v8u16 const_0x26 = (v8u16)__msa_fill_h(0x26);
  2013. v8u16 const_0x5E = (v8u16)__msa_fill_h(0x5E);
  2014. v8u16 const_0x12 = (v8u16)__msa_fill_h(0x12);
  2015. v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
  2016. v16i8 mask = {0, 1, 2, 16, 3, 4, 5, 17, 6, 7, 8, 18, 9, 10, 11, 19};
  2017. v16i8 zero = {0};
  2018. for (x = 0; x < width; x += 16) {
  2019. inp0 = (v16u8)__msa_ld_b((v16i8*)s, 0);
  2020. inp1 = (v16u8)__msa_ld_b((v16i8*)s, 16);
  2021. inp2 = (v16u8)__msa_ld_b((v16i8*)s, 32);
  2022. inp3 = (v16u8)__msa_ld_b((v16i8*)t, 0);
  2023. inp4 = (v16u8)__msa_ld_b((v16i8*)t, 16);
  2024. inp5 = (v16u8)__msa_ld_b((v16i8*)t, 32);
  2025. src1 = (v16u8)__msa_sldi_b((v16i8)inp1, (v16i8)inp0, 12);
  2026. src5 = (v16u8)__msa_sldi_b((v16i8)inp4, (v16i8)inp3, 12);
  2027. src2 = (v16u8)__msa_sldi_b((v16i8)inp2, (v16i8)inp1, 8);
  2028. src6 = (v16u8)__msa_sldi_b((v16i8)inp5, (v16i8)inp4, 8);
  2029. src3 = (v16u8)__msa_sldi_b((v16i8)inp2, (v16i8)inp2, 4);
  2030. src7 = (v16u8)__msa_sldi_b((v16i8)inp5, (v16i8)inp5, 4);
  2031. src0 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)inp0);
  2032. src1 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src1);
  2033. src2 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src2);
  2034. src3 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src3);
  2035. src4 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)inp3);
  2036. src5 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src5);
  2037. src6 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src6);
  2038. src7 = (v16u8)__msa_vshf_b(mask, (v16i8)zero, (v16i8)src7);
  2039. vec0 = (v8u16)__msa_ilvr_b((v16i8)src4, (v16i8)src0);
  2040. vec1 = (v8u16)__msa_ilvl_b((v16i8)src4, (v16i8)src0);
  2041. vec2 = (v8u16)__msa_ilvr_b((v16i8)src5, (v16i8)src1);
  2042. vec3 = (v8u16)__msa_ilvl_b((v16i8)src5, (v16i8)src1);
  2043. vec4 = (v8u16)__msa_ilvr_b((v16i8)src6, (v16i8)src2);
  2044. vec5 = (v8u16)__msa_ilvl_b((v16i8)src6, (v16i8)src2);
  2045. vec6 = (v8u16)__msa_ilvr_b((v16i8)src7, (v16i8)src3);
  2046. vec7 = (v8u16)__msa_ilvl_b((v16i8)src7, (v16i8)src3);
  2047. vec0 = (v8u16)__msa_hadd_u_h((v16u8)vec0, (v16u8)vec0);
  2048. vec1 = (v8u16)__msa_hadd_u_h((v16u8)vec1, (v16u8)vec1);
  2049. vec2 = (v8u16)__msa_hadd_u_h((v16u8)vec2, (v16u8)vec2);
  2050. vec3 = (v8u16)__msa_hadd_u_h((v16u8)vec3, (v16u8)vec3);
  2051. vec4 = (v8u16)__msa_hadd_u_h((v16u8)vec4, (v16u8)vec4);
  2052. vec5 = (v8u16)__msa_hadd_u_h((v16u8)vec5, (v16u8)vec5);
  2053. vec6 = (v8u16)__msa_hadd_u_h((v16u8)vec6, (v16u8)vec6);
  2054. vec7 = (v8u16)__msa_hadd_u_h((v16u8)vec7, (v16u8)vec7);
  2055. reg0 = (v8i16)__msa_pckev_d((v2i64)vec1, (v2i64)vec0);
  2056. reg1 = (v8i16)__msa_pckev_d((v2i64)vec3, (v2i64)vec2);
  2057. reg2 = (v8i16)__msa_pckev_d((v2i64)vec5, (v2i64)vec4);
  2058. reg3 = (v8i16)__msa_pckev_d((v2i64)vec7, (v2i64)vec6);
  2059. reg0 += (v8i16)__msa_pckod_d((v2i64)vec1, (v2i64)vec0);
  2060. reg1 += (v8i16)__msa_pckod_d((v2i64)vec3, (v2i64)vec2);
  2061. reg2 += (v8i16)__msa_pckod_d((v2i64)vec5, (v2i64)vec4);
  2062. reg3 += (v8i16)__msa_pckod_d((v2i64)vec7, (v2i64)vec6);
  2063. reg0 = __msa_srai_h(reg0, 2);
  2064. reg1 = __msa_srai_h(reg1, 2);
  2065. reg2 = __msa_srai_h(reg2, 2);
  2066. reg3 = __msa_srai_h(reg3, 2);
  2067. vec4 = (v8u16)__msa_pckev_h((v8i16)reg1, (v8i16)reg0);
  2068. vec5 = (v8u16)__msa_pckev_h((v8i16)reg3, (v8i16)reg2);
  2069. vec6 = (v8u16)__msa_pckod_h((v8i16)reg1, (v8i16)reg0);
  2070. vec7 = (v8u16)__msa_pckod_h((v8i16)reg3, (v8i16)reg2);
  2071. vec0 = (v8u16)__msa_pckod_h((v8i16)vec5, (v8i16)vec4);
  2072. vec1 = (v8u16)__msa_pckev_h((v8i16)vec7, (v8i16)vec6);
  2073. vec2 = (v8u16)__msa_pckev_h((v8i16)vec5, (v8i16)vec4);
  2074. vec3 = vec0 * const_0x70;
  2075. vec4 = vec1 * const_0x4A;
  2076. vec5 = vec2 * const_0x26;
  2077. vec2 *= const_0x70;
  2078. vec1 *= const_0x5E;
  2079. vec0 *= const_0x12;
  2080. reg0 = __msa_subv_h((v8i16)vec3, (v8i16)vec4);
  2081. reg1 = __msa_subv_h((v8i16)const_0x8080, (v8i16)vec5);
  2082. reg2 = __msa_subv_h((v8i16)vec2, (v8i16)vec1);
  2083. reg3 = __msa_subv_h((v8i16)const_0x8080, (v8i16)vec0);
  2084. reg0 += reg1;
  2085. reg2 += reg3;
  2086. reg0 = __msa_srai_h(reg0, 8);
  2087. reg2 = __msa_srai_h(reg2, 8);
  2088. dst0 = (v16u8)__msa_pckev_b((v16i8)reg2, (v16i8)reg0);
  2089. res0 = __msa_copy_u_d((v2i64)dst0, 0);
  2090. res1 = __msa_copy_u_d((v2i64)dst0, 1);
  2091. SD(res0, dst_u);
  2092. SD(res1, dst_v);
  2093. t += 48;
  2094. s += 48;
  2095. dst_u += 8;
  2096. dst_v += 8;
  2097. }
  2098. }
  2099. void NV12ToARGBRow_MSA(const uint8* src_y,
  2100. const uint8* src_uv,
  2101. uint8* rgb_buf,
  2102. const struct YuvConstants* yuvconstants,
  2103. int width) {
  2104. int x;
  2105. uint64 val0, val1;
  2106. v16u8 src0, src1, res0, res1, dst0, dst1;
  2107. v8i16 vec0, vec1, vec2;
  2108. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  2109. v4i32 vec_ubvr, vec_ugvg;
  2110. v16u8 zero = {0};
  2111. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  2112. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  2113. vec_br, vec_yg);
  2114. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  2115. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  2116. for (x = 0; x < width; x += 8) {
  2117. val0 = LD(src_y);
  2118. val1 = LD(src_uv);
  2119. src0 = (v16u8)__msa_insert_d((v2i64)zero, 0, val0);
  2120. src1 = (v16u8)__msa_insert_d((v2i64)zero, 0, val1);
  2121. YUVTORGB(src0, src1, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  2122. vec0, vec1, vec2);
  2123. res0 = (v16u8)__msa_ilvev_b((v16i8)vec2, (v16i8)vec0);
  2124. res1 = (v16u8)__msa_ilvev_b((v16i8)alpha, (v16i8)vec1);
  2125. dst0 = (v16u8)__msa_ilvr_b((v16i8)res1, (v16i8)res0);
  2126. dst1 = (v16u8)__msa_ilvl_b((v16i8)res1, (v16i8)res0);
  2127. ST_UB2(dst0, dst1, rgb_buf, 16);
  2128. src_y += 8;
  2129. src_uv += 8;
  2130. rgb_buf += 32;
  2131. }
  2132. }
  2133. void NV12ToRGB565Row_MSA(const uint8* src_y,
  2134. const uint8* src_uv,
  2135. uint8* rgb_buf,
  2136. const struct YuvConstants* yuvconstants,
  2137. int width) {
  2138. int x;
  2139. uint64 val0, val1;
  2140. v16u8 src0, src1, dst0;
  2141. v8i16 vec0, vec1, vec2;
  2142. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  2143. v4i32 vec_ubvr, vec_ugvg;
  2144. v16u8 zero = {0};
  2145. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  2146. vec_br, vec_yg);
  2147. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  2148. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  2149. for (x = 0; x < width; x += 8) {
  2150. val0 = LD(src_y);
  2151. val1 = LD(src_uv);
  2152. src0 = (v16u8)__msa_insert_d((v2i64)zero, 0, val0);
  2153. src1 = (v16u8)__msa_insert_d((v2i64)zero, 0, val1);
  2154. YUVTORGB(src0, src1, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  2155. vec0, vec1, vec2);
  2156. vec0 = vec0 >> 3;
  2157. vec1 = (vec1 >> 2) << 5;
  2158. vec2 = (vec2 >> 3) << 11;
  2159. dst0 = (v16u8)(vec0 | vec1 | vec2);
  2160. ST_UB(dst0, rgb_buf);
  2161. src_y += 8;
  2162. src_uv += 8;
  2163. rgb_buf += 16;
  2164. }
  2165. }
  2166. void NV21ToARGBRow_MSA(const uint8* src_y,
  2167. const uint8* src_vu,
  2168. uint8* rgb_buf,
  2169. const struct YuvConstants* yuvconstants,
  2170. int width) {
  2171. int x;
  2172. uint64 val0, val1;
  2173. v16u8 src0, src1, res0, res1, dst0, dst1;
  2174. v8i16 vec0, vec1, vec2;
  2175. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  2176. v4i32 vec_ubvr, vec_ugvg;
  2177. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  2178. v16u8 zero = {0};
  2179. v16i8 shuffler = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
  2180. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  2181. vec_br, vec_yg);
  2182. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  2183. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  2184. for (x = 0; x < width; x += 8) {
  2185. val0 = LD(src_y);
  2186. val1 = LD(src_vu);
  2187. src0 = (v16u8)__msa_insert_d((v2i64)zero, 0, val0);
  2188. src1 = (v16u8)__msa_insert_d((v2i64)zero, 0, val1);
  2189. src1 = (v16u8)__msa_vshf_b(shuffler, (v16i8)src1, (v16i8)src1);
  2190. YUVTORGB(src0, src1, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  2191. vec0, vec1, vec2);
  2192. res0 = (v16u8)__msa_ilvev_b((v16i8)vec2, (v16i8)vec0);
  2193. res1 = (v16u8)__msa_ilvev_b((v16i8)alpha, (v16i8)vec1);
  2194. dst0 = (v16u8)__msa_ilvr_b((v16i8)res1, (v16i8)res0);
  2195. dst1 = (v16u8)__msa_ilvl_b((v16i8)res1, (v16i8)res0);
  2196. ST_UB2(dst0, dst1, rgb_buf, 16);
  2197. src_y += 8;
  2198. src_vu += 8;
  2199. rgb_buf += 32;
  2200. }
  2201. }
  2202. void SobelRow_MSA(const uint8* src_sobelx,
  2203. const uint8* src_sobely,
  2204. uint8* dst_argb,
  2205. int width) {
  2206. int x;
  2207. v16u8 src0, src1, vec0, dst0, dst1, dst2, dst3;
  2208. v16i8 mask0 = {0, 0, 0, 16, 1, 1, 1, 16, 2, 2, 2, 16, 3, 3, 3, 16};
  2209. v16i8 const_0x4 = __msa_ldi_b(0x4);
  2210. v16i8 mask1 = mask0 + const_0x4;
  2211. v16i8 mask2 = mask1 + const_0x4;
  2212. v16i8 mask3 = mask2 + const_0x4;
  2213. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  2214. for (x = 0; x < width; x += 16) {
  2215. src0 = (v16u8)__msa_ld_b((v16i8*)src_sobelx, 0);
  2216. src1 = (v16u8)__msa_ld_b((v16i8*)src_sobely, 0);
  2217. vec0 = __msa_adds_u_b(src0, src1);
  2218. dst0 = (v16u8)__msa_vshf_b(mask0, (v16i8)alpha, (v16i8)vec0);
  2219. dst1 = (v16u8)__msa_vshf_b(mask1, (v16i8)alpha, (v16i8)vec0);
  2220. dst2 = (v16u8)__msa_vshf_b(mask2, (v16i8)alpha, (v16i8)vec0);
  2221. dst3 = (v16u8)__msa_vshf_b(mask3, (v16i8)alpha, (v16i8)vec0);
  2222. ST_UB4(dst0, dst1, dst2, dst3, dst_argb, 16);
  2223. src_sobelx += 16;
  2224. src_sobely += 16;
  2225. dst_argb += 64;
  2226. }
  2227. }
  2228. void SobelToPlaneRow_MSA(const uint8* src_sobelx,
  2229. const uint8* src_sobely,
  2230. uint8* dst_y,
  2231. int width) {
  2232. int x;
  2233. v16u8 src0, src1, src2, src3, dst0, dst1;
  2234. for (x = 0; x < width; x += 32) {
  2235. src0 = (v16u8)__msa_ld_b((v16i8*)src_sobelx, 0);
  2236. src1 = (v16u8)__msa_ld_b((v16i8*)src_sobelx, 16);
  2237. src2 = (v16u8)__msa_ld_b((v16i8*)src_sobely, 0);
  2238. src3 = (v16u8)__msa_ld_b((v16i8*)src_sobely, 16);
  2239. dst0 = __msa_adds_u_b(src0, src2);
  2240. dst1 = __msa_adds_u_b(src1, src3);
  2241. ST_UB2(dst0, dst1, dst_y, 16);
  2242. src_sobelx += 32;
  2243. src_sobely += 32;
  2244. dst_y += 32;
  2245. }
  2246. }
  2247. void SobelXYRow_MSA(const uint8* src_sobelx,
  2248. const uint8* src_sobely,
  2249. uint8* dst_argb,
  2250. int width) {
  2251. int x;
  2252. v16u8 src0, src1, vec0, vec1, vec2;
  2253. v16u8 reg0, reg1, dst0, dst1, dst2, dst3;
  2254. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  2255. for (x = 0; x < width; x += 16) {
  2256. src0 = (v16u8)__msa_ld_b((v16i8*)src_sobelx, 0);
  2257. src1 = (v16u8)__msa_ld_b((v16i8*)src_sobely, 0);
  2258. vec0 = __msa_adds_u_b(src0, src1);
  2259. vec1 = (v16u8)__msa_ilvr_b((v16i8)src0, (v16i8)src1);
  2260. vec2 = (v16u8)__msa_ilvl_b((v16i8)src0, (v16i8)src1);
  2261. reg0 = (v16u8)__msa_ilvr_b((v16i8)alpha, (v16i8)vec0);
  2262. reg1 = (v16u8)__msa_ilvl_b((v16i8)alpha, (v16i8)vec0);
  2263. dst0 = (v16u8)__msa_ilvr_b((v16i8)reg0, (v16i8)vec1);
  2264. dst1 = (v16u8)__msa_ilvl_b((v16i8)reg0, (v16i8)vec1);
  2265. dst2 = (v16u8)__msa_ilvr_b((v16i8)reg1, (v16i8)vec2);
  2266. dst3 = (v16u8)__msa_ilvl_b((v16i8)reg1, (v16i8)vec2);
  2267. ST_UB4(dst0, dst1, dst2, dst3, dst_argb, 16);
  2268. src_sobelx += 16;
  2269. src_sobely += 16;
  2270. dst_argb += 64;
  2271. }
  2272. }
  2273. void ARGBToYJRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
  2274. int x;
  2275. v16u8 src0, src1, src2, src3, dst0;
  2276. v16u8 const_0x4B0F = (v16u8)__msa_fill_h(0x4B0F);
  2277. v16u8 const_0x26 = (v16u8)__msa_fill_h(0x26);
  2278. v8u16 const_0x40 = (v8u16)__msa_fill_h(0x40);
  2279. for (x = 0; x < width; x += 16) {
  2280. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
  2281. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
  2282. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 32);
  2283. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 48);
  2284. ARGBTOY(src0, src1, src2, src3, const_0x4B0F, const_0x26, const_0x40, 7,
  2285. dst0);
  2286. ST_UB(dst0, dst_y);
  2287. src_argb0 += 64;
  2288. dst_y += 16;
  2289. }
  2290. }
  2291. void BGRAToYRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
  2292. int x;
  2293. v16u8 src0, src1, src2, src3, dst0;
  2294. v16u8 const_0x4200 = (v16u8)__msa_fill_h(0x4200);
  2295. v16u8 const_0x1981 = (v16u8)__msa_fill_h(0x1981);
  2296. v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080);
  2297. for (x = 0; x < width; x += 16) {
  2298. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
  2299. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
  2300. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 32);
  2301. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 48);
  2302. ARGBTOY(src0, src1, src2, src3, const_0x4200, const_0x1981, const_0x1080, 8,
  2303. dst0);
  2304. ST_UB(dst0, dst_y);
  2305. src_argb0 += 64;
  2306. dst_y += 16;
  2307. }
  2308. }
  2309. void ABGRToYRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
  2310. int x;
  2311. v16u8 src0, src1, src2, src3, dst0;
  2312. v16u8 const_0x8142 = (v16u8)__msa_fill_h(0x8142);
  2313. v16u8 const_0x19 = (v16u8)__msa_fill_h(0x19);
  2314. v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080);
  2315. for (x = 0; x < width; x += 16) {
  2316. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
  2317. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
  2318. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 32);
  2319. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 48);
  2320. ARGBTOY(src0, src1, src2, src3, const_0x8142, const_0x19, const_0x1080, 8,
  2321. dst0);
  2322. ST_UB(dst0, dst_y);
  2323. src_argb0 += 64;
  2324. dst_y += 16;
  2325. }
  2326. }
  2327. void RGBAToYRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
  2328. int x;
  2329. v16u8 src0, src1, src2, src3, dst0;
  2330. v16u8 const_0x1900 = (v16u8)__msa_fill_h(0x1900);
  2331. v16u8 const_0x4281 = (v16u8)__msa_fill_h(0x4281);
  2332. v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080);
  2333. for (x = 0; x < width; x += 16) {
  2334. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
  2335. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
  2336. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 32);
  2337. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 48);
  2338. ARGBTOY(src0, src1, src2, src3, const_0x1900, const_0x4281, const_0x1080, 8,
  2339. dst0);
  2340. ST_UB(dst0, dst_y);
  2341. src_argb0 += 64;
  2342. dst_y += 16;
  2343. }
  2344. }
  2345. void ARGBToUVJRow_MSA(const uint8* src_rgb0,
  2346. int src_stride_rgb,
  2347. uint8* dst_u,
  2348. uint8* dst_v,
  2349. int width) {
  2350. int x;
  2351. const uint8* s = src_rgb0;
  2352. const uint8* t = src_rgb0 + src_stride_rgb;
  2353. v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  2354. v16u8 vec0, vec1, vec2, vec3;
  2355. v16u8 dst0, dst1;
  2356. v16i8 shuffler0 = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29};
  2357. v16i8 shuffler1 = {2, 3, 6, 7, 10, 11, 14, 15,
  2358. 18, 19, 22, 23, 26, 27, 30, 31};
  2359. v16i8 shuffler2 = {0, 3, 4, 7, 8, 11, 12, 15, 16, 19, 20, 23, 24, 27, 28, 31};
  2360. v16i8 shuffler3 = {1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30};
  2361. v16u8 const_0x7F = (v16u8)__msa_fill_h(0x7F);
  2362. v16u8 const_0x6B14 = (v16u8)__msa_fill_h(0x6B14);
  2363. v16u8 const_0x2B54 = (v16u8)__msa_fill_h(0x2B54);
  2364. v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
  2365. for (x = 0; x < width; x += 32) {
  2366. src0 = (v16u8)__msa_ld_b((v16i8*)s, 0);
  2367. src1 = (v16u8)__msa_ld_b((v16i8*)s, 16);
  2368. src2 = (v16u8)__msa_ld_b((v16i8*)s, 32);
  2369. src3 = (v16u8)__msa_ld_b((v16i8*)s, 48);
  2370. src4 = (v16u8)__msa_ld_b((v16i8*)t, 0);
  2371. src5 = (v16u8)__msa_ld_b((v16i8*)t, 16);
  2372. src6 = (v16u8)__msa_ld_b((v16i8*)t, 32);
  2373. src7 = (v16u8)__msa_ld_b((v16i8*)t, 48);
  2374. src0 = __msa_aver_u_b(src0, src4);
  2375. src1 = __msa_aver_u_b(src1, src5);
  2376. src2 = __msa_aver_u_b(src2, src6);
  2377. src3 = __msa_aver_u_b(src3, src7);
  2378. src4 = (v16u8)__msa_pckev_w((v4i32)src1, (v4i32)src0);
  2379. src5 = (v16u8)__msa_pckev_w((v4i32)src3, (v4i32)src2);
  2380. src6 = (v16u8)__msa_pckod_w((v4i32)src1, (v4i32)src0);
  2381. src7 = (v16u8)__msa_pckod_w((v4i32)src3, (v4i32)src2);
  2382. vec0 = __msa_aver_u_b(src4, src6);
  2383. vec1 = __msa_aver_u_b(src5, src7);
  2384. src0 = (v16u8)__msa_ld_b((v16i8*)s, 64);
  2385. src1 = (v16u8)__msa_ld_b((v16i8*)s, 80);
  2386. src2 = (v16u8)__msa_ld_b((v16i8*)s, 96);
  2387. src3 = (v16u8)__msa_ld_b((v16i8*)s, 112);
  2388. src4 = (v16u8)__msa_ld_b((v16i8*)t, 64);
  2389. src5 = (v16u8)__msa_ld_b((v16i8*)t, 80);
  2390. src6 = (v16u8)__msa_ld_b((v16i8*)t, 96);
  2391. src7 = (v16u8)__msa_ld_b((v16i8*)t, 112);
  2392. src0 = __msa_aver_u_b(src0, src4);
  2393. src1 = __msa_aver_u_b(src1, src5);
  2394. src2 = __msa_aver_u_b(src2, src6);
  2395. src3 = __msa_aver_u_b(src3, src7);
  2396. src4 = (v16u8)__msa_pckev_w((v4i32)src1, (v4i32)src0);
  2397. src5 = (v16u8)__msa_pckev_w((v4i32)src3, (v4i32)src2);
  2398. src6 = (v16u8)__msa_pckod_w((v4i32)src1, (v4i32)src0);
  2399. src7 = (v16u8)__msa_pckod_w((v4i32)src3, (v4i32)src2);
  2400. vec2 = __msa_aver_u_b(src4, src6);
  2401. vec3 = __msa_aver_u_b(src5, src7);
  2402. ARGBTOUV(vec0, vec1, vec2, vec3, const_0x6B14, const_0x7F, const_0x2B54,
  2403. const_0x8080, shuffler1, shuffler0, shuffler2, shuffler3, dst0,
  2404. dst1);
  2405. ST_UB(dst0, dst_v);
  2406. ST_UB(dst1, dst_u);
  2407. s += 128;
  2408. t += 128;
  2409. dst_v += 16;
  2410. dst_u += 16;
  2411. }
  2412. }
  2413. void BGRAToUVRow_MSA(const uint8* src_rgb0,
  2414. int src_stride_rgb,
  2415. uint8* dst_u,
  2416. uint8* dst_v,
  2417. int width) {
  2418. int x;
  2419. const uint8* s = src_rgb0;
  2420. const uint8* t = src_rgb0 + src_stride_rgb;
  2421. v16u8 dst0, dst1, vec0, vec1, vec2, vec3;
  2422. v16i8 shuffler0 = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29};
  2423. v16i8 shuffler1 = {2, 3, 6, 7, 10, 11, 14, 15,
  2424. 18, 19, 22, 23, 26, 27, 30, 31};
  2425. v16i8 shuffler2 = {0, 3, 4, 7, 8, 11, 12, 15, 16, 19, 20, 23, 24, 27, 28, 31};
  2426. v16i8 shuffler3 = {2, 1, 6, 5, 10, 9, 14, 13, 18, 17, 22, 21, 26, 25, 30, 29};
  2427. v16u8 const_0x125E = (v16u8)__msa_fill_h(0x125E);
  2428. v16u8 const_0x7000 = (v16u8)__msa_fill_h(0x7000);
  2429. v16u8 const_0x264A = (v16u8)__msa_fill_h(0x264A);
  2430. v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
  2431. for (x = 0; x < width; x += 32) {
  2432. READ_ARGB(s, t, vec0, vec1, vec2, vec3);
  2433. ARGBTOUV(vec0, vec1, vec2, vec3, const_0x125E, const_0x7000, const_0x264A,
  2434. const_0x8080, shuffler0, shuffler1, shuffler2, shuffler3, dst0,
  2435. dst1);
  2436. ST_UB(dst0, dst_v);
  2437. ST_UB(dst1, dst_u);
  2438. s += 128;
  2439. t += 128;
  2440. dst_v += 16;
  2441. dst_u += 16;
  2442. }
  2443. }
  2444. void ABGRToUVRow_MSA(const uint8* src_rgb0,
  2445. int src_stride_rgb,
  2446. uint8* dst_u,
  2447. uint8* dst_v,
  2448. int width) {
  2449. int x;
  2450. const uint8* s = src_rgb0;
  2451. const uint8* t = src_rgb0 + src_stride_rgb;
  2452. v16u8 src0, src1, src2, src3;
  2453. v16u8 dst0, dst1;
  2454. v16i8 shuffler0 = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29};
  2455. v16i8 shuffler1 = {2, 3, 6, 7, 10, 11, 14, 15,
  2456. 18, 19, 22, 23, 26, 27, 30, 31};
  2457. v16i8 shuffler2 = {0, 3, 4, 7, 8, 11, 12, 15, 16, 19, 20, 23, 24, 27, 28, 31};
  2458. v16i8 shuffler3 = {1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30};
  2459. v16u8 const_0x4A26 = (v16u8)__msa_fill_h(0x4A26);
  2460. v16u8 const_0x0070 = (v16u8)__msa_fill_h(0x0070);
  2461. v16u8 const_0x125E = (v16u8)__msa_fill_h(0x125E);
  2462. v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
  2463. for (x = 0; x < width; x += 32) {
  2464. READ_ARGB(s, t, src0, src1, src2, src3);
  2465. ARGBTOUV(src0, src1, src2, src3, const_0x4A26, const_0x0070, const_0x125E,
  2466. const_0x8080, shuffler1, shuffler0, shuffler2, shuffler3, dst0,
  2467. dst1);
  2468. ST_UB(dst0, dst_u);
  2469. ST_UB(dst1, dst_v);
  2470. s += 128;
  2471. t += 128;
  2472. dst_u += 16;
  2473. dst_v += 16;
  2474. }
  2475. }
  2476. void RGBAToUVRow_MSA(const uint8* src_rgb0,
  2477. int src_stride_rgb,
  2478. uint8* dst_u,
  2479. uint8* dst_v,
  2480. int width) {
  2481. int x;
  2482. const uint8* s = src_rgb0;
  2483. const uint8* t = src_rgb0 + src_stride_rgb;
  2484. v16u8 dst0, dst1, vec0, vec1, vec2, vec3;
  2485. v16i8 shuffler0 = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29};
  2486. v16i8 shuffler1 = {2, 3, 6, 7, 10, 11, 14, 15,
  2487. 18, 19, 22, 23, 26, 27, 30, 31};
  2488. v16i8 shuffler2 = {0, 3, 4, 7, 8, 11, 12, 15, 16, 19, 20, 23, 24, 27, 28, 31};
  2489. v16i8 shuffler3 = {2, 1, 6, 5, 10, 9, 14, 13, 18, 17, 22, 21, 26, 25, 30, 29};
  2490. v16u8 const_0x125E = (v16u8)__msa_fill_h(0x264A);
  2491. v16u8 const_0x7000 = (v16u8)__msa_fill_h(0x7000);
  2492. v16u8 const_0x264A = (v16u8)__msa_fill_h(0x125E);
  2493. v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
  2494. for (x = 0; x < width; x += 32) {
  2495. READ_ARGB(s, t, vec0, vec1, vec2, vec3);
  2496. ARGBTOUV(vec0, vec1, vec2, vec3, const_0x125E, const_0x7000, const_0x264A,
  2497. const_0x8080, shuffler0, shuffler1, shuffler2, shuffler3, dst0,
  2498. dst1);
  2499. ST_UB(dst0, dst_u);
  2500. ST_UB(dst1, dst_v);
  2501. s += 128;
  2502. t += 128;
  2503. dst_u += 16;
  2504. dst_v += 16;
  2505. }
  2506. }
  2507. void I444ToARGBRow_MSA(const uint8* src_y,
  2508. const uint8* src_u,
  2509. const uint8* src_v,
  2510. uint8* rgb_buf,
  2511. const struct YuvConstants* yuvconstants,
  2512. int width) {
  2513. int x;
  2514. v16u8 src0, src1, src2, dst0, dst1;
  2515. v8u16 vec0, vec1, vec2;
  2516. v4i32 reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9;
  2517. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  2518. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  2519. v8i16 zero = {0};
  2520. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  2521. vec_br, vec_yg);
  2522. for (x = 0; x < width; x += 8) {
  2523. READI444(src_y, src_u, src_v, src0, src1, src2);
  2524. vec0 = (v8u16)__msa_ilvr_b((v16i8)src0, (v16i8)src0);
  2525. reg0 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec0);
  2526. reg1 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec0);
  2527. reg0 *= vec_yg;
  2528. reg1 *= vec_yg;
  2529. reg0 = __msa_srai_w(reg0, 16);
  2530. reg1 = __msa_srai_w(reg1, 16);
  2531. reg4 = reg0 + vec_br;
  2532. reg5 = reg1 + vec_br;
  2533. reg2 = reg0 + vec_bg;
  2534. reg3 = reg1 + vec_bg;
  2535. reg0 += vec_bb;
  2536. reg1 += vec_bb;
  2537. vec0 = (v8u16)__msa_ilvr_b((v16i8)zero, (v16i8)src1);
  2538. vec1 = (v8u16)__msa_ilvr_b((v16i8)zero, (v16i8)src2);
  2539. reg6 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec0);
  2540. reg7 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec0);
  2541. reg8 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec1);
  2542. reg9 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec1);
  2543. reg0 -= reg6 * vec_ub;
  2544. reg1 -= reg7 * vec_ub;
  2545. reg2 -= reg6 * vec_ug;
  2546. reg3 -= reg7 * vec_ug;
  2547. reg4 -= reg8 * vec_vr;
  2548. reg5 -= reg9 * vec_vr;
  2549. reg2 -= reg8 * vec_vg;
  2550. reg3 -= reg9 * vec_vg;
  2551. reg0 = __msa_srai_w(reg0, 6);
  2552. reg1 = __msa_srai_w(reg1, 6);
  2553. reg2 = __msa_srai_w(reg2, 6);
  2554. reg3 = __msa_srai_w(reg3, 6);
  2555. reg4 = __msa_srai_w(reg4, 6);
  2556. reg5 = __msa_srai_w(reg5, 6);
  2557. CLIP_0TO255(reg0, reg1, reg2, reg3, reg4, reg5);
  2558. vec0 = (v8u16)__msa_pckev_h((v8i16)reg1, (v8i16)reg0);
  2559. vec1 = (v8u16)__msa_pckev_h((v8i16)reg3, (v8i16)reg2);
  2560. vec2 = (v8u16)__msa_pckev_h((v8i16)reg5, (v8i16)reg4);
  2561. vec0 = (v8u16)__msa_ilvev_b((v16i8)vec1, (v16i8)vec0);
  2562. vec1 = (v8u16)__msa_ilvev_b((v16i8)alpha, (v16i8)vec2);
  2563. dst0 = (v16u8)__msa_ilvr_h((v8i16)vec1, (v8i16)vec0);
  2564. dst1 = (v16u8)__msa_ilvl_h((v8i16)vec1, (v8i16)vec0);
  2565. ST_UB2(dst0, dst1, rgb_buf, 16);
  2566. src_y += 8;
  2567. src_u += 8;
  2568. src_v += 8;
  2569. rgb_buf += 32;
  2570. }
  2571. }
  2572. void I400ToARGBRow_MSA(const uint8* src_y, uint8* rgb_buf, int width) {
  2573. int x;
  2574. v16u8 src0, res0, res1, res2, res3, res4, dst0, dst1, dst2, dst3;
  2575. v8i16 vec0, vec1;
  2576. v4i32 reg0, reg1, reg2, reg3;
  2577. v4i32 vec_yg = __msa_fill_w(0x4A35);
  2578. v8i16 vec_ygb = __msa_fill_h(0xFB78);
  2579. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  2580. v8i16 max = __msa_ldi_h(0xFF);
  2581. v8i16 zero = {0};
  2582. for (x = 0; x < width; x += 16) {
  2583. src0 = (v16u8)__msa_ld_b((v16i8*)src_y, 0);
  2584. vec0 = (v8i16)__msa_ilvr_b((v16i8)src0, (v16i8)src0);
  2585. vec1 = (v8i16)__msa_ilvl_b((v16i8)src0, (v16i8)src0);
  2586. reg0 = (v4i32)__msa_ilvr_h(zero, vec0);
  2587. reg1 = (v4i32)__msa_ilvl_h(zero, vec0);
  2588. reg2 = (v4i32)__msa_ilvr_h(zero, vec1);
  2589. reg3 = (v4i32)__msa_ilvl_h(zero, vec1);
  2590. reg0 *= vec_yg;
  2591. reg1 *= vec_yg;
  2592. reg2 *= vec_yg;
  2593. reg3 *= vec_yg;
  2594. reg0 = __msa_srai_w(reg0, 16);
  2595. reg1 = __msa_srai_w(reg1, 16);
  2596. reg2 = __msa_srai_w(reg2, 16);
  2597. reg3 = __msa_srai_w(reg3, 16);
  2598. vec0 = (v8i16)__msa_pckev_h((v8i16)reg1, (v8i16)reg0);
  2599. vec1 = (v8i16)__msa_pckev_h((v8i16)reg3, (v8i16)reg2);
  2600. vec0 += vec_ygb;
  2601. vec1 += vec_ygb;
  2602. vec0 = __msa_srai_h(vec0, 6);
  2603. vec1 = __msa_srai_h(vec1, 6);
  2604. vec0 = __msa_maxi_s_h(vec0, 0);
  2605. vec1 = __msa_maxi_s_h(vec1, 0);
  2606. vec0 = __msa_min_s_h(max, vec0);
  2607. vec1 = __msa_min_s_h(max, vec1);
  2608. res0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  2609. res1 = (v16u8)__msa_ilvr_b((v16i8)res0, (v16i8)res0);
  2610. res2 = (v16u8)__msa_ilvl_b((v16i8)res0, (v16i8)res0);
  2611. res3 = (v16u8)__msa_ilvr_b((v16i8)alpha, (v16i8)res0);
  2612. res4 = (v16u8)__msa_ilvl_b((v16i8)alpha, (v16i8)res0);
  2613. dst0 = (v16u8)__msa_ilvr_b((v16i8)res3, (v16i8)res1);
  2614. dst1 = (v16u8)__msa_ilvl_b((v16i8)res3, (v16i8)res1);
  2615. dst2 = (v16u8)__msa_ilvr_b((v16i8)res4, (v16i8)res2);
  2616. dst3 = (v16u8)__msa_ilvl_b((v16i8)res4, (v16i8)res2);
  2617. ST_UB4(dst0, dst1, dst2, dst3, rgb_buf, 16);
  2618. src_y += 16;
  2619. rgb_buf += 64;
  2620. }
  2621. }
  2622. void J400ToARGBRow_MSA(const uint8* src_y, uint8* dst_argb, int width) {
  2623. int x;
  2624. v16u8 src0, vec0, vec1, vec2, vec3, dst0, dst1, dst2, dst3;
  2625. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  2626. for (x = 0; x < width; x += 16) {
  2627. src0 = (v16u8)__msa_ld_b((v16i8*)src_y, 0);
  2628. vec0 = (v16u8)__msa_ilvr_b((v16i8)src0, (v16i8)src0);
  2629. vec1 = (v16u8)__msa_ilvl_b((v16i8)src0, (v16i8)src0);
  2630. vec2 = (v16u8)__msa_ilvr_b((v16i8)alpha, (v16i8)src0);
  2631. vec3 = (v16u8)__msa_ilvl_b((v16i8)alpha, (v16i8)src0);
  2632. dst0 = (v16u8)__msa_ilvr_b((v16i8)vec2, (v16i8)vec0);
  2633. dst1 = (v16u8)__msa_ilvl_b((v16i8)vec2, (v16i8)vec0);
  2634. dst2 = (v16u8)__msa_ilvr_b((v16i8)vec3, (v16i8)vec1);
  2635. dst3 = (v16u8)__msa_ilvl_b((v16i8)vec3, (v16i8)vec1);
  2636. ST_UB4(dst0, dst1, dst2, dst3, dst_argb, 16);
  2637. src_y += 16;
  2638. dst_argb += 64;
  2639. }
  2640. }
  2641. void YUY2ToARGBRow_MSA(const uint8* src_yuy2,
  2642. uint8* rgb_buf,
  2643. const struct YuvConstants* yuvconstants,
  2644. int width) {
  2645. int x;
  2646. v16u8 src0, src1, src2;
  2647. v8i16 vec0, vec1, vec2;
  2648. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  2649. v4i32 vec_ubvr, vec_ugvg;
  2650. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  2651. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  2652. vec_br, vec_yg);
  2653. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  2654. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  2655. for (x = 0; x < width; x += 8) {
  2656. src0 = (v16u8)__msa_ld_b((v16i8*)src_yuy2, 0);
  2657. src1 = (v16u8)__msa_pckev_b((v16i8)src0, (v16i8)src0);
  2658. src2 = (v16u8)__msa_pckod_b((v16i8)src0, (v16i8)src0);
  2659. YUVTORGB(src1, src2, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  2660. vec0, vec1, vec2);
  2661. STOREARGB(vec0, vec1, vec2, alpha, rgb_buf);
  2662. src_yuy2 += 16;
  2663. rgb_buf += 32;
  2664. }
  2665. }
  2666. void UYVYToARGBRow_MSA(const uint8* src_uyvy,
  2667. uint8* rgb_buf,
  2668. const struct YuvConstants* yuvconstants,
  2669. int width) {
  2670. int x;
  2671. v16u8 src0, src1, src2;
  2672. v8i16 vec0, vec1, vec2;
  2673. v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg;
  2674. v4i32 vec_ubvr, vec_ugvg;
  2675. v16u8 alpha = (v16u8)__msa_ldi_b(ALPHA_VAL);
  2676. YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg,
  2677. vec_br, vec_yg);
  2678. vec_ubvr = __msa_ilvr_w(vec_vr, vec_ub);
  2679. vec_ugvg = (v4i32)__msa_ilvev_h((v8i16)vec_vg, (v8i16)vec_ug);
  2680. for (x = 0; x < width; x += 8) {
  2681. src0 = (v16u8)__msa_ld_b((v16i8*)src_uyvy, 0);
  2682. src1 = (v16u8)__msa_pckod_b((v16i8)src0, (v16i8)src0);
  2683. src2 = (v16u8)__msa_pckev_b((v16i8)src0, (v16i8)src0);
  2684. YUVTORGB(src1, src2, vec_ubvr, vec_ugvg, vec_bb, vec_bg, vec_br, vec_yg,
  2685. vec0, vec1, vec2);
  2686. STOREARGB(vec0, vec1, vec2, alpha, rgb_buf);
  2687. src_uyvy += 16;
  2688. rgb_buf += 32;
  2689. }
  2690. }
  2691. void InterpolateRow_MSA(uint8* dst_ptr,
  2692. const uint8* src_ptr,
  2693. ptrdiff_t src_stride,
  2694. int width,
  2695. int32 source_y_fraction) {
  2696. int32 y1_fraction = source_y_fraction;
  2697. int32 y0_fraction = 256 - y1_fraction;
  2698. uint16 y_fractions;
  2699. const uint8* s = src_ptr;
  2700. const uint8* t = src_ptr + src_stride;
  2701. int x;
  2702. v16u8 src0, src1, src2, src3, dst0, dst1;
  2703. v8u16 vec0, vec1, vec2, vec3, y_frac;
  2704. if (0 == y1_fraction) {
  2705. memcpy(dst_ptr, src_ptr, width);
  2706. return;
  2707. }
  2708. if (128 == y1_fraction) {
  2709. for (x = 0; x < width; x += 32) {
  2710. src0 = (v16u8)__msa_ld_b((v16i8*)s, 0);
  2711. src1 = (v16u8)__msa_ld_b((v16i8*)s, 16);
  2712. src2 = (v16u8)__msa_ld_b((v16i8*)t, 0);
  2713. src3 = (v16u8)__msa_ld_b((v16i8*)t, 16);
  2714. dst0 = __msa_aver_u_b(src0, src2);
  2715. dst1 = __msa_aver_u_b(src1, src3);
  2716. ST_UB2(dst0, dst1, dst_ptr, 16);
  2717. s += 32;
  2718. t += 32;
  2719. dst_ptr += 32;
  2720. }
  2721. return;
  2722. }
  2723. y_fractions = (uint16)(y0_fraction + (y1_fraction << 8));
  2724. y_frac = (v8u16)__msa_fill_h(y_fractions);
  2725. for (x = 0; x < width; x += 32) {
  2726. src0 = (v16u8)__msa_ld_b((v16i8*)s, 0);
  2727. src1 = (v16u8)__msa_ld_b((v16i8*)s, 16);
  2728. src2 = (v16u8)__msa_ld_b((v16i8*)t, 0);
  2729. src3 = (v16u8)__msa_ld_b((v16i8*)t, 16);
  2730. vec0 = (v8u16)__msa_ilvr_b((v16i8)src2, (v16i8)src0);
  2731. vec1 = (v8u16)__msa_ilvl_b((v16i8)src2, (v16i8)src0);
  2732. vec2 = (v8u16)__msa_ilvr_b((v16i8)src3, (v16i8)src1);
  2733. vec3 = (v8u16)__msa_ilvl_b((v16i8)src3, (v16i8)src1);
  2734. vec0 = (v8u16)__msa_dotp_u_h((v16u8)vec0, (v16u8)y_frac);
  2735. vec1 = (v8u16)__msa_dotp_u_h((v16u8)vec1, (v16u8)y_frac);
  2736. vec2 = (v8u16)__msa_dotp_u_h((v16u8)vec2, (v16u8)y_frac);
  2737. vec3 = (v8u16)__msa_dotp_u_h((v16u8)vec3, (v16u8)y_frac);
  2738. vec0 = (v8u16)__msa_srari_h((v8i16)vec0, 8);
  2739. vec1 = (v8u16)__msa_srari_h((v8i16)vec1, 8);
  2740. vec2 = (v8u16)__msa_srari_h((v8i16)vec2, 8);
  2741. vec3 = (v8u16)__msa_srari_h((v8i16)vec3, 8);
  2742. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  2743. dst1 = (v16u8)__msa_pckev_b((v16i8)vec3, (v16i8)vec2);
  2744. ST_UB2(dst0, dst1, dst_ptr, 16);
  2745. s += 32;
  2746. t += 32;
  2747. dst_ptr += 32;
  2748. }
  2749. }
  2750. void ARGBSetRow_MSA(uint8* dst_argb, uint32 v32, int width) {
  2751. int x;
  2752. v4i32 dst0 = __builtin_msa_fill_w(v32);
  2753. for (x = 0; x < width; x += 4) {
  2754. ST_UB(dst0, dst_argb);
  2755. dst_argb += 16;
  2756. }
  2757. }
  2758. void RAWToRGB24Row_MSA(const uint8* src_raw, uint8* dst_rgb24, int width) {
  2759. int x;
  2760. v16u8 src0, src1, src2, src3, src4, dst0, dst1, dst2;
  2761. v16i8 shuffler0 = {2, 1, 0, 5, 4, 3, 8, 7, 6, 11, 10, 9, 14, 13, 12, 17};
  2762. v16i8 shuffler1 = {8, 7, 12, 11, 10, 15, 14, 13,
  2763. 18, 17, 16, 21, 20, 19, 24, 23};
  2764. v16i8 shuffler2 = {14, 19, 18, 17, 22, 21, 20, 25,
  2765. 24, 23, 28, 27, 26, 31, 30, 29};
  2766. for (x = 0; x < width; x += 16) {
  2767. src0 = (v16u8)__msa_ld_b((v16i8*)src_raw, 0);
  2768. src1 = (v16u8)__msa_ld_b((v16i8*)src_raw, 16);
  2769. src2 = (v16u8)__msa_ld_b((v16i8*)src_raw, 32);
  2770. src3 = (v16u8)__msa_sldi_b((v16i8)src1, (v16i8)src0, 8);
  2771. src4 = (v16u8)__msa_sldi_b((v16i8)src2, (v16i8)src1, 8);
  2772. dst0 = (v16u8)__msa_vshf_b(shuffler0, (v16i8)src1, (v16i8)src0);
  2773. dst1 = (v16u8)__msa_vshf_b(shuffler1, (v16i8)src4, (v16i8)src3);
  2774. dst2 = (v16u8)__msa_vshf_b(shuffler2, (v16i8)src2, (v16i8)src1);
  2775. ST_UB2(dst0, dst1, dst_rgb24, 16);
  2776. ST_UB(dst2, (dst_rgb24 + 32));
  2777. src_raw += 48;
  2778. dst_rgb24 += 48;
  2779. }
  2780. }
  2781. void MergeUVRow_MSA(const uint8* src_u,
  2782. const uint8* src_v,
  2783. uint8* dst_uv,
  2784. int width) {
  2785. int x;
  2786. v16u8 src0, src1, dst0, dst1;
  2787. for (x = 0; x < width; x += 16) {
  2788. src0 = (v16u8)__msa_ld_b((v16i8*)src_u, 0);
  2789. src1 = (v16u8)__msa_ld_b((v16i8*)src_v, 0);
  2790. dst0 = (v16u8)__msa_ilvr_b((v16i8)src1, (v16i8)src0);
  2791. dst1 = (v16u8)__msa_ilvl_b((v16i8)src1, (v16i8)src0);
  2792. ST_UB2(dst0, dst1, dst_uv, 16);
  2793. src_u += 16;
  2794. src_v += 16;
  2795. dst_uv += 32;
  2796. }
  2797. }
  2798. void ARGBExtractAlphaRow_MSA(const uint8* src_argb, uint8* dst_a, int width) {
  2799. int i;
  2800. v16u8 src0, src1, src2, src3, vec0, vec1, dst0;
  2801. for (i = 0; i < width; i += 16) {
  2802. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0);
  2803. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16);
  2804. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb, 32);
  2805. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb, 48);
  2806. vec0 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  2807. vec1 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2);
  2808. dst0 = (v16u8)__msa_pckod_b((v16i8)vec1, (v16i8)vec0);
  2809. ST_UB(dst0, dst_a);
  2810. src_argb += 64;
  2811. dst_a += 16;
  2812. }
  2813. }
  2814. void ARGBBlendRow_MSA(const uint8* src_argb0,
  2815. const uint8* src_argb1,
  2816. uint8* dst_argb,
  2817. int width) {
  2818. int x;
  2819. v16u8 src0, src1, src2, src3, dst0, dst1;
  2820. v8u16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  2821. v8u16 vec8, vec9, vec10, vec11, vec12, vec13;
  2822. v8u16 const_256 = (v8u16)__msa_ldi_h(256);
  2823. v16u8 const_255 = (v16u8)__msa_ldi_b(255);
  2824. v16u8 mask = {0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255};
  2825. v16i8 zero = {0};
  2826. for (x = 0; x < width; x += 8) {
  2827. src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
  2828. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
  2829. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb1, 0);
  2830. src3 = (v16u8)__msa_ld_b((v16i8*)src_argb1, 16);
  2831. vec0 = (v8u16)__msa_ilvr_b(zero, (v16i8)src0);
  2832. vec1 = (v8u16)__msa_ilvl_b(zero, (v16i8)src0);
  2833. vec2 = (v8u16)__msa_ilvr_b(zero, (v16i8)src1);
  2834. vec3 = (v8u16)__msa_ilvl_b(zero, (v16i8)src1);
  2835. vec4 = (v8u16)__msa_ilvr_b(zero, (v16i8)src2);
  2836. vec5 = (v8u16)__msa_ilvl_b(zero, (v16i8)src2);
  2837. vec6 = (v8u16)__msa_ilvr_b(zero, (v16i8)src3);
  2838. vec7 = (v8u16)__msa_ilvl_b(zero, (v16i8)src3);
  2839. vec8 = (v8u16)__msa_fill_h(vec0[3]);
  2840. vec9 = (v8u16)__msa_fill_h(vec0[7]);
  2841. vec10 = (v8u16)__msa_fill_h(vec1[3]);
  2842. vec11 = (v8u16)__msa_fill_h(vec1[7]);
  2843. vec8 = (v8u16)__msa_pckev_d((v2i64)vec9, (v2i64)vec8);
  2844. vec9 = (v8u16)__msa_pckev_d((v2i64)vec11, (v2i64)vec10);
  2845. vec10 = (v8u16)__msa_fill_h(vec2[3]);
  2846. vec11 = (v8u16)__msa_fill_h(vec2[7]);
  2847. vec12 = (v8u16)__msa_fill_h(vec3[3]);
  2848. vec13 = (v8u16)__msa_fill_h(vec3[7]);
  2849. vec10 = (v8u16)__msa_pckev_d((v2i64)vec11, (v2i64)vec10);
  2850. vec11 = (v8u16)__msa_pckev_d((v2i64)vec13, (v2i64)vec12);
  2851. vec8 = const_256 - vec8;
  2852. vec9 = const_256 - vec9;
  2853. vec10 = const_256 - vec10;
  2854. vec11 = const_256 - vec11;
  2855. vec8 *= vec4;
  2856. vec9 *= vec5;
  2857. vec10 *= vec6;
  2858. vec11 *= vec7;
  2859. vec8 = (v8u16)__msa_srai_h((v8i16)vec8, 8);
  2860. vec9 = (v8u16)__msa_srai_h((v8i16)vec9, 8);
  2861. vec10 = (v8u16)__msa_srai_h((v8i16)vec10, 8);
  2862. vec11 = (v8u16)__msa_srai_h((v8i16)vec11, 8);
  2863. vec0 += vec8;
  2864. vec1 += vec9;
  2865. vec2 += vec10;
  2866. vec3 += vec11;
  2867. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  2868. dst1 = (v16u8)__msa_pckev_b((v16i8)vec3, (v16i8)vec2);
  2869. dst0 = __msa_bmnz_v(dst0, const_255, mask);
  2870. dst1 = __msa_bmnz_v(dst1, const_255, mask);
  2871. ST_UB2(dst0, dst1, dst_argb, 16);
  2872. src_argb0 += 32;
  2873. src_argb1 += 32;
  2874. dst_argb += 32;
  2875. }
  2876. }
  2877. void ARGBQuantizeRow_MSA(uint8* dst_argb,
  2878. int scale,
  2879. int interval_size,
  2880. int interval_offset,
  2881. int width) {
  2882. int x;
  2883. v16u8 src0, src1, src2, src3, dst0, dst1, dst2, dst3;
  2884. v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  2885. v4i32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
  2886. v4i32 tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
  2887. v4i32 vec_scale = __msa_fill_w(scale);
  2888. v16u8 vec_int_sz = (v16u8)__msa_fill_b(interval_size);
  2889. v16u8 vec_int_ofst = (v16u8)__msa_fill_b(interval_offset);
  2890. v16i8 mask = {0, 1, 2, 19, 4, 5, 6, 23, 8, 9, 10, 27, 12, 13, 14, 31};
  2891. v16i8 zero = {0};
  2892. for (x = 0; x < width; x += 8) {
  2893. src0 = (v16u8)__msa_ld_b((v16i8*)dst_argb, 0);
  2894. src1 = (v16u8)__msa_ld_b((v16i8*)dst_argb, 16);
  2895. src2 = (v16u8)__msa_ld_b((v16i8*)dst_argb, 32);
  2896. src3 = (v16u8)__msa_ld_b((v16i8*)dst_argb, 48);
  2897. vec0 = (v8i16)__msa_ilvr_b(zero, (v16i8)src0);
  2898. vec1 = (v8i16)__msa_ilvl_b(zero, (v16i8)src0);
  2899. vec2 = (v8i16)__msa_ilvr_b(zero, (v16i8)src1);
  2900. vec3 = (v8i16)__msa_ilvl_b(zero, (v16i8)src1);
  2901. vec4 = (v8i16)__msa_ilvr_b(zero, (v16i8)src2);
  2902. vec5 = (v8i16)__msa_ilvl_b(zero, (v16i8)src2);
  2903. vec6 = (v8i16)__msa_ilvr_b(zero, (v16i8)src3);
  2904. vec7 = (v8i16)__msa_ilvl_b(zero, (v16i8)src3);
  2905. tmp0 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec0);
  2906. tmp1 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec0);
  2907. tmp2 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec1);
  2908. tmp3 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec1);
  2909. tmp4 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec2);
  2910. tmp5 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec2);
  2911. tmp6 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec3);
  2912. tmp7 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec3);
  2913. tmp8 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec4);
  2914. tmp9 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec4);
  2915. tmp10 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec5);
  2916. tmp11 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec5);
  2917. tmp12 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec6);
  2918. tmp13 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec6);
  2919. tmp14 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec7);
  2920. tmp15 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec7);
  2921. tmp0 *= vec_scale;
  2922. tmp1 *= vec_scale;
  2923. tmp2 *= vec_scale;
  2924. tmp3 *= vec_scale;
  2925. tmp4 *= vec_scale;
  2926. tmp5 *= vec_scale;
  2927. tmp6 *= vec_scale;
  2928. tmp7 *= vec_scale;
  2929. tmp8 *= vec_scale;
  2930. tmp9 *= vec_scale;
  2931. tmp10 *= vec_scale;
  2932. tmp11 *= vec_scale;
  2933. tmp12 *= vec_scale;
  2934. tmp13 *= vec_scale;
  2935. tmp14 *= vec_scale;
  2936. tmp15 *= vec_scale;
  2937. tmp0 >>= 16;
  2938. tmp1 >>= 16;
  2939. tmp2 >>= 16;
  2940. tmp3 >>= 16;
  2941. tmp4 >>= 16;
  2942. tmp5 >>= 16;
  2943. tmp6 >>= 16;
  2944. tmp7 >>= 16;
  2945. tmp8 >>= 16;
  2946. tmp9 >>= 16;
  2947. tmp10 >>= 16;
  2948. tmp11 >>= 16;
  2949. tmp12 >>= 16;
  2950. tmp13 >>= 16;
  2951. tmp14 >>= 16;
  2952. tmp15 >>= 16;
  2953. vec0 = (v8i16)__msa_pckev_h((v8i16)tmp1, (v8i16)tmp0);
  2954. vec1 = (v8i16)__msa_pckev_h((v8i16)tmp3, (v8i16)tmp2);
  2955. vec2 = (v8i16)__msa_pckev_h((v8i16)tmp5, (v8i16)tmp4);
  2956. vec3 = (v8i16)__msa_pckev_h((v8i16)tmp7, (v8i16)tmp6);
  2957. vec4 = (v8i16)__msa_pckev_h((v8i16)tmp9, (v8i16)tmp8);
  2958. vec5 = (v8i16)__msa_pckev_h((v8i16)tmp11, (v8i16)tmp10);
  2959. vec6 = (v8i16)__msa_pckev_h((v8i16)tmp13, (v8i16)tmp12);
  2960. vec7 = (v8i16)__msa_pckev_h((v8i16)tmp15, (v8i16)tmp14);
  2961. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  2962. dst1 = (v16u8)__msa_pckev_b((v16i8)vec3, (v16i8)vec2);
  2963. dst2 = (v16u8)__msa_pckev_b((v16i8)vec5, (v16i8)vec4);
  2964. dst3 = (v16u8)__msa_pckev_b((v16i8)vec7, (v16i8)vec6);
  2965. dst0 *= vec_int_sz;
  2966. dst1 *= vec_int_sz;
  2967. dst2 *= vec_int_sz;
  2968. dst3 *= vec_int_sz;
  2969. dst0 += vec_int_ofst;
  2970. dst1 += vec_int_ofst;
  2971. dst2 += vec_int_ofst;
  2972. dst3 += vec_int_ofst;
  2973. dst0 = (v16u8)__msa_vshf_b(mask, (v16i8)src0, (v16i8)dst0);
  2974. dst1 = (v16u8)__msa_vshf_b(mask, (v16i8)src1, (v16i8)dst1);
  2975. dst2 = (v16u8)__msa_vshf_b(mask, (v16i8)src2, (v16i8)dst2);
  2976. dst3 = (v16u8)__msa_vshf_b(mask, (v16i8)src3, (v16i8)dst3);
  2977. ST_UB4(dst0, dst1, dst2, dst3, dst_argb, 16);
  2978. dst_argb += 64;
  2979. }
  2980. }
  2981. void ARGBColorMatrixRow_MSA(const uint8* src_argb,
  2982. uint8* dst_argb,
  2983. const int8* matrix_argb,
  2984. int width) {
  2985. int32 x;
  2986. v16i8 src0;
  2987. v16u8 src1, src2, dst0, dst1;
  2988. v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9;
  2989. v8i16 vec10, vec11, vec12, vec13, vec14, vec15, vec16, vec17;
  2990. v4i32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
  2991. v4i32 tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
  2992. v16i8 zero = {0};
  2993. v8i16 max = __msa_ldi_h(255);
  2994. src0 = __msa_ld_b((v16i8*)matrix_argb, 0);
  2995. vec0 = (v8i16)__msa_ilvr_b(zero, src0);
  2996. vec1 = (v8i16)__msa_ilvl_b(zero, src0);
  2997. for (x = 0; x < width; x += 8) {
  2998. src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0);
  2999. src2 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16);
  3000. vec2 = (v8i16)__msa_ilvr_b(zero, (v16i8)src1);
  3001. vec3 = (v8i16)__msa_ilvl_b(zero, (v16i8)src1);
  3002. vec4 = (v8i16)__msa_ilvr_b(zero, (v16i8)src2);
  3003. vec5 = (v8i16)__msa_ilvl_b(zero, (v16i8)src2);
  3004. vec6 = (v8i16)__msa_pckod_d((v2i64)vec2, (v2i64)vec2);
  3005. vec7 = (v8i16)__msa_pckod_d((v2i64)vec3, (v2i64)vec3);
  3006. vec8 = (v8i16)__msa_pckod_d((v2i64)vec4, (v2i64)vec4);
  3007. vec9 = (v8i16)__msa_pckod_d((v2i64)vec5, (v2i64)vec5);
  3008. vec2 = (v8i16)__msa_pckev_d((v2i64)vec2, (v2i64)vec2);
  3009. vec3 = (v8i16)__msa_pckev_d((v2i64)vec3, (v2i64)vec3);
  3010. vec4 = (v8i16)__msa_pckev_d((v2i64)vec4, (v2i64)vec4);
  3011. vec5 = (v8i16)__msa_pckev_d((v2i64)vec5, (v2i64)vec5);
  3012. vec10 = vec2 * vec0;
  3013. vec11 = vec2 * vec1;
  3014. vec12 = vec6 * vec0;
  3015. vec13 = vec6 * vec1;
  3016. tmp0 = __msa_hadd_s_w(vec10, vec10);
  3017. tmp1 = __msa_hadd_s_w(vec11, vec11);
  3018. tmp2 = __msa_hadd_s_w(vec12, vec12);
  3019. tmp3 = __msa_hadd_s_w(vec13, vec13);
  3020. vec14 = vec3 * vec0;
  3021. vec15 = vec3 * vec1;
  3022. vec16 = vec7 * vec0;
  3023. vec17 = vec7 * vec1;
  3024. tmp4 = __msa_hadd_s_w(vec14, vec14);
  3025. tmp5 = __msa_hadd_s_w(vec15, vec15);
  3026. tmp6 = __msa_hadd_s_w(vec16, vec16);
  3027. tmp7 = __msa_hadd_s_w(vec17, vec17);
  3028. vec10 = __msa_pckev_h((v8i16)tmp1, (v8i16)tmp0);
  3029. vec11 = __msa_pckev_h((v8i16)tmp3, (v8i16)tmp2);
  3030. vec12 = __msa_pckev_h((v8i16)tmp5, (v8i16)tmp4);
  3031. vec13 = __msa_pckev_h((v8i16)tmp7, (v8i16)tmp6);
  3032. tmp0 = __msa_hadd_s_w(vec10, vec10);
  3033. tmp1 = __msa_hadd_s_w(vec11, vec11);
  3034. tmp2 = __msa_hadd_s_w(vec12, vec12);
  3035. tmp3 = __msa_hadd_s_w(vec13, vec13);
  3036. tmp0 = __msa_srai_w(tmp0, 6);
  3037. tmp1 = __msa_srai_w(tmp1, 6);
  3038. tmp2 = __msa_srai_w(tmp2, 6);
  3039. tmp3 = __msa_srai_w(tmp3, 6);
  3040. vec2 = vec4 * vec0;
  3041. vec6 = vec4 * vec1;
  3042. vec3 = vec8 * vec0;
  3043. vec7 = vec8 * vec1;
  3044. tmp8 = __msa_hadd_s_w(vec2, vec2);
  3045. tmp9 = __msa_hadd_s_w(vec6, vec6);
  3046. tmp10 = __msa_hadd_s_w(vec3, vec3);
  3047. tmp11 = __msa_hadd_s_w(vec7, vec7);
  3048. vec4 = vec5 * vec0;
  3049. vec8 = vec5 * vec1;
  3050. vec5 = vec9 * vec0;
  3051. vec9 = vec9 * vec1;
  3052. tmp12 = __msa_hadd_s_w(vec4, vec4);
  3053. tmp13 = __msa_hadd_s_w(vec8, vec8);
  3054. tmp14 = __msa_hadd_s_w(vec5, vec5);
  3055. tmp15 = __msa_hadd_s_w(vec9, vec9);
  3056. vec14 = __msa_pckev_h((v8i16)tmp9, (v8i16)tmp8);
  3057. vec15 = __msa_pckev_h((v8i16)tmp11, (v8i16)tmp10);
  3058. vec16 = __msa_pckev_h((v8i16)tmp13, (v8i16)tmp12);
  3059. vec17 = __msa_pckev_h((v8i16)tmp15, (v8i16)tmp14);
  3060. tmp4 = __msa_hadd_s_w(vec14, vec14);
  3061. tmp5 = __msa_hadd_s_w(vec15, vec15);
  3062. tmp6 = __msa_hadd_s_w(vec16, vec16);
  3063. tmp7 = __msa_hadd_s_w(vec17, vec17);
  3064. tmp4 = __msa_srai_w(tmp4, 6);
  3065. tmp5 = __msa_srai_w(tmp5, 6);
  3066. tmp6 = __msa_srai_w(tmp6, 6);
  3067. tmp7 = __msa_srai_w(tmp7, 6);
  3068. vec10 = __msa_pckev_h((v8i16)tmp1, (v8i16)tmp0);
  3069. vec11 = __msa_pckev_h((v8i16)tmp3, (v8i16)tmp2);
  3070. vec12 = __msa_pckev_h((v8i16)tmp5, (v8i16)tmp4);
  3071. vec13 = __msa_pckev_h((v8i16)tmp7, (v8i16)tmp6);
  3072. vec10 = __msa_maxi_s_h(vec10, 0);
  3073. vec11 = __msa_maxi_s_h(vec11, 0);
  3074. vec12 = __msa_maxi_s_h(vec12, 0);
  3075. vec13 = __msa_maxi_s_h(vec13, 0);
  3076. vec10 = __msa_min_s_h(vec10, max);
  3077. vec11 = __msa_min_s_h(vec11, max);
  3078. vec12 = __msa_min_s_h(vec12, max);
  3079. vec13 = __msa_min_s_h(vec13, max);
  3080. dst0 = (v16u8)__msa_pckev_b((v16i8)vec11, (v16i8)vec10);
  3081. dst1 = (v16u8)__msa_pckev_b((v16i8)vec13, (v16i8)vec12);
  3082. ST_UB2(dst0, dst1, dst_argb, 16);
  3083. src_argb += 32;
  3084. dst_argb += 32;
  3085. }
  3086. }
  3087. void SplitUVRow_MSA(const uint8* src_uv,
  3088. uint8* dst_u,
  3089. uint8* dst_v,
  3090. int width) {
  3091. int x;
  3092. v16u8 src0, src1, src2, src3, dst0, dst1, dst2, dst3;
  3093. for (x = 0; x < width; x += 32) {
  3094. src0 = (v16u8)__msa_ld_b((v16i8*)src_uv, 0);
  3095. src1 = (v16u8)__msa_ld_b((v16i8*)src_uv, 16);
  3096. src2 = (v16u8)__msa_ld_b((v16i8*)src_uv, 32);
  3097. src3 = (v16u8)__msa_ld_b((v16i8*)src_uv, 48);
  3098. dst0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0);
  3099. dst1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2);
  3100. dst2 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0);
  3101. dst3 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2);
  3102. ST_UB2(dst0, dst1, dst_u, 16);
  3103. ST_UB2(dst2, dst3, dst_v, 16);
  3104. src_uv += 64;
  3105. dst_u += 32;
  3106. dst_v += 32;
  3107. }
  3108. }
  3109. void SetRow_MSA(uint8* dst, uint8 v8, int width) {
  3110. int x;
  3111. v16u8 dst0 = (v16u8)__msa_fill_b(v8);
  3112. for (x = 0; x < width; x += 16) {
  3113. ST_UB(dst0, dst);
  3114. dst += 16;
  3115. }
  3116. }
  3117. void MirrorUVRow_MSA(const uint8* src_uv,
  3118. uint8* dst_u,
  3119. uint8* dst_v,
  3120. int width) {
  3121. int x;
  3122. v16u8 src0, src1, src2, src3;
  3123. v16u8 dst0, dst1, dst2, dst3;
  3124. v16i8 mask0 = {30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0};
  3125. v16i8 mask1 = {31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1};
  3126. src_uv += (2 * width);
  3127. for (x = 0; x < width; x += 32) {
  3128. src_uv -= 64;
  3129. src2 = (v16u8)__msa_ld_b((v16i8*)src_uv, 0);
  3130. src3 = (v16u8)__msa_ld_b((v16i8*)src_uv, 16);
  3131. src0 = (v16u8)__msa_ld_b((v16i8*)src_uv, 32);
  3132. src1 = (v16u8)__msa_ld_b((v16i8*)src_uv, 48);
  3133. dst0 = (v16u8)__msa_vshf_b(mask1, (v16i8)src1, (v16i8)src0);
  3134. dst1 = (v16u8)__msa_vshf_b(mask1, (v16i8)src3, (v16i8)src2);
  3135. dst2 = (v16u8)__msa_vshf_b(mask0, (v16i8)src1, (v16i8)src0);
  3136. dst3 = (v16u8)__msa_vshf_b(mask0, (v16i8)src3, (v16i8)src2);
  3137. ST_UB2(dst0, dst1, dst_v, 16);
  3138. ST_UB2(dst2, dst3, dst_u, 16);
  3139. dst_u += 32;
  3140. dst_v += 32;
  3141. }
  3142. }
  3143. void SobelXRow_MSA(const uint8* src_y0,
  3144. const uint8* src_y1,
  3145. const uint8* src_y2,
  3146. uint8* dst_sobelx,
  3147. int32 width) {
  3148. int x;
  3149. v16u8 src0, src1, src2, src3, src4, src5, dst0;
  3150. v8i16 vec0, vec1, vec2, vec3, vec4, vec5;
  3151. v16i8 mask0 = {0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9};
  3152. v16i8 tmp = __msa_ldi_b(8);
  3153. v16i8 mask1 = mask0 + tmp;
  3154. v8i16 zero = {0};
  3155. v8i16 max = __msa_ldi_h(255);
  3156. for (x = 0; x < width; x += 16) {
  3157. src0 = (v16u8)__msa_ld_b((v16i8*)src_y0, 0);
  3158. src1 = (v16u8)__msa_ld_b((v16i8*)src_y0, 16);
  3159. src2 = (v16u8)__msa_ld_b((v16i8*)src_y1, 0);
  3160. src3 = (v16u8)__msa_ld_b((v16i8*)src_y1, 16);
  3161. src4 = (v16u8)__msa_ld_b((v16i8*)src_y2, 0);
  3162. src5 = (v16u8)__msa_ld_b((v16i8*)src_y2, 16);
  3163. vec0 = (v8i16)__msa_vshf_b(mask0, (v16i8)src1, (v16i8)src0);
  3164. vec1 = (v8i16)__msa_vshf_b(mask1, (v16i8)src1, (v16i8)src0);
  3165. vec2 = (v8i16)__msa_vshf_b(mask0, (v16i8)src3, (v16i8)src2);
  3166. vec3 = (v8i16)__msa_vshf_b(mask1, (v16i8)src3, (v16i8)src2);
  3167. vec4 = (v8i16)__msa_vshf_b(mask0, (v16i8)src5, (v16i8)src4);
  3168. vec5 = (v8i16)__msa_vshf_b(mask1, (v16i8)src5, (v16i8)src4);
  3169. vec0 = (v8i16)__msa_hsub_u_h((v16u8)vec0, (v16u8)vec0);
  3170. vec1 = (v8i16)__msa_hsub_u_h((v16u8)vec1, (v16u8)vec1);
  3171. vec2 = (v8i16)__msa_hsub_u_h((v16u8)vec2, (v16u8)vec2);
  3172. vec3 = (v8i16)__msa_hsub_u_h((v16u8)vec3, (v16u8)vec3);
  3173. vec4 = (v8i16)__msa_hsub_u_h((v16u8)vec4, (v16u8)vec4);
  3174. vec5 = (v8i16)__msa_hsub_u_h((v16u8)vec5, (v16u8)vec5);
  3175. vec0 += vec2;
  3176. vec1 += vec3;
  3177. vec4 += vec2;
  3178. vec5 += vec3;
  3179. vec0 += vec4;
  3180. vec1 += vec5;
  3181. vec0 = __msa_add_a_h(zero, vec0);
  3182. vec1 = __msa_add_a_h(zero, vec1);
  3183. vec0 = __msa_maxi_s_h(vec0, 0);
  3184. vec1 = __msa_maxi_s_h(vec1, 0);
  3185. vec0 = __msa_min_s_h(max, vec0);
  3186. vec1 = __msa_min_s_h(max, vec1);
  3187. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  3188. ST_UB(dst0, dst_sobelx);
  3189. src_y0 += 16;
  3190. src_y1 += 16;
  3191. src_y2 += 16;
  3192. dst_sobelx += 16;
  3193. }
  3194. }
  3195. void SobelYRow_MSA(const uint8* src_y0,
  3196. const uint8* src_y1,
  3197. uint8* dst_sobely,
  3198. int32 width) {
  3199. int x;
  3200. v16u8 src0, src1, dst0;
  3201. v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6;
  3202. v8i16 zero = {0};
  3203. v8i16 max = __msa_ldi_h(255);
  3204. for (x = 0; x < width; x += 16) {
  3205. src0 = (v16u8)__msa_ld_b((v16i8*)src_y0, 0);
  3206. src1 = (v16u8)__msa_ld_b((v16i8*)src_y1, 0);
  3207. vec0 = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)src0);
  3208. vec1 = (v8i16)__msa_ilvl_b((v16i8)zero, (v16i8)src0);
  3209. vec2 = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)src1);
  3210. vec3 = (v8i16)__msa_ilvl_b((v16i8)zero, (v16i8)src1);
  3211. vec0 -= vec2;
  3212. vec1 -= vec3;
  3213. vec6[0] = src_y0[16] - src_y1[16];
  3214. vec6[1] = src_y0[17] - src_y1[17];
  3215. vec2 = (v8i16)__msa_sldi_b((v16i8)vec1, (v16i8)vec0, 2);
  3216. vec3 = (v8i16)__msa_sldi_b((v16i8)vec6, (v16i8)vec1, 2);
  3217. vec4 = (v8i16)__msa_sldi_b((v16i8)vec1, (v16i8)vec0, 4);
  3218. vec5 = (v8i16)__msa_sldi_b((v16i8)vec6, (v16i8)vec1, 4);
  3219. vec0 += vec2;
  3220. vec1 += vec3;
  3221. vec4 += vec2;
  3222. vec5 += vec3;
  3223. vec0 += vec4;
  3224. vec1 += vec5;
  3225. vec0 = __msa_add_a_h(zero, vec0);
  3226. vec1 = __msa_add_a_h(zero, vec1);
  3227. vec0 = __msa_maxi_s_h(vec0, 0);
  3228. vec1 = __msa_maxi_s_h(vec1, 0);
  3229. vec0 = __msa_min_s_h(max, vec0);
  3230. vec1 = __msa_min_s_h(max, vec1);
  3231. dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0);
  3232. ST_UB(dst0, dst_sobely);
  3233. src_y0 += 16;
  3234. src_y1 += 16;
  3235. dst_sobely += 16;
  3236. }
  3237. }
  3238. void HalfFloatRow_MSA(const uint16* src, uint16* dst, float scale, int width) {
  3239. int i;
  3240. v8u16 src0, src1, src2, src3, dst0, dst1, dst2, dst3;
  3241. v4u32 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  3242. v4f32 fvec0, fvec1, fvec2, fvec3, fvec4, fvec5, fvec6, fvec7;
  3243. v4f32 mult_vec;
  3244. v8i16 zero = {0};
  3245. mult_vec[0] = 1.9259299444e-34f * scale;
  3246. mult_vec = (v4f32)__msa_splati_w((v4i32)mult_vec, 0);
  3247. for (i = 0; i < width; i += 32) {
  3248. src0 = (v8u16)__msa_ld_h((v8i16*)src, 0);
  3249. src1 = (v8u16)__msa_ld_h((v8i16*)src, 16);
  3250. src2 = (v8u16)__msa_ld_h((v8i16*)src, 32);
  3251. src3 = (v8u16)__msa_ld_h((v8i16*)src, 48);
  3252. vec0 = (v4u32)__msa_ilvr_h(zero, (v8i16)src0);
  3253. vec1 = (v4u32)__msa_ilvl_h(zero, (v8i16)src0);
  3254. vec2 = (v4u32)__msa_ilvr_h(zero, (v8i16)src1);
  3255. vec3 = (v4u32)__msa_ilvl_h(zero, (v8i16)src1);
  3256. vec4 = (v4u32)__msa_ilvr_h(zero, (v8i16)src2);
  3257. vec5 = (v4u32)__msa_ilvl_h(zero, (v8i16)src2);
  3258. vec6 = (v4u32)__msa_ilvr_h(zero, (v8i16)src3);
  3259. vec7 = (v4u32)__msa_ilvl_h(zero, (v8i16)src3);
  3260. fvec0 = __msa_ffint_u_w(vec0);
  3261. fvec1 = __msa_ffint_u_w(vec1);
  3262. fvec2 = __msa_ffint_u_w(vec2);
  3263. fvec3 = __msa_ffint_u_w(vec3);
  3264. fvec4 = __msa_ffint_u_w(vec4);
  3265. fvec5 = __msa_ffint_u_w(vec5);
  3266. fvec6 = __msa_ffint_u_w(vec6);
  3267. fvec7 = __msa_ffint_u_w(vec7);
  3268. fvec0 *= mult_vec;
  3269. fvec1 *= mult_vec;
  3270. fvec2 *= mult_vec;
  3271. fvec3 *= mult_vec;
  3272. fvec4 *= mult_vec;
  3273. fvec5 *= mult_vec;
  3274. fvec6 *= mult_vec;
  3275. fvec7 *= mult_vec;
  3276. vec0 = ((v4u32)fvec0) >> 13;
  3277. vec1 = ((v4u32)fvec1) >> 13;
  3278. vec2 = ((v4u32)fvec2) >> 13;
  3279. vec3 = ((v4u32)fvec3) >> 13;
  3280. vec4 = ((v4u32)fvec4) >> 13;
  3281. vec5 = ((v4u32)fvec5) >> 13;
  3282. vec6 = ((v4u32)fvec6) >> 13;
  3283. vec7 = ((v4u32)fvec7) >> 13;
  3284. dst0 = (v8u16)__msa_pckev_h((v8i16)vec1, (v8i16)vec0);
  3285. dst1 = (v8u16)__msa_pckev_h((v8i16)vec3, (v8i16)vec2);
  3286. dst2 = (v8u16)__msa_pckev_h((v8i16)vec5, (v8i16)vec4);
  3287. dst3 = (v8u16)__msa_pckev_h((v8i16)vec7, (v8i16)vec6);
  3288. ST_UH2(dst0, dst1, dst, 8);
  3289. ST_UH2(dst2, dst3, dst + 16, 8);
  3290. src += 32;
  3291. dst += 32;
  3292. }
  3293. }
  3294. #ifdef __cplusplus
  3295. } // extern "C"
  3296. } // namespace libyuv
  3297. #endif
  3298. #endif // !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa)