Skip to content

Commit 5588dbc

Browse files
committed
[SystemZAsmParser] Treat VR128 separately in ParseDirectiveInsn().
This patch makes the parser - reject higher vector registers (>=16) in operands where they should not be accepted. - accept higher integers (>=16) in vector register operands. Review: Ulrich Weigand Differential Revision: https://reviews.llvm.org/D88888
1 parent a825eaa commit 5588dbc

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -635,18 +635,18 @@ static struct InsnMatchEntry InsnMatchTable[] = {
635635
{ "ssf", SystemZ::InsnSSF, 4,
636636
{ MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg } },
637637
{ "vri", SystemZ::InsnVRI, 6,
638-
{ MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_U12Imm, MCK_U4Imm, MCK_U4Imm } },
638+
{ MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U12Imm, MCK_U4Imm, MCK_U4Imm } },
639639
{ "vrr", SystemZ::InsnVRR, 7,
640-
{ MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm, MCK_U4Imm,
640+
{ MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm,
641641
MCK_U4Imm } },
642642
{ "vrs", SystemZ::InsnVRS, 5,
643-
{ MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_U4Imm } },
643+
{ MCK_U48Imm, MCK_AnyReg, MCK_VR128, MCK_BDAddr64Disp12, MCK_U4Imm } },
644644
{ "vrv", SystemZ::InsnVRV, 4,
645-
{ MCK_U48Imm, MCK_AnyReg, MCK_BDVAddr64Disp12, MCK_U4Imm } },
645+
{ MCK_U48Imm, MCK_VR128, MCK_BDVAddr64Disp12, MCK_U4Imm } },
646646
{ "vrx", SystemZ::InsnVRX, 4,
647-
{ MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp12, MCK_U4Imm } },
647+
{ MCK_U48Imm, MCK_VR128, MCK_BDXAddr64Disp12, MCK_U4Imm } },
648648
{ "vsi", SystemZ::InsnVSI, 4,
649-
{ MCK_U48Imm, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_U8Imm } }
649+
{ MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_U8Imm } }
650650
};
651651

652652
static void printMCExpr(const MCExpr *E, raw_ostream &OS) {
@@ -851,10 +851,11 @@ SystemZAsmParser::parseRegister(OperandVector &Operands, RegisterKind Kind) {
851851
// Parse any type of register (including integers) and add it to Operands.
852852
OperandMatchResultTy
853853
SystemZAsmParser::parseAnyRegister(OperandVector &Operands) {
854+
SMLoc StartLoc = Parser.getTok().getLoc();
855+
854856
// Handle integer values.
855857
if (Parser.getTok().is(AsmToken::Integer)) {
856858
const MCExpr *Register;
857-
SMLoc StartLoc = Parser.getTok().getLoc();
858859
if (Parser.parseExpression(Register))
859860
return MatchOperand_ParseFail;
860861

@@ -876,6 +877,11 @@ SystemZAsmParser::parseAnyRegister(OperandVector &Operands) {
876877
if (parseRegister(Reg))
877878
return MatchOperand_ParseFail;
878879

880+
if (Reg.Num > 15) {
881+
Error(StartLoc, "invalid register");
882+
return MatchOperand_ParseFail;
883+
}
884+
879885
// Map to the correct register kind.
880886
RegisterKind Kind;
881887
unsigned RegNo;
@@ -1208,6 +1214,8 @@ bool SystemZAsmParser::ParseDirectiveInsn(SMLoc L) {
12081214
OperandMatchResultTy ResTy;
12091215
if (Kind == MCK_AnyReg)
12101216
ResTy = parseAnyReg(Operands);
1217+
else if (Kind == MCK_VR128)
1218+
ResTy = parseVR128(Operands);
12111219
else if (Kind == MCK_BDXAddr64Disp12 || Kind == MCK_BDXAddr64Disp20)
12121220
ResTy = parseBDXAddr64(Operands);
12131221
else if (Kind == MCK_BDAddr64Disp12 || Kind == MCK_BDAddr64Disp20)

llvm/test/MC/SystemZ/directive-insn-vector.s

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,5 @@
2525
#CHECK: e6 0c 20 0c 01 35 vlrl %v16, 12(%r2), 12
2626
.insn vsi,0xe60000000035,%v16,12(%r2),12
2727

28+
#CHECK: e7 01 00 00 0c 56 vlr %v16, %v17
29+
.insn vrr,0xe70000000056,16,17,0,0,0,0

llvm/test/MC/SystemZ/regs-bad.s

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,13 @@
217217
lxr %f0,16
218218
lxr %f0,0(%r1)
219219

220+
# Test that a high (>=16) vector register is not accepted in a non-vector
221+
# operand.
222+
#
223+
#CHECK: error: invalid register
224+
#CHECK: .insn rr,0x1800,%v16,%v0
225+
.insn rr,0x1800,%v16,%v0
226+
220227
# Test access register operands
221228
#
222229
#CHECK: error: invalid operand for instruction

0 commit comments

Comments
 (0)