Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 455b52c

Browse files
committedOct 21, 2024·
[LLVM][AArch64] Add assembly/disassembly for FTMOPA and BFTMOPA
This patch adds assembly/disassembly for the following SME2p2 instructions (part of the 2024 AArch64 ISA update) - BFTMOPA (widening) - FEAT_SME2p2 - BFTMOPA (non-widening) - FEAT_SME2p2 & FEAT_SME_B16B16 - FTMOPA (4-way) - FEAT_SME2p2 & FEAT_SME_F8F32 - FTMOPA (2-way, 8-to-16) - FEAT_SME2p2 & FEAT_SME_F8F16 - FTMOPA (2-way, 16-to-32) - FEAT_SME2p2 - FTMOPA (non-widening, f16) - FEAT_SME2p2 & FEAT_SME_F16F16 - FTMOPA (non-widening, f32) - FEAT_SME2p2 - Add new ZPR_K register class and ZK register operand - Introduce assembler extension tests for the new sme2p2 feature In accordance with: https://developer.arm.com/documentation/ddi0602/latest/ Co-authored-by: Marian Lukac [email protected]
1 parent 7a90ff7 commit 455b52c

21 files changed

+675
-13
lines changed
 

‎llvm/lib/Target/AArch64/AArch64RegisterInfo.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,6 +1210,15 @@ def ZPRMul2AsmOp32_Hi : ZPRAsmOperand<"VectorS_Hi", 32, "Mul2_Hi">;
12101210
def ZPRMul2AsmOp64_Lo : ZPRAsmOperand<"VectorD_Lo", 64, "Mul2_Lo">;
12111211
def ZPRMul2AsmOp64_Hi : ZPRAsmOperand<"VectorD_Hi", 64, "Mul2_Hi">;
12121212

1213+
def ZPR_K : RegisterClass<"AArch64", [untyped], 128,
1214+
(add Z20, Z21, Z22, Z23, Z28, Z29, Z30, Z31)>;
1215+
1216+
def ZK : RegisterOperand<ZPR_K, "printSVERegOp<>">{
1217+
let EncoderMethod = "EncodeZK";
1218+
let DecoderMethod = "DecodeZK";
1219+
let ParserMatchClass = ZPRAsmOperand<"Vector_20to23or28to31", 0, "_K">;
1220+
}
1221+
12131222
def ZPR8Mul2_Lo : ZPRMul2_MinToMaxRegOp<"b", ZPRMul2AsmOp8_Lo, 0, 14, ElementSizeB, ZPRMul2_Lo>;
12141223
def ZPR8Mul2_Hi : ZPRMul2_MinToMaxRegOp<"b", ZPRMul2AsmOp8_Hi, 16, 30, ElementSizeB, ZPRMul2_Hi>;
12151224
def ZPR16Mul2_Lo : ZPRMul2_MinToMaxRegOp<"h", ZPRMul2AsmOp16_Lo, 0, 14, ElementSizeH, ZPRMul2_Lo>;

‎llvm/lib/Target/AArch64/AArch64SMEInstrInfo.td

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,3 +1000,24 @@ defm FMOPA_MPPZZ_BtoS : sme_outer_product_fp32<0b0, 0b01, ZPR8, "fmopa", null_fr
10001000

10011001
} //[HasSMEF8F32]
10021002

1003+
let Predicates = [HasSME2p2] in {
1004+
def FTMOPA_M2ZZZI_HtoS : sme_tmopa_32b<0b11000, ZZ_h_mul_r, ZPR16, "ftmopa">;
1005+
def FTMOPA_M2ZZZI_StoS : sme_tmopa_32b<0b00000, ZZ_s_mul_r, ZPR32, "ftmopa">;
1006+
def BFTMOPA_M2ZZZI_HtoS : sme_tmopa_32b<0b10000, ZZ_h_mul_r, ZPR16, "bftmopa">;
1007+
} // [HasSME2p2]
1008+
1009+
let Predicates = [HasSME2p2, HasSMEB16B16] in {
1010+
def BFTMOPA_M2ZZZI_HtoH : sme_tmopa_16b<0b11001, ZZ_h_mul_r, ZPR16, "bftmopa">;
1011+
} // [HasSME2p2, HasSMEB16B16]
1012+
1013+
let Predicates = [HasSME2p2, HasSMEF8F32], Uses = [FPMR, FPCR] in {
1014+
def FTMOPA_M2ZZZI_BtoS : sme_tmopa_32b<0b01000, ZZ_b_mul_r, ZPR8, "ftmopa">;
1015+
} // [HasSME2p2, HasSMEF8F32], Uses = [FPMR, FPCR]
1016+
1017+
let Predicates = [HasSME2p2, HasSMEF8F16], Uses = [FPMR, FPCR] in {
1018+
def FTMOPA_M2ZZZI_BtoH : sme_tmopa_16b<0b01001, ZZ_b_mul_r, ZPR8, "ftmopa">;
1019+
} // [HasSME2p2, HasSMEF8F16], Uses = [FPMR, FPCR]
1020+
1021+
let Predicates = [HasSME2p2, HasSMEF16F16] in {
1022+
def FTMOPA_M2ZZZI_HtoH : sme_tmopa_16b<0b10001, ZZ_h_mul_r, ZPR16, "ftmopa">;
1023+
} // [HasSME2p2, HasSMEF16F16]

