IntrinsicsAArch64.td 110 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545
  1. //===- IntrinsicsAARCH64.td - Defines AARCH64 intrinsics ---*- tablegen -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file defines all of the AARCH64-specific intrinsics.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. let TargetPrefix = "aarch64" in {
  13. def int_aarch64_ldxr : Intrinsic<[llvm_i64_ty], [llvm_anyptr_ty],
  14. [IntrNoFree, IntrWillReturn]>;
  15. def int_aarch64_ldaxr : Intrinsic<[llvm_i64_ty], [llvm_anyptr_ty],
  16. [IntrNoFree, IntrWillReturn]>;
  17. def int_aarch64_stxr : Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_anyptr_ty],
  18. [IntrNoFree, IntrWillReturn]>;
  19. def int_aarch64_stlxr : Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_anyptr_ty],
  20. [IntrNoFree, IntrWillReturn]>;
  21. def int_aarch64_ldxp : Intrinsic<[llvm_i64_ty, llvm_i64_ty], [llvm_ptr_ty],
  22. [IntrNoFree, IntrWillReturn]>;
  23. def int_aarch64_ldaxp : Intrinsic<[llvm_i64_ty, llvm_i64_ty], [llvm_ptr_ty],
  24. [IntrNoFree, IntrWillReturn]>;
  25. def int_aarch64_stxp : Intrinsic<[llvm_i32_ty],
  26. [llvm_i64_ty, llvm_i64_ty, llvm_ptr_ty],
  27. [IntrNoFree, IntrWillReturn]>;
  28. def int_aarch64_stlxp : Intrinsic<[llvm_i32_ty],
  29. [llvm_i64_ty, llvm_i64_ty, llvm_ptr_ty],
  30. [IntrNoFree, IntrWillReturn]>;
  31. def int_aarch64_clrex : Intrinsic<[]>;
  32. def int_aarch64_sdiv : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
  33. LLVMMatchType<0>], [IntrNoMem]>;
  34. def int_aarch64_udiv : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
  35. LLVMMatchType<0>], [IntrNoMem]>;
  36. def int_aarch64_fjcvtzs : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
  37. def int_aarch64_cls: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
  38. def int_aarch64_cls64: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i64_ty], [IntrNoMem]>;
  39. def int_aarch64_frint32z
  40. : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ], [ LLVMMatchType<0> ],
  41. [ IntrNoMem ]>;
  42. def int_aarch64_frint64z
  43. : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ], [ LLVMMatchType<0> ],
  44. [ IntrNoMem ]>;
  45. def int_aarch64_frint32x
  46. : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ], [ LLVMMatchType<0> ],
  47. [ IntrNoMem ]>;
  48. def int_aarch64_frint64x
  49. : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ], [ LLVMMatchType<0> ],
  50. [ IntrNoMem ]>;
  51. //===----------------------------------------------------------------------===//
  52. // HINT
  53. def int_aarch64_hint : DefaultAttrsIntrinsic<[], [llvm_i32_ty]>;
  54. //===----------------------------------------------------------------------===//
  55. // Data Barrier Instructions
  56. def int_aarch64_dmb : GCCBuiltin<"__builtin_arm_dmb">, MSBuiltin<"__dmb">,
  57. Intrinsic<[], [llvm_i32_ty], [IntrNoFree, IntrWillReturn]>;
  58. def int_aarch64_dsb : GCCBuiltin<"__builtin_arm_dsb">, MSBuiltin<"__dsb">,
  59. Intrinsic<[], [llvm_i32_ty], [IntrNoFree, IntrWillReturn]>;
  60. def int_aarch64_isb : GCCBuiltin<"__builtin_arm_isb">, MSBuiltin<"__isb">,
  61. Intrinsic<[], [llvm_i32_ty], [IntrNoFree, IntrWillReturn]>;
  62. // A space-consuming intrinsic primarily for testing block and jump table
  63. // placements. The first argument is the number of bytes this "instruction"
  64. // takes up, the second and return value are essentially chains, used to force
  65. // ordering during ISel.
  66. def int_aarch64_space : DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i32_ty, llvm_i64_ty], []>;
  67. }
  68. //===----------------------------------------------------------------------===//
  69. // Advanced SIMD (NEON)
  70. let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.".
  71. class AdvSIMD_2Scalar_Float_Intrinsic
  72. : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
  73. [IntrNoMem]>;
  74. class AdvSIMD_FPToIntRounding_Intrinsic
  75. : DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty], [IntrNoMem]>;
  76. class AdvSIMD_1IntArg_Intrinsic
  77. : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem]>;
  78. class AdvSIMD_1FloatArg_Intrinsic
  79. : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], [IntrNoMem]>;
  80. class AdvSIMD_1VectorArg_Intrinsic
  81. : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [LLVMMatchType<0>], [IntrNoMem]>;
  82. class AdvSIMD_1VectorArg_Expand_Intrinsic
  83. : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty], [IntrNoMem]>;
  84. class AdvSIMD_1VectorArg_Long_Intrinsic
  85. : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [LLVMTruncatedType<0>], [IntrNoMem]>;
  86. class AdvSIMD_1IntArg_Narrow_Intrinsic
  87. : DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyint_ty], [IntrNoMem]>;
  88. class AdvSIMD_1VectorArg_Narrow_Intrinsic
  89. : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMExtendedType<0>], [IntrNoMem]>;
  90. class AdvSIMD_1VectorArg_Int_Across_Intrinsic
  91. : DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyvector_ty], [IntrNoMem]>;
  92. class AdvSIMD_1VectorArg_Float_Across_Intrinsic
  93. : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [llvm_anyvector_ty], [IntrNoMem]>;
  94. class AdvSIMD_2IntArg_Intrinsic
  95. : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
  96. [IntrNoMem]>;
  97. class AdvSIMD_2FloatArg_Intrinsic
  98. : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
  99. [IntrNoMem]>;
  100. class AdvSIMD_2VectorArg_Intrinsic
  101. : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
  102. [IntrNoMem]>;
  103. class AdvSIMD_2VectorArg_Compare_Intrinsic
  104. : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty, LLVMMatchType<1>],
  105. [IntrNoMem]>;
  106. class AdvSIMD_2Arg_FloatCompare_Intrinsic
  107. : DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty, LLVMMatchType<1>],
  108. [IntrNoMem]>;
  109. class AdvSIMD_2VectorArg_Long_Intrinsic
  110. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  111. [LLVMTruncatedType<0>, LLVMTruncatedType<0>],
  112. [IntrNoMem]>;
  113. class AdvSIMD_2VectorArg_Wide_Intrinsic
  114. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  115. [LLVMMatchType<0>, LLVMTruncatedType<0>],
  116. [IntrNoMem]>;
  117. class AdvSIMD_2VectorArg_Narrow_Intrinsic
  118. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  119. [LLVMExtendedType<0>, LLVMExtendedType<0>],
  120. [IntrNoMem]>;
  121. class AdvSIMD_2Arg_Scalar_Narrow_Intrinsic
  122. : DefaultAttrsIntrinsic<[llvm_anyint_ty],
  123. [LLVMExtendedType<0>, llvm_i32_ty],
  124. [IntrNoMem]>;
  125. class AdvSIMD_2VectorArg_Scalar_Expand_BySize_Intrinsic
  126. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  127. [llvm_anyvector_ty],
  128. [IntrNoMem]>;
  129. class AdvSIMD_2VectorArg_Scalar_Wide_BySize_Intrinsic
  130. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  131. [LLVMTruncatedType<0>],
  132. [IntrNoMem]>;
  133. class AdvSIMD_2VectorArg_Scalar_Wide_Intrinsic
  134. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  135. [LLVMTruncatedType<0>, llvm_i32_ty],
  136. [IntrNoMem]>;
  137. class AdvSIMD_2VectorArg_Tied_Narrow_Intrinsic
  138. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  139. [LLVMHalfElementsVectorType<0>, llvm_anyvector_ty],
  140. [IntrNoMem]>;
  141. class AdvSIMD_2VectorArg_Lane_Intrinsic
  142. : DefaultAttrsIntrinsic<[llvm_anyint_ty],
  143. [LLVMMatchType<0>, llvm_anyint_ty, llvm_i32_ty],
  144. [IntrNoMem]>;
  145. class AdvSIMD_3VectorArg_Intrinsic
  146. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  147. [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
  148. [IntrNoMem]>;
  149. class AdvSIMD_3VectorArg_Scalar_Intrinsic
  150. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  151. [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty],
  152. [IntrNoMem]>;
  153. class AdvSIMD_3VectorArg_Tied_Narrow_Intrinsic
  154. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  155. [LLVMHalfElementsVectorType<0>, llvm_anyvector_ty,
  156. LLVMMatchType<1>], [IntrNoMem]>;
  157. class AdvSIMD_3VectorArg_Scalar_Tied_Narrow_Intrinsic
  158. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  159. [LLVMHalfElementsVectorType<0>, llvm_anyvector_ty, llvm_i32_ty],
  160. [IntrNoMem]>;
  161. class AdvSIMD_CvtFxToFP_Intrinsic
  162. : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [llvm_anyint_ty, llvm_i32_ty],
  163. [IntrNoMem]>;
  164. class AdvSIMD_CvtFPToFx_Intrinsic
  165. : DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty, llvm_i32_ty],
  166. [IntrNoMem]>;
  167. class AdvSIMD_1Arg_Intrinsic
  168. : DefaultAttrsIntrinsic<[llvm_any_ty], [LLVMMatchType<0>], [IntrNoMem]>;
  169. class AdvSIMD_Dot_Intrinsic
  170. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  171. [LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<1>],
  172. [IntrNoMem]>;
  173. class AdvSIMD_FP16FML_Intrinsic
  174. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  175. [LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<1>],
  176. [IntrNoMem]>;
  177. class AdvSIMD_MatMul_Intrinsic
  178. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  179. [LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<1>],
  180. [IntrNoMem]>;
  181. class AdvSIMD_FML_Intrinsic
  182. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  183. [LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<1>],
  184. [IntrNoMem]>;
  185. class AdvSIMD_BF16FML_Intrinsic
  186. : DefaultAttrsIntrinsic<[llvm_v4f32_ty],
  187. [llvm_v4f32_ty, llvm_v8bf16_ty, llvm_v8bf16_ty],
  188. [IntrNoMem]>;
  189. }
  190. // Arithmetic ops
  191. let TargetPrefix = "aarch64", IntrProperties = [IntrNoMem] in {
  192. // Vector Add Across Lanes
  193. def int_aarch64_neon_saddv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
  194. def int_aarch64_neon_uaddv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
  195. def int_aarch64_neon_faddv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
  196. // Vector Long Add Across Lanes
  197. def int_aarch64_neon_saddlv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
  198. def int_aarch64_neon_uaddlv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
  199. // Vector Halving Add
  200. def int_aarch64_neon_shadd : AdvSIMD_2VectorArg_Intrinsic;
  201. def int_aarch64_neon_uhadd : AdvSIMD_2VectorArg_Intrinsic;
  202. // Vector Rounding Halving Add
  203. def int_aarch64_neon_srhadd : AdvSIMD_2VectorArg_Intrinsic;
  204. def int_aarch64_neon_urhadd : AdvSIMD_2VectorArg_Intrinsic;
  205. // Vector Saturating Add
  206. def int_aarch64_neon_sqadd : AdvSIMD_2IntArg_Intrinsic;
  207. def int_aarch64_neon_suqadd : AdvSIMD_2IntArg_Intrinsic;
  208. def int_aarch64_neon_usqadd : AdvSIMD_2IntArg_Intrinsic;
  209. def int_aarch64_neon_uqadd : AdvSIMD_2IntArg_Intrinsic;
  210. // Vector Add High-Half
  211. // FIXME: this is a legacy intrinsic for aarch64_simd.h. Remove it when that
  212. // header is no longer supported.
  213. def int_aarch64_neon_addhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
  214. // Vector Rounding Add High-Half
  215. def int_aarch64_neon_raddhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
  216. // Vector Saturating Doubling Multiply High
  217. def int_aarch64_neon_sqdmulh : AdvSIMD_2IntArg_Intrinsic;
  218. def int_aarch64_neon_sqdmulh_lane : AdvSIMD_2VectorArg_Lane_Intrinsic;
  219. def int_aarch64_neon_sqdmulh_laneq : AdvSIMD_2VectorArg_Lane_Intrinsic;
  220. // Vector Saturating Rounding Doubling Multiply High
  221. def int_aarch64_neon_sqrdmulh : AdvSIMD_2IntArg_Intrinsic;
  222. def int_aarch64_neon_sqrdmulh_lane : AdvSIMD_2VectorArg_Lane_Intrinsic;
  223. def int_aarch64_neon_sqrdmulh_laneq : AdvSIMD_2VectorArg_Lane_Intrinsic;
  224. // Vector Polynominal Multiply
  225. def int_aarch64_neon_pmul : AdvSIMD_2VectorArg_Intrinsic;
  226. // Vector Long Multiply
  227. def int_aarch64_neon_smull : AdvSIMD_2VectorArg_Long_Intrinsic;
  228. def int_aarch64_neon_umull : AdvSIMD_2VectorArg_Long_Intrinsic;
  229. def int_aarch64_neon_pmull : AdvSIMD_2VectorArg_Long_Intrinsic;
  230. // 64-bit polynomial multiply really returns an i128, which is not legal. Fake
  231. // it with a v16i8.
  232. def int_aarch64_neon_pmull64 :
  233. DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
  234. // Vector Extending Multiply
  235. def int_aarch64_neon_fmulx : AdvSIMD_2FloatArg_Intrinsic {
  236. let IntrProperties = [IntrNoMem, Commutative];
  237. }
  238. // Vector Saturating Doubling Long Multiply
  239. def int_aarch64_neon_sqdmull : AdvSIMD_2VectorArg_Long_Intrinsic;
  240. def int_aarch64_neon_sqdmulls_scalar
  241. : DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
  242. // Vector Halving Subtract
  243. def int_aarch64_neon_shsub : AdvSIMD_2VectorArg_Intrinsic;
  244. def int_aarch64_neon_uhsub : AdvSIMD_2VectorArg_Intrinsic;
  245. // Vector Saturating Subtract
  246. def int_aarch64_neon_sqsub : AdvSIMD_2IntArg_Intrinsic;
  247. def int_aarch64_neon_uqsub : AdvSIMD_2IntArg_Intrinsic;
  248. // Vector Subtract High-Half
  249. // FIXME: this is a legacy intrinsic for aarch64_simd.h. Remove it when that
  250. // header is no longer supported.
  251. def int_aarch64_neon_subhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
  252. // Vector Rounding Subtract High-Half
  253. def int_aarch64_neon_rsubhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
  254. // Vector Compare Absolute Greater-than-or-equal
  255. def int_aarch64_neon_facge : AdvSIMD_2Arg_FloatCompare_Intrinsic;
  256. // Vector Compare Absolute Greater-than
  257. def int_aarch64_neon_facgt : AdvSIMD_2Arg_FloatCompare_Intrinsic;
  258. // Vector Absolute Difference
  259. def int_aarch64_neon_sabd : AdvSIMD_2VectorArg_Intrinsic;
  260. def int_aarch64_neon_uabd : AdvSIMD_2VectorArg_Intrinsic;
  261. def int_aarch64_neon_fabd : AdvSIMD_2VectorArg_Intrinsic;
  262. // Scalar Absolute Difference
  263. def int_aarch64_sisd_fabd : AdvSIMD_2Scalar_Float_Intrinsic;
  264. // Vector Max
  265. def int_aarch64_neon_smax : AdvSIMD_2VectorArg_Intrinsic;
  266. def int_aarch64_neon_umax : AdvSIMD_2VectorArg_Intrinsic;
  267. def int_aarch64_neon_fmax : AdvSIMD_2FloatArg_Intrinsic;
  268. def int_aarch64_neon_fmaxnmp : AdvSIMD_2VectorArg_Intrinsic;
  269. // Vector Max Across Lanes
  270. def int_aarch64_neon_smaxv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
  271. def int_aarch64_neon_umaxv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
  272. def int_aarch64_neon_fmaxv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
  273. def int_aarch64_neon_fmaxnmv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
  274. // Vector Min
  275. def int_aarch64_neon_smin : AdvSIMD_2VectorArg_Intrinsic;
  276. def int_aarch64_neon_umin : AdvSIMD_2VectorArg_Intrinsic;
  277. def int_aarch64_neon_fmin : AdvSIMD_2FloatArg_Intrinsic;
  278. def int_aarch64_neon_fminnmp : AdvSIMD_2VectorArg_Intrinsic;
  279. // Vector Min/Max Number
  280. def int_aarch64_neon_fminnm : AdvSIMD_2FloatArg_Intrinsic;
  281. def int_aarch64_neon_fmaxnm : AdvSIMD_2FloatArg_Intrinsic;
  282. // Vector Min Across Lanes
  283. def int_aarch64_neon_sminv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
  284. def int_aarch64_neon_uminv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
  285. def int_aarch64_neon_fminv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
  286. def int_aarch64_neon_fminnmv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
  287. // Pairwise Add
  288. def int_aarch64_neon_addp : AdvSIMD_2VectorArg_Intrinsic;
  289. def int_aarch64_neon_faddp : AdvSIMD_2VectorArg_Intrinsic;
  290. // Long Pairwise Add
  291. // FIXME: In theory, we shouldn't need intrinsics for saddlp or
  292. // uaddlp, but tblgen's type inference currently can't handle the
  293. // pattern fragments this ends up generating.
  294. def int_aarch64_neon_saddlp : AdvSIMD_1VectorArg_Expand_Intrinsic;
  295. def int_aarch64_neon_uaddlp : AdvSIMD_1VectorArg_Expand_Intrinsic;
  296. // Folding Maximum
  297. def int_aarch64_neon_smaxp : AdvSIMD_2VectorArg_Intrinsic;
  298. def int_aarch64_neon_umaxp : AdvSIMD_2VectorArg_Intrinsic;
  299. def int_aarch64_neon_fmaxp : AdvSIMD_2VectorArg_Intrinsic;
  300. // Folding Minimum
  301. def int_aarch64_neon_sminp : AdvSIMD_2VectorArg_Intrinsic;
  302. def int_aarch64_neon_uminp : AdvSIMD_2VectorArg_Intrinsic;
  303. def int_aarch64_neon_fminp : AdvSIMD_2VectorArg_Intrinsic;
  304. // Reciprocal Estimate/Step
  305. def int_aarch64_neon_frecps : AdvSIMD_2FloatArg_Intrinsic;
  306. def int_aarch64_neon_frsqrts : AdvSIMD_2FloatArg_Intrinsic;
  307. // Reciprocal Exponent
  308. def int_aarch64_neon_frecpx : AdvSIMD_1FloatArg_Intrinsic;
  309. // Vector Saturating Shift Left
  310. def int_aarch64_neon_sqshl : AdvSIMD_2IntArg_Intrinsic;
  311. def int_aarch64_neon_uqshl : AdvSIMD_2IntArg_Intrinsic;
  312. // Vector Rounding Shift Left
  313. def int_aarch64_neon_srshl : AdvSIMD_2IntArg_Intrinsic;
  314. def int_aarch64_neon_urshl : AdvSIMD_2IntArg_Intrinsic;
  315. // Vector Saturating Rounding Shift Left
  316. def int_aarch64_neon_sqrshl : AdvSIMD_2IntArg_Intrinsic;
  317. def int_aarch64_neon_uqrshl : AdvSIMD_2IntArg_Intrinsic;
  318. // Vector Signed->Unsigned Shift Left by Constant
  319. def int_aarch64_neon_sqshlu : AdvSIMD_2IntArg_Intrinsic;
  320. // Vector Signed->Unsigned Narrowing Saturating Shift Right by Constant
  321. def int_aarch64_neon_sqshrun : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
  322. // Vector Signed->Unsigned Rounding Narrowing Saturating Shift Right by Const
  323. def int_aarch64_neon_sqrshrun : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
  324. // Vector Narrowing Shift Right by Constant
  325. def int_aarch64_neon_sqshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
  326. def int_aarch64_neon_uqshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
  327. // Vector Rounding Narrowing Shift Right by Constant
  328. def int_aarch64_neon_rshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
  329. // Vector Rounding Narrowing Saturating Shift Right by Constant
  330. def int_aarch64_neon_sqrshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
  331. def int_aarch64_neon_uqrshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
  332. // Vector Shift Left
  333. def int_aarch64_neon_sshl : AdvSIMD_2IntArg_Intrinsic;
  334. def int_aarch64_neon_ushl : AdvSIMD_2IntArg_Intrinsic;
  335. // Vector Widening Shift Left by Constant
  336. def int_aarch64_neon_shll : AdvSIMD_2VectorArg_Scalar_Wide_BySize_Intrinsic;
  337. def int_aarch64_neon_sshll : AdvSIMD_2VectorArg_Scalar_Wide_Intrinsic;
  338. def int_aarch64_neon_ushll : AdvSIMD_2VectorArg_Scalar_Wide_Intrinsic;
  339. // Vector Shift Right by Constant and Insert
  340. def int_aarch64_neon_vsri : AdvSIMD_3VectorArg_Scalar_Intrinsic;
  341. // Vector Shift Left by Constant and Insert
  342. def int_aarch64_neon_vsli : AdvSIMD_3VectorArg_Scalar_Intrinsic;
  343. // Vector Saturating Narrow
  344. def int_aarch64_neon_scalar_sqxtn: AdvSIMD_1IntArg_Narrow_Intrinsic;
  345. def int_aarch64_neon_scalar_uqxtn : AdvSIMD_1IntArg_Narrow_Intrinsic;
  346. def int_aarch64_neon_sqxtn : AdvSIMD_1VectorArg_Narrow_Intrinsic;
  347. def int_aarch64_neon_uqxtn : AdvSIMD_1VectorArg_Narrow_Intrinsic;
  348. // Vector Saturating Extract and Unsigned Narrow
  349. def int_aarch64_neon_scalar_sqxtun : AdvSIMD_1IntArg_Narrow_Intrinsic;
  350. def int_aarch64_neon_sqxtun : AdvSIMD_1VectorArg_Narrow_Intrinsic;
  351. // Vector Absolute Value
  352. def int_aarch64_neon_abs : AdvSIMD_1Arg_Intrinsic;
  353. // Vector Saturating Absolute Value
  354. def int_aarch64_neon_sqabs : AdvSIMD_1IntArg_Intrinsic;
  355. // Vector Saturating Negation
  356. def int_aarch64_neon_sqneg : AdvSIMD_1IntArg_Intrinsic;
  357. // Vector Count Leading Sign Bits
  358. def int_aarch64_neon_cls : AdvSIMD_1VectorArg_Intrinsic;
  359. // Vector Reciprocal Estimate
  360. def int_aarch64_neon_urecpe : AdvSIMD_1VectorArg_Intrinsic;
  361. def int_aarch64_neon_frecpe : AdvSIMD_1FloatArg_Intrinsic;
  362. // Vector Square Root Estimate
  363. def int_aarch64_neon_ursqrte : AdvSIMD_1VectorArg_Intrinsic;
  364. def int_aarch64_neon_frsqrte : AdvSIMD_1FloatArg_Intrinsic;
  365. // Vector Conversions Between Half-Precision and Single-Precision.
  366. def int_aarch64_neon_vcvtfp2hf
  367. : DefaultAttrsIntrinsic<[llvm_v4i16_ty], [llvm_v4f32_ty], [IntrNoMem]>;
  368. def int_aarch64_neon_vcvthf2fp
  369. : DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4i16_ty], [IntrNoMem]>;
  370. // Vector Conversions Between Floating-point and Fixed-point.
  371. def int_aarch64_neon_vcvtfp2fxs : AdvSIMD_CvtFPToFx_Intrinsic;
  372. def int_aarch64_neon_vcvtfp2fxu : AdvSIMD_CvtFPToFx_Intrinsic;
  373. def int_aarch64_neon_vcvtfxs2fp : AdvSIMD_CvtFxToFP_Intrinsic;
  374. def int_aarch64_neon_vcvtfxu2fp : AdvSIMD_CvtFxToFP_Intrinsic;
  375. // Vector FP->Int Conversions
  376. def int_aarch64_neon_fcvtas : AdvSIMD_FPToIntRounding_Intrinsic;
  377. def int_aarch64_neon_fcvtau : AdvSIMD_FPToIntRounding_Intrinsic;
  378. def int_aarch64_neon_fcvtms : AdvSIMD_FPToIntRounding_Intrinsic;
  379. def int_aarch64_neon_fcvtmu : AdvSIMD_FPToIntRounding_Intrinsic;
  380. def int_aarch64_neon_fcvtns : AdvSIMD_FPToIntRounding_Intrinsic;
  381. def int_aarch64_neon_fcvtnu : AdvSIMD_FPToIntRounding_Intrinsic;
  382. def int_aarch64_neon_fcvtps : AdvSIMD_FPToIntRounding_Intrinsic;
  383. def int_aarch64_neon_fcvtpu : AdvSIMD_FPToIntRounding_Intrinsic;
  384. def int_aarch64_neon_fcvtzs : AdvSIMD_FPToIntRounding_Intrinsic;
  385. def int_aarch64_neon_fcvtzu : AdvSIMD_FPToIntRounding_Intrinsic;
  386. // v8.5-A Vector FP Rounding
  387. def int_aarch64_neon_frint32x : AdvSIMD_1FloatArg_Intrinsic;
  388. def int_aarch64_neon_frint32z : AdvSIMD_1FloatArg_Intrinsic;
  389. def int_aarch64_neon_frint64x : AdvSIMD_1FloatArg_Intrinsic;
  390. def int_aarch64_neon_frint64z : AdvSIMD_1FloatArg_Intrinsic;
  391. // Scalar FP->Int conversions
  392. // Vector FP Inexact Narrowing
  393. def int_aarch64_neon_fcvtxn : AdvSIMD_1VectorArg_Expand_Intrinsic;
  394. // Scalar FP Inexact Narrowing
  395. def int_aarch64_sisd_fcvtxn : DefaultAttrsIntrinsic<[llvm_float_ty], [llvm_double_ty],
  396. [IntrNoMem]>;
  397. // v8.2-A Dot Product
  398. def int_aarch64_neon_udot : AdvSIMD_Dot_Intrinsic;
  399. def int_aarch64_neon_sdot : AdvSIMD_Dot_Intrinsic;
  400. // v8.6-A Matrix Multiply Intrinsics
  401. def int_aarch64_neon_ummla : AdvSIMD_MatMul_Intrinsic;
  402. def int_aarch64_neon_smmla : AdvSIMD_MatMul_Intrinsic;
  403. def int_aarch64_neon_usmmla : AdvSIMD_MatMul_Intrinsic;
  404. def int_aarch64_neon_usdot : AdvSIMD_Dot_Intrinsic;
  405. def int_aarch64_neon_bfdot : AdvSIMD_Dot_Intrinsic;
  406. def int_aarch64_neon_bfmmla
  407. : DefaultAttrsIntrinsic<[llvm_v4f32_ty],
  408. [llvm_v4f32_ty, llvm_v8bf16_ty, llvm_v8bf16_ty],
  409. [IntrNoMem]>;
  410. def int_aarch64_neon_bfmlalb : AdvSIMD_BF16FML_Intrinsic;
  411. def int_aarch64_neon_bfmlalt : AdvSIMD_BF16FML_Intrinsic;
  412. // v8.6-A Bfloat Intrinsics
  413. def int_aarch64_neon_bfcvt
  414. : DefaultAttrsIntrinsic<[llvm_bfloat_ty], [llvm_float_ty], [IntrNoMem]>;
  415. def int_aarch64_neon_bfcvtn
  416. : DefaultAttrsIntrinsic<[llvm_v8bf16_ty], [llvm_v4f32_ty], [IntrNoMem]>;
  417. def int_aarch64_neon_bfcvtn2
  418. : DefaultAttrsIntrinsic<[llvm_v8bf16_ty],
  419. [llvm_v8bf16_ty, llvm_v4f32_ty],
  420. [IntrNoMem]>;
  421. // v8.2-A FP16 Fused Multiply-Add Long
  422. def int_aarch64_neon_fmlal : AdvSIMD_FP16FML_Intrinsic;
  423. def int_aarch64_neon_fmlsl : AdvSIMD_FP16FML_Intrinsic;
  424. def int_aarch64_neon_fmlal2 : AdvSIMD_FP16FML_Intrinsic;
  425. def int_aarch64_neon_fmlsl2 : AdvSIMD_FP16FML_Intrinsic;
  426. // v8.3-A Floating-point complex add
  427. def int_aarch64_neon_vcadd_rot90 : AdvSIMD_2VectorArg_Intrinsic;
  428. def int_aarch64_neon_vcadd_rot270 : AdvSIMD_2VectorArg_Intrinsic;
  429. def int_aarch64_neon_vcmla_rot0 : AdvSIMD_3VectorArg_Intrinsic;
  430. def int_aarch64_neon_vcmla_rot90 : AdvSIMD_3VectorArg_Intrinsic;
  431. def int_aarch64_neon_vcmla_rot180 : AdvSIMD_3VectorArg_Intrinsic;
  432. def int_aarch64_neon_vcmla_rot270 : AdvSIMD_3VectorArg_Intrinsic;
  433. }
  434. let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.".
  435. class AdvSIMD_2Vector2Index_Intrinsic
  436. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  437. [llvm_anyvector_ty, llvm_i64_ty, LLVMMatchType<0>, llvm_i64_ty],
  438. [IntrNoMem]>;
  439. }
  440. // Vector element to element moves
  441. def int_aarch64_neon_vcopy_lane: AdvSIMD_2Vector2Index_Intrinsic;
  442. let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.".
  443. class AdvSIMD_1Vec_Load_Intrinsic
  444. : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [LLVMAnyPointerType<LLVMMatchType<0>>],
  445. [IntrReadMem, IntrArgMemOnly]>;
  446. class AdvSIMD_1Vec_Store_Lane_Intrinsic
  447. : DefaultAttrsIntrinsic<[], [llvm_anyvector_ty, llvm_i64_ty, llvm_anyptr_ty],
  448. [IntrArgMemOnly, NoCapture<ArgIndex<2>>]>;
  449. class AdvSIMD_2Vec_Load_Intrinsic
  450. : DefaultAttrsIntrinsic<[LLVMMatchType<0>, llvm_anyvector_ty],
  451. [LLVMAnyPointerType<LLVMMatchType<0>>],
  452. [IntrReadMem, IntrArgMemOnly]>;
  453. class AdvSIMD_2Vec_Load_Lane_Intrinsic
  454. : DefaultAttrsIntrinsic<[LLVMMatchType<0>, LLVMMatchType<0>],
  455. [LLVMMatchType<0>, llvm_anyvector_ty,
  456. llvm_i64_ty, llvm_anyptr_ty],
  457. [IntrReadMem, IntrArgMemOnly]>;
  458. class AdvSIMD_2Vec_Store_Intrinsic
  459. : DefaultAttrsIntrinsic<[], [llvm_anyvector_ty, LLVMMatchType<0>,
  460. LLVMAnyPointerType<LLVMMatchType<0>>],
  461. [IntrArgMemOnly, NoCapture<ArgIndex<2>>]>;
  462. class AdvSIMD_2Vec_Store_Lane_Intrinsic
  463. : DefaultAttrsIntrinsic<[], [llvm_anyvector_ty, LLVMMatchType<0>,
  464. llvm_i64_ty, llvm_anyptr_ty],
  465. [IntrArgMemOnly, NoCapture<ArgIndex<3>>]>;
  466. class AdvSIMD_3Vec_Load_Intrinsic
  467. : DefaultAttrsIntrinsic<[LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty],
  468. [LLVMAnyPointerType<LLVMMatchType<0>>],
  469. [IntrReadMem, IntrArgMemOnly]>;
  470. class AdvSIMD_3Vec_Load_Lane_Intrinsic
  471. : DefaultAttrsIntrinsic<[LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
  472. [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty,
  473. llvm_i64_ty, llvm_anyptr_ty],
  474. [IntrReadMem, IntrArgMemOnly]>;
  475. class AdvSIMD_3Vec_Store_Intrinsic
  476. : DefaultAttrsIntrinsic<[], [llvm_anyvector_ty, LLVMMatchType<0>,
  477. LLVMMatchType<0>, LLVMAnyPointerType<LLVMMatchType<0>>],
  478. [IntrArgMemOnly, NoCapture<ArgIndex<3>>]>;
  479. class AdvSIMD_3Vec_Store_Lane_Intrinsic
  480. : DefaultAttrsIntrinsic<[], [llvm_anyvector_ty,
  481. LLVMMatchType<0>, LLVMMatchType<0>,
  482. llvm_i64_ty, llvm_anyptr_ty],
  483. [IntrArgMemOnly, NoCapture<ArgIndex<4>>]>;
  484. class AdvSIMD_4Vec_Load_Intrinsic
  485. : DefaultAttrsIntrinsic<[LLVMMatchType<0>, LLVMMatchType<0>,
  486. LLVMMatchType<0>, llvm_anyvector_ty],
  487. [LLVMAnyPointerType<LLVMMatchType<0>>],
  488. [IntrReadMem, IntrArgMemOnly]>;
  489. class AdvSIMD_4Vec_Load_Lane_Intrinsic
  490. : DefaultAttrsIntrinsic<[LLVMMatchType<0>, LLVMMatchType<0>,
  491. LLVMMatchType<0>, LLVMMatchType<0>],
  492. [LLVMMatchType<0>, LLVMMatchType<0>,
  493. LLVMMatchType<0>, llvm_anyvector_ty,
  494. llvm_i64_ty, llvm_anyptr_ty],
  495. [IntrReadMem, IntrArgMemOnly]>;
  496. class AdvSIMD_4Vec_Store_Intrinsic
  497. : DefaultAttrsIntrinsic<[], [llvm_anyvector_ty, LLVMMatchType<0>,
  498. LLVMMatchType<0>, LLVMMatchType<0>,
  499. LLVMAnyPointerType<LLVMMatchType<0>>],
  500. [IntrArgMemOnly, NoCapture<ArgIndex<4>>]>;
  501. class AdvSIMD_4Vec_Store_Lane_Intrinsic
  502. : DefaultAttrsIntrinsic<[], [llvm_anyvector_ty, LLVMMatchType<0>,
  503. LLVMMatchType<0>, LLVMMatchType<0>,
  504. llvm_i64_ty, llvm_anyptr_ty],
  505. [IntrArgMemOnly, NoCapture<ArgIndex<5>>]>;
  506. }
  507. // Memory ops
  508. def int_aarch64_neon_ld1x2 : AdvSIMD_2Vec_Load_Intrinsic;
  509. def int_aarch64_neon_ld1x3 : AdvSIMD_3Vec_Load_Intrinsic;
  510. def int_aarch64_neon_ld1x4 : AdvSIMD_4Vec_Load_Intrinsic;
  511. def int_aarch64_neon_st1x2 : AdvSIMD_2Vec_Store_Intrinsic;
  512. def int_aarch64_neon_st1x3 : AdvSIMD_3Vec_Store_Intrinsic;
  513. def int_aarch64_neon_st1x4 : AdvSIMD_4Vec_Store_Intrinsic;
  514. def int_aarch64_neon_ld2 : AdvSIMD_2Vec_Load_Intrinsic;
  515. def int_aarch64_neon_ld3 : AdvSIMD_3Vec_Load_Intrinsic;
  516. def int_aarch64_neon_ld4 : AdvSIMD_4Vec_Load_Intrinsic;
  517. def int_aarch64_neon_ld2lane : AdvSIMD_2Vec_Load_Lane_Intrinsic;
  518. def int_aarch64_neon_ld3lane : AdvSIMD_3Vec_Load_Lane_Intrinsic;
  519. def int_aarch64_neon_ld4lane : AdvSIMD_4Vec_Load_Lane_Intrinsic;
  520. def int_aarch64_neon_ld2r : AdvSIMD_2Vec_Load_Intrinsic;
  521. def int_aarch64_neon_ld3r : AdvSIMD_3Vec_Load_Intrinsic;
  522. def int_aarch64_neon_ld4r : AdvSIMD_4Vec_Load_Intrinsic;
  523. def int_aarch64_neon_st2 : AdvSIMD_2Vec_Store_Intrinsic;
  524. def int_aarch64_neon_st3 : AdvSIMD_3Vec_Store_Intrinsic;
  525. def int_aarch64_neon_st4 : AdvSIMD_4Vec_Store_Intrinsic;
  526. def int_aarch64_neon_st2lane : AdvSIMD_2Vec_Store_Lane_Intrinsic;
  527. def int_aarch64_neon_st3lane : AdvSIMD_3Vec_Store_Lane_Intrinsic;
  528. def int_aarch64_neon_st4lane : AdvSIMD_4Vec_Store_Lane_Intrinsic;
  529. let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.".
  530. class AdvSIMD_Tbl1_Intrinsic
  531. : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [llvm_v16i8_ty, LLVMMatchType<0>],
  532. [IntrNoMem]>;
  533. class AdvSIMD_Tbl2_Intrinsic
  534. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  535. [llvm_v16i8_ty, llvm_v16i8_ty, LLVMMatchType<0>], [IntrNoMem]>;
  536. class AdvSIMD_Tbl3_Intrinsic
  537. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  538. [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty,
  539. LLVMMatchType<0>],
  540. [IntrNoMem]>;
  541. class AdvSIMD_Tbl4_Intrinsic
  542. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  543. [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty,
  544. LLVMMatchType<0>],
  545. [IntrNoMem]>;
  546. class AdvSIMD_Tbx1_Intrinsic
  547. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  548. [LLVMMatchType<0>, llvm_v16i8_ty, LLVMMatchType<0>],
  549. [IntrNoMem]>;
  550. class AdvSIMD_Tbx2_Intrinsic
  551. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  552. [LLVMMatchType<0>, llvm_v16i8_ty, llvm_v16i8_ty,
  553. LLVMMatchType<0>],
  554. [IntrNoMem]>;
  555. class AdvSIMD_Tbx3_Intrinsic
  556. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  557. [LLVMMatchType<0>, llvm_v16i8_ty, llvm_v16i8_ty,
  558. llvm_v16i8_ty, LLVMMatchType<0>],
  559. [IntrNoMem]>;
  560. class AdvSIMD_Tbx4_Intrinsic
  561. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  562. [LLVMMatchType<0>, llvm_v16i8_ty, llvm_v16i8_ty,
  563. llvm_v16i8_ty, llvm_v16i8_ty, LLVMMatchType<0>],
  564. [IntrNoMem]>;
  565. }
  566. def int_aarch64_neon_tbl1 : AdvSIMD_Tbl1_Intrinsic;
  567. def int_aarch64_neon_tbl2 : AdvSIMD_Tbl2_Intrinsic;
  568. def int_aarch64_neon_tbl3 : AdvSIMD_Tbl3_Intrinsic;
  569. def int_aarch64_neon_tbl4 : AdvSIMD_Tbl4_Intrinsic;
  570. def int_aarch64_neon_tbx1 : AdvSIMD_Tbx1_Intrinsic;
  571. def int_aarch64_neon_tbx2 : AdvSIMD_Tbx2_Intrinsic;
  572. def int_aarch64_neon_tbx3 : AdvSIMD_Tbx3_Intrinsic;
  573. def int_aarch64_neon_tbx4 : AdvSIMD_Tbx4_Intrinsic;
  574. let TargetPrefix = "aarch64" in {
  575. class FPCR_Get_Intrinsic
  576. : DefaultAttrsIntrinsic<[llvm_i64_ty], [], [IntrNoMem, IntrHasSideEffects]>;
  577. class FPCR_Set_Intrinsic
  578. : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrNoMem, IntrHasSideEffects]>;
  579. class RNDR_Intrinsic
  580. : DefaultAttrsIntrinsic<[llvm_i64_ty, llvm_i1_ty], [], [IntrNoMem, IntrHasSideEffects]>;
  581. }
  582. // FPCR
  583. def int_aarch64_get_fpcr : FPCR_Get_Intrinsic;
  584. def int_aarch64_set_fpcr : FPCR_Set_Intrinsic;
  585. // Armv8.5-A Random number generation intrinsics
  586. def int_aarch64_rndr : RNDR_Intrinsic;
  587. def int_aarch64_rndrrs : RNDR_Intrinsic;
  588. let TargetPrefix = "aarch64" in {
  589. class Crypto_AES_DataKey_Intrinsic
  590. : DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>;
  591. class Crypto_AES_Data_Intrinsic
  592. : DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
  593. // SHA intrinsic taking 5 words of the hash (v4i32, i32) and 4 of the schedule
  594. // (v4i32).
  595. class Crypto_SHA_5Hash4Schedule_Intrinsic
  596. : DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i32_ty, llvm_v4i32_ty],
  597. [IntrNoMem]>;
  598. // SHA intrinsic taking 5 words of the hash (v4i32, i32) and 4 of the schedule
  599. // (v4i32).
  600. class Crypto_SHA_1Hash_Intrinsic
  601. : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
  602. // SHA intrinsic taking 8 words of the schedule
  603. class Crypto_SHA_8Schedule_Intrinsic
  604. : DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
  605. // SHA intrinsic taking 12 words of the schedule
  606. class Crypto_SHA_12Schedule_Intrinsic
  607. : DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
  608. [IntrNoMem]>;
  609. // SHA intrinsic taking 8 words of the hash and 4 of the schedule.
  610. class Crypto_SHA_8Hash4Schedule_Intrinsic
  611. : DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
  612. [IntrNoMem]>;
  613. // SHA512 intrinsic taking 2 arguments
  614. class Crypto_SHA512_2Arg_Intrinsic
  615. : DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty], [IntrNoMem]>;
  616. // SHA512 intrinsic taking 3 Arguments
  617. class Crypto_SHA512_3Arg_Intrinsic
  618. : DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],
  619. [IntrNoMem]>;
  620. // SHA3 Intrinsics taking 3 arguments
  621. class Crypto_SHA3_3Arg_Intrinsic
  622. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  623. [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
  624. [IntrNoMem]>;
  625. // SHA3 Intrinsic taking 2 arguments
  626. class Crypto_SHA3_2Arg_Intrinsic
  627. : DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
  628. [IntrNoMem]>;
  629. // SHA3 Intrinsic taking 3 Arguments 1 immediate
  630. class Crypto_SHA3_2ArgImm_Intrinsic
  631. : DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i64_ty],
  632. [IntrNoMem, ImmArg<ArgIndex<2>>]>;
  633. class Crypto_SM3_3Vector_Intrinsic
  634. : Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
  635. [IntrNoMem]>;
  636. class Crypto_SM3_3VectorIndexed_Intrinsic
  637. : Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty, llvm_i64_ty],
  638. [IntrNoMem, ImmArg<ArgIndex<3>>]>;
  639. class Crypto_SM4_2Vector_Intrinsic
  640. : Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
  641. }
  642. // AES
  643. def int_aarch64_crypto_aese : Crypto_AES_DataKey_Intrinsic;
  644. def int_aarch64_crypto_aesd : Crypto_AES_DataKey_Intrinsic;
  645. def int_aarch64_crypto_aesmc : Crypto_AES_Data_Intrinsic;
  646. def int_aarch64_crypto_aesimc : Crypto_AES_Data_Intrinsic;
  647. // SHA1
  648. def int_aarch64_crypto_sha1c : Crypto_SHA_5Hash4Schedule_Intrinsic;
  649. def int_aarch64_crypto_sha1p : Crypto_SHA_5Hash4Schedule_Intrinsic;
  650. def int_aarch64_crypto_sha1m : Crypto_SHA_5Hash4Schedule_Intrinsic;
  651. def int_aarch64_crypto_sha1h : Crypto_SHA_1Hash_Intrinsic;
  652. def int_aarch64_crypto_sha1su0 : Crypto_SHA_12Schedule_Intrinsic;
  653. def int_aarch64_crypto_sha1su1 : Crypto_SHA_8Schedule_Intrinsic;
  654. // SHA256
  655. def int_aarch64_crypto_sha256h : Crypto_SHA_8Hash4Schedule_Intrinsic;
  656. def int_aarch64_crypto_sha256h2 : Crypto_SHA_8Hash4Schedule_Intrinsic;
  657. def int_aarch64_crypto_sha256su0 : Crypto_SHA_8Schedule_Intrinsic;
  658. def int_aarch64_crypto_sha256su1 : Crypto_SHA_12Schedule_Intrinsic;
  659. //SHA3
  660. def int_aarch64_crypto_eor3s : Crypto_SHA3_3Arg_Intrinsic;
  661. def int_aarch64_crypto_eor3u : Crypto_SHA3_3Arg_Intrinsic;
  662. def int_aarch64_crypto_bcaxs : Crypto_SHA3_3Arg_Intrinsic;
  663. def int_aarch64_crypto_bcaxu : Crypto_SHA3_3Arg_Intrinsic;
  664. def int_aarch64_crypto_rax1 : Crypto_SHA3_2Arg_Intrinsic;
  665. def int_aarch64_crypto_xar : Crypto_SHA3_2ArgImm_Intrinsic;
  666. // SHA512
  667. def int_aarch64_crypto_sha512h : Crypto_SHA512_3Arg_Intrinsic;
  668. def int_aarch64_crypto_sha512h2 : Crypto_SHA512_3Arg_Intrinsic;
  669. def int_aarch64_crypto_sha512su0 : Crypto_SHA512_2Arg_Intrinsic;
  670. def int_aarch64_crypto_sha512su1 : Crypto_SHA512_3Arg_Intrinsic;
  671. //SM3 & SM4
  672. def int_aarch64_crypto_sm3partw1 : Crypto_SM3_3Vector_Intrinsic;
  673. def int_aarch64_crypto_sm3partw2 : Crypto_SM3_3Vector_Intrinsic;
  674. def int_aarch64_crypto_sm3ss1 : Crypto_SM3_3Vector_Intrinsic;
  675. def int_aarch64_crypto_sm3tt1a : Crypto_SM3_3VectorIndexed_Intrinsic;
  676. def int_aarch64_crypto_sm3tt1b : Crypto_SM3_3VectorIndexed_Intrinsic;
  677. def int_aarch64_crypto_sm3tt2a : Crypto_SM3_3VectorIndexed_Intrinsic;
  678. def int_aarch64_crypto_sm3tt2b : Crypto_SM3_3VectorIndexed_Intrinsic;
  679. def int_aarch64_crypto_sm4e : Crypto_SM4_2Vector_Intrinsic;
  680. def int_aarch64_crypto_sm4ekey : Crypto_SM4_2Vector_Intrinsic;
  681. //===----------------------------------------------------------------------===//
  682. // CRC32
  683. let TargetPrefix = "aarch64" in {
  684. def int_aarch64_crc32b : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
  685. [IntrNoMem]>;
  686. def int_aarch64_crc32cb : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
  687. [IntrNoMem]>;
  688. def int_aarch64_crc32h : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
  689. [IntrNoMem]>;
  690. def int_aarch64_crc32ch : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
  691. [IntrNoMem]>;
  692. def int_aarch64_crc32w : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
  693. [IntrNoMem]>;
  694. def int_aarch64_crc32cw : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
  695. [IntrNoMem]>;
  696. def int_aarch64_crc32x : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i64_ty],
  697. [IntrNoMem]>;
  698. def int_aarch64_crc32cx : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i64_ty],
  699. [IntrNoMem]>;
  700. }
  701. //===----------------------------------------------------------------------===//
  702. // Memory Tagging Extensions (MTE) Intrinsics
  703. let TargetPrefix = "aarch64" in {
  704. def int_aarch64_irg : DefaultAttrsIntrinsic<[llvm_ptr_ty], [llvm_ptr_ty, llvm_i64_ty],
  705. [IntrNoMem, IntrHasSideEffects]>;
  706. def int_aarch64_addg : DefaultAttrsIntrinsic<[llvm_ptr_ty], [llvm_ptr_ty, llvm_i64_ty],
  707. [IntrNoMem]>;
  708. def int_aarch64_gmi : DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_ptr_ty, llvm_i64_ty],
  709. [IntrNoMem]>;
  710. def int_aarch64_ldg : DefaultAttrsIntrinsic<[llvm_ptr_ty], [llvm_ptr_ty, llvm_ptr_ty],
  711. [IntrReadMem]>;
  712. def int_aarch64_stg : DefaultAttrsIntrinsic<[], [llvm_ptr_ty, llvm_ptr_ty],
  713. [IntrWriteMem]>;
  714. def int_aarch64_subp : DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_ptr_ty, llvm_ptr_ty],
  715. [IntrNoMem]>;
  716. // The following are codegen-only intrinsics for stack instrumentation.
  717. // Generate a randomly tagged stack base pointer.
  718. def int_aarch64_irg_sp : DefaultAttrsIntrinsic<[llvm_ptr_ty], [llvm_i64_ty],
  719. [IntrNoMem, IntrHasSideEffects]>;
  720. // Transfer pointer tag with offset.
  721. // ptr1 = tagp(ptr0, baseptr, tag_offset) returns a pointer where
  722. // * address is the address in ptr0
  723. // * tag is a function of (tag in baseptr, tag_offset).
  724. // ** Beware, this is not the same function as implemented by the ADDG instruction!
  725. // Backend optimizations may change tag_offset; the only guarantee is that calls
  726. // to tagp with the same pair of (baseptr, tag_offset) will produce pointers
  727. // with the same tag value, assuming the set of excluded tags has not changed.
  728. // Address bits in baseptr and tag bits in ptr0 are ignored.
  729. // When offset between ptr0 and baseptr is a compile time constant, this can be emitted as
  730. // ADDG ptr1, baseptr, (ptr0 - baseptr), tag_offset
  731. // It is intended that ptr0 is an alloca address, and baseptr is the direct output of llvm.aarch64.irg.sp.
  732. def int_aarch64_tagp : DefaultAttrsIntrinsic<[llvm_anyptr_ty], [LLVMMatchType<0>, llvm_ptr_ty, llvm_i64_ty],
  733. [IntrNoMem, ImmArg<ArgIndex<2>>]>;
  734. // Update allocation tags for the memory range to match the tag in the pointer argument.
  735. def int_aarch64_settag : DefaultAttrsIntrinsic<[], [llvm_ptr_ty, llvm_i64_ty],
  736. [IntrWriteMem, IntrArgMemOnly, NoCapture<ArgIndex<0>>, WriteOnly<ArgIndex<0>>]>;
  737. // Update allocation tags for the memory range to match the tag in the pointer argument,
  738. // and set memory contents to zero.
  739. def int_aarch64_settag_zero : DefaultAttrsIntrinsic<[], [llvm_ptr_ty, llvm_i64_ty],
  740. [IntrWriteMem, IntrArgMemOnly, NoCapture<ArgIndex<0>>, WriteOnly<ArgIndex<0>>]>;
  741. // Update allocation tags for 16-aligned, 16-sized memory region, and store a pair 8-byte values.
  742. def int_aarch64_stgp : DefaultAttrsIntrinsic<[], [llvm_ptr_ty, llvm_i64_ty, llvm_i64_ty],
  743. [IntrWriteMem, IntrArgMemOnly, NoCapture<ArgIndex<0>>, WriteOnly<ArgIndex<0>>]>;
  744. }
  745. // Transactional Memory Extension (TME) Intrinsics
  746. let TargetPrefix = "aarch64" in {
  747. def int_aarch64_tstart : GCCBuiltin<"__builtin_arm_tstart">,
  748. Intrinsic<[llvm_i64_ty], [], [IntrWillReturn]>;
  749. def int_aarch64_tcommit : GCCBuiltin<"__builtin_arm_tcommit">, Intrinsic<[], [], [IntrWillReturn]>;
  750. def int_aarch64_tcancel : GCCBuiltin<"__builtin_arm_tcancel">,
  751. Intrinsic<[], [llvm_i64_ty], [IntrWillReturn, ImmArg<ArgIndex<0>>]>;
  752. def int_aarch64_ttest : GCCBuiltin<"__builtin_arm_ttest">,
  753. Intrinsic<[llvm_i64_ty], [],
  754. [IntrNoMem, IntrHasSideEffects, IntrWillReturn]>;
  755. // Armv8.7-A load/store 64-byte intrinsics
  756. defvar data512 = !listsplat(llvm_i64_ty, 8);
  757. def int_aarch64_ld64b: Intrinsic<data512, [llvm_ptr_ty]>;
  758. def int_aarch64_st64b: Intrinsic<[], !listconcat([llvm_ptr_ty], data512)>;
  759. def int_aarch64_st64bv: Intrinsic<[llvm_i64_ty], !listconcat([llvm_ptr_ty], data512)>;
  760. def int_aarch64_st64bv0: Intrinsic<[llvm_i64_ty], !listconcat([llvm_ptr_ty], data512)>;
  761. }
  762. def llvm_nxv2i1_ty : LLVMType<nxv2i1>;
  763. def llvm_nxv4i1_ty : LLVMType<nxv4i1>;
  764. def llvm_nxv8i1_ty : LLVMType<nxv8i1>;
  765. def llvm_nxv16i1_ty : LLVMType<nxv16i1>;
  766. def llvm_nxv16i8_ty : LLVMType<nxv16i8>;
  767. def llvm_nxv4i32_ty : LLVMType<nxv4i32>;
  768. def llvm_nxv2i64_ty : LLVMType<nxv2i64>;
  769. def llvm_nxv8f16_ty : LLVMType<nxv8f16>;
  770. def llvm_nxv8bf16_ty : LLVMType<nxv8bf16>;
  771. def llvm_nxv4f32_ty : LLVMType<nxv4f32>;
  772. def llvm_nxv2f64_ty : LLVMType<nxv2f64>;
  773. let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.".
  774. class AdvSIMD_SVE_Create_2Vector_Tuple
  775. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  776. [llvm_anyvector_ty, LLVMMatchType<1>],
  777. [IntrReadMem]>;
  778. class AdvSIMD_SVE_Create_3Vector_Tuple
  779. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  780. [llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>],
  781. [IntrReadMem]>;
  782. class AdvSIMD_SVE_Create_4Vector_Tuple
  783. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  784. [llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>,
  785. LLVMMatchType<1>],
  786. [IntrReadMem]>;
  787. class AdvSIMD_SVE_Set_Vector_Tuple
  788. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  789. [LLVMMatchType<0>, llvm_i32_ty, llvm_anyvector_ty],
  790. [IntrReadMem, ImmArg<ArgIndex<1>>]>;
  791. class AdvSIMD_SVE_Get_Vector_Tuple
  792. : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty, llvm_i32_ty],
  793. [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
  794. class AdvSIMD_ManyVec_PredLoad_Intrinsic
  795. : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty, LLVMPointerToElt<0>],
  796. [IntrReadMem, IntrArgMemOnly]>;
  797. class AdvSIMD_1Vec_PredLoad_Intrinsic
  798. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  799. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  800. LLVMPointerToElt<0>],
  801. [IntrReadMem, IntrArgMemOnly]>;
  802. class AdvSIMD_1Vec_PredLoad_WriteFFR_Intrinsic
  803. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  804. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  805. LLVMPointerToElt<0>],
  806. [IntrInaccessibleMemOrArgMemOnly]>;
  807. class AdvSIMD_1Vec_PredStore_Intrinsic
  808. : DefaultAttrsIntrinsic<[],
  809. [llvm_anyvector_ty,
  810. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  811. LLVMPointerToElt<0>],
  812. [IntrArgMemOnly, NoCapture<ArgIndex<2>>]>;
  813. class AdvSIMD_2Vec_PredStore_Intrinsic
  814. : DefaultAttrsIntrinsic<[],
  815. [llvm_anyvector_ty, LLVMMatchType<0>,
  816. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, LLVMPointerToElt<0>],
  817. [IntrArgMemOnly, NoCapture<ArgIndex<3>>]>;
  818. class AdvSIMD_3Vec_PredStore_Intrinsic
  819. : DefaultAttrsIntrinsic<[],
  820. [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>,
  821. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, LLVMPointerToElt<0>],
  822. [IntrArgMemOnly, NoCapture<ArgIndex<4>>]>;
  823. class AdvSIMD_4Vec_PredStore_Intrinsic
  824. : DefaultAttrsIntrinsic<[],
  825. [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>,
  826. LLVMMatchType<0>,
  827. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, LLVMPointerToElt<0>],
  828. [IntrArgMemOnly, NoCapture<ArgIndex<5>>]>;
  829. class AdvSIMD_SVE_Index_Intrinsic
  830. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  831. [LLVMVectorElementType<0>,
  832. LLVMVectorElementType<0>],
  833. [IntrNoMem]>;
  834. class AdvSIMD_Merged1VectorArg_Intrinsic
  835. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  836. [LLVMMatchType<0>,
  837. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  838. LLVMMatchType<0>],
  839. [IntrNoMem]>;
  840. class AdvSIMD_2VectorArgIndexed_Intrinsic
  841. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  842. [LLVMMatchType<0>,
  843. LLVMMatchType<0>,
  844. llvm_i32_ty],
  845. [IntrNoMem, ImmArg<ArgIndex<2>>]>;
  846. class AdvSIMD_3VectorArgIndexed_Intrinsic
  847. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  848. [LLVMMatchType<0>,
  849. LLVMMatchType<0>,
  850. LLVMMatchType<0>,
  851. llvm_i32_ty],
  852. [IntrNoMem, ImmArg<ArgIndex<3>>]>;
  853. class AdvSIMD_Pred1VectorArg_Intrinsic
  854. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  855. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  856. LLVMMatchType<0>],
  857. [IntrNoMem]>;
  858. class AdvSIMD_Pred2VectorArg_Intrinsic
  859. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  860. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  861. LLVMMatchType<0>,
  862. LLVMMatchType<0>],
  863. [IntrNoMem]>;
  864. class AdvSIMD_Pred3VectorArg_Intrinsic
  865. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  866. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  867. LLVMMatchType<0>,
  868. LLVMMatchType<0>,
  869. LLVMMatchType<0>],
  870. [IntrNoMem]>;
  871. class AdvSIMD_SVE_Compare_Intrinsic
  872. : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>],
  873. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  874. llvm_anyvector_ty,
  875. LLVMMatchType<0>],
  876. [IntrNoMem]>;
  877. class AdvSIMD_SVE_CompareWide_Intrinsic
  878. : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>],
  879. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  880. llvm_anyvector_ty,
  881. llvm_nxv2i64_ty],
  882. [IntrNoMem]>;
  883. class AdvSIMD_SVE_Saturating_Intrinsic
  884. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  885. [LLVMMatchType<0>,
  886. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>],
  887. [IntrNoMem]>;
  888. class AdvSIMD_SVE_SaturatingWithPattern_Intrinsic
  889. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  890. [LLVMMatchType<0>,
  891. llvm_i32_ty,
  892. llvm_i32_ty],
  893. [IntrNoMem, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>]>;
  894. class AdvSIMD_SVE_Saturating_N_Intrinsic<LLVMType T>
  895. : DefaultAttrsIntrinsic<[T],
  896. [T, llvm_anyvector_ty],
  897. [IntrNoMem]>;
  898. class AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<LLVMType T>
  899. : DefaultAttrsIntrinsic<[T],
  900. [T, llvm_i32_ty, llvm_i32_ty],
  901. [IntrNoMem, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>]>;
  902. class AdvSIMD_SVE_CNT_Intrinsic
  903. : DefaultAttrsIntrinsic<[LLVMVectorOfBitcastsToInt<0>],
  904. [LLVMVectorOfBitcastsToInt<0>,
  905. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  906. llvm_anyvector_ty],
  907. [IntrNoMem]>;
  908. class AdvSIMD_SVE_ReduceWithInit_Intrinsic
  909. : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
  910. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  911. LLVMVectorElementType<0>,
  912. llvm_anyvector_ty],
  913. [IntrNoMem]>;
  914. class AdvSIMD_SVE_ShiftByImm_Intrinsic
  915. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  916. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  917. LLVMMatchType<0>,
  918. llvm_i32_ty],
  919. [IntrNoMem, ImmArg<ArgIndex<2>>]>;
  920. class AdvSIMD_SVE_ShiftWide_Intrinsic
  921. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  922. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  923. LLVMMatchType<0>,
  924. llvm_nxv2i64_ty],
  925. [IntrNoMem]>;
  926. class AdvSIMD_SVE_Unpack_Intrinsic
  927. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  928. [LLVMSubdivide2VectorType<0>],
  929. [IntrNoMem]>;
  930. class AdvSIMD_SVE_CADD_Intrinsic
  931. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  932. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  933. LLVMMatchType<0>,
  934. LLVMMatchType<0>,
  935. llvm_i32_ty],
  936. [IntrNoMem, ImmArg<ArgIndex<3>>]>;
  937. class AdvSIMD_SVE_CMLA_Intrinsic
  938. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  939. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  940. LLVMMatchType<0>,
  941. LLVMMatchType<0>,
  942. LLVMMatchType<0>,
  943. llvm_i32_ty],
  944. [IntrNoMem, ImmArg<ArgIndex<4>>]>;
  945. class AdvSIMD_SVE_CMLA_LANE_Intrinsic
  946. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  947. [LLVMMatchType<0>,
  948. LLVMMatchType<0>,
  949. LLVMMatchType<0>,
  950. llvm_i32_ty,
  951. llvm_i32_ty],
  952. [IntrNoMem, ImmArg<ArgIndex<3>>, ImmArg<ArgIndex<4>>]>;
  953. class AdvSIMD_SVE_DUP_Intrinsic
  954. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  955. [LLVMMatchType<0>,
  956. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  957. LLVMVectorElementType<0>],
  958. [IntrNoMem]>;
  959. class AdvSIMD_SVE_DUP_Unpred_Intrinsic
  960. : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [LLVMVectorElementType<0>],
  961. [IntrNoMem]>;
  962. class AdvSIMD_SVE_DUPQ_Intrinsic
  963. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  964. [LLVMMatchType<0>,
  965. llvm_i64_ty],
  966. [IntrNoMem]>;
  967. class AdvSIMD_SVE_EXPA_Intrinsic
  968. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  969. [LLVMVectorOfBitcastsToInt<0>],
  970. [IntrNoMem]>;
  971. class AdvSIMD_SVE_FCVT_Intrinsic
  972. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  973. [LLVMMatchType<0>,
  974. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  975. llvm_anyvector_ty],
  976. [IntrNoMem]>;
  977. class AdvSIMD_SVE_FCVTZS_Intrinsic
  978. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  979. [LLVMVectorOfBitcastsToInt<0>,
  980. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  981. llvm_anyvector_ty],
  982. [IntrNoMem]>;
  983. class AdvSIMD_SVE_INSR_Intrinsic
  984. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  985. [LLVMMatchType<0>,
  986. LLVMVectorElementType<0>],
  987. [IntrNoMem]>;
  988. class AdvSIMD_SVE_PTRUE_Intrinsic
  989. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  990. [llvm_i32_ty],
  991. [IntrNoMem, ImmArg<ArgIndex<0>>]>;
  992. class AdvSIMD_SVE_PUNPKHI_Intrinsic
  993. : DefaultAttrsIntrinsic<[LLVMHalfElementsVectorType<0>],
  994. [llvm_anyvector_ty],
  995. [IntrNoMem]>;
  996. class AdvSIMD_SVE_SCALE_Intrinsic
  997. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  998. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  999. LLVMMatchType<0>,
  1000. LLVMVectorOfBitcastsToInt<0>],
  1001. [IntrNoMem]>;
  1002. class AdvSIMD_SVE_SCVTF_Intrinsic
  1003. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1004. [LLVMMatchType<0>,
  1005. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1006. llvm_anyvector_ty],
  1007. [IntrNoMem]>;
  1008. class AdvSIMD_SVE_TSMUL_Intrinsic
  1009. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1010. [LLVMMatchType<0>,
  1011. LLVMVectorOfBitcastsToInt<0>],
  1012. [IntrNoMem]>;
  1013. class AdvSIMD_SVE_CNTB_Intrinsic
  1014. : DefaultAttrsIntrinsic<[llvm_i64_ty],
  1015. [llvm_i32_ty],
  1016. [IntrNoMem, ImmArg<ArgIndex<0>>]>;
  1017. class AdvSIMD_SVE_CNTP_Intrinsic
  1018. : DefaultAttrsIntrinsic<[llvm_i64_ty],
  1019. [llvm_anyvector_ty, LLVMMatchType<0>],
  1020. [IntrNoMem]>;
  1021. class AdvSIMD_SVE_DOT_Intrinsic
  1022. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1023. [LLVMMatchType<0>,
  1024. LLVMSubdivide4VectorType<0>,
  1025. LLVMSubdivide4VectorType<0>],
  1026. [IntrNoMem]>;
  1027. class AdvSIMD_SVE_DOT_Indexed_Intrinsic
  1028. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1029. [LLVMMatchType<0>,
  1030. LLVMSubdivide4VectorType<0>,
  1031. LLVMSubdivide4VectorType<0>,
  1032. llvm_i32_ty],
  1033. [IntrNoMem, ImmArg<ArgIndex<3>>]>;
  1034. class AdvSIMD_SVE_PTEST_Intrinsic
  1035. : DefaultAttrsIntrinsic<[llvm_i1_ty],
  1036. [llvm_anyvector_ty,
  1037. LLVMMatchType<0>],
  1038. [IntrNoMem]>;
  1039. class AdvSIMD_SVE_TBL_Intrinsic
  1040. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1041. [LLVMMatchType<0>,
  1042. LLVMVectorOfBitcastsToInt<0>],
  1043. [IntrNoMem]>;
  1044. class AdvSIMD_SVE2_TBX_Intrinsic
  1045. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1046. [LLVMMatchType<0>,
  1047. LLVMMatchType<0>,
  1048. LLVMVectorOfBitcastsToInt<0>],
  1049. [IntrNoMem]>;
  1050. class SVE2_1VectorArg_Long_Intrinsic
  1051. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1052. [LLVMSubdivide2VectorType<0>,
  1053. llvm_i32_ty],
  1054. [IntrNoMem, ImmArg<ArgIndex<1>>]>;
  1055. class SVE2_2VectorArg_Long_Intrinsic
  1056. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1057. [LLVMSubdivide2VectorType<0>,
  1058. LLVMSubdivide2VectorType<0>],
  1059. [IntrNoMem]>;
  1060. class SVE2_2VectorArgIndexed_Long_Intrinsic
  1061. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1062. [LLVMSubdivide2VectorType<0>,
  1063. LLVMSubdivide2VectorType<0>,
  1064. llvm_i32_ty],
  1065. [IntrNoMem, ImmArg<ArgIndex<2>>]>;
  1066. class SVE2_2VectorArg_Wide_Intrinsic
  1067. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1068. [LLVMMatchType<0>,
  1069. LLVMSubdivide2VectorType<0>],
  1070. [IntrNoMem]>;
  1071. class SVE2_2VectorArg_Pred_Long_Intrinsic
  1072. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1073. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1074. LLVMMatchType<0>,
  1075. LLVMSubdivide2VectorType<0>],
  1076. [IntrNoMem]>;
  1077. class SVE2_3VectorArg_Long_Intrinsic
  1078. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1079. [LLVMMatchType<0>,
  1080. LLVMSubdivide2VectorType<0>,
  1081. LLVMSubdivide2VectorType<0>],
  1082. [IntrNoMem]>;
  1083. class SVE2_3VectorArgIndexed_Long_Intrinsic
  1084. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1085. [LLVMMatchType<0>,
  1086. LLVMSubdivide2VectorType<0>,
  1087. LLVMSubdivide2VectorType<0>,
  1088. llvm_i32_ty],
  1089. [IntrNoMem, ImmArg<ArgIndex<3>>]>;
  1090. class SVE2_1VectorArg_Narrowing_Intrinsic
  1091. : DefaultAttrsIntrinsic<[LLVMSubdivide2VectorType<0>],
  1092. [llvm_anyvector_ty],
  1093. [IntrNoMem]>;
  1094. class SVE2_Merged1VectorArg_Narrowing_Intrinsic
  1095. : DefaultAttrsIntrinsic<[LLVMSubdivide2VectorType<0>],
  1096. [LLVMSubdivide2VectorType<0>,
  1097. llvm_anyvector_ty],
  1098. [IntrNoMem]>;
  1099. class SVE2_2VectorArg_Narrowing_Intrinsic
  1100. : DefaultAttrsIntrinsic<
  1101. [LLVMSubdivide2VectorType<0>],
  1102. [llvm_anyvector_ty, LLVMMatchType<0>],
  1103. [IntrNoMem]>;
  1104. class SVE2_Merged2VectorArg_Narrowing_Intrinsic
  1105. : DefaultAttrsIntrinsic<
  1106. [LLVMSubdivide2VectorType<0>],
  1107. [LLVMSubdivide2VectorType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
  1108. [IntrNoMem]>;
  1109. class SVE2_1VectorArg_Imm_Narrowing_Intrinsic
  1110. : DefaultAttrsIntrinsic<[LLVMSubdivide2VectorType<0>],
  1111. [llvm_anyvector_ty, llvm_i32_ty],
  1112. [IntrNoMem, ImmArg<ArgIndex<1>>]>;
  1113. class SVE2_2VectorArg_Imm_Narrowing_Intrinsic
  1114. : DefaultAttrsIntrinsic<[LLVMSubdivide2VectorType<0>],
  1115. [LLVMSubdivide2VectorType<0>, llvm_anyvector_ty,
  1116. llvm_i32_ty],
  1117. [IntrNoMem, ImmArg<ArgIndex<2>>]>;
  1118. class SVE2_CONFLICT_DETECT_Intrinsic
  1119. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1120. [LLVMAnyPointerType<llvm_any_ty>,
  1121. LLVMMatchType<1>]>;
  1122. class SVE2_3VectorArg_Indexed_Intrinsic
  1123. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1124. [LLVMMatchType<0>,
  1125. LLVMSubdivide2VectorType<0>,
  1126. LLVMSubdivide2VectorType<0>,
  1127. llvm_i32_ty],
  1128. [IntrNoMem, ImmArg<ArgIndex<3>>]>;
  1129. class AdvSIMD_SVE_CDOT_LANE_Intrinsic
  1130. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1131. [LLVMMatchType<0>,
  1132. LLVMSubdivide4VectorType<0>,
  1133. LLVMSubdivide4VectorType<0>,
  1134. llvm_i32_ty,
  1135. llvm_i32_ty],
  1136. [IntrNoMem, ImmArg<ArgIndex<3>>, ImmArg<ArgIndex<4>>]>;
  1137. // NOTE: There is no relationship between these intrinsics beyond an attempt
  1138. // to reuse currently identical class definitions.
  1139. class AdvSIMD_SVE_LOGB_Intrinsic : AdvSIMD_SVE_CNT_Intrinsic;
  1140. class AdvSIMD_SVE2_CADD_Intrinsic : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1141. class AdvSIMD_SVE2_CMLA_Intrinsic : AdvSIMD_3VectorArgIndexed_Intrinsic;
  1142. // This class of intrinsics are not intended to be useful within LLVM IR but
  1143. // are instead here to support some of the more regid parts of the ACLE.
  1144. class Builtin_SVCVT<string name, LLVMType OUT, LLVMType PRED, LLVMType IN>
  1145. : DefaultAttrsIntrinsic<[OUT], [OUT, PRED, IN], [IntrNoMem]>;
  1146. }
  1147. //===----------------------------------------------------------------------===//
  1148. // SVE
  1149. let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.".
  1150. class AdvSIMD_SVE_Reduce_Intrinsic
  1151. : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
  1152. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1153. llvm_anyvector_ty],
  1154. [IntrNoMem]>;
  1155. class AdvSIMD_SVE_SADDV_Reduce_Intrinsic
  1156. : DefaultAttrsIntrinsic<[llvm_i64_ty],
  1157. [LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1158. llvm_anyvector_ty],
  1159. [IntrNoMem]>;
  1160. class AdvSIMD_SVE_WHILE_Intrinsic
  1161. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1162. [llvm_anyint_ty, LLVMMatchType<1>],
  1163. [IntrNoMem]>;
  1164. class AdvSIMD_GatherLoad_SV_64b_Offsets_Intrinsic
  1165. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1166. [
  1167. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1168. LLVMPointerToElt<0>,
  1169. LLVMScalarOrSameVectorWidth<0, llvm_i64_ty>
  1170. ],
  1171. [IntrReadMem, IntrArgMemOnly]>;
  1172. class AdvSIMD_GatherLoad_SV_64b_Offsets_WriteFFR_Intrinsic
  1173. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1174. [
  1175. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1176. LLVMPointerToElt<0>,
  1177. LLVMScalarOrSameVectorWidth<0, llvm_i64_ty>
  1178. ],
  1179. [IntrInaccessibleMemOrArgMemOnly]>;
  1180. class AdvSIMD_GatherLoad_SV_32b_Offsets_Intrinsic
  1181. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1182. [
  1183. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1184. LLVMPointerToElt<0>,
  1185. LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>
  1186. ],
  1187. [IntrReadMem, IntrArgMemOnly]>;
  1188. class AdvSIMD_GatherLoad_SV_32b_Offsets_WriteFFR_Intrinsic
  1189. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1190. [
  1191. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1192. LLVMPointerToElt<0>,
  1193. LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>
  1194. ],
  1195. [IntrInaccessibleMemOrArgMemOnly]>;
  1196. class AdvSIMD_GatherLoad_VS_Intrinsic
  1197. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1198. [
  1199. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1200. llvm_anyvector_ty,
  1201. llvm_i64_ty
  1202. ],
  1203. [IntrReadMem]>;
  1204. class AdvSIMD_GatherLoad_VS_WriteFFR_Intrinsic
  1205. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1206. [
  1207. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1208. llvm_anyvector_ty,
  1209. llvm_i64_ty
  1210. ],
  1211. [IntrInaccessibleMemOrArgMemOnly]>;
  1212. class AdvSIMD_ScatterStore_SV_64b_Offsets_Intrinsic
  1213. : DefaultAttrsIntrinsic<[],
  1214. [
  1215. llvm_anyvector_ty,
  1216. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1217. LLVMPointerToElt<0>,
  1218. LLVMScalarOrSameVectorWidth<0, llvm_i64_ty>
  1219. ],
  1220. [IntrWriteMem, IntrArgMemOnly]>;
  1221. class AdvSIMD_ScatterStore_SV_32b_Offsets_Intrinsic
  1222. : DefaultAttrsIntrinsic<[],
  1223. [
  1224. llvm_anyvector_ty,
  1225. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1226. LLVMPointerToElt<0>,
  1227. LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>
  1228. ],
  1229. [IntrWriteMem, IntrArgMemOnly]>;
  1230. class AdvSIMD_ScatterStore_VS_Intrinsic
  1231. : DefaultAttrsIntrinsic<[],
  1232. [
  1233. llvm_anyvector_ty,
  1234. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
  1235. llvm_anyvector_ty, llvm_i64_ty
  1236. ],
  1237. [IntrWriteMem]>;
  1238. class SVE_gather_prf_SV
  1239. : DefaultAttrsIntrinsic<[],
  1240. [
  1241. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, // Predicate
  1242. llvm_ptr_ty, // Base address
  1243. llvm_anyvector_ty, // Offsets
  1244. llvm_i32_ty // Prfop
  1245. ],
  1246. [IntrInaccessibleMemOrArgMemOnly, NoCapture<ArgIndex<1>>, ImmArg<ArgIndex<3>>]>;
  1247. class SVE_gather_prf_VS
  1248. : DefaultAttrsIntrinsic<[],
  1249. [
  1250. LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, // Predicate
  1251. llvm_anyvector_ty, // Base addresses
  1252. llvm_i64_ty, // Scalar offset
  1253. llvm_i32_ty // Prfop
  1254. ],
  1255. [IntrInaccessibleMemOrArgMemOnly, ImmArg<ArgIndex<3>>]>;
  1256. class SVE_MatMul_Intrinsic
  1257. : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1258. [LLVMMatchType<0>, LLVMSubdivide4VectorType<0>, LLVMSubdivide4VectorType<0>],
  1259. [IntrNoMem]>;
  1260. class SVE_4Vec_BF16
  1261. : DefaultAttrsIntrinsic<[llvm_nxv4f32_ty],
  1262. [llvm_nxv4f32_ty, llvm_nxv8bf16_ty, llvm_nxv8bf16_ty],
  1263. [IntrNoMem]>;
  1264. class SVE_4Vec_BF16_Indexed
  1265. : DefaultAttrsIntrinsic<[llvm_nxv4f32_ty],
  1266. [llvm_nxv4f32_ty, llvm_nxv8bf16_ty, llvm_nxv8bf16_ty, llvm_i64_ty],
  1267. [IntrNoMem, ImmArg<ArgIndex<3>>]>;
  1268. //
  1269. // Vector tuple creation intrinsics (ACLE)
  1270. //
  1271. def int_aarch64_sve_tuple_create2 : AdvSIMD_SVE_Create_2Vector_Tuple;
  1272. def int_aarch64_sve_tuple_create3 : AdvSIMD_SVE_Create_3Vector_Tuple;
  1273. def int_aarch64_sve_tuple_create4 : AdvSIMD_SVE_Create_4Vector_Tuple;
  1274. //
  1275. // Vector tuple insertion/extraction intrinsics (ACLE)
  1276. //
  1277. def int_aarch64_sve_tuple_get : AdvSIMD_SVE_Get_Vector_Tuple;
  1278. def int_aarch64_sve_tuple_set : AdvSIMD_SVE_Set_Vector_Tuple;
  1279. //
  1280. // Loads
  1281. //
  1282. def int_aarch64_sve_ld1 : AdvSIMD_1Vec_PredLoad_Intrinsic;
  1283. def int_aarch64_sve_ld2 : AdvSIMD_ManyVec_PredLoad_Intrinsic;
  1284. def int_aarch64_sve_ld3 : AdvSIMD_ManyVec_PredLoad_Intrinsic;
  1285. def int_aarch64_sve_ld4 : AdvSIMD_ManyVec_PredLoad_Intrinsic;
  1286. def int_aarch64_sve_ldnt1 : AdvSIMD_1Vec_PredLoad_Intrinsic;
  1287. def int_aarch64_sve_ldnf1 : AdvSIMD_1Vec_PredLoad_WriteFFR_Intrinsic;
  1288. def int_aarch64_sve_ldff1 : AdvSIMD_1Vec_PredLoad_WriteFFR_Intrinsic;
  1289. def int_aarch64_sve_ld1rq : AdvSIMD_1Vec_PredLoad_Intrinsic;
  1290. def int_aarch64_sve_ld1ro : AdvSIMD_1Vec_PredLoad_Intrinsic;
  1291. //
  1292. // Stores
  1293. //
  1294. def int_aarch64_sve_st1 : AdvSIMD_1Vec_PredStore_Intrinsic;
  1295. def int_aarch64_sve_st2 : AdvSIMD_2Vec_PredStore_Intrinsic;
  1296. def int_aarch64_sve_st3 : AdvSIMD_3Vec_PredStore_Intrinsic;
  1297. def int_aarch64_sve_st4 : AdvSIMD_4Vec_PredStore_Intrinsic;
  1298. def int_aarch64_sve_stnt1 : AdvSIMD_1Vec_PredStore_Intrinsic;
  1299. //
  1300. // Prefetches
  1301. //
  1302. def int_aarch64_sve_prf
  1303. : DefaultAttrsIntrinsic<[], [llvm_anyvector_ty, llvm_ptr_ty, llvm_i32_ty],
  1304. [IntrArgMemOnly, ImmArg<ArgIndex<2>>]>;
  1305. // Scalar + 32-bit scaled offset vector, zero extend, packed and
  1306. // unpacked.
  1307. def int_aarch64_sve_prfb_gather_uxtw_index : SVE_gather_prf_SV;
  1308. def int_aarch64_sve_prfh_gather_uxtw_index : SVE_gather_prf_SV;
  1309. def int_aarch64_sve_prfw_gather_uxtw_index : SVE_gather_prf_SV;
  1310. def int_aarch64_sve_prfd_gather_uxtw_index : SVE_gather_prf_SV;
  1311. // Scalar + 32-bit scaled offset vector, sign extend, packed and
  1312. // unpacked.
  1313. def int_aarch64_sve_prfb_gather_sxtw_index : SVE_gather_prf_SV;
  1314. def int_aarch64_sve_prfw_gather_sxtw_index : SVE_gather_prf_SV;
  1315. def int_aarch64_sve_prfh_gather_sxtw_index : SVE_gather_prf_SV;
  1316. def int_aarch64_sve_prfd_gather_sxtw_index : SVE_gather_prf_SV;
  1317. // Scalar + 64-bit scaled offset vector.
  1318. def int_aarch64_sve_prfb_gather_index : SVE_gather_prf_SV;
  1319. def int_aarch64_sve_prfh_gather_index : SVE_gather_prf_SV;
  1320. def int_aarch64_sve_prfw_gather_index : SVE_gather_prf_SV;
  1321. def int_aarch64_sve_prfd_gather_index : SVE_gather_prf_SV;
  1322. // Vector + scalar.
  1323. def int_aarch64_sve_prfb_gather_scalar_offset : SVE_gather_prf_VS;
  1324. def int_aarch64_sve_prfh_gather_scalar_offset : SVE_gather_prf_VS;
  1325. def int_aarch64_sve_prfw_gather_scalar_offset : SVE_gather_prf_VS;
  1326. def int_aarch64_sve_prfd_gather_scalar_offset : SVE_gather_prf_VS;
  1327. //
  1328. // Scalar to vector operations
  1329. //
  1330. def int_aarch64_sve_dup : AdvSIMD_SVE_DUP_Intrinsic;
  1331. def int_aarch64_sve_dup_x : AdvSIMD_SVE_DUP_Unpred_Intrinsic;
  1332. def int_aarch64_sve_index : AdvSIMD_SVE_Index_Intrinsic;
  1333. //
  1334. // Address calculation
  1335. //
  1336. def int_aarch64_sve_adrb : AdvSIMD_2VectorArg_Intrinsic;
  1337. def int_aarch64_sve_adrh : AdvSIMD_2VectorArg_Intrinsic;
  1338. def int_aarch64_sve_adrw : AdvSIMD_2VectorArg_Intrinsic;
  1339. def int_aarch64_sve_adrd : AdvSIMD_2VectorArg_Intrinsic;
  1340. //
  1341. // Integer arithmetic
  1342. //
  1343. def int_aarch64_sve_add : AdvSIMD_Pred2VectorArg_Intrinsic;
  1344. def int_aarch64_sve_sub : AdvSIMD_Pred2VectorArg_Intrinsic;
  1345. def int_aarch64_sve_subr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1346. def int_aarch64_sve_pmul : AdvSIMD_2VectorArg_Intrinsic;
  1347. def int_aarch64_sve_mul : AdvSIMD_Pred2VectorArg_Intrinsic;
  1348. def int_aarch64_sve_mul_lane : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1349. def int_aarch64_sve_smulh : AdvSIMD_Pred2VectorArg_Intrinsic;
  1350. def int_aarch64_sve_umulh : AdvSIMD_Pred2VectorArg_Intrinsic;
  1351. def int_aarch64_sve_sdiv : AdvSIMD_Pred2VectorArg_Intrinsic;
  1352. def int_aarch64_sve_udiv : AdvSIMD_Pred2VectorArg_Intrinsic;
  1353. def int_aarch64_sve_sdivr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1354. def int_aarch64_sve_udivr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1355. def int_aarch64_sve_smax : AdvSIMD_Pred2VectorArg_Intrinsic;
  1356. def int_aarch64_sve_umax : AdvSIMD_Pred2VectorArg_Intrinsic;
  1357. def int_aarch64_sve_smin : AdvSIMD_Pred2VectorArg_Intrinsic;
  1358. def int_aarch64_sve_umin : AdvSIMD_Pred2VectorArg_Intrinsic;
  1359. def int_aarch64_sve_sabd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1360. def int_aarch64_sve_uabd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1361. def int_aarch64_sve_mad : AdvSIMD_Pred3VectorArg_Intrinsic;
  1362. def int_aarch64_sve_msb : AdvSIMD_Pred3VectorArg_Intrinsic;
  1363. def int_aarch64_sve_mla : AdvSIMD_Pred3VectorArg_Intrinsic;
  1364. def int_aarch64_sve_mla_lane : AdvSIMD_3VectorArgIndexed_Intrinsic;
  1365. def int_aarch64_sve_mls : AdvSIMD_Pred3VectorArg_Intrinsic;
  1366. def int_aarch64_sve_mls_lane : AdvSIMD_3VectorArgIndexed_Intrinsic;
  1367. def int_aarch64_sve_saddv : AdvSIMD_SVE_SADDV_Reduce_Intrinsic;
  1368. def int_aarch64_sve_uaddv : AdvSIMD_SVE_SADDV_Reduce_Intrinsic;
  1369. def int_aarch64_sve_smaxv : AdvSIMD_SVE_Reduce_Intrinsic;
  1370. def int_aarch64_sve_umaxv : AdvSIMD_SVE_Reduce_Intrinsic;
  1371. def int_aarch64_sve_sminv : AdvSIMD_SVE_Reduce_Intrinsic;
  1372. def int_aarch64_sve_uminv : AdvSIMD_SVE_Reduce_Intrinsic;
  1373. def int_aarch64_sve_orv : AdvSIMD_SVE_Reduce_Intrinsic;
  1374. def int_aarch64_sve_eorv : AdvSIMD_SVE_Reduce_Intrinsic;
  1375. def int_aarch64_sve_andv : AdvSIMD_SVE_Reduce_Intrinsic;
  1376. def int_aarch64_sve_abs : AdvSIMD_Merged1VectorArg_Intrinsic;
  1377. def int_aarch64_sve_neg : AdvSIMD_Merged1VectorArg_Intrinsic;
  1378. def int_aarch64_sve_sdot : AdvSIMD_SVE_DOT_Intrinsic;
  1379. def int_aarch64_sve_sdot_lane : AdvSIMD_SVE_DOT_Indexed_Intrinsic;
  1380. def int_aarch64_sve_udot : AdvSIMD_SVE_DOT_Intrinsic;
  1381. def int_aarch64_sve_udot_lane : AdvSIMD_SVE_DOT_Indexed_Intrinsic;
  1382. def int_aarch64_sve_sqadd_x : AdvSIMD_2VectorArg_Intrinsic;
  1383. def int_aarch64_sve_sqsub_x : AdvSIMD_2VectorArg_Intrinsic;
  1384. def int_aarch64_sve_uqadd_x : AdvSIMD_2VectorArg_Intrinsic;
  1385. def int_aarch64_sve_uqsub_x : AdvSIMD_2VectorArg_Intrinsic;
  1386. // Shifts
  1387. def int_aarch64_sve_asr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1388. def int_aarch64_sve_asr_wide : AdvSIMD_SVE_ShiftWide_Intrinsic;
  1389. def int_aarch64_sve_asrd : AdvSIMD_SVE_ShiftByImm_Intrinsic;
  1390. def int_aarch64_sve_insr : AdvSIMD_SVE_INSR_Intrinsic;
  1391. def int_aarch64_sve_lsl : AdvSIMD_Pred2VectorArg_Intrinsic;
  1392. def int_aarch64_sve_lsl_wide : AdvSIMD_SVE_ShiftWide_Intrinsic;
  1393. def int_aarch64_sve_lsr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1394. def int_aarch64_sve_lsr_wide : AdvSIMD_SVE_ShiftWide_Intrinsic;
  1395. //
  1396. // Integer comparisons
  1397. //
  1398. def int_aarch64_sve_cmpeq : AdvSIMD_SVE_Compare_Intrinsic;
  1399. def int_aarch64_sve_cmpge : AdvSIMD_SVE_Compare_Intrinsic;
  1400. def int_aarch64_sve_cmpgt : AdvSIMD_SVE_Compare_Intrinsic;
  1401. def int_aarch64_sve_cmphi : AdvSIMD_SVE_Compare_Intrinsic;
  1402. def int_aarch64_sve_cmphs : AdvSIMD_SVE_Compare_Intrinsic;
  1403. def int_aarch64_sve_cmpne : AdvSIMD_SVE_Compare_Intrinsic;
  1404. def int_aarch64_sve_cmpeq_wide : AdvSIMD_SVE_CompareWide_Intrinsic;
  1405. def int_aarch64_sve_cmpge_wide : AdvSIMD_SVE_CompareWide_Intrinsic;
  1406. def int_aarch64_sve_cmpgt_wide : AdvSIMD_SVE_CompareWide_Intrinsic;
  1407. def int_aarch64_sve_cmphi_wide : AdvSIMD_SVE_CompareWide_Intrinsic;
  1408. def int_aarch64_sve_cmphs_wide : AdvSIMD_SVE_CompareWide_Intrinsic;
  1409. def int_aarch64_sve_cmple_wide : AdvSIMD_SVE_CompareWide_Intrinsic;
  1410. def int_aarch64_sve_cmplo_wide : AdvSIMD_SVE_CompareWide_Intrinsic;
  1411. def int_aarch64_sve_cmpls_wide : AdvSIMD_SVE_CompareWide_Intrinsic;
  1412. def int_aarch64_sve_cmplt_wide : AdvSIMD_SVE_CompareWide_Intrinsic;
  1413. def int_aarch64_sve_cmpne_wide : AdvSIMD_SVE_CompareWide_Intrinsic;
  1414. //
  1415. // Counting bits
  1416. //
  1417. def int_aarch64_sve_cls : AdvSIMD_Merged1VectorArg_Intrinsic;
  1418. def int_aarch64_sve_clz : AdvSIMD_Merged1VectorArg_Intrinsic;
  1419. def int_aarch64_sve_cnt : AdvSIMD_SVE_CNT_Intrinsic;
  1420. //
  1421. // Counting elements
  1422. //
  1423. def int_aarch64_sve_cntb : AdvSIMD_SVE_CNTB_Intrinsic;
  1424. def int_aarch64_sve_cnth : AdvSIMD_SVE_CNTB_Intrinsic;
  1425. def int_aarch64_sve_cntw : AdvSIMD_SVE_CNTB_Intrinsic;
  1426. def int_aarch64_sve_cntd : AdvSIMD_SVE_CNTB_Intrinsic;
  1427. def int_aarch64_sve_cntp : AdvSIMD_SVE_CNTP_Intrinsic;
  1428. //
  1429. // FFR manipulation
  1430. //
  1431. def int_aarch64_sve_rdffr : GCCBuiltin<"__builtin_sve_svrdffr">, DefaultAttrsIntrinsic<[llvm_nxv16i1_ty], [], [IntrReadMem, IntrInaccessibleMemOnly]>;
  1432. def int_aarch64_sve_rdffr_z : GCCBuiltin<"__builtin_sve_svrdffr_z">, DefaultAttrsIntrinsic<[llvm_nxv16i1_ty], [llvm_nxv16i1_ty], [IntrReadMem, IntrInaccessibleMemOnly]>;
  1433. def int_aarch64_sve_setffr : GCCBuiltin<"__builtin_sve_svsetffr">, DefaultAttrsIntrinsic<[], [], [IntrWriteMem, IntrInaccessibleMemOnly]>;
  1434. def int_aarch64_sve_wrffr : GCCBuiltin<"__builtin_sve_svwrffr">, DefaultAttrsIntrinsic<[], [llvm_nxv16i1_ty], [IntrWriteMem, IntrInaccessibleMemOnly]>;
  1435. //
  1436. // Saturating scalar arithmetic
  1437. //
  1438. def int_aarch64_sve_sqdech : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1439. def int_aarch64_sve_sqdecw : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1440. def int_aarch64_sve_sqdecd : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1441. def int_aarch64_sve_sqdecp : AdvSIMD_SVE_Saturating_Intrinsic;
  1442. def int_aarch64_sve_sqdecb_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1443. def int_aarch64_sve_sqdecb_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1444. def int_aarch64_sve_sqdech_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1445. def int_aarch64_sve_sqdech_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1446. def int_aarch64_sve_sqdecw_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1447. def int_aarch64_sve_sqdecw_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1448. def int_aarch64_sve_sqdecd_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1449. def int_aarch64_sve_sqdecd_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1450. def int_aarch64_sve_sqdecp_n32 : AdvSIMD_SVE_Saturating_N_Intrinsic<llvm_i32_ty>;
  1451. def int_aarch64_sve_sqdecp_n64 : AdvSIMD_SVE_Saturating_N_Intrinsic<llvm_i64_ty>;
  1452. def int_aarch64_sve_sqinch : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1453. def int_aarch64_sve_sqincw : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1454. def int_aarch64_sve_sqincd : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1455. def int_aarch64_sve_sqincp : AdvSIMD_SVE_Saturating_Intrinsic;
  1456. def int_aarch64_sve_sqincb_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1457. def int_aarch64_sve_sqincb_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1458. def int_aarch64_sve_sqinch_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1459. def int_aarch64_sve_sqinch_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1460. def int_aarch64_sve_sqincw_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1461. def int_aarch64_sve_sqincw_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1462. def int_aarch64_sve_sqincd_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1463. def int_aarch64_sve_sqincd_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1464. def int_aarch64_sve_sqincp_n32 : AdvSIMD_SVE_Saturating_N_Intrinsic<llvm_i32_ty>;
  1465. def int_aarch64_sve_sqincp_n64 : AdvSIMD_SVE_Saturating_N_Intrinsic<llvm_i64_ty>;
  1466. def int_aarch64_sve_uqdech : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1467. def int_aarch64_sve_uqdecw : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1468. def int_aarch64_sve_uqdecd : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1469. def int_aarch64_sve_uqdecp : AdvSIMD_SVE_Saturating_Intrinsic;
  1470. def int_aarch64_sve_uqdecb_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1471. def int_aarch64_sve_uqdecb_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1472. def int_aarch64_sve_uqdech_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1473. def int_aarch64_sve_uqdech_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1474. def int_aarch64_sve_uqdecw_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1475. def int_aarch64_sve_uqdecw_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1476. def int_aarch64_sve_uqdecd_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1477. def int_aarch64_sve_uqdecd_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1478. def int_aarch64_sve_uqdecp_n32 : AdvSIMD_SVE_Saturating_N_Intrinsic<llvm_i32_ty>;
  1479. def int_aarch64_sve_uqdecp_n64 : AdvSIMD_SVE_Saturating_N_Intrinsic<llvm_i64_ty>;
  1480. def int_aarch64_sve_uqinch : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1481. def int_aarch64_sve_uqincw : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1482. def int_aarch64_sve_uqincd : AdvSIMD_SVE_SaturatingWithPattern_Intrinsic;
  1483. def int_aarch64_sve_uqincp : AdvSIMD_SVE_Saturating_Intrinsic;
  1484. def int_aarch64_sve_uqincb_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1485. def int_aarch64_sve_uqincb_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1486. def int_aarch64_sve_uqinch_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1487. def int_aarch64_sve_uqinch_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1488. def int_aarch64_sve_uqincw_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1489. def int_aarch64_sve_uqincw_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1490. def int_aarch64_sve_uqincd_n32 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i32_ty>;
  1491. def int_aarch64_sve_uqincd_n64 : AdvSIMD_SVE_SaturatingWithPattern_N_Intrinsic<llvm_i64_ty>;
  1492. def int_aarch64_sve_uqincp_n32 : AdvSIMD_SVE_Saturating_N_Intrinsic<llvm_i32_ty>;
  1493. def int_aarch64_sve_uqincp_n64 : AdvSIMD_SVE_Saturating_N_Intrinsic<llvm_i64_ty>;
  1494. //
  1495. // Reversal
  1496. //
  1497. def int_aarch64_sve_rbit : AdvSIMD_Merged1VectorArg_Intrinsic;
  1498. def int_aarch64_sve_revb : AdvSIMD_Merged1VectorArg_Intrinsic;
  1499. def int_aarch64_sve_revh : AdvSIMD_Merged1VectorArg_Intrinsic;
  1500. def int_aarch64_sve_revw : AdvSIMD_Merged1VectorArg_Intrinsic;
  1501. //
  1502. // Permutations and selection
  1503. //
  1504. def int_aarch64_sve_clasta : AdvSIMD_Pred2VectorArg_Intrinsic;
  1505. def int_aarch64_sve_clasta_n : AdvSIMD_SVE_ReduceWithInit_Intrinsic;
  1506. def int_aarch64_sve_clastb : AdvSIMD_Pred2VectorArg_Intrinsic;
  1507. def int_aarch64_sve_clastb_n : AdvSIMD_SVE_ReduceWithInit_Intrinsic;
  1508. def int_aarch64_sve_compact : AdvSIMD_Pred1VectorArg_Intrinsic;
  1509. def int_aarch64_sve_dupq_lane : AdvSIMD_SVE_DUPQ_Intrinsic;
  1510. def int_aarch64_sve_ext : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1511. def int_aarch64_sve_sel : AdvSIMD_Pred2VectorArg_Intrinsic;
  1512. def int_aarch64_sve_lasta : AdvSIMD_SVE_Reduce_Intrinsic;
  1513. def int_aarch64_sve_lastb : AdvSIMD_SVE_Reduce_Intrinsic;
  1514. def int_aarch64_sve_rev : AdvSIMD_1VectorArg_Intrinsic;
  1515. def int_aarch64_sve_splice : AdvSIMD_Pred2VectorArg_Intrinsic;
  1516. def int_aarch64_sve_sunpkhi : AdvSIMD_SVE_Unpack_Intrinsic;
  1517. def int_aarch64_sve_sunpklo : AdvSIMD_SVE_Unpack_Intrinsic;
  1518. def int_aarch64_sve_tbl : AdvSIMD_SVE_TBL_Intrinsic;
  1519. def int_aarch64_sve_trn1 : AdvSIMD_2VectorArg_Intrinsic;
  1520. def int_aarch64_sve_trn2 : AdvSIMD_2VectorArg_Intrinsic;
  1521. def int_aarch64_sve_trn1q : AdvSIMD_2VectorArg_Intrinsic;
  1522. def int_aarch64_sve_trn2q : AdvSIMD_2VectorArg_Intrinsic;
  1523. def int_aarch64_sve_uunpkhi : AdvSIMD_SVE_Unpack_Intrinsic;
  1524. def int_aarch64_sve_uunpklo : AdvSIMD_SVE_Unpack_Intrinsic;
  1525. def int_aarch64_sve_uzp1 : AdvSIMD_2VectorArg_Intrinsic;
  1526. def int_aarch64_sve_uzp2 : AdvSIMD_2VectorArg_Intrinsic;
  1527. def int_aarch64_sve_uzp1q : AdvSIMD_2VectorArg_Intrinsic;
  1528. def int_aarch64_sve_uzp2q : AdvSIMD_2VectorArg_Intrinsic;
  1529. def int_aarch64_sve_zip1 : AdvSIMD_2VectorArg_Intrinsic;
  1530. def int_aarch64_sve_zip2 : AdvSIMD_2VectorArg_Intrinsic;
  1531. def int_aarch64_sve_zip1q : AdvSIMD_2VectorArg_Intrinsic;
  1532. def int_aarch64_sve_zip2q : AdvSIMD_2VectorArg_Intrinsic;
  1533. //
  1534. // Logical operations
  1535. //
  1536. def int_aarch64_sve_and : AdvSIMD_Pred2VectorArg_Intrinsic;
  1537. def int_aarch64_sve_bic : AdvSIMD_Pred2VectorArg_Intrinsic;
  1538. def int_aarch64_sve_cnot : AdvSIMD_Merged1VectorArg_Intrinsic;
  1539. def int_aarch64_sve_eor : AdvSIMD_Pred2VectorArg_Intrinsic;
  1540. def int_aarch64_sve_not : AdvSIMD_Merged1VectorArg_Intrinsic;
  1541. def int_aarch64_sve_orr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1542. //
  1543. // Conversion
  1544. //
  1545. def int_aarch64_sve_sxtb : AdvSIMD_Merged1VectorArg_Intrinsic;
  1546. def int_aarch64_sve_sxth : AdvSIMD_Merged1VectorArg_Intrinsic;
  1547. def int_aarch64_sve_sxtw : AdvSIMD_Merged1VectorArg_Intrinsic;
  1548. def int_aarch64_sve_uxtb : AdvSIMD_Merged1VectorArg_Intrinsic;
  1549. def int_aarch64_sve_uxth : AdvSIMD_Merged1VectorArg_Intrinsic;
  1550. def int_aarch64_sve_uxtw : AdvSIMD_Merged1VectorArg_Intrinsic;
  1551. //
  1552. // While comparisons
  1553. //
  1554. def int_aarch64_sve_whilele : AdvSIMD_SVE_WHILE_Intrinsic;
  1555. def int_aarch64_sve_whilelo : AdvSIMD_SVE_WHILE_Intrinsic;
  1556. def int_aarch64_sve_whilels : AdvSIMD_SVE_WHILE_Intrinsic;
  1557. def int_aarch64_sve_whilelt : AdvSIMD_SVE_WHILE_Intrinsic;
  1558. def int_aarch64_sve_whilege : AdvSIMD_SVE_WHILE_Intrinsic;
  1559. def int_aarch64_sve_whilegt : AdvSIMD_SVE_WHILE_Intrinsic;
  1560. def int_aarch64_sve_whilehs : AdvSIMD_SVE_WHILE_Intrinsic;
  1561. def int_aarch64_sve_whilehi : AdvSIMD_SVE_WHILE_Intrinsic;
  1562. //
  1563. // Floating-point arithmetic
  1564. //
  1565. def int_aarch64_sve_fabd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1566. def int_aarch64_sve_fabs : AdvSIMD_Merged1VectorArg_Intrinsic;
  1567. def int_aarch64_sve_fadd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1568. def int_aarch64_sve_fcadd : AdvSIMD_SVE_CADD_Intrinsic;
  1569. def int_aarch64_sve_fcmla : AdvSIMD_SVE_CMLA_Intrinsic;
  1570. def int_aarch64_sve_fcmla_lane : AdvSIMD_SVE_CMLA_LANE_Intrinsic;
  1571. def int_aarch64_sve_fdiv : AdvSIMD_Pred2VectorArg_Intrinsic;
  1572. def int_aarch64_sve_fdivr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1573. def int_aarch64_sve_fexpa_x : AdvSIMD_SVE_EXPA_Intrinsic;
  1574. def int_aarch64_sve_fmad : AdvSIMD_Pred3VectorArg_Intrinsic;
  1575. def int_aarch64_sve_fmax : AdvSIMD_Pred2VectorArg_Intrinsic;
  1576. def int_aarch64_sve_fmaxnm : AdvSIMD_Pred2VectorArg_Intrinsic;
  1577. def int_aarch64_sve_fmin : AdvSIMD_Pred2VectorArg_Intrinsic;
  1578. def int_aarch64_sve_fminnm : AdvSIMD_Pred2VectorArg_Intrinsic;
  1579. def int_aarch64_sve_fmla : AdvSIMD_Pred3VectorArg_Intrinsic;
  1580. def int_aarch64_sve_fmla_lane : AdvSIMD_3VectorArgIndexed_Intrinsic;
  1581. def int_aarch64_sve_fmls : AdvSIMD_Pred3VectorArg_Intrinsic;
  1582. def int_aarch64_sve_fmls_lane : AdvSIMD_3VectorArgIndexed_Intrinsic;
  1583. def int_aarch64_sve_fmsb : AdvSIMD_Pred3VectorArg_Intrinsic;
  1584. def int_aarch64_sve_fmul : AdvSIMD_Pred2VectorArg_Intrinsic;
  1585. def int_aarch64_sve_fmulx : AdvSIMD_Pred2VectorArg_Intrinsic;
  1586. def int_aarch64_sve_fneg : AdvSIMD_Merged1VectorArg_Intrinsic;
  1587. def int_aarch64_sve_fmul_lane : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1588. def int_aarch64_sve_fnmad : AdvSIMD_Pred3VectorArg_Intrinsic;
  1589. def int_aarch64_sve_fnmla : AdvSIMD_Pred3VectorArg_Intrinsic;
  1590. def int_aarch64_sve_fnmls : AdvSIMD_Pred3VectorArg_Intrinsic;
  1591. def int_aarch64_sve_fnmsb : AdvSIMD_Pred3VectorArg_Intrinsic;
  1592. def int_aarch64_sve_frecpe_x : AdvSIMD_1VectorArg_Intrinsic;
  1593. def int_aarch64_sve_frecps_x : AdvSIMD_2VectorArg_Intrinsic;
  1594. def int_aarch64_sve_frecpx : AdvSIMD_Merged1VectorArg_Intrinsic;
  1595. def int_aarch64_sve_frinta : AdvSIMD_Merged1VectorArg_Intrinsic;
  1596. def int_aarch64_sve_frinti : AdvSIMD_Merged1VectorArg_Intrinsic;
  1597. def int_aarch64_sve_frintm : AdvSIMD_Merged1VectorArg_Intrinsic;
  1598. def int_aarch64_sve_frintn : AdvSIMD_Merged1VectorArg_Intrinsic;
  1599. def int_aarch64_sve_frintp : AdvSIMD_Merged1VectorArg_Intrinsic;
  1600. def int_aarch64_sve_frintx : AdvSIMD_Merged1VectorArg_Intrinsic;
  1601. def int_aarch64_sve_frintz : AdvSIMD_Merged1VectorArg_Intrinsic;
  1602. def int_aarch64_sve_frsqrte_x : AdvSIMD_1VectorArg_Intrinsic;
  1603. def int_aarch64_sve_frsqrts_x : AdvSIMD_2VectorArg_Intrinsic;
  1604. def int_aarch64_sve_fscale : AdvSIMD_SVE_SCALE_Intrinsic;
  1605. def int_aarch64_sve_fsqrt : AdvSIMD_Merged1VectorArg_Intrinsic;
  1606. def int_aarch64_sve_fsub : AdvSIMD_Pred2VectorArg_Intrinsic;
  1607. def int_aarch64_sve_fsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1608. def int_aarch64_sve_ftmad_x : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1609. def int_aarch64_sve_ftsmul_x : AdvSIMD_SVE_TSMUL_Intrinsic;
  1610. def int_aarch64_sve_ftssel_x : AdvSIMD_SVE_TSMUL_Intrinsic;
  1611. //
  1612. // Floating-point reductions
  1613. //
  1614. def int_aarch64_sve_fadda : AdvSIMD_SVE_ReduceWithInit_Intrinsic;
  1615. def int_aarch64_sve_faddv : AdvSIMD_SVE_Reduce_Intrinsic;
  1616. def int_aarch64_sve_fmaxv : AdvSIMD_SVE_Reduce_Intrinsic;
  1617. def int_aarch64_sve_fmaxnmv : AdvSIMD_SVE_Reduce_Intrinsic;
  1618. def int_aarch64_sve_fminv : AdvSIMD_SVE_Reduce_Intrinsic;
  1619. def int_aarch64_sve_fminnmv : AdvSIMD_SVE_Reduce_Intrinsic;
  1620. //
  1621. // Floating-point conversions
  1622. //
  1623. def int_aarch64_sve_fcvt : AdvSIMD_SVE_FCVT_Intrinsic;
  1624. def int_aarch64_sve_fcvtzs : AdvSIMD_SVE_FCVTZS_Intrinsic;
  1625. def int_aarch64_sve_fcvtzu : AdvSIMD_SVE_FCVTZS_Intrinsic;
  1626. def int_aarch64_sve_scvtf : AdvSIMD_SVE_SCVTF_Intrinsic;
  1627. def int_aarch64_sve_ucvtf : AdvSIMD_SVE_SCVTF_Intrinsic;
  1628. //
  1629. // Floating-point comparisons
  1630. //
  1631. def int_aarch64_sve_facge : AdvSIMD_SVE_Compare_Intrinsic;
  1632. def int_aarch64_sve_facgt : AdvSIMD_SVE_Compare_Intrinsic;
  1633. def int_aarch64_sve_fcmpeq : AdvSIMD_SVE_Compare_Intrinsic;
  1634. def int_aarch64_sve_fcmpge : AdvSIMD_SVE_Compare_Intrinsic;
  1635. def int_aarch64_sve_fcmpgt : AdvSIMD_SVE_Compare_Intrinsic;
  1636. def int_aarch64_sve_fcmpne : AdvSIMD_SVE_Compare_Intrinsic;
  1637. def int_aarch64_sve_fcmpuo : AdvSIMD_SVE_Compare_Intrinsic;
  1638. def int_aarch64_sve_fcvtzs_i32f16 : Builtin_SVCVT<"svcvt_s32_f16_m", llvm_nxv4i32_ty, llvm_nxv4i1_ty, llvm_nxv8f16_ty>;
  1639. def int_aarch64_sve_fcvtzs_i32f64 : Builtin_SVCVT<"svcvt_s32_f64_m", llvm_nxv4i32_ty, llvm_nxv2i1_ty, llvm_nxv2f64_ty>;
  1640. def int_aarch64_sve_fcvtzs_i64f16 : Builtin_SVCVT<"svcvt_s64_f16_m", llvm_nxv2i64_ty, llvm_nxv2i1_ty, llvm_nxv8f16_ty>;
  1641. def int_aarch64_sve_fcvtzs_i64f32 : Builtin_SVCVT<"svcvt_s64_f32_m", llvm_nxv2i64_ty, llvm_nxv2i1_ty, llvm_nxv4f32_ty>;
  1642. def int_aarch64_sve_fcvt_bf16f32 : Builtin_SVCVT<"svcvt_bf16_f32_m", llvm_nxv8bf16_ty, llvm_nxv8i1_ty, llvm_nxv4f32_ty>;
  1643. def int_aarch64_sve_fcvtnt_bf16f32 : Builtin_SVCVT<"svcvtnt_bf16_f32_m", llvm_nxv8bf16_ty, llvm_nxv8i1_ty, llvm_nxv4f32_ty>;
  1644. def int_aarch64_sve_fcvtzu_i32f16 : Builtin_SVCVT<"svcvt_u32_f16_m", llvm_nxv4i32_ty, llvm_nxv4i1_ty, llvm_nxv8f16_ty>;
  1645. def int_aarch64_sve_fcvtzu_i32f64 : Builtin_SVCVT<"svcvt_u32_f64_m", llvm_nxv4i32_ty, llvm_nxv2i1_ty, llvm_nxv2f64_ty>;
  1646. def int_aarch64_sve_fcvtzu_i64f16 : Builtin_SVCVT<"svcvt_u64_f16_m", llvm_nxv2i64_ty, llvm_nxv2i1_ty, llvm_nxv8f16_ty>;
  1647. def int_aarch64_sve_fcvtzu_i64f32 : Builtin_SVCVT<"svcvt_u64_f32_m", llvm_nxv2i64_ty, llvm_nxv2i1_ty, llvm_nxv4f32_ty>;
  1648. def int_aarch64_sve_fcvt_f16f32 : Builtin_SVCVT<"svcvt_f16_f32_m", llvm_nxv8f16_ty, llvm_nxv4i1_ty, llvm_nxv4f32_ty>;
  1649. def int_aarch64_sve_fcvt_f16f64 : Builtin_SVCVT<"svcvt_f16_f64_m", llvm_nxv8f16_ty, llvm_nxv2i1_ty, llvm_nxv2f64_ty>;
  1650. def int_aarch64_sve_fcvt_f32f64 : Builtin_SVCVT<"svcvt_f32_f64_m", llvm_nxv4f32_ty, llvm_nxv2i1_ty, llvm_nxv2f64_ty>;
  1651. def int_aarch64_sve_fcvt_f32f16 : Builtin_SVCVT<"svcvt_f32_f16_m", llvm_nxv4f32_ty, llvm_nxv4i1_ty, llvm_nxv8f16_ty>;
  1652. def int_aarch64_sve_fcvt_f64f16 : Builtin_SVCVT<"svcvt_f64_f16_m", llvm_nxv2f64_ty, llvm_nxv2i1_ty, llvm_nxv8f16_ty>;
  1653. def int_aarch64_sve_fcvt_f64f32 : Builtin_SVCVT<"svcvt_f64_f32_m", llvm_nxv2f64_ty, llvm_nxv2i1_ty, llvm_nxv4f32_ty>;
  1654. def int_aarch64_sve_fcvtlt_f32f16 : Builtin_SVCVT<"svcvtlt_f32_f16_m", llvm_nxv4f32_ty, llvm_nxv4i1_ty, llvm_nxv8f16_ty>;
  1655. def int_aarch64_sve_fcvtlt_f64f32 : Builtin_SVCVT<"svcvtlt_f64_f32_m", llvm_nxv2f64_ty, llvm_nxv2i1_ty, llvm_nxv4f32_ty>;
  1656. def int_aarch64_sve_fcvtnt_f16f32 : Builtin_SVCVT<"svcvtnt_f16_f32_m", llvm_nxv8f16_ty, llvm_nxv4i1_ty, llvm_nxv4f32_ty>;
  1657. def int_aarch64_sve_fcvtnt_f32f64 : Builtin_SVCVT<"svcvtnt_f32_f64_m", llvm_nxv4f32_ty, llvm_nxv2i1_ty, llvm_nxv2f64_ty>;
  1658. def int_aarch64_sve_fcvtx_f32f64 : Builtin_SVCVT<"svcvtx_f32_f64_m", llvm_nxv4f32_ty, llvm_nxv2i1_ty, llvm_nxv2f64_ty>;
  1659. def int_aarch64_sve_fcvtxnt_f32f64 : Builtin_SVCVT<"svcvtxnt_f32_f64_m", llvm_nxv4f32_ty, llvm_nxv2i1_ty, llvm_nxv2f64_ty>;
  1660. def int_aarch64_sve_scvtf_f16i32 : Builtin_SVCVT<"svcvt_f16_s32_m", llvm_nxv8f16_ty, llvm_nxv4i1_ty, llvm_nxv4i32_ty>;
  1661. def int_aarch64_sve_scvtf_f16i64 : Builtin_SVCVT<"svcvt_f16_s64_m", llvm_nxv8f16_ty, llvm_nxv2i1_ty, llvm_nxv2i64_ty>;
  1662. def int_aarch64_sve_scvtf_f32i64 : Builtin_SVCVT<"svcvt_f32_s64_m", llvm_nxv4f32_ty, llvm_nxv2i1_ty, llvm_nxv2i64_ty>;
  1663. def int_aarch64_sve_scvtf_f64i32 : Builtin_SVCVT<"svcvt_f64_s32_m", llvm_nxv2f64_ty, llvm_nxv2i1_ty, llvm_nxv4i32_ty>;
  1664. def int_aarch64_sve_ucvtf_f16i32 : Builtin_SVCVT<"svcvt_f16_u32_m", llvm_nxv8f16_ty, llvm_nxv4i1_ty, llvm_nxv4i32_ty>;
  1665. def int_aarch64_sve_ucvtf_f16i64 : Builtin_SVCVT<"svcvt_f16_u64_m", llvm_nxv8f16_ty, llvm_nxv2i1_ty, llvm_nxv2i64_ty>;
  1666. def int_aarch64_sve_ucvtf_f32i64 : Builtin_SVCVT<"svcvt_f32_u64_m", llvm_nxv4f32_ty, llvm_nxv2i1_ty, llvm_nxv2i64_ty>;
  1667. def int_aarch64_sve_ucvtf_f64i32 : Builtin_SVCVT<"svcvt_f64_u32_m", llvm_nxv2f64_ty, llvm_nxv2i1_ty, llvm_nxv4i32_ty>;
  1668. //
  1669. // Predicate creation
  1670. //
  1671. def int_aarch64_sve_ptrue : AdvSIMD_SVE_PTRUE_Intrinsic;
  1672. //
  1673. // Predicate operations
  1674. //
  1675. def int_aarch64_sve_and_z : AdvSIMD_Pred2VectorArg_Intrinsic;
  1676. def int_aarch64_sve_bic_z : AdvSIMD_Pred2VectorArg_Intrinsic;
  1677. def int_aarch64_sve_brka : AdvSIMD_Merged1VectorArg_Intrinsic;
  1678. def int_aarch64_sve_brka_z : AdvSIMD_Pred1VectorArg_Intrinsic;
  1679. def int_aarch64_sve_brkb : AdvSIMD_Merged1VectorArg_Intrinsic;
  1680. def int_aarch64_sve_brkb_z : AdvSIMD_Pred1VectorArg_Intrinsic;
  1681. def int_aarch64_sve_brkn_z : AdvSIMD_Pred2VectorArg_Intrinsic;
  1682. def int_aarch64_sve_brkpa_z : AdvSIMD_Pred2VectorArg_Intrinsic;
  1683. def int_aarch64_sve_brkpb_z : AdvSIMD_Pred2VectorArg_Intrinsic;
  1684. def int_aarch64_sve_eor_z : AdvSIMD_Pred2VectorArg_Intrinsic;
  1685. def int_aarch64_sve_nand_z : AdvSIMD_Pred2VectorArg_Intrinsic;
  1686. def int_aarch64_sve_nor_z : AdvSIMD_Pred2VectorArg_Intrinsic;
  1687. def int_aarch64_sve_orn_z : AdvSIMD_Pred2VectorArg_Intrinsic;
  1688. def int_aarch64_sve_orr_z : AdvSIMD_Pred2VectorArg_Intrinsic;
  1689. def int_aarch64_sve_pfirst : AdvSIMD_Pred1VectorArg_Intrinsic;
  1690. def int_aarch64_sve_pnext : AdvSIMD_Pred1VectorArg_Intrinsic;
  1691. def int_aarch64_sve_punpkhi : AdvSIMD_SVE_PUNPKHI_Intrinsic;
  1692. def int_aarch64_sve_punpklo : AdvSIMD_SVE_PUNPKHI_Intrinsic;
  1693. //
  1694. // Testing predicates
  1695. //
  1696. def int_aarch64_sve_ptest_any : AdvSIMD_SVE_PTEST_Intrinsic;
  1697. def int_aarch64_sve_ptest_first : AdvSIMD_SVE_PTEST_Intrinsic;
  1698. def int_aarch64_sve_ptest_last : AdvSIMD_SVE_PTEST_Intrinsic;
  1699. //
  1700. // Reinterpreting data
  1701. //
  1702. def int_aarch64_sve_convert_from_svbool : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
  1703. [llvm_nxv16i1_ty],
  1704. [IntrNoMem]>;
  1705. def int_aarch64_sve_convert_to_svbool : DefaultAttrsIntrinsic<[llvm_nxv16i1_ty],
  1706. [llvm_anyvector_ty],
  1707. [IntrNoMem]>;
  1708. //
  1709. // Gather loads: scalar base + vector offsets
  1710. //
  1711. // 64 bit unscaled offsets
  1712. def int_aarch64_sve_ld1_gather : AdvSIMD_GatherLoad_SV_64b_Offsets_Intrinsic;
  1713. // 64 bit scaled offsets
  1714. def int_aarch64_sve_ld1_gather_index : AdvSIMD_GatherLoad_SV_64b_Offsets_Intrinsic;
  1715. // 32 bit unscaled offsets, sign (sxtw) or zero (zxtw) extended to 64 bits
  1716. def int_aarch64_sve_ld1_gather_sxtw : AdvSIMD_GatherLoad_SV_32b_Offsets_Intrinsic;
  1717. def int_aarch64_sve_ld1_gather_uxtw : AdvSIMD_GatherLoad_SV_32b_Offsets_Intrinsic;
  1718. // 32 bit scaled offsets, sign (sxtw) or zero (zxtw) extended to 64 bits
  1719. def int_aarch64_sve_ld1_gather_sxtw_index : AdvSIMD_GatherLoad_SV_32b_Offsets_Intrinsic;
  1720. def int_aarch64_sve_ld1_gather_uxtw_index : AdvSIMD_GatherLoad_SV_32b_Offsets_Intrinsic;
  1721. //
  1722. // Gather loads: vector base + scalar offset
  1723. //
  1724. def int_aarch64_sve_ld1_gather_scalar_offset : AdvSIMD_GatherLoad_VS_Intrinsic;
  1725. //
  1726. // First-faulting gather loads: scalar base + vector offsets
  1727. //
  1728. // 64 bit unscaled offsets
  1729. def int_aarch64_sve_ldff1_gather : AdvSIMD_GatherLoad_SV_64b_Offsets_WriteFFR_Intrinsic;
  1730. // 64 bit scaled offsets
  1731. def int_aarch64_sve_ldff1_gather_index : AdvSIMD_GatherLoad_SV_64b_Offsets_WriteFFR_Intrinsic;
  1732. // 32 bit unscaled offsets, sign (sxtw) or zero (uxtw) extended to 64 bits
  1733. def int_aarch64_sve_ldff1_gather_sxtw : AdvSIMD_GatherLoad_SV_32b_Offsets_WriteFFR_Intrinsic;
  1734. def int_aarch64_sve_ldff1_gather_uxtw : AdvSIMD_GatherLoad_SV_32b_Offsets_WriteFFR_Intrinsic;
  1735. // 32 bit scaled offsets, sign (sxtw) or zero (uxtw) extended to 64 bits
  1736. def int_aarch64_sve_ldff1_gather_sxtw_index : AdvSIMD_GatherLoad_SV_32b_Offsets_WriteFFR_Intrinsic;
  1737. def int_aarch64_sve_ldff1_gather_uxtw_index : AdvSIMD_GatherLoad_SV_32b_Offsets_WriteFFR_Intrinsic;
  1738. //
  1739. // First-faulting gather loads: vector base + scalar offset
  1740. //
  1741. def int_aarch64_sve_ldff1_gather_scalar_offset : AdvSIMD_GatherLoad_VS_WriteFFR_Intrinsic;
  1742. //
  1743. // Non-temporal gather loads: scalar base + vector offsets
  1744. //
  1745. // 64 bit unscaled offsets
  1746. def int_aarch64_sve_ldnt1_gather : AdvSIMD_GatherLoad_SV_64b_Offsets_Intrinsic;
  1747. // 64 bit indices
  1748. def int_aarch64_sve_ldnt1_gather_index : AdvSIMD_GatherLoad_SV_64b_Offsets_Intrinsic;
  1749. // 32 bit unscaled offsets, zero (zxtw) extended to 64 bits
  1750. def int_aarch64_sve_ldnt1_gather_uxtw : AdvSIMD_GatherLoad_SV_32b_Offsets_Intrinsic;
  1751. //
  1752. // Non-temporal gather loads: vector base + scalar offset
  1753. //
  1754. def int_aarch64_sve_ldnt1_gather_scalar_offset : AdvSIMD_GatherLoad_VS_Intrinsic;
  1755. //
  1756. // Scatter stores: scalar base + vector offsets
  1757. //
  1758. // 64 bit unscaled offsets
  1759. def int_aarch64_sve_st1_scatter : AdvSIMD_ScatterStore_SV_64b_Offsets_Intrinsic;
  1760. // 64 bit scaled offsets
  1761. def int_aarch64_sve_st1_scatter_index
  1762. : AdvSIMD_ScatterStore_SV_64b_Offsets_Intrinsic;
  1763. // 32 bit unscaled offsets, sign (sxtw) or zero (zxtw) extended to 64 bits
  1764. def int_aarch64_sve_st1_scatter_sxtw
  1765. : AdvSIMD_ScatterStore_SV_32b_Offsets_Intrinsic;
  1766. def int_aarch64_sve_st1_scatter_uxtw
  1767. : AdvSIMD_ScatterStore_SV_32b_Offsets_Intrinsic;
  1768. // 32 bit scaled offsets, sign (sxtw) or zero (zxtw) extended to 64 bits
  1769. def int_aarch64_sve_st1_scatter_sxtw_index
  1770. : AdvSIMD_ScatterStore_SV_32b_Offsets_Intrinsic;
  1771. def int_aarch64_sve_st1_scatter_uxtw_index
  1772. : AdvSIMD_ScatterStore_SV_32b_Offsets_Intrinsic;
  1773. //
  1774. // Scatter stores: vector base + scalar offset
  1775. //
  1776. def int_aarch64_sve_st1_scatter_scalar_offset : AdvSIMD_ScatterStore_VS_Intrinsic;
  1777. //
  1778. // Non-temporal scatter stores: scalar base + vector offsets
  1779. //
  1780. // 64 bit unscaled offsets
  1781. def int_aarch64_sve_stnt1_scatter : AdvSIMD_ScatterStore_SV_64b_Offsets_Intrinsic;
  1782. // 64 bit indices
  1783. def int_aarch64_sve_stnt1_scatter_index
  1784. : AdvSIMD_ScatterStore_SV_64b_Offsets_Intrinsic;
  1785. // 32 bit unscaled offsets, zero (zxtw) extended to 64 bits
  1786. def int_aarch64_sve_stnt1_scatter_uxtw : AdvSIMD_ScatterStore_SV_32b_Offsets_Intrinsic;
  1787. //
  1788. // Non-temporal scatter stores: vector base + scalar offset
  1789. //
  1790. def int_aarch64_sve_stnt1_scatter_scalar_offset : AdvSIMD_ScatterStore_VS_Intrinsic;
  1791. //
  1792. // SVE2 - Uniform DSP operations
  1793. //
  1794. def int_aarch64_sve_saba : AdvSIMD_3VectorArg_Intrinsic;
  1795. def int_aarch64_sve_shadd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1796. def int_aarch64_sve_shsub : AdvSIMD_Pred2VectorArg_Intrinsic;
  1797. def int_aarch64_sve_shsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1798. def int_aarch64_sve_sli : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1799. def int_aarch64_sve_sqabs : AdvSIMD_Merged1VectorArg_Intrinsic;
  1800. def int_aarch64_sve_sqadd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1801. def int_aarch64_sve_sqdmulh : AdvSIMD_2VectorArg_Intrinsic;
  1802. def int_aarch64_sve_sqdmulh_lane : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1803. def int_aarch64_sve_sqneg : AdvSIMD_Merged1VectorArg_Intrinsic;
  1804. def int_aarch64_sve_sqrdmlah : AdvSIMD_3VectorArg_Intrinsic;
  1805. def int_aarch64_sve_sqrdmlah_lane : AdvSIMD_3VectorArgIndexed_Intrinsic;
  1806. def int_aarch64_sve_sqrdmlsh : AdvSIMD_3VectorArg_Intrinsic;
  1807. def int_aarch64_sve_sqrdmlsh_lane : AdvSIMD_3VectorArgIndexed_Intrinsic;
  1808. def int_aarch64_sve_sqrdmulh : AdvSIMD_2VectorArg_Intrinsic;
  1809. def int_aarch64_sve_sqrdmulh_lane : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1810. def int_aarch64_sve_sqrshl : AdvSIMD_Pred2VectorArg_Intrinsic;
  1811. def int_aarch64_sve_sqshl : AdvSIMD_Pred2VectorArg_Intrinsic;
  1812. def int_aarch64_sve_sqshlu : AdvSIMD_SVE_ShiftByImm_Intrinsic;
  1813. def int_aarch64_sve_sqsub : AdvSIMD_Pred2VectorArg_Intrinsic;
  1814. def int_aarch64_sve_sqsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1815. def int_aarch64_sve_srhadd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1816. def int_aarch64_sve_sri : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1817. def int_aarch64_sve_srshl : AdvSIMD_Pred2VectorArg_Intrinsic;
  1818. def int_aarch64_sve_srshr : AdvSIMD_SVE_ShiftByImm_Intrinsic;
  1819. def int_aarch64_sve_srsra : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1820. def int_aarch64_sve_ssra : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1821. def int_aarch64_sve_suqadd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1822. def int_aarch64_sve_uaba : AdvSIMD_3VectorArg_Intrinsic;
  1823. def int_aarch64_sve_uhadd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1824. def int_aarch64_sve_uhsub : AdvSIMD_Pred2VectorArg_Intrinsic;
  1825. def int_aarch64_sve_uhsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1826. def int_aarch64_sve_uqadd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1827. def int_aarch64_sve_uqrshl : AdvSIMD_Pred2VectorArg_Intrinsic;
  1828. def int_aarch64_sve_uqshl : AdvSIMD_Pred2VectorArg_Intrinsic;
  1829. def int_aarch64_sve_uqsub : AdvSIMD_Pred2VectorArg_Intrinsic;
  1830. def int_aarch64_sve_uqsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
  1831. def int_aarch64_sve_urecpe : AdvSIMD_Merged1VectorArg_Intrinsic;
  1832. def int_aarch64_sve_urhadd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1833. def int_aarch64_sve_urshl : AdvSIMD_Pred2VectorArg_Intrinsic;
  1834. def int_aarch64_sve_urshr : AdvSIMD_SVE_ShiftByImm_Intrinsic;
  1835. def int_aarch64_sve_ursqrte : AdvSIMD_Merged1VectorArg_Intrinsic;
  1836. def int_aarch64_sve_ursra : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1837. def int_aarch64_sve_usqadd : AdvSIMD_Pred2VectorArg_Intrinsic;
  1838. def int_aarch64_sve_usra : AdvSIMD_2VectorArgIndexed_Intrinsic;
  1839. //
  1840. // SVE2 - Widening DSP operations
  1841. //
  1842. def int_aarch64_sve_sabalb : SVE2_3VectorArg_Long_Intrinsic;
  1843. def int_aarch64_sve_sabalt : SVE2_3VectorArg_Long_Intrinsic;
  1844. def int_aarch64_sve_sabdlb : SVE2_2VectorArg_Long_Intrinsic;
  1845. def int_aarch64_sve_sabdlt : SVE2_2VectorArg_Long_Intrinsic;
  1846. def int_aarch64_sve_saddlb : SVE2_2VectorArg_Long_Intrinsic;
  1847. def int_aarch64_sve_saddlt : SVE2_2VectorArg_Long_Intrinsic;
  1848. def int_aarch64_sve_saddwb : SVE2_2VectorArg_Wide_Intrinsic;
  1849. def int_aarch64_sve_saddwt : SVE2_2VectorArg_Wide_Intrinsic;
  1850. def int_aarch64_sve_sshllb : SVE2_1VectorArg_Long_Intrinsic;
  1851. def int_aarch64_sve_sshllt : SVE2_1VectorArg_Long_Intrinsic;
  1852. def int_aarch64_sve_ssublb : SVE2_2VectorArg_Long_Intrinsic;
  1853. def int_aarch64_sve_ssublt : SVE2_2VectorArg_Long_Intrinsic;
  1854. def int_aarch64_sve_ssubwb : SVE2_2VectorArg_Wide_Intrinsic;
  1855. def int_aarch64_sve_ssubwt : SVE2_2VectorArg_Wide_Intrinsic;
  1856. def int_aarch64_sve_uabalb : SVE2_3VectorArg_Long_Intrinsic;
  1857. def int_aarch64_sve_uabalt : SVE2_3VectorArg_Long_Intrinsic;
  1858. def int_aarch64_sve_uabdlb : SVE2_2VectorArg_Long_Intrinsic;
  1859. def int_aarch64_sve_uabdlt : SVE2_2VectorArg_Long_Intrinsic;
  1860. def int_aarch64_sve_uaddlb : SVE2_2VectorArg_Long_Intrinsic;
  1861. def int_aarch64_sve_uaddlt : SVE2_2VectorArg_Long_Intrinsic;
  1862. def int_aarch64_sve_uaddwb : SVE2_2VectorArg_Wide_Intrinsic;
  1863. def int_aarch64_sve_uaddwt : SVE2_2VectorArg_Wide_Intrinsic;
  1864. def int_aarch64_sve_ushllb : SVE2_1VectorArg_Long_Intrinsic;
  1865. def int_aarch64_sve_ushllt : SVE2_1VectorArg_Long_Intrinsic;
  1866. def int_aarch64_sve_usublb : SVE2_2VectorArg_Long_Intrinsic;
  1867. def int_aarch64_sve_usublt : SVE2_2VectorArg_Long_Intrinsic;
  1868. def int_aarch64_sve_usubwb : SVE2_2VectorArg_Wide_Intrinsic;
  1869. def int_aarch64_sve_usubwt : SVE2_2VectorArg_Wide_Intrinsic;
  1870. //
  1871. // SVE2 - Non-widening pairwise arithmetic
  1872. //
  1873. def int_aarch64_sve_addp : AdvSIMD_Pred2VectorArg_Intrinsic;
  1874. def int_aarch64_sve_faddp : AdvSIMD_Pred2VectorArg_Intrinsic;
  1875. def int_aarch64_sve_fmaxp : AdvSIMD_Pred2VectorArg_Intrinsic;
  1876. def int_aarch64_sve_fmaxnmp : AdvSIMD_Pred2VectorArg_Intrinsic;
  1877. def int_aarch64_sve_fminp : AdvSIMD_Pred2VectorArg_Intrinsic;
  1878. def int_aarch64_sve_fminnmp : AdvSIMD_Pred2VectorArg_Intrinsic;
  1879. def int_aarch64_sve_smaxp : AdvSIMD_Pred2VectorArg_Intrinsic;
  1880. def int_aarch64_sve_sminp : AdvSIMD_Pred2VectorArg_Intrinsic;
  1881. def int_aarch64_sve_umaxp : AdvSIMD_Pred2VectorArg_Intrinsic;
  1882. def int_aarch64_sve_uminp : AdvSIMD_Pred2VectorArg_Intrinsic;
  1883. //
  1884. // SVE2 - Widening pairwise arithmetic
  1885. //
  1886. def int_aarch64_sve_sadalp : SVE2_2VectorArg_Pred_Long_Intrinsic;
  1887. def int_aarch64_sve_uadalp : SVE2_2VectorArg_Pred_Long_Intrinsic;
  1888. //
  1889. // SVE2 - Uniform complex integer arithmetic
  1890. //
  1891. def int_aarch64_sve_cadd_x : AdvSIMD_SVE2_CADD_Intrinsic;
  1892. def int_aarch64_sve_sqcadd_x : AdvSIMD_SVE2_CADD_Intrinsic;
  1893. def int_aarch64_sve_cmla_x : AdvSIMD_SVE2_CMLA_Intrinsic;
  1894. def int_aarch64_sve_cmla_lane_x : AdvSIMD_SVE_CMLA_LANE_Intrinsic;
  1895. def int_aarch64_sve_sqrdcmlah_x : AdvSIMD_SVE2_CMLA_Intrinsic;
  1896. def int_aarch64_sve_sqrdcmlah_lane_x : AdvSIMD_SVE_CMLA_LANE_Intrinsic;
  1897. //
  1898. // SVE2 - Widening complex integer arithmetic
  1899. //
  1900. def int_aarch64_sve_saddlbt : SVE2_2VectorArg_Long_Intrinsic;
  1901. def int_aarch64_sve_ssublbt : SVE2_2VectorArg_Long_Intrinsic;
  1902. def int_aarch64_sve_ssubltb : SVE2_2VectorArg_Long_Intrinsic;
  1903. //
  1904. // SVE2 - Widening complex integer dot product
  1905. //
  1906. def int_aarch64_sve_cdot : AdvSIMD_SVE_DOT_Indexed_Intrinsic;
  1907. def int_aarch64_sve_cdot_lane : AdvSIMD_SVE_CDOT_LANE_Intrinsic;
  1908. //
  1909. // SVE2 - Floating-point widening multiply-accumulate
  1910. //
  1911. def int_aarch64_sve_fmlalb : SVE2_3VectorArg_Long_Intrinsic;
  1912. def int_aarch64_sve_fmlalb_lane : SVE2_3VectorArgIndexed_Long_Intrinsic;
  1913. def int_aarch64_sve_fmlalt : SVE2_3VectorArg_Long_Intrinsic;
  1914. def int_aarch64_sve_fmlalt_lane : SVE2_3VectorArgIndexed_Long_Intrinsic;
  1915. def int_aarch64_sve_fmlslb : SVE2_3VectorArg_Long_Intrinsic;
  1916. def int_aarch64_sve_fmlslb_lane : SVE2_3VectorArgIndexed_Long_Intrinsic;
  1917. def int_aarch64_sve_fmlslt : SVE2_3VectorArg_Long_Intrinsic;
  1918. def int_aarch64_sve_fmlslt_lane : SVE2_3VectorArgIndexed_Long_Intrinsic;
  1919. //
  1920. // SVE2 - Floating-point integer binary logarithm
  1921. //
  1922. def int_aarch64_sve_flogb : AdvSIMD_SVE_LOGB_Intrinsic;
  1923. //
  1924. // SVE2 - Vector histogram count
  1925. //
  1926. def int_aarch64_sve_histcnt : AdvSIMD_Pred2VectorArg_Intrinsic;
  1927. def int_aarch64_sve_histseg : AdvSIMD_2VectorArg_Intrinsic;
  1928. //
  1929. // SVE2 - Character match
  1930. //
  1931. def int_aarch64_sve_match : AdvSIMD_SVE_Compare_Intrinsic;
  1932. def int_aarch64_sve_nmatch : AdvSIMD_SVE_Compare_Intrinsic;
  1933. //
  1934. // SVE2 - Unary narrowing operations
  1935. //
  1936. def int_aarch64_sve_sqxtnb : SVE2_1VectorArg_Narrowing_Intrinsic;
  1937. def int_aarch64_sve_sqxtnt : SVE2_Merged1VectorArg_Narrowing_Intrinsic;
  1938. def int_aarch64_sve_sqxtunb : SVE2_1VectorArg_Narrowing_Intrinsic;
  1939. def int_aarch64_sve_sqxtunt : SVE2_Merged1VectorArg_Narrowing_Intrinsic;
  1940. def int_aarch64_sve_uqxtnb : SVE2_1VectorArg_Narrowing_Intrinsic;
  1941. def int_aarch64_sve_uqxtnt : SVE2_Merged1VectorArg_Narrowing_Intrinsic;
  1942. //
  1943. // SVE2 - Binary narrowing DSP operations
  1944. //
  1945. def int_aarch64_sve_addhnb : SVE2_2VectorArg_Narrowing_Intrinsic;
  1946. def int_aarch64_sve_addhnt : SVE2_Merged2VectorArg_Narrowing_Intrinsic;
  1947. def int_aarch64_sve_raddhnb : SVE2_2VectorArg_Narrowing_Intrinsic;
  1948. def int_aarch64_sve_raddhnt : SVE2_Merged2VectorArg_Narrowing_Intrinsic;
  1949. def int_aarch64_sve_subhnb : SVE2_2VectorArg_Narrowing_Intrinsic;
  1950. def int_aarch64_sve_subhnt : SVE2_Merged2VectorArg_Narrowing_Intrinsic;
  1951. def int_aarch64_sve_rsubhnb : SVE2_2VectorArg_Narrowing_Intrinsic;
  1952. def int_aarch64_sve_rsubhnt : SVE2_Merged2VectorArg_Narrowing_Intrinsic;
  1953. // Narrowing shift right
  1954. def int_aarch64_sve_shrnb : SVE2_1VectorArg_Imm_Narrowing_Intrinsic;
  1955. def int_aarch64_sve_shrnt : SVE2_2VectorArg_Imm_Narrowing_Intrinsic;
  1956. def int_aarch64_sve_rshrnb : SVE2_1VectorArg_Imm_Narrowing_Intrinsic;
  1957. def int_aarch64_sve_rshrnt : SVE2_2VectorArg_Imm_Narrowing_Intrinsic;
  1958. // Saturating shift right - signed input/output
  1959. def int_aarch64_sve_sqshrnb : SVE2_1VectorArg_Imm_Narrowing_Intrinsic;
  1960. def int_aarch64_sve_sqshrnt : SVE2_2VectorArg_Imm_Narrowing_Intrinsic;
  1961. def int_aarch64_sve_sqrshrnb : SVE2_1VectorArg_Imm_Narrowing_Intrinsic;
  1962. def int_aarch64_sve_sqrshrnt : SVE2_2VectorArg_Imm_Narrowing_Intrinsic;
  1963. // Saturating shift right - unsigned input/output
  1964. def int_aarch64_sve_uqshrnb : SVE2_1VectorArg_Imm_Narrowing_Intrinsic;
  1965. def int_aarch64_sve_uqshrnt : SVE2_2VectorArg_Imm_Narrowing_Intrinsic;
  1966. def int_aarch64_sve_uqrshrnb : SVE2_1VectorArg_Imm_Narrowing_Intrinsic;
  1967. def int_aarch64_sve_uqrshrnt : SVE2_2VectorArg_Imm_Narrowing_Intrinsic;
  1968. // Saturating shift right - signed input, unsigned output
  1969. def int_aarch64_sve_sqshrunb : SVE2_1VectorArg_Imm_Narrowing_Intrinsic;
  1970. def int_aarch64_sve_sqshrunt : SVE2_2VectorArg_Imm_Narrowing_Intrinsic;
  1971. def int_aarch64_sve_sqrshrunb : SVE2_1VectorArg_Imm_Narrowing_Intrinsic;
  1972. def int_aarch64_sve_sqrshrunt : SVE2_2VectorArg_Imm_Narrowing_Intrinsic;
  1973. // SVE2 MLA LANE.
  1974. def int_aarch64_sve_smlalb_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1975. def int_aarch64_sve_smlalt_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1976. def int_aarch64_sve_umlalb_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1977. def int_aarch64_sve_umlalt_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1978. def int_aarch64_sve_smlslb_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1979. def int_aarch64_sve_smlslt_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1980. def int_aarch64_sve_umlslb_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1981. def int_aarch64_sve_umlslt_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1982. def int_aarch64_sve_smullb_lane : SVE2_2VectorArgIndexed_Long_Intrinsic;
  1983. def int_aarch64_sve_smullt_lane : SVE2_2VectorArgIndexed_Long_Intrinsic;
  1984. def int_aarch64_sve_umullb_lane : SVE2_2VectorArgIndexed_Long_Intrinsic;
  1985. def int_aarch64_sve_umullt_lane : SVE2_2VectorArgIndexed_Long_Intrinsic;
  1986. def int_aarch64_sve_sqdmlalb_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1987. def int_aarch64_sve_sqdmlalt_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1988. def int_aarch64_sve_sqdmlslb_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1989. def int_aarch64_sve_sqdmlslt_lane : SVE2_3VectorArg_Indexed_Intrinsic;
  1990. def int_aarch64_sve_sqdmullb_lane : SVE2_2VectorArgIndexed_Long_Intrinsic;
  1991. def int_aarch64_sve_sqdmullt_lane : SVE2_2VectorArgIndexed_Long_Intrinsic;
  1992. // SVE2 MLA Unpredicated.
  1993. def int_aarch64_sve_smlalb : SVE2_3VectorArg_Long_Intrinsic;
  1994. def int_aarch64_sve_smlalt : SVE2_3VectorArg_Long_Intrinsic;
  1995. def int_aarch64_sve_umlalb : SVE2_3VectorArg_Long_Intrinsic;
  1996. def int_aarch64_sve_umlalt : SVE2_3VectorArg_Long_Intrinsic;
  1997. def int_aarch64_sve_smlslb : SVE2_3VectorArg_Long_Intrinsic;
  1998. def int_aarch64_sve_smlslt : SVE2_3VectorArg_Long_Intrinsic;
  1999. def int_aarch64_sve_umlslb : SVE2_3VectorArg_Long_Intrinsic;
  2000. def int_aarch64_sve_umlslt : SVE2_3VectorArg_Long_Intrinsic;
  2001. def int_aarch64_sve_smullb : SVE2_2VectorArg_Long_Intrinsic;
  2002. def int_aarch64_sve_smullt : SVE2_2VectorArg_Long_Intrinsic;
  2003. def int_aarch64_sve_umullb : SVE2_2VectorArg_Long_Intrinsic;
  2004. def int_aarch64_sve_umullt : SVE2_2VectorArg_Long_Intrinsic;
  2005. def int_aarch64_sve_sqdmlalb : SVE2_3VectorArg_Long_Intrinsic;
  2006. def int_aarch64_sve_sqdmlalt : SVE2_3VectorArg_Long_Intrinsic;
  2007. def int_aarch64_sve_sqdmlslb : SVE2_3VectorArg_Long_Intrinsic;
  2008. def int_aarch64_sve_sqdmlslt : SVE2_3VectorArg_Long_Intrinsic;
  2009. def int_aarch64_sve_sqdmullb : SVE2_2VectorArg_Long_Intrinsic;
  2010. def int_aarch64_sve_sqdmullt : SVE2_2VectorArg_Long_Intrinsic;
  2011. def int_aarch64_sve_sqdmlalbt : SVE2_3VectorArg_Long_Intrinsic;
  2012. def int_aarch64_sve_sqdmlslbt : SVE2_3VectorArg_Long_Intrinsic;
  2013. // SVE2 ADDSUB Long Unpredicated.
  2014. def int_aarch64_sve_adclb : AdvSIMD_3VectorArg_Intrinsic;
  2015. def int_aarch64_sve_adclt : AdvSIMD_3VectorArg_Intrinsic;
  2016. def int_aarch64_sve_sbclb : AdvSIMD_3VectorArg_Intrinsic;
  2017. def int_aarch64_sve_sbclt : AdvSIMD_3VectorArg_Intrinsic;
  2018. //
  2019. // SVE2 - Polynomial arithmetic
  2020. //
  2021. def int_aarch64_sve_eorbt : AdvSIMD_3VectorArg_Intrinsic;
  2022. def int_aarch64_sve_eortb : AdvSIMD_3VectorArg_Intrinsic;
  2023. def int_aarch64_sve_pmullb_pair : AdvSIMD_2VectorArg_Intrinsic;
  2024. def int_aarch64_sve_pmullt_pair : AdvSIMD_2VectorArg_Intrinsic;
  2025. //
  2026. // SVE2 bitwise ternary operations.
  2027. //
  2028. def int_aarch64_sve_eor3 : AdvSIMD_3VectorArg_Intrinsic;
  2029. def int_aarch64_sve_bcax : AdvSIMD_3VectorArg_Intrinsic;
  2030. def int_aarch64_sve_bsl : AdvSIMD_3VectorArg_Intrinsic;
  2031. def int_aarch64_sve_bsl1n : AdvSIMD_3VectorArg_Intrinsic;
  2032. def int_aarch64_sve_bsl2n : AdvSIMD_3VectorArg_Intrinsic;
  2033. def int_aarch64_sve_nbsl : AdvSIMD_3VectorArg_Intrinsic;
  2034. def int_aarch64_sve_xar : AdvSIMD_2VectorArgIndexed_Intrinsic;
  2035. //
  2036. // SVE2 - Optional AES, SHA-3 and SM4
  2037. //
  2038. def int_aarch64_sve_aesd : GCCBuiltin<"__builtin_sve_svaesd_u8">,
  2039. DefaultAttrsIntrinsic<[llvm_nxv16i8_ty],
  2040. [llvm_nxv16i8_ty, llvm_nxv16i8_ty],
  2041. [IntrNoMem]>;
  2042. def int_aarch64_sve_aesimc : GCCBuiltin<"__builtin_sve_svaesimc_u8">,
  2043. DefaultAttrsIntrinsic<[llvm_nxv16i8_ty],
  2044. [llvm_nxv16i8_ty],
  2045. [IntrNoMem]>;
  2046. def int_aarch64_sve_aese : GCCBuiltin<"__builtin_sve_svaese_u8">,
  2047. DefaultAttrsIntrinsic<[llvm_nxv16i8_ty],
  2048. [llvm_nxv16i8_ty, llvm_nxv16i8_ty],
  2049. [IntrNoMem]>;
  2050. def int_aarch64_sve_aesmc : GCCBuiltin<"__builtin_sve_svaesmc_u8">,
  2051. DefaultAttrsIntrinsic<[llvm_nxv16i8_ty],
  2052. [llvm_nxv16i8_ty],
  2053. [IntrNoMem]>;
  2054. def int_aarch64_sve_rax1 : GCCBuiltin<"__builtin_sve_svrax1_u64">,
  2055. DefaultAttrsIntrinsic<[llvm_nxv2i64_ty],
  2056. [llvm_nxv2i64_ty, llvm_nxv2i64_ty],
  2057. [IntrNoMem]>;
  2058. def int_aarch64_sve_sm4e : GCCBuiltin<"__builtin_sve_svsm4e_u32">,
  2059. DefaultAttrsIntrinsic<[llvm_nxv4i32_ty],
  2060. [llvm_nxv4i32_ty, llvm_nxv4i32_ty],
  2061. [IntrNoMem]>;
  2062. def int_aarch64_sve_sm4ekey : GCCBuiltin<"__builtin_sve_svsm4ekey_u32">,
  2063. DefaultAttrsIntrinsic<[llvm_nxv4i32_ty],
  2064. [llvm_nxv4i32_ty, llvm_nxv4i32_ty],
  2065. [IntrNoMem]>;
  2066. //
  2067. // SVE2 - Extended table lookup/permute
  2068. //
  2069. def int_aarch64_sve_tbl2 : AdvSIMD_SVE2_TBX_Intrinsic;
  2070. def int_aarch64_sve_tbx : AdvSIMD_SVE2_TBX_Intrinsic;
  2071. //
  2072. // SVE2 - Optional bit permutation
  2073. //
  2074. def int_aarch64_sve_bdep_x : AdvSIMD_2VectorArg_Intrinsic;
  2075. def int_aarch64_sve_bext_x : AdvSIMD_2VectorArg_Intrinsic;
  2076. def int_aarch64_sve_bgrp_x : AdvSIMD_2VectorArg_Intrinsic;
  2077. //
  2078. // SVE ACLE: 7.3. INT8 matrix multiply extensions
  2079. //
  2080. def int_aarch64_sve_ummla : SVE_MatMul_Intrinsic;
  2081. def int_aarch64_sve_smmla : SVE_MatMul_Intrinsic;
  2082. def int_aarch64_sve_usmmla : SVE_MatMul_Intrinsic;
  2083. def int_aarch64_sve_usdot : AdvSIMD_SVE_DOT_Intrinsic;
  2084. def int_aarch64_sve_usdot_lane : AdvSIMD_SVE_DOT_Indexed_Intrinsic;
  2085. def int_aarch64_sve_sudot_lane : AdvSIMD_SVE_DOT_Indexed_Intrinsic;
  2086. //
  2087. // SVE ACLE: 7.4/5. FP64/FP32 matrix multiply extensions
  2088. //
  2089. def int_aarch64_sve_fmmla : AdvSIMD_3VectorArg_Intrinsic;
  2090. //
  2091. // SVE ACLE: 7.2. BFloat16 extensions
  2092. //
  2093. def int_aarch64_sve_bfdot : SVE_4Vec_BF16;
  2094. def int_aarch64_sve_bfmlalb : SVE_4Vec_BF16;
  2095. def int_aarch64_sve_bfmlalt : SVE_4Vec_BF16;
  2096. def int_aarch64_sve_bfmmla : SVE_4Vec_BF16;
  2097. def int_aarch64_sve_bfdot_lane : SVE_4Vec_BF16_Indexed;
  2098. def int_aarch64_sve_bfmlalb_lane : SVE_4Vec_BF16_Indexed;
  2099. def int_aarch64_sve_bfmlalt_lane : SVE_4Vec_BF16_Indexed;
  2100. }
  2101. //
  2102. // SVE2 - Contiguous conflict detection
  2103. //
  2104. def int_aarch64_sve_whilerw_b : SVE2_CONFLICT_DETECT_Intrinsic;
  2105. def int_aarch64_sve_whilerw_h : SVE2_CONFLICT_DETECT_Intrinsic;
  2106. def int_aarch64_sve_whilerw_s : SVE2_CONFLICT_DETECT_Intrinsic;
  2107. def int_aarch64_sve_whilerw_d : SVE2_CONFLICT_DETECT_Intrinsic;
  2108. def int_aarch64_sve_whilewr_b : SVE2_CONFLICT_DETECT_Intrinsic;
  2109. def int_aarch64_sve_whilewr_h : SVE2_CONFLICT_DETECT_Intrinsic;
  2110. def int_aarch64_sve_whilewr_s : SVE2_CONFLICT_DETECT_Intrinsic;
  2111. def int_aarch64_sve_whilewr_d : SVE2_CONFLICT_DETECT_Intrinsic;