@@ -103,22 +103,38 @@ def simm16nonzero : RISCVOp<XLenVT>,
103103 let OperandType = "OPERAND_SIMM16_NONZERO";
104104}
105105
106- def simm20 : RISCVSImmLeafOp<20>;
106+ def simm20_li : RISCVOp<XLenVT> {
107+ let ParserMatchClass = SImmAsmOperand<20, "LI">;
108+ let EncoderMethod = "getImmOpValue";
109+ let DecoderMethod = "decodeSImmOperand<20>";
110+ let OperandType = "OPERAND_SIMM20_LI";
111+ let MCOperandPredicate = [{
112+ int64_t Imm;
113+ if (MCOp.evaluateAsConstantImm(Imm))
114+ return isInt<20>(Imm);
115+ return MCOp.isBareSymbolRef();
116+ }];
117+ }
107118
108119def simm26 : RISCVSImmLeafOp<26>;
109120
121+ class BareSImmNAsmOperand<int width>
122+ : ImmAsmOperand<"BareS", width, ""> {
123+ let PredicateMethod = "isBareSimmN<" # width # ">";
124+ }
125+
110126// 32-bit Immediate, used by RV32 Instructions in 32-bit operations, so no
111127// sign-/zero-extension. This is represented internally as a signed 32-bit value.
112- def simm32 : RISCVOp<XLenVT> {
113- let ParserMatchClass = SImmAsmOperand <32, "" >;
128+ def bare_simm32 : RISCVOp<XLenVT> {
129+ let ParserMatchClass = BareSImmNAsmOperand <32>;
114130 let EncoderMethod = "getImmOpValue";
115131 let DecoderMethod = "decodeSImmOperand<32>";
116- let OperandType = "OPERAND_SIMM32 ";
132+ let OperandType = "OPERAND_BARE_SIMM32 ";
117133 let MCOperandPredicate = [{
118134 int64_t Imm;
119135 if (MCOp.evaluateAsConstantImm(Imm))
120136 return isInt<32>(Imm);
121- return false ;
137+ return MCOp.isBareSymbolRef() ;
122138 }];
123139}
124140
@@ -256,7 +272,7 @@ def InsnQC_EAI : DirectiveInsnQC_EAI<(outs AnyReg:$rd),
256272 (ins uimm7_opcode:$opcode,
257273 uimm3:$func3,
258274 uimm1:$func1,
259- simm32 :$imm32),
275+ bare_simm32 :$imm32),
260276 "$opcode, $func3, $func1, $rd, $imm32">;
261277def InsnQC_EI : DirectiveInsnQC_EI<(outs AnyReg:$rd),
262278 (ins uimm7_opcode:$opcode,
@@ -303,7 +319,7 @@ def : InstAlias<".insn_qc.eai $opcode, $func3, $func1, $rd, $imm32",
303319 uimm7_opcode:$opcode,
304320 uimm3:$func3,
305321 uimm1:$func1,
306- simm32 :$imm32)>;
322+ bare_simm32 :$imm32)>;
307323def : InstAlias<".insn_qc.ei $opcode, $func3, $func2, $rd, $rs1, $imm26",
308324 (InsnQC_EI AnyReg:$rd,
309325 uimm7_opcode:$opcode,
@@ -671,7 +687,7 @@ class QCIRVInstESStore<bits<3> funct3, bits<2> funct2, string opcodestr>
671687 opcodestr, "$rs2, ${imm}(${rs1})">;
672688
673689class QCIRVInstEAI<bits<3> funct3, bits<1> funct1, string opcodestr>
674- : RVInst48<(outs GPRNoX0:$rd_wb), (ins GPRNoX0:$rd, simm32 :$imm),
690+ : RVInst48<(outs GPRNoX0:$rd_wb), (ins GPRNoX0:$rd, bare_simm32 :$imm),
675691 opcodestr, "$rd, $imm", [], InstFormatOther> {
676692 bits<5> rd;
677693 bits<32> imm;
@@ -1009,15 +1025,15 @@ let Predicates = [HasVendorXqcilb, IsRV32] in {
10091025
10101026let Predicates = [HasVendorXqcili, IsRV32] in {
10111027let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
1012- def QC_LI : RVInstU<OPC_OP_IMM_32, (outs GPRNoX0:$rd), (ins simm20 :$imm20),
1028+ def QC_LI : RVInstU<OPC_OP_IMM_32, (outs GPRNoX0:$rd), (ins simm20_li :$imm20),
10131029 "qc.li", "$rd, $imm20"> {
10141030 let Inst{31} = imm20{19};
10151031 let Inst{30-16} = imm20{14-0};
10161032 let Inst{15-12} = imm20{18-15};
10171033 }
10181034
1019- def QC_E_LI : RVInst48<(outs GPRNoX0:$rd), (ins simm32 :$imm),
1020- "qc.e.li", "$rd, $imm", [], InstFormatOther > {
1035+ def QC_E_LI : RVInst48<(outs GPRNoX0:$rd), (ins bare_simm32 :$imm),
1036+ "qc.e.li", "$rd, $imm", [], InstFormatQC_EAI > {
10211037 bits<5> rd;
10221038 bits<32> imm;
10231039
0 commit comments