‎llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,6 +1264,7 @@ class AArch64Operand : public MCParsedAsmOperand {
12641264
case AArch64::ZPR_4bRegClassID:
12651265
case AArch64::ZPRMul2_LoRegClassID:
12661266
case AArch64::ZPRMul2_HiRegClassID:
1267+
case AArch64::ZPR_KRegClassID:
12671268
RK = RegKind::SVEDataVector;
12681269
break;
12691270
case AArch64::PPRRegClassID:
@@ -6118,6 +6119,9 @@ bool AArch64AsmParser::showMatchError(SMLoc Loc, unsigned ErrCode,
61186119
case Match_InvalidZPRMul2_Hi64:
61196120
return Error(Loc, "Invalid restricted vector register, expected even "
61206121
"register in z16.d..z30.d");
6122+
case Match_InvalidZPR_K0:
6123+
return Error(Loc, "invalid restricted vector register, expected register "
6124+
"in z20..z23 or z28..z31");
61216125
case Match_InvalidSVEPattern:
61226126
return Error(Loc, "invalid predicate pattern");
61236127
case Match_InvalidSVEPPRorPNRAnyReg:
@@ -6827,6 +6831,7 @@ bool AArch64AsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
68276831
case Match_InvalidZPRMul2_Hi32:
68286832
case Match_InvalidZPRMul2_Lo64:
68296833
case Match_InvalidZPRMul2_Hi64:
6834+
case Match_InvalidZPR_K0:
68306835
case Match_InvalidSVEVectorList2x8Mul2:
68316836
case Match_InvalidSVEVectorList2x16Mul2:
68326837
case Match_InvalidSVEVectorList2x32Mul2:

‎llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ template <unsigned Min, unsigned Max>
4949
static DecodeStatus DecodeZPRMul2_MinMax(MCInst &Inst, unsigned RegNo,
5050
uint64_t Address,
5151
const MCDisassembler *Decoder);
52+
static DecodeStatus DecodeZK(MCInst &Inst, unsigned RegNo, uint64_t Address,
53+
const MCDisassembler *Decoder);
5254
template <unsigned Min, unsigned Max>
5355
static DecodeStatus DecodeZPR2Mul2RegisterClass(MCInst &Inst, unsigned RegNo,
5456
uint64_t Address,
@@ -387,6 +389,23 @@ static DecodeStatus DecodeZPR2Mul2RegisterClass(MCInst &Inst, unsigned RegNo,
387389
return Success;
388390
}
389391

392+
// Zk Is the name of the control vector register Z20-Z23 or Z28-Z31, encoded in
393+
// the "K:Zk" fields. Z20-Z23 = 000, 001,010, 011 and Z28-Z31 = 100, 101, 110,
394+
// 111
395+
static DecodeStatus DecodeZK(MCInst &Inst, unsigned RegNo, uint64_t Address,
396+
const MCDisassembler *Decoder) {
397+
// RegNo < 4 => Reg is in Z20-Z23 (offset 20)
398+
// RegNo >= 4 => Reg is in Z28-Z31 (offset 24)
399+
unsigned Reg = (RegNo < 4) ? (RegNo + 20) : (RegNo + 24);
400+
if (!(Reg >= 20 && Reg <= 23) && !(Reg >= 28 && Reg <= 31))
401+
return Fail;
402+
403+
unsigned Register =
404+
AArch64MCRegisterClasses[AArch64::ZPRRegClassID].getRegister(Reg);
405+
Inst.addOperand(MCOperand::createReg(Register));
406+
return Success;
407+
}
408+
390409
static DecodeStatus DecodeZPR4Mul4RegisterClass(MCInst &Inst, unsigned RegNo,
391410
uint64_t Address,
392411
const void *Decoder) {

‎llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,9 @@ class AArch64MCCodeEmitter : public MCCodeEmitter {
195195
uint32_t EncodeRegMul_MinMax(const MCInst &MI, unsigned OpIdx,
196196
SmallVectorImpl<MCFixup> &Fixups,
197197
const MCSubtargetInfo &STI) const;
198+
uint32_t EncodeZK(const MCInst &MI, unsigned OpIdx,
199+
SmallVectorImpl<MCFixup> &Fixups,
200+
const MCSubtargetInfo &STI) const;
198201
uint32_t EncodePNR_p8to15(const MCInst &MI, unsigned OpIdx,
199202
SmallVectorImpl<MCFixup> &Fixups,
200203
const MCSubtargetInfo &STI) const;
@@ -573,6 +576,21 @@ AArch64MCCodeEmitter::EncodeRegMul_MinMax(const MCInst &MI, unsigned OpIdx,
573576
return (RegVal - Min) / Multiple;
574577
}
575578

579+
// Zk Is the name of the control vector register Z20-Z23 or Z28-Z31, encoded in
580+
// the "K:Zk" fields. Z20-Z23 = 000, 001,010, 011 and Z28-Z31 = 100, 101, 110,
581+
// 111
582+
uint32_t AArch64MCCodeEmitter::EncodeZK(const MCInst &MI, unsigned OpIdx,
583+
SmallVectorImpl<MCFixup> &Fixups,
584+
const MCSubtargetInfo &STI) const {
585+
auto RegOpnd = MI.getOperand(OpIdx).getReg();
586+
unsigned RegVal = Ctx.getRegisterInfo()->getEncodingValue(RegOpnd);
587+
// Z28 => RegVal = 28 (28 - 24 = 4) Z28 = 4
588+
if (RegOpnd > AArch64::Z27)
589+
return (RegVal - 24);
590+
// Z20 => RegVal = 20 (20 -20 = 0) Z20 = 0
591+
return (RegVal - 20);
592+
}
593+
576594
uint32_t
577595
AArch64MCCodeEmitter::EncodePNR_p8to15(const MCInst &MI, unsigned OpIdx,
578596
SmallVectorImpl<MCFixup> &Fixups,

‎llvm/lib/Target/AArch64/SMEInstrFormats.td

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3192,6 +3192,68 @@ multiclass sme2_int_bmopx_tile<string mnemonic, bits<3> op, SDPatternOperator i
31923192
def : SME_ZA_Tile_TwoPred_TwoVec_Pat<NAME, intrinsic, timm32_0_3, nxv4i1, nxv4i32>;
31933193
}
31943194

3195+
//===----------------------------------------------------------------------===//
3196+
// SME2 Sparse Outer Product and Accumulate
3197+
3198+
class sme_tmopa_16b<bits<5> opc, RegisterOperand zn_ty, RegisterOperand zm_ty, string mnemonic>
3199+
: I<(outs TileOp16:$ZAda),
3200+
(ins TileOp16:$_ZAda, zn_ty:$Zn, zm_ty:$Zm, ZK:$Zk, VectorIndexS32b:$imm),
3201+
mnemonic, "\t$ZAda, $Zn, $Zm, $Zk$imm",
3202+
"", []>,
3203+
Sched<[]> {
3204+
bit ZAda;
3205+
bits<4> Zn;
3206+
bits<5> Zm;
3207+
bits<3> Zk;
3208+
bits<2> imm;
3209+
let Inst{31-25} = 0b1000000;
3210+
let Inst{24} = opc{4};
3211+
let Inst{23-22} = 0b01;
3212+
let Inst{21} = opc{3};
3213+
let Inst{20-16} = Zm;
3214+
let Inst{15} = opc{2};
3215+
let Inst{14} = 0b0;
3216+
let Inst{13} = opc{1};
3217+
let Inst{12-10} = Zk;
3218+
let Inst{9-6} = Zn;
3219+
let Inst{5-4} = imm;
3220+
let Inst{3} = opc{0};
3221+
let Inst{2-1} = 0b00;
3222+
let Inst{0} = ZAda;
3223+
3224+
let Constraints = "$ZAda = $_ZAda";
3225+
}
3226+
3227+
class sme_tmopa_32b<bits<5> opc, RegisterOperand zn_ty, RegisterOperand zm_ty, string mnemonic>
3228+
: I<(outs TileOp32:$ZAda),
3229+
(ins TileOp32:$_ZAda, zn_ty:$Zn, zm_ty:$Zm, ZK:$Zk, VectorIndexS32b:$imm),
3230+
mnemonic, "\t$ZAda, $Zn, $Zm, $Zk$imm",
3231+
"", []>,
3232+
Sched<[]> {
3233+
bits<2> ZAda;
3234+
bits<4> Zn;
3235+
bits<5> Zm;
3236+
bits<3> Zk;
3237+
bits<2> imm;
3238+
let Inst{31-25} = 0b1000000;
3239+
let Inst{24} = opc{4};
3240+
let Inst{23-22} = 0b01;
3241+
let Inst{21} = opc{3};
3242+
let Inst{20-16} = Zm;
3243+
let Inst{15} = opc{2};
3244+
let Inst{14} = 0b0;
3245+
let Inst{13} = opc{1};
3246+
let Inst{12-10} = Zk;
3247+
let Inst{9-6} = Zn;
3248+
let Inst{5-4} = imm;
3249+
let Inst{3} = opc{0};
3250+
let Inst{2} = 0b0;
3251+
let Inst{1-0} = ZAda;
3252+
3253+
let Constraints = "$ZAda = $_ZAda";
3254+
}
3255+
3256+
31953257
//===----------------------------------------------------------------------===///
31963258
// SME2 Zero Lookup Table.
31973259
class sme2_zero_zt<string mnemonic, bits<4> opc>

‎llvm/test/CodeGen/AArch64/GlobalISel/regbank-inlineasm.mir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ tracksRegLiveness: true
5757
body: |
5858
bb.1:
5959
; CHECK-LABEL: name: inlineasm_virt_reg_output
60-
; CHECK: INLINEASM &"mov ${0:w}, 7", 0 /* attdialect */, 2490378 /* regdef:FPR32_with_hsub_in_FPR16_lo */, def %0
60+
; CHECK: INLINEASM &"mov ${0:w}, 7", 0 /* attdialect */, 2490378 /* regdef:GPR32common */, def %0
6161
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY %0
6262
; CHECK-NEXT: $w0 = COPY [[COPY]](s32)
6363
; CHECK-NEXT: RET_ReallyLR implicit $w0
@@ -75,7 +75,7 @@ tracksRegLiveness: true
7575
body: |
7676
bb.1:
7777
; CHECK-LABEL: name: inlineasm_virt_mixed_types
78-
; CHECK: INLINEASM &"mov $0, #0; mov $1, #0", 0 /* attdialect */, 2490378 /* regdef:FPR32_with_hsub_in_FPR16_lo */, def %0, 3342346 /* regdef:GPR64 */, def %1
78+
; CHECK: INLINEASM &"mov $0, #0; mov $1, #0", 0 /* attdialect */, 2490378 /* regdef:GPR32common */, def %0, 3342346 /* regdef:FPR64 */, def %1
7979
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY %0
8080
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s64) = COPY %1
8181
; CHECK-NEXT: $d0 = COPY [[COPY1]](s64)

‎llvm/test/CodeGen/AArch64/aarch64-sve-asm.ll

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ define <vscale x 16 x i8> @test_svadd_i8(<vscale x 16 x i8> %Zn, <vscale x 16 x
1313
; CHECK-NEXT: [[COPY1:%[0-9]+]]:zpr = COPY $z0
1414
; CHECK-NEXT: [[COPY2:%[0-9]+]]:zpr = COPY [[COPY1]]
1515
; CHECK-NEXT: [[COPY3:%[0-9]+]]:zpr_3b = COPY [[COPY]]
16-
; CHECK-NEXT: INLINEASM &"add $0.b, $1.b, $2.b", 0 /* attdialect */, 5701642 /* regdef:ZPR */, def %2, 5701641 /* reguse:ZPR */, [[COPY2]], 6291465 /* reguse:ZPR_3b */, [[COPY3]]
16+
; CHECK-NEXT: INLINEASM &"add $0.b, $1.b, $2.b", 0 /* attdialect */, 5767178 /* regdef:ZPR */, def %2, 5767177 /* reguse:ZPR */, [[COPY2]], 6357001 /* reguse:ZPR_3b */, [[COPY3]]
1717
; CHECK-NEXT: $z0 = COPY %2
1818
; CHECK-NEXT: RET_ReallyLR implicit $z0
1919
%1 = tail call <vscale x 16 x i8> asm "add $0.b, $1.b, $2.b", "=w,w,y"(<vscale x 16 x i8> %Zn, <vscale x 16 x i8> %Zm)
@@ -29,7 +29,7 @@ define <vscale x 2 x i64> @test_svsub_i64(<vscale x 2 x i64> %Zn, <vscale x 2 x
2929
; CHECK-NEXT: [[COPY1:%[0-9]+]]:zpr = COPY $z0
3030
; CHECK-NEXT: [[COPY2:%[0-9]+]]:zpr = COPY [[COPY1]]
3131
; CHECK-NEXT: [[COPY3:%[0-9]+]]:zpr_4b = COPY [[COPY]]
32-
; CHECK-NEXT: INLINEASM &"sub $0.d, $1.d, $2.d", 0 /* attdialect */, 5701642 /* regdef:ZPR */, def %2, 5701641 /* reguse:ZPR */, [[COPY2]], 5963785 /* reguse:ZPR_4b */, [[COPY3]]
32+
; CHECK-NEXT: INLINEASM &"sub $0.d, $1.d, $2.d", 0 /* attdialect */, 5767178 /* regdef:ZPR */, def %2, 5767177 /* reguse:ZPR */, [[COPY2]], 6029321 /* reguse:ZPR_4b */, [[COPY3]]
3333
; CHECK-NEXT: $z0 = COPY %2
3434
; CHECK-NEXT: RET_ReallyLR implicit $z0
3535
%1 = tail call <vscale x 2 x i64> asm "sub $0.d, $1.d, $2.d", "=w,w,x"(<vscale x 2 x i64> %Zn, <vscale x 2 x i64> %Zm)
@@ -45,7 +45,7 @@ define <vscale x 8 x half> @test_svfmul_f16(<vscale x 8 x half> %Zn, <vscale x 8
4545
; CHECK-NEXT: [[COPY1:%[0-9]+]]:zpr = COPY $z0
4646
; CHECK-NEXT: [[COPY2:%[0-9]+]]:zpr = COPY [[COPY1]]
4747
; CHECK-NEXT: [[COPY3:%[0-9]+]]:zpr_3b = COPY [[COPY]]
48-
; CHECK-NEXT: INLINEASM &"fmul $0.h, $1.h, $2.h", 0 /* attdialect */, 5701642 /* regdef:ZPR */, def %2, 5701641 /* reguse:ZPR */, [[COPY2]], 6291465 /* reguse:ZPR_3b */, [[COPY3]]
48+
; CHECK-NEXT: INLINEASM &"fmul $0.h, $1.h, $2.h", 0 /* attdialect */, 5767178 /* regdef:ZPR */, def %2, 5767177 /* reguse:ZPR */, [[COPY2]], 6357001 /* reguse:ZPR_3b */, [[COPY3]]
4949
; CHECK-NEXT: $z0 = COPY %2
5050
; CHECK-NEXT: RET_ReallyLR implicit $z0
5151
%1 = tail call <vscale x 8 x half> asm "fmul $0.h, $1.h, $2.h", "=w,w,y"(<vscale x 8 x half> %Zn, <vscale x 8 x half> %Zm)
@@ -61,7 +61,7 @@ define <vscale x 4 x float> @test_svfmul_f(<vscale x 4 x float> %Zn, <vscale x 4
6161
; CHECK-NEXT: [[COPY1:%[0-9]+]]:zpr = COPY $z0
6262
; CHECK-NEXT: [[COPY2:%[0-9]+]]:zpr = COPY [[COPY1]]
6363
; CHECK-NEXT: [[COPY3:%[0-9]+]]:zpr_4b = COPY [[COPY]]
64-
; CHECK-NEXT: INLINEASM &"fmul $0.s, $1.s, $2.s", 0 /* attdialect */, 5701642 /* regdef:ZPR */, def %2, 5701641 /* reguse:ZPR */, [[COPY2]], 5963785 /* reguse:ZPR_4b */, [[COPY3]]
64+
; CHECK-NEXT: INLINEASM &"fmul $0.s, $1.s, $2.s", 0 /* attdialect */, 5767178 /* regdef:ZPR */, def %2, 5767177 /* reguse:ZPR */, [[COPY2]], 6029321 /* reguse:ZPR_4b */, [[COPY3]]
6565
; CHECK-NEXT: $z0 = COPY %2
6666
; CHECK-NEXT: RET_ReallyLR implicit $z0
6767
%1 = tail call <vscale x 4 x float> asm "fmul $0.s, $1.s, $2.s", "=w,w,x"(<vscale x 4 x float> %Zn, <vscale x 4 x float> %Zm)
@@ -79,7 +79,7 @@ define <vscale x 8 x half> @test_svfadd_f16(<vscale x 16 x i1> %Pg, <vscale x 8
7979
; CHECK-NEXT: [[COPY3:%[0-9]+]]:ppr_3b = COPY [[COPY2]]
8080
; CHECK-NEXT: [[COPY4:%[0-9]+]]:zpr = COPY [[COPY1]]
8181
; CHECK-NEXT: [[COPY5:%[0-9]+]]:zpr = COPY [[COPY]]
82-
; CHECK-NEXT: INLINEASM &"fadd $0.h, $1/m, $2.h, $3.h", 0 /* attdialect */, 5701642 /* regdef:ZPR */, def %3, 655369 /* reguse:PPR_3b */, [[COPY3]], 5701641 /* reguse:ZPR */, [[COPY4]], 5701641 /* reguse:ZPR */, [[COPY5]]
82+
; CHECK-NEXT: INLINEASM &"fadd $0.h, $1/m, $2.h, $3.h", 0 /* attdialect */, 5767178 /* regdef:ZPR */, def %3, 720905 /* reguse:PPR_3b */, [[COPY3]], 5767177 /* reguse:ZPR */, [[COPY4]], 5767177 /* reguse:ZPR */, [[COPY5]]
8383
; CHECK-NEXT: $z0 = COPY %3
8484
; CHECK-NEXT: RET_ReallyLR implicit $z0
8585
%1 = tail call <vscale x 8 x half> asm "fadd $0.h, $1/m, $2.h, $3.h", "=w,@3Upl,w,w"(<vscale x 16 x i1> %Pg, <vscale x 8 x half> %Zn, <vscale x 8 x half> %Zm)
@@ -95,7 +95,7 @@ define <vscale x 4 x i32> @test_incp(<vscale x 16 x i1> %Pg, <vscale x 4 x i32>
9595
; CHECK-NEXT: [[COPY1:%[0-9]+]]:ppr = COPY $p0
9696
; CHECK-NEXT: [[COPY2:%[0-9]+]]:ppr = COPY [[COPY1]]
9797
; CHECK-NEXT: [[COPY3:%[0-9]+]]:zpr = COPY [[COPY]]
98-
; CHECK-NEXT: INLINEASM &"incp $0.s, $1", 0 /* attdialect */, 5701642 /* regdef:ZPR */, def %2, 393225 /* reguse:PPR */, [[COPY2]], 2147483657 /* reguse tiedto:$0 */, [[COPY3]](tied-def 3)
98+
; CHECK-NEXT: INLINEASM &"incp $0.s, $1", 0 /* attdialect */, 5767178 /* regdef:ZPR */, def %2, 458761 /* reguse:PPR */, [[COPY2]], 2147483657 /* reguse tiedto:$0 */, [[COPY3]](tied-def 3)
9999
; CHECK-NEXT: $z0 = COPY %2
100100
; CHECK-NEXT: RET_ReallyLR implicit $z0
101101
%1 = tail call <vscale x 4 x i32> asm "incp $0.s, $1", "=w,@3Upa,0"(<vscale x 16 x i1> %Pg, <vscale x 4 x i32> %Zn)
@@ -113,7 +113,7 @@ define <vscale x 8 x half> @test_svfadd_f16_Uph_constraint(<vscale x 16 x i1> %P
113113
; CHECK-NEXT: [[COPY3:%[0-9]+]]:ppr_p8to15 = COPY [[COPY2]]
114114
; CHECK-NEXT: [[COPY4:%[0-9]+]]:zpr = COPY [[COPY1]]
115115
; CHECK-NEXT: [[COPY5:%[0-9]+]]:zpr = COPY [[COPY]]
116-
; CHECK-NEXT: INLINEASM &"fadd $0.h, $1/m, $2.h, $3.h", 0 /* attdialect */, 5701642 /* regdef:ZPR */, def %3, 720905 /* reguse:PPR_p8to15 */, [[COPY3]], 5701641 /* reguse:ZPR */, [[COPY4]], 5701641 /* reguse:ZPR */, [[COPY5]]
116+
; CHECK-NEXT: INLINEASM &"fadd $0.h, $1/m, $2.h, $3.h", 0 /* attdialect */, 5767178 /* regdef:ZPR */, def %3, 786441 /* reguse:PPR_p8to15 */, [[COPY3]], 5767177 /* reguse:ZPR */, [[COPY4]], 5767177 /* reguse:ZPR */, [[COPY5]]
117117
; CHECK-NEXT: $z0 = COPY %3
118118
; CHECK-NEXT: RET_ReallyLR implicit $z0
119119
%1 = tail call <vscale x 8 x half> asm "fadd $0.h, $1/m, $2.h, $3.h", "=w,@3Uph,w,w"(<vscale x 16 x i1> %Pg, <vscale x 8 x half> %Zn, <vscale x 8 x half> %Zm)

‎llvm/test/CodeGen/AArch64/emit_fneg_with_non_register_operand.mir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,10 @@ body: |
9191
; CHECK-NEXT: {{ $}}
9292
; CHECK-NEXT: [[LOADgot:%[0-9]+]]:gpr64common = LOADgot target-flags(aarch64-got) @c
9393
; CHECK-NEXT: [[LDRDui:%[0-9]+]]:fpr64 = LDRDui [[LOADgot]], 0 :: (dereferenceable load (s64) from @c)
94-
; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 3342346 /* regdef:GPR64 */, def %2, 2147483657 /* reguse tiedto:$0 */, [[LDRDui]](tied-def 3)
94+
; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 3342346 /* regdef:FPR64 */, def %2, 2147483657 /* reguse tiedto:$0 */, [[LDRDui]](tied-def 3)
9595
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY %2
9696
; CHECK-NEXT: [[LDRDui1:%[0-9]+]]:fpr64 = LDRDui [[LOADgot]], 0 :: (dereferenceable load (s64) from @c)
97-
; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 3342346 /* regdef:GPR64 */, def %4, 2147483657 /* reguse tiedto:$0 */, [[LDRDui1]](tied-def 3)
97+
; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 3342346 /* regdef:FPR64 */, def %4, 2147483657 /* reguse tiedto:$0 */, [[LDRDui1]](tied-def 3)
9898
; CHECK-NEXT: [[FNEGDr:%[0-9]+]]:fpr64 = FNEGDr %2
9999
; CHECK-NEXT: nofpexcept FCMPDrr %4, killed [[FNEGDr]], implicit-def $nzcv, implicit $fpcr
100100
; CHECK-NEXT: Bcc 1, %bb.2, implicit $nzcv

‎llvm/test/CodeGen/AArch64/fmlal-loreg.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ define <4 x float> @test(ptr %lhs_panel, ptr %rhs_panel, <4 x float> %a) {
1111
; CHECK-NEXT: .cfi_def_cfa_offset 16
1212
; CHECK-NEXT: .cfi_offset b8, -16
1313
; CHECK-NEXT: fmov x8, d0
14-
; CHECK-NEXT: ldr q8, [x0]
1514
; CHECK-NEXT: ldr q16, [x1]
15+
; CHECK-NEXT: ldr q8, [x0]
1616
; CHECK-NEXT: lsr x9, x8, #32
1717
; CHECK-NEXT: //APP
1818
; CHECK-NEXT: nop

‎llvm/test/CodeGen/AArch64/peephole-insvigpr.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ body: |
487487
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64common = COPY $x0
488488
; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr64all = IMPLICIT_DEF
489489
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64sp = COPY [[DEF]]
490-
; CHECK-NEXT: INLINEASM &"ldr ${0:s}, $1", 8 /* mayload attdialect */, 3342346 /* regdef:GPR64 */, def %1, 262158 /* mem:m */, killed [[COPY1]]
490+
; CHECK-NEXT: INLINEASM &"ldr ${0:s}, $1", 8 /* mayload attdialect */, 3342346 /* regdef:FPR64 */, def %1, 262158 /* mem:m */, killed [[COPY1]]
491491
; CHECK-NEXT: [[MOVIv2d_ns:%[0-9]+]]:fpr128 = MOVIv2d_ns 0
492492
; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr64 = COPY [[MOVIv2d_ns]].dsub
493493
; CHECK-NEXT: [[DEF1:%[0-9]+]]:fpr128 = IMPLICIT_DEF
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2,+sme-b16b16 2>&1 < %s| FileCheck %s
2+
3+
// --------------------------------------------------------------------------//
4+
// Invalid ZA register (range)
5+
6+
bftmopa za2.h, {z30.h-z31.h}, z31.h, z31[3]
7+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
8+
// CHECK-NEXT: bftmopa za2.h, {z30.h-z31.h}, z31.h, z31[3]
9+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
10+
11+
bftmopa za4.s, {z30.h-z31.h}, z31.h, z31[3]
12+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
13+
// CHECK-NEXT: bftmopa za4.s, {z30.h-z31.h}, z31.h, z31[3]
14+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
15+
16+
// --------------------------------------------------------------------------//
17+
// Invalid ZA register (type-suffix)
18+
19+
bftmopa za3.d, {z28.h-z29.h}, z31.h, z20[3]
20+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected za[0-3].s
21+
// CHECK-NEXT: bftmopa za3.d, {z28.h-z29.h}, z31.h, z20[3]
22+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
23+
24+
// --------------------------------------------------------------------------//
25+
// Invalid vector list operand
26+
27+
bftmopa za0.h, {z28.h-z31.h}, z31.h, z31[3]
28+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
29+
// CHECK-NEXT: bftmopa za0.h, {z28.h-z31.h}, z31.h, z31[3]
30+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
31+
32+
bftmopa za0.h, {z29.h-z30.h}, z31.h, z31[3]
33+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors, where the first vector is a multiple of 2 and with matching element types
34+
// CHECK-NEXT: bftmopa za0.h, {z29.h-z30.h}, z31.h, z31[3]
35+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
36+
37+
bftmopa za0.s, {z28.h-z31.h}, z31.h, z31[3]
38+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
39+
// CHECK-NEXT: bftmopa za0.s, {z28.h-z31.h}, z31.h, z31[3]
40+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
41+
42+
bftmopa za3.s, {z29.h-z30.h}, z31.h, z31[3]
43+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors, where the first vector is a multiple of 2 and with matching element types
44+
// CHECK-NEXT: bftmopa za3.s, {z29.h-z30.h}, z31.h, z31[3]
45+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
46+
47+
// --------------------------------------------------------------------------//
48+
// Invalid ZK register
49+
50+
bftmopa za0.h, {z28.h-z29.h}, z31.h, z19[3]
51+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
52+
// CHECK-NEXT: bftmopa za0.h, {z28.h-z29.h}, z31.h, z19[3]
53+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
54+
55+
bftmopa za0.h, {z28.h-z29.h}, z31.h, z24[3]
56+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
57+
// CHECK-NEXT: bftmopa za0.h, {z28.h-z29.h}, z31.h, z24[3]
58+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
59+
60+
bftmopa za3.s, {z28.h-z29.h}, z31.h, z19[3]
61+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
62+
// CHECK-NEXT: bftmopa za3.s, {z28.h-z29.h}, z31.h, z19[3]
63+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
64+
65+
bftmopa za3.s, {z28.h-z29.h}, z31.h, z27[3]
66+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
67+
// CHECK-NEXT: bftmopa za3.s, {z28.h-z29.h}, z31.h, z27[3]
68+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
69+
70+
bftmopa za0.h, {z28.h-z29.h}, z31.h, z21.h[3]
71+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
72+
// CHECK-NEXT: bftmopa za0.h, {z28.h-z29.h}, z31.h, z21.h[3]
73+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
74+
75+
bftmopa za0.s, {z28.h-z29.h}, z31.h, z30.h[3]
76+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
77+
// CHECK-NEXT: bftmopa za0.s, {z28.h-z29.h}, z31.h, z30.h[3]
78+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
79+
80+
// --------------------------------------------------------------------------//
81+
// Invalid immediate
82+
83+
bftmopa za0.h, {z28.h-z29.h}, z31.h, z20[4]
84+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3]
85+
// CHECK-NEXT: bftmopa za0.h, {z28.h-z29.h}, z31.h, z20[4]
86+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
87+
88+
bftmopa za3.s, {z28.h-z29.h}, z31.h, z20[4]
89+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3]
90+
// CHECK-NEXT: bftmopa za3.s, {z28.h-z29.h}, z31.h, z20[4]
91+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
92+
93+
// --------------------------------------------------------------------------//
94+
// Invalid ZPR type suffix
95+
96+
bftmopa za0.h, {z28.h-z29.h}, z31.s, z20[3]
97+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
98+
// CHECK-NEXT: bftmopa za0.h, {z28.h-z29.h}, z31.s, z20[3]
99+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
100+
101+
bftmopa za0.h, {z28.b-z29.b}, z31.b, z20[3]
102+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
103+
// CHECK-NEXT: bftmopa za0.h, {z28.b-z29.b}, z31.b, z20[3]
104+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
105+
106+
bftmopa za3.s, {z28.h-z29.h}, z31.s, z20[3]
107+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
108+
// CHECK-NEXT: bftmopa za3.s, {z28.h-z29.h}, z31.s, z20[3]
109+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
110+
111+
bftmopa za3.s, {z28.s-z29.s}, z31.s, z20[3]
112+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
113+
// CHECK-NEXT: bftmopa za3.s, {z28.s-z29.s}, z31.s, z20[3]
114+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

‎llvm/test/MC/AArch64/SME2p2/bftmopa.s

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2,+sme-b16b16 < %s \
2+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
3+
// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
4+
// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
5+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2p2,+sme-b16b16 < %s \
6+
// RUN: | llvm-objdump -d --mattr=+sme2p2,+sme-b16b16 --no-print-imm-hex - | FileCheck %s --check-prefix=CHECK-INST
7+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2p2,+sme-b16b16 < %s \
8+
// RUN: | llvm-objdump -d --mattr=-sme2p2 --no-print-imm-hex - | FileCheck %s --check-prefix=CHECK-UNKNOWN
9+
// Disassemble encoding and check the re-encoding (-show-encoding) matches.
10+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2,+sme-b16b16 < %s \
11+
// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
12+
// RUN: | llvm-mc -triple=aarch64 -mattr=+sme2p2,+sme-b16b16 -disassemble -show-encoding \
13+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
14+
15+
// non-widening
16+
17+
bftmopa za0.h, {z0.h-z1.h}, z0.h, z20[0] // 10000001-01100000-00000000-00001000
18+
// CHECK-INST: bftmopa za0.h, { z0.h, z1.h }, z0.h, z20[0]
19+
// CHECK-ENCODING: [0x08,0x00,0x60,0x81]
20+
// CHECK-ERROR: instruction requires: sme2p2 sme-b16b16
21+
// CHECK-UNKNOWN: 81600008 <unknown>
22+
23+
bftmopa za1.h, {z12.h-z13.h}, z8.h, z23[3] // 10000001-01101000-00001101-10111001
24+
// CHECK-INST: bftmopa za1.h, { z12.h, z13.h }, z8.h, z23[3]
25+
// CHECK-ENCODING: [0xb9,0x0d,0x68,0x81]
26+
// CHECK-ERROR: instruction requires: sme2p2 sme-b16b16
27+
// CHECK-UNKNOWN: 81680db9 <unknown>
28+
29+
bftmopa za1.h, {z30.h-z31.h}, z31.h, z31[3] // 10000001-01111111-00011111-11111001
30+
// CHECK-INST: bftmopa za1.h, { z30.h, z31.h }, z31.h, z31[3]
31+
// CHECK-ENCODING: [0xf9,0x1f,0x7f,0x81]
32+
// CHECK-ERROR: instruction requires: sme2p2 sme-b16b16
33+
// CHECK-UNKNOWN: 817f1ff9 <unknown>
34+
35+
// widening
36+
37+
bftmopa za0.s, {z0.h-z1.h}, z0.h, z20[0] // 10000001-01000000-00000000-00000000
38+
// CHECK-INST: bftmopa za0.s, { z0.h, z1.h }, z0.h, z20[0]
39+
// CHECK-ENCODING: [0x00,0x00,0x40,0x81]
40+
// CHECK-ERROR: instruction requires: sme2p2
41+
// CHECK-UNKNOWN: 81400000 <unknown>
42+
43+
bftmopa za3.s, {z12.h-z13.h}, z8.h, z23[3] // 10000001-01001000-00001101-10110011
44+
// CHECK-INST: bftmopa za3.s, { z12.h, z13.h }, z8.h, z23[3]
45+
// CHECK-ENCODING: [0xb3,0x0d,0x48,0x81]
46+
// CHECK-ERROR: instruction requires: sme2p2
47+
// CHECK-UNKNOWN: 81480db3 <unknown>
48+
49+
bftmopa za3.s, {z30.h-z31.h}, z31.h, z31[3] // 10000001-01011111-00011111-11110011
50+
// CHECK-INST: bftmopa za3.s, { z30.h, z31.h }, z31.h, z31[3]
51+
// CHECK-ENCODING: [0xf3,0x1f,0x5f,0x81]
52+
// CHECK-ERROR: instruction requires: sme2p2
53+
// CHECK-UNKNOWN: 815f1ff3 <unknown>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// RUN: not llvm-mc -triple aarch64 -filetype asm -o - %s 2>&1 | FileCheck %s
2+
3+
.arch armv9-a+sme2p2
4+
.arch armv9-a+nosme2p2
5+
ftmopa za0.s, {z0.s-z1.s}, z0.s, z20[0]
6+
// CHECK: error: instruction requires: sme2p2
7+
// CHECK: ftmopa za0.s, {z0.s-z1.s}, z0.s, z20[0]
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// RUN: llvm-mc -triple aarch64 -o - %s 2>&1 | FileCheck %s
2+
3+
.arch armv9-a+sme2p2
4+
ftmopa za0.s, {z0.s-z1.s}, z0.s, z20[0]
5+
// CHECK: ftmopa za0.s, { z0.s, z1.s }, z0.s, z20[0]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// RUN: not llvm-mc -triple aarch64 -filetype asm -o - %s 2>&1 | FileCheck %s
2+
3+
.arch_extension sme2p2
4+
.arch_extension nosme2p2
5+
ftmopa za0.s, {z0.s-z1.s}, z0.s, z20[0]
6+
// CHECK: error: instruction requires: sme2p2
7+
// CHECK: ftmopa za0.s, {z0.s-z1.s}, z0.s, z20[0]
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// RUN: llvm-mc -triple aarch64 -filetype asm -o - %s 2>&1 | FileCheck %s
2+
3+
.arch_extension sme2p2
4+
ftmopa za0.s, {z0.s-z1.s}, z0.s, z20[0]
5+
// CHECK: ftmopa za0.s, { z0.s, z1.s }, z0.s, z20[0]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// RUN: not llvm-mc -triple aarch64 -filetype asm -o - %s 2>&1 | FileCheck %s
2+
3+
.cpu generic+sme2p2
4+
.cpu generic+nosme2p2
5+
ftmopa za0.s, {z0.s-z1.s}, z0.s, z20[0]
6+
// CHECK: error: instruction requires: sme2p2
7+
// CHECK: ftmopa za0.s, {z0.s-z1.s}, z0.s, z20[0]
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// RUN: llvm-mc -triple aarch64 -filetype asm -o - %s 2>&1 | FileCheck %s
2+
3+
.cpu generic+sme2p2
4+
ftmopa za0.s, {z0.s-z1.s}, z0.s, z20[0]
5+
// CHECK: ftmopa za0.s, { z0.s, z1.s }, z0.s, z20[0]
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2,+sme-f8f32,+sme-f8f16,+sme-f16f16 2>&1 < %s| FileCheck %s
2+
3+
// --------------------------------------------------------------------------//
4+
// Invalid ZA register (range)
5+
6+
ftmopa za2.h, {z30.b-z31.b}, z31.b, z31[3]
7+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
8+
// CHECK-NEXT: ftmopa za2.h, {z30.b-z31.b}, z31.b, z31[3]
9+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
10+
11+
ftmopa za2.h, {z30.h-z31.h}, z31.h, z31[3]
12+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
13+
// CHECK-NEXT: ftmopa za2.h, {z30.h-z31.h}, z31.h, z31[3]
14+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
15+
16+
ftmopa za4.s, {z30.b-z31.b}, z31.b, z31[3]
17+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
18+
// CHECK-NEXT: ftmopa za4.s, {z30.b-z31.b}, z31.b, z31[3]
19+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
20+
21+
ftmopa za4.s, {z30.h-z31.h}, z31.h, z31[3]
22+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
23+
// CHECK-NEXT: ftmopa za4.s, {z30.h-z31.h}, z31.h, z31[3]
24+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
25+
26+
ftmopa za4.s, {z30.s-z31.s}, z31.s, z31[3]
27+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
28+
// CHECK-NEXT: ftmopa za4.s, {z30.s-z31.s}, z31.s, z31[3]
29+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
30+
31+
// --------------------------------------------------------------------------//
32+
// Invalid ZA register (type suffix)
33+
34+
ftmopa za0.b, {z30.b-z31.b}, z31.b, z31[3]
35+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected za[0-3].s
36+
// CHECK-NEXT: ftmopa za0.b, {z30.b-z31.b}, z31.b, z31[3]
37+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
38+
39+
ftmopa za0.d, {z30.h-z31.h}, z31.h, z31[3]
40+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected za[0-3].s
41+
// CHECK-NEXT: ftmopa za0.d, {z30.h-z31.h}, z31.h, z31[3]
42+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
43+
44+
ftmopa za0.h, {z30.s-z31.s}, z31.s, z31[3]
45+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
46+
// CHECK-NEXT: ftmopa za0.h, {z30.s-z31.s}, z31.s, z31[3]
47+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
48+
49+
// --------------------------------------------------------------------------//
50+
// Invalid vector list operand
51+
52+
ftmopa za0.h, {z28.b-z31.b}, z31.b, z31[3]
53+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
54+
// CHECK-NEXT: ftmopa za0.h, {z28.b-z31.b}, z31.b, z31[3]
55+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
56+
57+
ftmopa za0.h, {z29.b-z30.b}, z31.b, z31[3]
58+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors, where the first vector is a multiple of 2 and with matching element types
59+
// CHECK-NEXT: ftmopa za0.h, {z29.b-z30.b}, z31.b, z31[3]
60+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
61+
62+
ftmopa za0.h, {z28.h-z31.h}, z31.h, z31[3]
63+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
64+
// CHECK-NEXT: ftmopa za0.h, {z28.h-z31.h}, z31.h, z31[3]
65+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
66+
67+
ftmopa za0.h, {z29.h-z30.h}, z31.h, z31[3]
68+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors, where the first vector is a multiple of 2 and with matching element types
69+
// CHECK-NEXT: ftmopa za0.h, {z29.h-z30.h}, z31.h, z31[3]
70+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
71+
72+
ftmopa za3.s, {z28.b-z31.b}, z31.b, z31[3]
73+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
74+
// CHECK-NEXT: ftmopa za3.s, {z28.b-z31.b}, z31.b, z31[3]
75+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
76+
77+
ftmopa za3.s, {z29.b-z30.b}, z31.b, z31[3]
78+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors, where the first vector is a multiple of 2 and with matching element types
79+
// CHECK-NEXT: ftmopa za3.s, {z29.b-z30.b}, z31.b, z31[3]
80+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
81+
82+
ftmopa za3.s, {z28.h-z31.h}, z31.h, z31[3]
83+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
84+
// CHECK-NEXT: ftmopa za3.s, {z28.h-z31.h}, z31.h, z31[3]
85+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
86+
87+
ftmopa za3.s, {z29.h-z30.h}, z31.h, z31[3]
88+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors, where the first vector is a multiple of 2 and with matching element types
89+
// CHECK-NEXT: ftmopa za3.s, {z29.h-z30.h}, z31.h, z31[3]
90+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
91+
92+
ftmopa za3.s, {z28.s-z31.s}, z31.s, z31[3]
93+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
94+
// CHECK-NEXT: ftmopa za3.s, {z28.s-z31.s}, z31.s, z31[3]
95+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
96+
97+
ftmopa za3.s, {z29.s-z30.s}, z31.s, z31[3]
98+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors, where the first vector is a multiple of 2 and with matching element types
99+
// CHECK-NEXT: ftmopa za3.s, {z29.s-z30.s}, z31.s, z31[3]
100+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
101+
102+
103+
// --------------------------------------------------------------------------//
104+
// Invalid ZK register
105+
106+
ftmopa za0.h, {z28.b-z29.b}, z31.b, z27[3]
107+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
108+
// CHECK-NEXT: ftmopa za0.h, {z28.b-z29.b}, z31.b, z27[3]
109+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
110+
111+
ftmopa za0.h, {z28.b-z29.b}, z31.b, z21.b[3]
112+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
113+
// CHECK-NEXT: ftmopa za0.h, {z28.b-z29.b}, z31.b, z21.b[3]
114+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
115+
116+
ftmopa za0.h, {z28.h-z29.h}, z31.h, z19[3]
117+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
118+
// CHECK-NEXT: ftmopa za0.h, {z28.h-z29.h}, z31.h, z19[3]
119+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
120+
121+
ftmopa za0.h, {z28.h-z29.h}, z31.h, z30.h[3]
122+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
123+
// CHECK-NEXT: ftmopa za0.h, {z28.h-z29.h}, z31.h, z30.h[3]
124+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
125+
126+
ftmopa za3.s, {z28.b-z29.b}, z31.b, z27[3]
127+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
128+
// CHECK-NEXT: ftmopa za3.s, {z28.b-z29.b}, z31.b, z27[3]
129+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
130+
131+
ftmopa za3.s, {z28.b-z29.b}, z31.b, z29.b[3]
132+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
133+
// CHECK-NEXT: ftmopa za3.s, {z28.b-z29.b}, z31.b, z29.b[3]
134+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
135+
136+
ftmopa za3.s, {z28.h-z29.h}, z31.h, z24[3]
137+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
138+
// CHECK-NEXT: ftmopa za3.s, {z28.h-z29.h}, z31.h, z24[3]
139+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
140+
141+
ftmopa za3.s, {z28.h-z29.h}, z31.h, z21.h[3]
142+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
143+
// CHECK-NEXT: ftmopa za3.s, {z28.h-z29.h}, z31.h, z21.h[3]
144+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
145+
146+
ftmopa za3.s, {z28.s-z29.s}, z31.s, z19[3]
147+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
148+
// CHECK-NEXT: ftmopa za3.s, {z28.s-z29.s}, z31.s, z19[3]
149+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
150+
151+
ftmopa za3.s, {z28.s-z29.s}, z31.s, z30.s[3]
152+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted vector register, expected register in z20..z23 or z28..z31
153+
// CHECK-NEXT: ftmopa za3.s, {z28.s-z29.s}, z31.s, z30.s[3]
154+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
155+
156+
// --------------------------------------------------------------------------//
157+
// Invalid immediate
158+
159+
ftmopa za0.h, {z28.b-z29.b}, z31.b, z20[4]
160+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
161+
// CHECK-NEXT: ftmopa za0.h, {z28.b-z29.b}, z31.b, z20[4]
162+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
163+
164+
ftmopa za0.h, {z28.h-z29.h}, z31.h, z20[4]
165+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
166+
// CHECK-NEXT: ftmopa za0.h, {z28.h-z29.h}, z31.h, z20[4]
167+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
168+
169+
ftmopa za3.s, {z28.b-z29.b}, z31.b, z20[4]
170+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
171+
// CHECK-NEXT: ftmopa za3.s, {z28.b-z29.b}, z31.b, z20[4]
172+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
173+
174+
ftmopa za3.s, {z28.h-z29.h}, z31.h, z20[4]
175+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
176+
// CHECK-NEXT: ftmopa za3.s, {z28.h-z29.h}, z31.h, z20[4]
177+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
178+
179+
ftmopa za3.s, {z28.s-z29.s}, z31.s, z20[4]
180+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: vector lane must be an integer in range [0, 3].
181+
// CHECK-NEXT: ftmopa za3.s, {z28.s-z29.s}, z31.s, z20[4]
182+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
183+
184+
// --------------------------------------------------------------------------//
185+
// Invalid ZPR type suffix
186+
187+
ftmopa za0.h, {z28.b-z29.b}, z31.h, z20[3]
188+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
189+
// CHECK-NEXT: ftmopa za0.h, {z28.b-z29.b}, z31.h, z20[3]
190+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
191+
192+
ftmopa za0.h, {z28.h-z29.h}, z31.s, z20[3]
193+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
194+
// CHECK-NEXT: ftmopa za0.h, {z28.h-z29.h}, z31.s, z20[3]
195+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
196+
197+
ftmopa za0.s, {z28.b-z29.b}, z31.h, z20[3]
198+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
199+
// CHECK-NEXT: ftmopa za0.s, {z28.b-z29.b}, z31.h, z20[3]
200+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
201+
202+
ftmopa za0.s, {z28.h-z29.h}, z31.s, z20[3]
203+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
204+
// CHECK-NEXT: ftmopa za0.s, {z28.h-z29.h}, z31.s, z20[3]
205+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
206+
207+
ftmopa za0.s, {z28.s-z29.s}, z31.h, z20[3]
208+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
209+
// CHECK-NEXT: ftmopa za0.s, {z28.s-z29.s}, z31.h, z20[3]
210+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
211+
212+

‎llvm/test/MC/AArch64/SME2p2/ftmopa.s

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2,+sme-f8f32,+sme-f8f16,+sme-f16f16 < %s \
2+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
3+
// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
4+
// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
5+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2p2,+sme-f8f32,+sme-f8f16,+sme-f16f16 < %s \
6+
// RUN: | llvm-objdump -d --mattr=+sme2p2,+sme-f8f32,+sme-f8f16,+sme-f16f16 --no-print-imm-hex - | FileCheck %s --check-prefix=CHECK-INST
7+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2p2,+sme-f8f32,+sme-f8f16,+sme-f16f16 < %s \
8+
// RUN: | llvm-objdump -d --mattr=-sme2p2 --no-print-imm-hex - | FileCheck %s --check-prefix=CHECK-UNKNOWN
9+
// Disassemble encoding and check the re-encoding (-show-encoding) matches.
10+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2p2,+sme-f8f32,+sme-f8f16,+sme-f16f16 < %s \
11+
// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
12+
// RUN: | llvm-mc -triple=aarch64 -mattr=+sme2p2,+sme-f8f32,+sme-f8f16,+sme-f16f16 -disassemble -show-encoding \
13+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
14+
15+
// 2-way (fp8-to-fp16)
16+
17+
ftmopa za0.h, {z0.b-z1.b}, z0.b, z20[0] // 10000000-01100000-00000000-00001000
18+
// CHECK-INST: ftmopa za0.h, { z0.b, z1.b }, z0.b, z20[0]
19+
// CHECK-ENCODING: [0x08,0x00,0x60,0x80]
20+
// CHECK-ERROR: instruction requires: sme2p2 sme-f8f16
21+
// CHECK-UNKNOWN: 80600008 <unknown>
22+
23+
ftmopa za1.h, {z10.b-z11.b}, z21.b, z29[1] // 10000000-01110101-00010101-01011001
24+
// CHECK-INST: ftmopa za1.h, { z10.b, z11.b }, z21.b, z29[1]
25+
// CHECK-ENCODING: [0x59,0x15,0x75,0x80]
26+
// CHECK-ERROR: instruction requires: sme2p2 sme-f8f16
27+
// CHECK-UNKNOWN: 80751559 <unknown>
28+
29+
ftmopa za1.h, {z30.b-z31.b}, z31.b, z31[3] // 10000000-01111111-00011111-11111001
30+
// CHECK-INST: ftmopa za1.h, { z30.b, z31.b }, z31.b, z31[3]
31+
// CHECK-ENCODING: [0xf9,0x1f,0x7f,0x80]
32+
// CHECK-ERROR: instruction requires: sme2p2 sme-f8f16
33+
// CHECK-UNKNOWN: 807f1ff9 <unknown>
34+
35+
// 2-way, (fp16-to-fp32)
36+
37+
ftmopa za0.s, {z0.h-z1.h}, z0.h, z20[0] // 10000001-01100000-00000000-00000000
38+
// CHECK-INST: ftmopa za0.s, { z0.h, z1.h }, z0.h, z20[0]
39+
// CHECK-ENCODING: [0x00,0x00,0x60,0x81]
40+
// CHECK-ERROR: instruction requires: sme2p2
41+
// CHECK-UNKNOWN: 81600000 <unknown>
42+
43+
ftmopa za3.s, {z12.h-z13.h}, z8.h, z23[3] // 10000001-01101000-00001101-10110011
44+
// CHECK-INST: ftmopa za3.s, { z12.h, z13.h }, z8.h, z23[3]
45+
// CHECK-ENCODING: [0xb3,0x0d,0x68,0x81]
46+
// CHECK-ERROR: instruction requires: sme2p2
47+
// CHECK-UNKNOWN: 81680db3 <unknown>
48+
49+
ftmopa za3.s, {z30.h-z31.h}, z31.h, z31[3] // 10000001-01111111-00011111-11110011
50+
// CHECK-INST: ftmopa za3.s, { z30.h, z31.h }, z31.h, z31[3]
51+
// CHECK-ENCODING: [0xf3,0x1f,0x7f,0x81]
52+
// CHECK-ERROR: instruction requires: sme2p2
53+
// CHECK-UNKNOWN: 817f1ff3 <unknown>
54+
55+
// 4-way
56+
57+
ftmopa za0.s, {z0.b-z1.b}, z0.b, z20[0] // 10000000-01100000-00000000-00000000
58+
// CHECK-INST: ftmopa za0.s, { z0.b, z1.b }, z0.b, z20[0]
59+
// CHECK-ENCODING: [0x00,0x00,0x60,0x80]
60+
// CHECK-ERROR: instruction requires: sme2p2 sme-f8f32
61+
// CHECK-UNKNOWN: 80600000 <unknown>
62+
63+
ftmopa za3.s, {z12.b-z13.b}, z8.b, z23[3] // 10000000-01101000-00001101-10110011
64+
// CHECK-INST: ftmopa za3.s, { z12.b, z13.b }, z8.b, z23[3]
65+
// CHECK-ENCODING: [0xb3,0x0d,0x68,0x80]
66+
// CHECK-ERROR: instruction requires: sme2p2 sme-f8f32
67+
// CHECK-UNKNOWN: 80680db3 <unknown>
68+
69+
ftmopa za3.s, {z30.b-z31.b}, z31.b, z31[3] // 10000000-01111111-00011111-11110011
70+
// CHECK-INST: ftmopa za3.s, { z30.b, z31.b }, z31.b, z31[3]
71+
// CHECK-ENCODING: [0xf3,0x1f,0x7f,0x80]
72+
// CHECK-ERROR: instruction requires: sme2p2 sme-f8f32
73+
// CHECK-UNKNOWN: 807f1ff3 <unknown>
74+
75+
// non-widening (half-precision)
76+
77+
ftmopa za0.h, {z0.h-z1.h}, z0.h, z20[0] // 10000001-01000000-00000000-00001000
78+
// CHECK-INST: ftmopa za0.h, { z0.h, z1.h }, z0.h, z20[0]
79+
// CHECK-ENCODING: [0x08,0x00,0x40,0x81]
80+
// CHECK-ERROR: instruction requires: sme2p2 sme-f16f16
81+
// CHECK-UNKNOWN: 81400008 <unknown>
82+
83+
ftmopa za1.h, {z12.h-z13.h}, z8.h, z23[3] // 10000001-01001000-00001101-10111001
84+
// CHECK-INST: ftmopa za1.h, { z12.h, z13.h }, z8.h, z23[3]
85+
// CHECK-ENCODING: [0xb9,0x0d,0x48,0x81]
86+
// CHECK-ERROR: instruction requires: sme2p2 sme-f16f16
87+
// CHECK-UNKNOWN: 81480db9 <unknown>
88+
89+
ftmopa za1.h, {z30.h-z31.h}, z31.h, z31[3] // 10000001-01011111-00011111-11111011
90+
// CHECK-INST: ftmopa za1.h, { z30.h, z31.h }, z31.h, z31[3]
91+
// CHECK-ENCODING: [0xf9,0x1f,0x5f,0x81]
92+
// CHECK-ERROR: instruction requires: sme2p2 sme-f16f16
93+
// CHECK-UNKNOWN: 815f1ff9 <unknown>
94+
95+
// non-widening (single-precision)
96+
97+
ftmopa za0.s, {z0.s-z1.s}, z0.s, z20[0] // 10000000-01000000-00000000-00000000
98+
// CHECK-INST: ftmopa za0.s, { z0.s, z1.s }, z0.s, z20[0]
99+
// CHECK-ENCODING: [0x00,0x00,0x40,0x80]
100+
// CHECK-ERROR: instruction requires: sme2p2
101+
// CHECK-UNKNOWN: 80400000 <unknown>
102+
103+
ftmopa za3.s, {z12.s-z13.s}, z8.s, z23[3] // 10000000-01001000-00001101-10110011
104+
// CHECK-INST: ftmopa za3.s, { z12.s, z13.s }, z8.s, z23[3]
105+
// CHECK-ENCODING: [0xb3,0x0d,0x48,0x80]
106+
// CHECK-ERROR: instruction requires: sme2p2
107+
// CHECK-UNKNOWN: 80480db3 <unknown>
108+
109+
ftmopa za3.s, {z30.s-z31.s}, z31.s, z31[3] // 10000000-01011111-00011111-11110011
110+
// CHECK-INST: ftmopa za3.s, { z30.s, z31.s }, z31.s, z31[3]
111+
// CHECK-ENCODING: [0xf3,0x1f,0x5f,0x80]
112+
// CHECK-ERROR: instruction requires: sme2p2
113+
// CHECK-UNKNOWN: 805f1ff3 <unknown>

0 commit comments

Comments
 (0)
Please sign in to comment.