Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 529d733

Browse files
committed
Reapply r334980 and r334983.
These patches were previously reverted as they led to buildbot time-outs caused by large switch statement in printAliasInstr when using UBSan and O3. The issue has been addressed with a workaround (r335525). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336079 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent e523817 commit 529d733

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1126
-110
lines changed

lib/Target/AArch64/AArch64InstrFormats.td

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,23 @@ def CondCode : AsmOperandClass {
179179
// A 32-bit register pasrsed as 64-bit
180180
def GPR32as64Operand : AsmOperandClass {
181181
let Name = "GPR32as64";
182+
let ParserMethod =
183+
"tryParseGPROperand<false, RegConstraintEqualityTy::EqualsSubReg>";
182184
}
183185
def GPR32as64 : RegisterOperand<GPR32> {
184186
let ParserMatchClass = GPR32as64Operand;
185187
}
186188

189+
// A 64-bit register pasrsed as 32-bit
190+
def GPR64as32Operand : AsmOperandClass {
191+
let Name = "GPR64as32";
192+
let ParserMethod =
193+
"tryParseGPROperand<false, RegConstraintEqualityTy::EqualsSuperReg>";
194+
}
195+
def GPR64as32 : RegisterOperand<GPR64, "printGPR64as32"> {
196+
let ParserMatchClass = GPR64as32Operand;
197+
}
198+
187199
// 8-bit immediate for AdvSIMD where 64-bit values of the form:
188200
// aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg hhhhhhhh
189201
// are encoded as the eight bit value 'abcdefgh'.

lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,21 +527,37 @@ let Predicates = [HasSVE] in {
527527
defm CMPLO_WIDE_PPzZZ : sve_int_cmp_1_wide<0b110, "cmplo">;
528528
defm CMPLS_WIDE_PPzZZ : sve_int_cmp_1_wide<0b111, "cmpls">;
529529

530+
defm SQINCB_XPiWdI : sve_int_pred_pattern_b_s32<0b00000, "sqincb">;
531+
defm UQINCB_WPiI : sve_int_pred_pattern_b_u32<0b00001, "uqincb">;
532+
defm SQDECB_XPiWdI : sve_int_pred_pattern_b_s32<0b00010, "sqdecb">;
533+
defm UQDECB_WPiI : sve_int_pred_pattern_b_u32<0b00011, "uqdecb">;
530534
defm SQINCB_XPiI : sve_int_pred_pattern_b_x64<0b00100, "sqincb">;
531535
defm UQINCB_XPiI : sve_int_pred_pattern_b_x64<0b00101, "uqincb">;
532536
defm SQDECB_XPiI : sve_int_pred_pattern_b_x64<0b00110, "sqdecb">;
533537
defm UQDECB_XPiI : sve_int_pred_pattern_b_x64<0b00111, "uqdecb">;
534538

539+
defm SQINCH_XPiWdI : sve_int_pred_pattern_b_s32<0b01000, "sqinch">;
540+
defm UQINCH_WPiI : sve_int_pred_pattern_b_u32<0b01001, "uqinch">;
541+
defm SQDECH_XPiWdI : sve_int_pred_pattern_b_s32<0b01010, "sqdech">;
542+
defm UQDECH_WPiI : sve_int_pred_pattern_b_u32<0b01011, "uqdech">;
535543
defm SQINCH_XPiI : sve_int_pred_pattern_b_x64<0b01100, "sqinch">;
536544
defm UQINCH_XPiI : sve_int_pred_pattern_b_x64<0b01101, "uqinch">;
537545
defm SQDECH_XPiI : sve_int_pred_pattern_b_x64<0b01110, "sqdech">;
538546
defm UQDECH_XPiI : sve_int_pred_pattern_b_x64<0b01111, "uqdech">;
539547

548+
defm SQINCW_XPiWdI : sve_int_pred_pattern_b_s32<0b10000, "sqincw">;
549+
defm UQINCW_WPiI : sve_int_pred_pattern_b_u32<0b10001, "uqincw">;
550+
defm SQDECW_XPiWdI : sve_int_pred_pattern_b_s32<0b10010, "sqdecw">;
551+
defm UQDECW_WPiI : sve_int_pred_pattern_b_u32<0b10011, "uqdecw">;
540552
defm SQINCW_XPiI : sve_int_pred_pattern_b_x64<0b10100, "sqincw">;
541553
defm UQINCW_XPiI : sve_int_pred_pattern_b_x64<0b10101, "uqincw">;
542554
defm SQDECW_XPiI : sve_int_pred_pattern_b_x64<0b10110, "sqdecw">;
543555
defm UQDECW_XPiI : sve_int_pred_pattern_b_x64<0b10111, "uqdecw">;
544556

557+
defm SQINCD_XPiWdI : sve_int_pred_pattern_b_s32<0b11000, "sqincd">;
558+
defm UQINCD_WPiI : sve_int_pred_pattern_b_u32<0b11001, "uqincd">;
559+
defm SQDECD_XPiWdI : sve_int_pred_pattern_b_s32<0b11010, "sqdecd">;
560+
defm UQDECD_WPiI : sve_int_pred_pattern_b_u32<0b11011, "uqdecd">;
545561
defm SQINCD_XPiI : sve_int_pred_pattern_b_x64<0b11100, "sqincd">;
546562
defm UQINCD_XPiI : sve_int_pred_pattern_b_x64<0b11101, "uqincd">;
547563
defm SQDECD_XPiI : sve_int_pred_pattern_b_x64<0b11110, "sqdecd">;

lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp

Lines changed: 94 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ enum class RegKind {
6666
SVEPredicateVector
6767
};
6868

69+
enum RegConstraintEqualityTy {
70+
EqualsReg,
71+
EqualsSuperReg,
72+
EqualsSubReg
73+
};
74+
6975
class AArch64AsmParser : public MCTargetAsmParser {
7076
private:
7177
StringRef Mnemonic; ///< Instruction mnemonic.
@@ -92,7 +98,8 @@ class AArch64AsmParser : public MCTargetAsmParser {
9298
bool parseOperand(OperandVector &Operands, bool isCondCode,
9399
bool invertCondCode);
94100

95-
bool showMatchError(SMLoc Loc, unsigned ErrCode, OperandVector &Operands);
101+
bool showMatchError(SMLoc Loc, unsigned ErrCode, uint64_t ErrorInfo,
102+
OperandVector &Operands);
96103

97104
bool parseDirectiveArch(SMLoc L);
98105
bool parseDirectiveCPU(SMLoc L);
@@ -139,7 +146,8 @@ class AArch64AsmParser : public MCTargetAsmParser {
139146
bool tryParseNeonVectorRegister(OperandVector &Operands);
140147
OperandMatchResultTy tryParseVectorIndex(OperandVector &Operands);
141148
OperandMatchResultTy tryParseGPRSeqPair(OperandVector &Operands);
142-
template <bool ParseShiftExtend>
149+
template <bool ParseShiftExtend,
150+
RegConstraintEqualityTy EqTy = RegConstraintEqualityTy::EqualsReg>
143151
OperandMatchResultTy tryParseGPROperand(OperandVector &Operands);
144152
template <bool ParseShiftExtend, bool ParseSuffix>
145153
OperandMatchResultTy tryParseSVEDataVector(OperandVector &Operands);
@@ -177,6 +185,8 @@ class AArch64AsmParser : public MCTargetAsmParser {
177185
setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits()));
178186
}
179187

188+
bool regsEqual(const MCParsedAsmOperand &Op1,
189+
const MCParsedAsmOperand &Op2) const override;
180190
bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
181191
SMLoc NameLoc, OperandVector &Operands) override;
182192
bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override;
@@ -231,6 +241,10 @@ class AArch64Operand : public MCParsedAsmOperand {
231241
RegKind Kind;
232242
int ElementWidth;
233243

244+
// The register may be allowed as a different register class,
245+
// e.g. for GPR64as32 or GPR32as64.
246+
RegConstraintEqualityTy EqualityTy;
247+
234248
// In some cases the shift/extend needs to be explicitly parsed together
235249
// with the register, rather than as a separate operand. This is needed
236250
// for addressing modes where the instruction as a whole dictates the
@@ -446,6 +460,11 @@ class AArch64Operand : public MCParsedAsmOperand {
446460
return Reg.RegNum;
447461
}
448462

463+
RegConstraintEqualityTy getRegEqualityTy() const {
464+
assert(Kind == k_Register && "Invalid access!");
465+
return Reg.EqualityTy;
466+
}
467+
449468
unsigned getVectorListStart() const {
450469
assert(Kind == k_VectorList && "Invalid access!");
451470
return VectorList.RegNum;
@@ -554,14 +573,16 @@ class AArch64Operand : public MCParsedAsmOperand {
554573
return DiagnosticPredicateTy::NearMatch;
555574
}
556575

557-
bool isSVEPattern() const {
576+
DiagnosticPredicate isSVEPattern() const {
558577
if (!isImm())
559-
return false;
578+
return DiagnosticPredicateTy::NoMatch;
560579
auto *MCE = dyn_cast<MCConstantExpr>(getImm());
561580
if (!MCE)
562-
return false;
581+
return DiagnosticPredicateTy::NoMatch;
563582
int64_t Val = MCE->getValue();
564-
return Val >= 0 && Val < 32;
583+
if (Val >= 0 && Val < 32)
584+
return DiagnosticPredicateTy::Match;
585+
return DiagnosticPredicateTy::NearMatch;
565586
}
566587

567588
bool isSymbolicUImm12Offset(const MCExpr *Expr, unsigned Scale) const {
@@ -1002,6 +1023,11 @@ class AArch64Operand : public MCParsedAsmOperand {
10021023
AArch64MCRegisterClasses[AArch64::GPR64RegClassID].contains(Reg.RegNum);
10031024
}
10041025

1026+
bool isGPR64as32() const {
1027+
return Kind == k_Register && Reg.Kind == RegKind::Scalar &&
1028+
AArch64MCRegisterClasses[AArch64::GPR32RegClassID].contains(Reg.RegNum);
1029+
}
1030+
10051031
bool isWSeqPair() const {
10061032
return Kind == k_Register && Reg.Kind == RegKind::Scalar &&
10071033
AArch64MCRegisterClasses[AArch64::WSeqPairsClassRegClassID].contains(
@@ -1318,6 +1344,18 @@ class AArch64Operand : public MCParsedAsmOperand {
13181344
Inst.addOperand(MCOperand::createReg(Reg));
13191345
}
13201346

1347+
void addGPR64as32Operands(MCInst &Inst, unsigned N) const {
1348+
assert(N == 1 && "Invalid number of operands!");
1349+
assert(
1350+
AArch64MCRegisterClasses[AArch64::GPR32RegClassID].contains(getReg()));
1351+
1352+
const MCRegisterInfo *RI = Ctx.getRegisterInfo();
1353+
uint32_t Reg = RI->getRegClass(AArch64::GPR64RegClassID).getRegister(
1354+
RI->getEncodingValue(getReg()));
1355+
1356+
Inst.addOperand(MCOperand::createReg(Reg));
1357+
}
1358+
13211359
template <int Width>
13221360
void addFPRasZPRRegOperands(MCInst &Inst, unsigned N) const {
13231361
unsigned Base;
@@ -1668,13 +1706,15 @@ class AArch64Operand : public MCParsedAsmOperand {
16681706

16691707
static std::unique_ptr<AArch64Operand>
16701708
CreateReg(unsigned RegNum, RegKind Kind, SMLoc S, SMLoc E, MCContext &Ctx,
1709+
RegConstraintEqualityTy EqTy = RegConstraintEqualityTy::EqualsReg,
16711710
AArch64_AM::ShiftExtendType ExtTy = AArch64_AM::LSL,
16721711
unsigned ShiftAmount = 0,
16731712
unsigned HasExplicitAmount = false) {
16741713
auto Op = make_unique<AArch64Operand>(k_Register, Ctx);
16751714
Op->Reg.RegNum = RegNum;
16761715
Op->Reg.Kind = Kind;
16771716
Op->Reg.ElementWidth = 0;
1717+
Op->Reg.EqualityTy = EqTy;
16781718
Op->Reg.ShiftExtend.Type = ExtTy;
16791719
Op->Reg.ShiftExtend.Amount = ShiftAmount;
16801720
Op->Reg.ShiftExtend.HasExplicitAmount = HasExplicitAmount;
@@ -1692,7 +1732,7 @@ class AArch64Operand : public MCParsedAsmOperand {
16921732
assert((Kind == RegKind::NeonVector || Kind == RegKind::SVEDataVector ||
16931733
Kind == RegKind::SVEPredicateVector) &&
16941734
"Invalid vector kind");
1695-
auto Op = CreateReg(RegNum, Kind, S, E, Ctx, ExtTy, ShiftAmount,
1735+
auto Op = CreateReg(RegNum, Kind, S, E, Ctx, EqualsReg, ExtTy, ShiftAmount,
16961736
HasExplicitAmount);
16971737
Op->Reg.ElementWidth = ElementWidth;
16981738
return Op;
@@ -3164,7 +3204,7 @@ AArch64AsmParser::tryParseGPR64sp0Operand(OperandVector &Operands) {
31643204
return MatchOperand_Success;
31653205
}
31663206

3167-
template <bool ParseShiftExtend>
3207+
template <bool ParseShiftExtend, RegConstraintEqualityTy EqTy>
31683208
OperandMatchResultTy
31693209
AArch64AsmParser::tryParseGPROperand(OperandVector &Operands) {
31703210
SMLoc StartLoc = getLoc();
@@ -3177,7 +3217,7 @@ AArch64AsmParser::tryParseGPROperand(OperandVector &Operands) {
31773217
// No shift/extend is the default.
31783218
if (!ParseShiftExtend || getParser().getTok().isNot(AsmToken::Comma)) {
31793219
Operands.push_back(AArch64Operand::CreateReg(
3180-
RegNum, RegKind::Scalar, StartLoc, getLoc(), getContext()));
3220+
RegNum, RegKind::Scalar, StartLoc, getLoc(), getContext(), EqTy));
31813221
return MatchOperand_Success;
31823222
}
31833223

@@ -3191,10 +3231,10 @@ AArch64AsmParser::tryParseGPROperand(OperandVector &Operands) {
31913231
return Res;
31923232

31933233
auto Ext = static_cast<AArch64Operand*>(ExtOpnd.back().get());
3194-
Operands.push_back(AArch64Operand::CreateReg(RegNum, RegKind::Scalar,
3195-
StartLoc, Ext->getEndLoc(), getContext(),
3196-
Ext->getShiftExtendType(), Ext->getShiftExtendAmount(),
3197-
Ext->hasShiftExtendAmount()));
3234+
Operands.push_back(AArch64Operand::CreateReg(
3235+
RegNum, RegKind::Scalar, StartLoc, Ext->getEndLoc(), getContext(), EqTy,
3236+
Ext->getShiftExtendType(), Ext->getShiftExtendAmount(),
3237+
Ext->hasShiftExtendAmount()));
31983238

31993239
return MatchOperand_Success;
32003240
}
@@ -3412,6 +3452,30 @@ bool AArch64AsmParser::parseOperand(OperandVector &Operands, bool isCondCode,
34123452
}
34133453
}
34143454

3455+
bool AArch64AsmParser::regsEqual(const MCParsedAsmOperand &Op1,
3456+
const MCParsedAsmOperand &Op2) const {
3457+
auto &AOp1 = static_cast<const AArch64Operand&>(Op1);
3458+
auto &AOp2 = static_cast<const AArch64Operand&>(Op2);
3459+
if (AOp1.getRegEqualityTy() == RegConstraintEqualityTy::EqualsReg &&
3460+
AOp2.getRegEqualityTy() == RegConstraintEqualityTy::EqualsReg)
3461+
return MCTargetAsmParser::regsEqual(Op1, Op2);
3462+
3463+
assert(AOp1.isScalarReg() && AOp2.isScalarReg() &&
3464+
"Testing equality of non-scalar registers not supported");
3465+
3466+
// Check if a registers match their sub/super register classes.
3467+
if (AOp1.getRegEqualityTy() == EqualsSuperReg)
3468+
return getXRegFromWReg(Op1.getReg()) == Op2.getReg();
3469+
if (AOp1.getRegEqualityTy() == EqualsSubReg)
3470+
return getWRegFromXReg(Op1.getReg()) == Op2.getReg();
3471+
if (AOp2.getRegEqualityTy() == EqualsSuperReg)
3472+
return getXRegFromWReg(Op2.getReg()) == Op1.getReg();
3473+
if (AOp2.getRegEqualityTy() == EqualsSubReg)
3474+
return getWRegFromXReg(Op2.getReg()) == Op1.getReg();
3475+
3476+
return false;
3477+
}
3478+
34153479
/// ParseInstruction - Parse an AArch64 instruction mnemonic followed by its
34163480
/// operands.
34173481
bool AArch64AsmParser::ParseInstruction(ParseInstructionInfo &Info,
@@ -3765,10 +3829,22 @@ static std::string AArch64MnemonicSpellCheck(StringRef S, uint64_t FBS,
37653829
unsigned VariantID = 0);
37663830

37673831
bool AArch64AsmParser::showMatchError(SMLoc Loc, unsigned ErrCode,
3832+
uint64_t ErrorInfo,
37683833
OperandVector &Operands) {
37693834
switch (ErrCode) {
3770-
case Match_InvalidTiedOperand:
3771-
return Error(Loc, "operand must match destination register");
3835+
case Match_InvalidTiedOperand: {
3836+
RegConstraintEqualityTy EqTy =
3837+
static_cast<const AArch64Operand &>(*Operands[ErrorInfo])
3838+
.getRegEqualityTy();
3839+
switch (EqTy) {
3840+
case RegConstraintEqualityTy::EqualsSubReg:
3841+
return Error(Loc, "operand must be 64-bit form of destination register");
3842+
case RegConstraintEqualityTy::EqualsSuperReg:
3843+
return Error(Loc, "operand must be 32-bit form of destination register");
3844+
case RegConstraintEqualityTy::EqualsReg:
3845+
return Error(Loc, "operand must match destination register");
3846+
}
3847+
}
37723848
case Match_MissingFeature:
37733849
return Error(Loc,
37743850
"instruction requires a CPU feature not currently enabled");
@@ -4389,7 +4465,7 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
43894465
return Error(IDLoc, Msg);
43904466
}
43914467
case Match_MnemonicFail:
4392-
return showMatchError(IDLoc, MatchResult, Operands);
4468+
return showMatchError(IDLoc, MatchResult, ErrorInfo, Operands);
43934469
case Match_InvalidOperand: {
43944470
SMLoc ErrorLoc = IDLoc;
43954471

@@ -4408,7 +4484,7 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
44084484
((AArch64Operand &)*Operands[ErrorInfo]).isTokenSuffix())
44094485
MatchResult = Match_InvalidSuffix;
44104486

4411-
return showMatchError(ErrorLoc, MatchResult, Operands);
4487+
return showMatchError(ErrorLoc, MatchResult, ErrorInfo, Operands);
44124488
}
44134489
case Match_InvalidTiedOperand:
44144490
case Match_InvalidMemoryIndexed1:
@@ -4546,7 +4622,7 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
45464622
SMLoc ErrorLoc = ((AArch64Operand &)*Operands[ErrorInfo]).getStartLoc();
45474623
if (ErrorLoc == SMLoc())
45484624
ErrorLoc = IDLoc;
4549-
return showMatchError(ErrorLoc, MatchResult, Operands);
4625+
return showMatchError(ErrorLoc, MatchResult, ErrorInfo, Operands);
45504626
}
45514627
}
45524628

lib/Target/AArch64/InstPrinter/AArch64InstPrinter.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,3 +1527,10 @@ void AArch64InstPrinter::printExactFPImm(const MCInst *MI, unsigned OpNum,
15271527
unsigned Val = MI->getOperand(OpNum).getImm();
15281528
O << "#" << (Val ? Imm1Desc->Repr : Imm0Desc->Repr);
15291529
}
1530+
1531+
void AArch64InstPrinter::printGPR64as32(const MCInst *MI, unsigned OpNum,
1532+
const MCSubtargetInfo &STI,
1533+
raw_ostream &O) {
1534+
unsigned Reg = MI->getOperand(OpNum).getReg();
1535+
O << getRegisterName(getWRegFromXReg(Reg));
1536+
}

lib/Target/AArch64/InstPrinter/AArch64InstPrinter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ class AArch64InstPrinter : public MCInstPrinter {
180180
template <char = 0>
181181
void printSVERegOp(const MCInst *MI, unsigned OpNum,
182182
const MCSubtargetInfo &STI, raw_ostream &O);
183+
void printGPR64as32(const MCInst *MI, unsigned OpNum,
184+
const MCSubtargetInfo &STI, raw_ostream &O);
183185
template <int Width>
184186
void printZPRasFPR(const MCInst *MI, unsigned OpNum,
185187
const MCSubtargetInfo &STI, raw_ostream &O);

lib/Target/AArch64/SVEInstrFormats.td

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,32 @@ class sve_int_pred_pattern_b<bits<5> opc, string asm, RegisterOperand dt,
333333
let Inst{9-5} = pattern;
334334
let Inst{4-0} = Rdn;
335335

336+
// Signed 32bit forms require their GPR operand printed.
337+
let AsmString = !if(!eq(opc{2,0}, 0b00),
338+
!strconcat(asm, "\t$Rdn, $_Rdn, $pattern, mul $imm4"),
339+
!strconcat(asm, "\t$Rdn, $pattern, mul $imm4"));
340+
336341
let Constraints = "$Rdn = $_Rdn";
337342
}
338343

344+
multiclass sve_int_pred_pattern_b_s32<bits<5> opc, string asm> {
345+
def NAME : sve_int_pred_pattern_b<opc, asm, GPR64z, GPR64as32>;
346+
347+
def : InstAlias<asm # "\t$Rd, $Rn, $pattern",
348+
(!cast<Instruction>(NAME) GPR64z:$Rd, GPR64as32:$Rn, sve_pred_enum:$pattern, 1), 1>;
349+
def : InstAlias<asm # "\t$Rd, $Rn",
350+
(!cast<Instruction>(NAME) GPR64z:$Rd, GPR64as32:$Rn, 0b11111, 1), 2>;
351+
}
352+
353+
multiclass sve_int_pred_pattern_b_u32<bits<5> opc, string asm> {
354+
def NAME : sve_int_pred_pattern_b<opc, asm, GPR32z, GPR32z>;
355+
356+
def : InstAlias<asm # "\t$Rdn, $pattern",
357+
(!cast<Instruction>(NAME) GPR32z:$Rdn, sve_pred_enum:$pattern, 1), 1>;
358+
def : InstAlias<asm # "\t$Rdn",
359+
(!cast<Instruction>(NAME) GPR32z:$Rdn, 0b11111, 1), 2>;
360+
}
361+
339362
multiclass sve_int_pred_pattern_b_x64<bits<5> opc, string asm> {
340363
def NAME : sve_int_pred_pattern_b<opc, asm, GPR64z, GPR64z>;
341364

test/MC/AArch64/SVE/decb-diagnostics.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ decb x0, all, mul #17
3737
// Invalid predicate patterns
3838

3939
decb x0, vl512
40-
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid predicate pattern
40+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
4141
// CHECK-NEXT: decb x0, vl512
4242
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
4343

4444
decb x0, vl9
45-
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid predicate pattern
45+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
4646
// CHECK-NEXT: decb x0, vl9
4747
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
4848

0 commit comments

Comments
 (0)