72#include "llvm/IR/IntrinsicsAArch64.h"
109#define DEBUG_TYPE "aarch64-lower"
112STATISTIC(NumShiftInserts,
"Number of vector shift inserts");
113STATISTIC(NumOptimizedImms,
"Number of times immediates were optimized");
120 cl::desc(
"Allow AArch64 Local Dynamic TLS code generation"),
125 cl::desc(
"Enable AArch64 logical imm instruction "
135 cl::desc(
"Combine extends of AArch64 masked "
136 "gather intrinsics"),
140 cl::desc(
"Combine ext and trunc to TBL"),
155 cl::desc(
"Enable / disable SVE scalable vectors in Global ISel"),
162 AArch64::X3, AArch64::X4, AArch64::X5,
163 AArch64::X6, AArch64::X7};
165 AArch64::Q3, AArch64::Q4, AArch64::Q5,
166 AArch64::Q6, AArch64::Q7};
191 return MVT::nxv8bf16;
198 switch (EC.getKnownMinValue()) {
214 "Expected scalable predicate vector type!");
236 "Expected legal vector type!");
282 switch (
Op.getOpcode()) {
291 switch (
Op.getConstantOperandVal(0)) {
294 case Intrinsic::aarch64_sve_ptrue:
295 case Intrinsic::aarch64_sve_pnext:
296 case Intrinsic::aarch64_sve_cmpeq:
297 case Intrinsic::aarch64_sve_cmpne:
298 case Intrinsic::aarch64_sve_cmpge:
299 case Intrinsic::aarch64_sve_cmpgt:
300 case Intrinsic::aarch64_sve_cmphs:
301 case Intrinsic::aarch64_sve_cmphi:
302 case Intrinsic::aarch64_sve_cmpeq_wide:
303 case Intrinsic::aarch64_sve_cmpne_wide:
304 case Intrinsic::aarch64_sve_cmpge_wide:
305 case Intrinsic::aarch64_sve_cmpgt_wide:
306 case Intrinsic::aarch64_sve_cmplt_wide:
307 case Intrinsic::aarch64_sve_cmple_wide:
308 case Intrinsic::aarch64_sve_cmphs_wide:
309 case Intrinsic::aarch64_sve_cmphi_wide:
310 case Intrinsic::aarch64_sve_cmplo_wide:
311 case Intrinsic::aarch64_sve_cmpls_wide:
312 case Intrinsic::aarch64_sve_fcmpeq:
313 case Intrinsic::aarch64_sve_fcmpne:
314 case Intrinsic::aarch64_sve_fcmpge:
315 case Intrinsic::aarch64_sve_fcmpgt:
316 case Intrinsic::aarch64_sve_fcmpuo:
317 case Intrinsic::aarch64_sve_facgt:
318 case Intrinsic::aarch64_sve_facge:
319 case Intrinsic::aarch64_sve_whilege:
320 case Intrinsic::aarch64_sve_whilegt:
321 case Intrinsic::aarch64_sve_whilehi:
322 case Intrinsic::aarch64_sve_whilehs:
323 case Intrinsic::aarch64_sve_whilele:
324 case Intrinsic::aarch64_sve_whilelo:
325 case Intrinsic::aarch64_sve_whilels:
326 case Intrinsic::aarch64_sve_whilelt:
327 case Intrinsic::aarch64_sve_match:
328 case Intrinsic::aarch64_sve_nmatch:
329 case Intrinsic::aarch64_sve_whilege_x2:
330 case Intrinsic::aarch64_sve_whilegt_x2:
331 case Intrinsic::aarch64_sve_whilehi_x2:
332 case Intrinsic::aarch64_sve_whilehs_x2:
333 case Intrinsic::aarch64_sve_whilele_x2:
334 case Intrinsic::aarch64_sve_whilelo_x2:
335 case Intrinsic::aarch64_sve_whilels_x2:
336 case Intrinsic::aarch64_sve_whilelt_x2:
342static std::tuple<SDValue, SDValue>
362 const auto *ConstDiscN = dyn_cast<ConstantSDNode>(ConstDisc);
363 if (!ConstDiscN || !isUInt<16>(ConstDiscN->getZExtValue()))
369 AddrDisc = DAG->
getRegister(AArch64::NoRegister, MVT::i64);
371 return std::make_tuple(
390 if (Subtarget->hasLS64()) {
396 if (Subtarget->hasFPARMv8()) {
404 if (Subtarget->hasNEON()) {
408 addDRType(MVT::v2f32);
409 addDRType(MVT::v8i8);
410 addDRType(MVT::v4i16);
411 addDRType(MVT::v2i32);
412 addDRType(MVT::v1i64);
413 addDRType(MVT::v1f64);
414 addDRType(MVT::v4f16);
415 addDRType(MVT::v4bf16);
417 addQRType(MVT::v4f32);
418 addQRType(MVT::v2f64);
419 addQRType(MVT::v16i8);
420 addQRType(MVT::v8i16);
421 addQRType(MVT::v4i32);
422 addQRType(MVT::v2i64);
423 addQRType(MVT::v8f16);
424 addQRType(MVT::v8bf16);
463 if (Subtarget->hasSVE2p1() || Subtarget->hasSME2()) {
588 if (Subtarget->hasFPARMv8()) {
594 if (Subtarget->hasFPARMv8()) {
648 if (Subtarget->hasCSSC()) {
727 if (Subtarget->hasFullFP16()) {
755 auto LegalizeNarrowFP = [
this](
MVT ScalarVT) {
855 if (!Subtarget->hasFullFP16()) {
856 LegalizeNarrowFP(MVT::f16);
858 LegalizeNarrowFP(MVT::bf16);
874 for (
MVT Ty : {MVT::f32, MVT::f64})
876 if (Subtarget->hasFullFP16())
883 for (
MVT Ty : {MVT::f32, MVT::f64})
885 if (Subtarget->hasFullFP16())
890 for (
auto VT : {MVT::f32, MVT::f64})
902 if (!Subtarget->hasLSE() && !Subtarget->outlineAtomics()) {
914 if (Subtarget->outlineAtomics() && !Subtarget->hasLSE()) {
940#define LCALLNAMES(A, B, N) \
941 setLibcallName(A##N##_RELAX, #B #N "_relax"); \
942 setLibcallName(A##N##_ACQ, #B #N "_acq"); \
943 setLibcallName(A##N##_REL, #B #N "_rel"); \
944 setLibcallName(A##N##_ACQ_REL, #B #N "_acq_rel");
945#define LCALLNAME4(A, B) \
946 LCALLNAMES(A, B, 1) \
947 LCALLNAMES(A, B, 2) LCALLNAMES(A, B, 4) LCALLNAMES(A, B, 8)
948#define LCALLNAME5(A, B) \
949 LCALLNAMES(A, B, 1) \
950 LCALLNAMES(A, B, 2) \
951 LCALLNAMES(A, B, 4) LCALLNAMES(A, B, 8) LCALLNAMES(A, B, 16)
952 LCALLNAME5(RTLIB::OUTLINE_ATOMIC_CAS, __aarch64_cas)
953 LCALLNAME4(RTLIB::OUTLINE_ATOMIC_SWP, __aarch64_swp)
954 LCALLNAME4(RTLIB::OUTLINE_ATOMIC_LDADD, __aarch64_ldadd)
955 LCALLNAME4(RTLIB::OUTLINE_ATOMIC_LDSET, __aarch64_ldset)
956 LCALLNAME4(RTLIB::OUTLINE_ATOMIC_LDCLR, __aarch64_ldclr)
957 LCALLNAME4(RTLIB::OUTLINE_ATOMIC_LDEOR, __aarch64_ldeor)
963 if (Subtarget->hasLSE128()) {
977 if (Subtarget->hasLSE2()) {
1040 if (WideVT.getScalarSizeInBits() > NarrowVT.getScalarSizeInBits()) {
1046 if (Subtarget->hasFPARMv8()) {
1221 for (
auto VT : {MVT::v2i32, MVT::v2i64, MVT::v4i32})
1224 if (Subtarget->hasFullFP16()) {
1257 for (
auto VT : {MVT::v1i64, MVT::v2i64}) {
1273 for (
MVT VT : { MVT::v8i8, MVT::v4i16, MVT::v2i32,
1274 MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1281 for (
MVT VT : {MVT::v8i8, MVT::v4i16, MVT::v2i32, MVT::v16i8, MVT::v8i16,
1292 for (
MVT VT : { MVT::v4f16, MVT::v2f32,
1293 MVT::v8f16, MVT::v4f32, MVT::v2f64 }) {
1294 if (VT.getVectorElementType() != MVT::f16 || Subtarget->hasFullFP16()) {
1303 for (
MVT VT : { MVT::v8i8, MVT::v4i16, MVT::v2i32,
1304 MVT::v16i8, MVT::v8i16, MVT::v4i32 }) {
1326 if (VT == MVT::v16i8 || VT == MVT::v8i16 || VT == MVT::v4i32) {
1353 for (
MVT Ty : {MVT::v2f32, MVT::v4f32, MVT::v2f64})
1355 if (Subtarget->hasFullFP16())
1356 for (
MVT Ty : {MVT::v4f16, MVT::v8f16})
1362 for (
MVT Ty : {MVT::v2f32, MVT::v4f32, MVT::v2f64})
1364 if (Subtarget->hasFullFP16())
1365 for (
MVT Ty : {MVT::v4f16, MVT::v8f16})
1388 for (
MVT VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 })
1391 for (
MVT VT : { MVT::v16f16, MVT::v8f32, MVT::v4f64 })
1398 if (VT.is128BitVector() || VT.is64BitVector()) {
1413 if (Subtarget->hasSME()) {
1421 {MVT::nxv16i1, MVT::nxv8i1, MVT::nxv4i1, MVT::nxv2i1, MVT::nxv1i1}) {
1430 for (
auto VT : {MVT::nxv16i8, MVT::nxv8i16, MVT::nxv4i32, MVT::nxv2i64}) {
1495 if (Subtarget->hasSVE2() ||
1496 (Subtarget->hasSME() && Subtarget->
isStreaming()))
1502 for (
auto VT : {MVT::nxv8i8, MVT::nxv4i16, MVT::nxv2i32}) {
1508 for (
auto VT : {MVT::nxv2i16, MVT::nxv4i16, MVT::nxv2i32, MVT::nxv2bf16,
1509 MVT::nxv4bf16, MVT::nxv2f16, MVT::nxv4f16, MVT::nxv2f32})
1513 { MVT::nxv2i8, MVT::nxv2i16, MVT::nxv2i32, MVT::nxv2i64, MVT::nxv4i8,
1514 MVT::nxv4i16, MVT::nxv4i32, MVT::nxv8i8, MVT::nxv8i16 })
1518 {MVT::nxv16i1, MVT::nxv8i1, MVT::nxv4i1, MVT::nxv2i1, MVT::nxv1i1}) {
1533 if (VT != MVT::nxv16i1) {
1541 {MVT::v4f16, MVT::v8f16, MVT::v2f32, MVT::v4f32, MVT::v1f64,
1542 MVT::v2f64, MVT::v8i8, MVT::v16i8, MVT::v4i16, MVT::v8i16,
1543 MVT::v2i32, MVT::v4i32, MVT::v1i64, MVT::v2i64}) {
1582 for (
auto VT : {MVT::nxv2f16, MVT::nxv4f16, MVT::nxv8f16, MVT::nxv2f32,
1583 MVT::nxv4f32, MVT::nxv2f64}) {
1660 for (
auto VT : {MVT::nxv2bf16, MVT::nxv4bf16, MVT::nxv8bf16}) {
1675 for (
auto VT : {MVT::v8i8, MVT::v16i8, MVT::v4i16, MVT::v8i16, MVT::v2i32,
1676 MVT::v4i32, MVT::v1i64, MVT::v2i64}) {
1691 addTypeForFixedLengthSVE(VT);
1696 addTypeForFixedLengthSVE(VT);
1700 for (
auto VT : {MVT::v8i8, MVT::v4i16})
1705 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32})
1707 for (
auto VT : {MVT::v8f16, MVT::v4f32})
1733 for (
auto VT : {MVT::v8i8, MVT::v16i8, MVT::v4i16, MVT::v8i16,
1734 MVT::v2i32, MVT::v4i32, MVT::v2i64}) {
1745 for (
auto VT : {MVT::v4f16, MVT::v8f16, MVT::v4f32})
1756 for (
auto VT : {MVT::v16i1, MVT::v8i1, MVT::v4i1, MVT::v2i1})
1762 for (
auto VT : {MVT::nxv16i8, MVT::nxv8i16, MVT::nxv4i32, MVT::nxv2i64,
1763 MVT::nxv2f16, MVT::nxv4f16, MVT::nxv8f16, MVT::nxv2f32,
1764 MVT::nxv4f32, MVT::nxv2f64, MVT::nxv2bf16, MVT::nxv4bf16,
1765 MVT::nxv8bf16, MVT::v4f16, MVT::v8f16, MVT::v2f32,
1766 MVT::v4f32, MVT::v1f64, MVT::v2f64, MVT::v8i8,
1767 MVT::v16i8, MVT::v4i16, MVT::v8i16, MVT::v2i32,
1768 MVT::v4i32, MVT::v1i64, MVT::v2i64}) {
1773 for (
auto VT : {MVT::nxv2f16, MVT::nxv4f16, MVT::nxv8f16, MVT::nxv2f32,
1774 MVT::nxv4f32, MVT::nxv2f64, MVT::v4f16, MVT::v8f16,
1775 MVT::v2f32, MVT::v4f32, MVT::v2f64})
1779 if (Subtarget->hasSVE2())
1785 if (Subtarget->hasMOPS() && Subtarget->hasMTE()) {
1792 if (Subtarget->hasSVE()) {
1820 for (
int i = 0; i < RTLIB::UNKNOWN_LIBCALL; ++i) {
1823 if ((libcallName !=
nullptr) && (libcallName[0] !=
'#')) {
1830void AArch64TargetLowering::addTypeForNEON(
MVT VT) {
1840 if (VT == MVT::v2f32 || VT == MVT::v4f32 || VT == MVT::v2f64) {
1860 if (VT == MVT::v2f32 || VT == MVT::v4f32 || VT == MVT::v2f64 ||
1861 ((VT == MVT::v4bf16 || VT == MVT::v8bf16 || VT == MVT::v4f16 ||
1862 VT == MVT::v8f16) &&
1863 Subtarget->hasFullFP16()))
1886 if (VT != MVT::v8i8 && VT != MVT::v16i8)
1895 for (
unsigned Opcode :
1913 for (
unsigned Opcode :
1949 if (Subtarget->hasD128()) {
1958 if (!Subtarget->hasSVE())
1963 if (ResVT != MVT::nxv2i1 && ResVT != MVT::nxv4i1 && ResVT != MVT::nxv8i1 &&
1964 ResVT != MVT::nxv16i1 && ResVT != MVT::v2i1 && ResVT != MVT::v4i1 &&
1965 ResVT != MVT::v8i1 && ResVT != MVT::v16i1)
1969 if (OpVT != MVT::i32 && OpVT != MVT::i64)
1981 return VT != MVT::nxv16i1 && VT != MVT::nxv8i1 && VT != MVT::nxv4i1 &&
1982 VT != MVT::nxv2i1 && VT != MVT::v16i1 && VT != MVT::v8i1 &&
1983 VT != MVT::v4i1 && VT != MVT::v2i1;
1986void AArch64TargetLowering::addTypeForFixedLengthSVE(
MVT VT) {
2011 while (InnerVT != VT) {
2025 while (InnerVT != VT) {
2128void AArch64TargetLowering::addDRType(
MVT VT) {
2134void AArch64TargetLowering::addQRType(
MVT VT) {
2153 Imm =
C->getZExtValue();
2164 return N->getOpcode() == Opc &&
2169 const APInt &Demanded,
2172 uint64_t OldImm = Imm, NewImm, Enc;
2177 if (Imm == 0 || Imm == Mask ||
2181 unsigned EltSize =
Size;
2198 ((InvertedImm << 1) | (InvertedImm >> (EltSize - 1) & 1)) &
2200 uint64_t Sum = RotatedImm + NonDemandedBits;
2201 bool Carry = NonDemandedBits & ~Sum & (1ULL << (EltSize - 1));
2202 uint64_t Ones = (Sum + Carry) & NonDemandedBits;
2203 NewImm = (Imm | Ones) & Mask;
2231 while (EltSize <
Size) {
2232 NewImm |= NewImm << EltSize;
2238 "demanded bits should never be altered");
2239 assert(OldImm != NewImm &&
"the new imm shouldn't be equal to the old imm");
2242 EVT VT =
Op.getValueType();
2248 if (NewImm == 0 || NewImm == OrigMask) {
2273 EVT VT =
Op.getValueType();
2279 "i32 or i64 is expected after legalization.");
2286 switch (
Op.getOpcode()) {
2290 NewOpc =
Size == 32 ? AArch64::ANDWri : AArch64::ANDXri;
2293 NewOpc =
Size == 32 ? AArch64::ORRWri : AArch64::ORRXri;
2296 NewOpc =
Size == 32 ? AArch64::EORWri : AArch64::EORXri;
2311 switch (
Op.getOpcode()) {
2317 if (
SrcOp.getValueSizeInBits() !=
Op.getScalarValueSizeInBits()) {
2318 assert(
SrcOp.getValueSizeInBits() >
Op.getScalarValueSizeInBits() &&
2319 "Expected DUP implicit truncation");
2320 Known = Known.
trunc(
Op.getScalarValueSizeInBits());
2334 ~(
Op->getConstantOperandVal(1) <<
Op->getConstantOperandVal(2));
2383 case Intrinsic::aarch64_ldaxr:
2384 case Intrinsic::aarch64_ldxr: {
2386 EVT VT = cast<MemIntrinsicSDNode>(
Op)->getMemoryVT();
2396 unsigned IntNo =
Op.getConstantOperandVal(0);
2400 case Intrinsic::aarch64_neon_uaddlv: {
2401 MVT VT =
Op.getOperand(1).getValueType().getSimpleVT();
2403 if (VT == MVT::v8i8 || VT == MVT::v16i8) {
2404 unsigned Bound = (VT == MVT::v8i8) ? 11 : 12;
2411 case Intrinsic::aarch64_neon_umaxv:
2412 case Intrinsic::aarch64_neon_uminv: {
2417 MVT VT =
Op.getOperand(1).getValueType().getSimpleVT();
2419 if (VT == MVT::v8i8 || VT == MVT::v16i8) {
2423 }
else if (VT == MVT::v4i16 || VT == MVT::v8i16) {
2437 unsigned Depth)
const {
2438 EVT VT =
Op.getValueType();
2440 unsigned Opcode =
Op.getOpcode();
2474 unsigned *
Fast)
const {
2475 if (Subtarget->requiresStrictAlign())
2480 *
Fast = !Subtarget->isMisaligned128StoreSlow() || VT.
getStoreSize() != 16 ||
2499 unsigned *
Fast)
const {
2500 if (Subtarget->requiresStrictAlign())
2505 *
Fast = !Subtarget->isMisaligned128StoreSlow() ||
2529#define MAKE_CASE(V) \
2884 Register DestReg =
MI.getOperand(0).getReg();
2885 Register IfTrueReg =
MI.getOperand(1).getReg();
2886 Register IfFalseReg =
MI.getOperand(2).getReg();
2887 unsigned CondCode =
MI.getOperand(3).getImm();
2888 bool NZCVKilled =
MI.getOperand(4).isKill();
2919 MI.eraseFromParent();
2927 "SEH does not use catchret!");
2939 Register TargetReg =
MI.getOperand(0).getReg();
2941 TII.probedStackAlloc(
MBBI, TargetReg,
false);
2943 MI.eraseFromParent();
2944 return NextInst->getParent();
2955 MIB.
add(
MI.getOperand(1));
2956 MIB.
add(
MI.getOperand(2));
2957 MIB.
add(
MI.getOperand(3));
2958 MIB.
add(
MI.getOperand(4));
2959 MIB.
add(
MI.getOperand(5));
2961 MI.eraseFromParent();
2972 MIB.
add(
MI.getOperand(0));
2973 MIB.
add(
MI.getOperand(1));
2974 MIB.
add(
MI.getOperand(2));
2975 MIB.
add(
MI.getOperand(1));
2977 MI.eraseFromParent();
2984 bool Op0IsDef)
const {
2990 for (
unsigned I = 1;
I <
MI.getNumOperands(); ++
I)
2991 MIB.
add(
MI.getOperand(
I));
2993 MI.eraseFromParent();
3003 unsigned StartIdx = 0;
3005 bool HasTile = BaseReg != AArch64::ZA;
3006 bool HasZPROut = HasTile &&
MI.getOperand(0).isReg();
3008 MIB.
add(
MI.getOperand(StartIdx));
3012 MIB.
addReg(BaseReg +
MI.getOperand(StartIdx).getImm(),
3014 MIB.
addReg(BaseReg +
MI.getOperand(StartIdx).getImm());
3018 if (
MI.getOperand(0).isReg() && !
MI.getOperand(1).isImm()) {
3019 MIB.
add(
MI.getOperand(StartIdx));
3024 for (
unsigned I = StartIdx;
I <
MI.getNumOperands(); ++
I)
3025 MIB.
add(
MI.getOperand(
I));
3027 MI.eraseFromParent();
3036 MIB.
add(
MI.getOperand(0));
3038 unsigned Mask =
MI.getOperand(0).getImm();
3039 for (
unsigned I = 0;
I < 8;
I++) {
3040 if (Mask & (1 <<
I))
3044 MI.eraseFromParent();
3055 if (TPIDR2.Uses > 0) {
3089 "Lazy ZA save is not yet supported on Windows");
3093 if (TPIDR2.
Uses > 0) {
3099 Register SP =
MRI.createVirtualRegister(&AArch64::GPR64RegClass);
3100 BuildMI(*BB,
MI,
MI.getDebugLoc(),
TII->get(TargetOpcode::COPY), SP)
3104 auto Size =
MI.getOperand(1).getReg();
3105 auto Dest =
MI.getOperand(0).getReg();
3106 BuildMI(*BB,
MI,
MI.getDebugLoc(),
TII->get(AArch64::MSUBXrrr), Dest)
3126 if (SMEOrigInstr != -1) {
3130 switch (SMEMatrixType) {
3146 switch (
MI.getOpcode()) {
3152 case AArch64::InitTPIDR2Obj:
3154 case AArch64::AllocateZABuffer:
3156 case AArch64::F128CSEL:
3158 case TargetOpcode::STATEPOINT:
3164 MI.addOperand(*
MI.getMF(),
3170 case TargetOpcode::STACKMAP:
3171 case TargetOpcode::PATCHPOINT:
3174 case TargetOpcode::PATCHABLE_EVENT_CALL:
3175 case TargetOpcode::PATCHABLE_TYPED_EVENT_CALL:
3178 case AArch64::CATCHRET:
3181 case AArch64::PROBED_STACKALLOC_DYN:
3184 case AArch64::LD1_MXIPXX_H_PSEUDO_B:
3185 return EmitTileLoad(AArch64::LD1_MXIPXX_H_B, AArch64::ZAB0,
MI, BB);
3186 case AArch64::LD1_MXIPXX_H_PSEUDO_H:
3187 return EmitTileLoad(AArch64::LD1_MXIPXX_H_H, AArch64::ZAH0,
MI, BB);
3188 case AArch64::LD1_MXIPXX_H_PSEUDO_S:
3189 return EmitTileLoad(AArch64::LD1_MXIPXX_H_S, AArch64::ZAS0,
MI, BB);
3190 case AArch64::LD1_MXIPXX_H_PSEUDO_D:
3191 return EmitTileLoad(AArch64::LD1_MXIPXX_H_D, AArch64::ZAD0,
MI, BB);
3192 case AArch64::LD1_MXIPXX_H_PSEUDO_Q:
3193 return EmitTileLoad(AArch64::LD1_MXIPXX_H_Q, AArch64::ZAQ0,
MI, BB);
3194 case AArch64::LD1_MXIPXX_V_PSEUDO_B:
3195 return EmitTileLoad(AArch64::LD1_MXIPXX_V_B, AArch64::ZAB0,
MI, BB);
3196 case AArch64::LD1_MXIPXX_V_PSEUDO_H:
3197 return EmitTileLoad(AArch64::LD1_MXIPXX_V_H, AArch64::ZAH0,
MI, BB);
3198 case AArch64::LD1_MXIPXX_V_PSEUDO_S:
3199 return EmitTileLoad(AArch64::LD1_MXIPXX_V_S, AArch64::ZAS0,
MI, BB);
3200 case AArch64::LD1_MXIPXX_V_PSEUDO_D:
3201 return EmitTileLoad(AArch64::LD1_MXIPXX_V_D, AArch64::ZAD0,
MI, BB);
3202 case AArch64::LD1_MXIPXX_V_PSEUDO_Q:
3203 return EmitTileLoad(AArch64::LD1_MXIPXX_V_Q, AArch64::ZAQ0,
MI, BB);
3204 case AArch64::LDR_ZA_PSEUDO:
3206 case AArch64::LDR_TX_PSEUDO:
3208 case AArch64::STR_TX_PSEUDO:
3210 case AArch64::ZERO_M_PSEUDO:
3212 case AArch64::ZERO_T_PSEUDO:
3239 N =
N->getOperand(0).getNode();
3247 auto Opnd0 =
N->getOperand(0);