@@ -103,22 +103,38 @@ def simm16nonzero : RISCVOp<XLenVT>,
103
103
let OperandType = "OPERAND_SIMM16_NONZERO";
104
104
}
105
105
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
+ }
107
118
108
119
def simm26 : RISCVSImmLeafOp<26>;
109
120
121
+ class BareSImmNAsmOperand<int width>
122
+ : ImmAsmOperand<"BareS", width, ""> {
123
+ let PredicateMethod = "isBareSimmN<" # width # ">";
124
+ }
125
+
110
126
// 32-bit Immediate, used by RV32 Instructions in 32-bit operations, so no
111
127
// 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>;
114
130
let EncoderMethod = "getImmOpValue";
115
131
let DecoderMethod = "decodeSImmOperand<32>";
116
- let OperandType = "OPERAND_SIMM32 ";
132
+ let OperandType = "OPERAND_BARE_SIMM32 ";
117
133
let MCOperandPredicate = [{
118
134
int64_t Imm;
119
135
if (MCOp.evaluateAsConstantImm(Imm))
120
136
return isInt<32>(Imm);
121
- return false ;
137
+ return MCOp.isBareSymbolRef() ;
122
138
}];
123
139
}
124
140
@@ -256,7 +272,7 @@ def InsnQC_EAI : DirectiveInsnQC_EAI<(outs AnyReg:$rd),
256
272
(ins uimm7_opcode:$opcode,
257
273
uimm3:$func3,
258
274
uimm1:$func1,
259
- simm32 :$imm32),
275
+ bare_simm32 :$imm32),
260
276
"$opcode, $func3, $func1, $rd, $imm32">;
261
277
def InsnQC_EI : DirectiveInsnQC_EI<(outs AnyReg:$rd),
262
278
(ins uimm7_opcode:$opcode,
@@ -303,7 +319,7 @@ def : InstAlias<".insn_qc.eai $opcode, $func3, $func1, $rd, $imm32",
303
319
uimm7_opcode:$opcode,
304
320
uimm3:$func3,
305
321
uimm1:$func1,
306
- simm32 :$imm32)>;
322
+ bare_simm32 :$imm32)>;
307
323
def : InstAlias<".insn_qc.ei $opcode, $func3, $func2, $rd, $rs1, $imm26",
308
324
(InsnQC_EI AnyReg:$rd,
309
325
uimm7_opcode:$opcode,
@@ -671,7 +687,7 @@ class QCIRVInstESStore<bits<3> funct3, bits<2> funct2, string opcodestr>
671
687
opcodestr, "$rs2, ${imm}(${rs1})">;
672
688
673
689
class 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),
675
691
opcodestr, "$rd, $imm", [], InstFormatOther> {
676
692
bits<5> rd;
677
693
bits<32> imm;
@@ -1009,15 +1025,15 @@ let Predicates = [HasVendorXqcilb, IsRV32] in {
1009
1025
1010
1026
let Predicates = [HasVendorXqcili, IsRV32] in {
1011
1027
let 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),
1013
1029
"qc.li", "$rd, $imm20"> {
1014
1030
let Inst{31} = imm20{19};
1015
1031
let Inst{30-16} = imm20{14-0};
1016
1032
let Inst{15-12} = imm20{18-15};
1017
1033
}
1018
1034
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 > {
1021
1037
bits<5> rd;
1022
1038
bits<32> imm;
1023
1039
0 commit comments