|
14 | 14 | // Operand and SDNode transformation definitions. |
15 | 15 | //===----------------------------------------------------------------------===// |
16 | 16 |
|
| 17 | +def uimm5nonzero : RISCVOp<XLenVT>, |
| 18 | + ImmLeaf<XLenVT, [{return (Imm != 0) && isUInt<5>(Imm);}]> { |
| 19 | + let ParserMatchClass = UImmAsmOperand<5, "NonZero">; |
| 20 | + let DecoderMethod = "decodeUImmNonZeroOperand<5>"; |
| 21 | + let OperandType = "OPERAND_UIMM5_NONZERO"; |
| 22 | +} |
| 23 | + |
17 | 24 | def uimm11 : RISCVUImmLeafOp<11>; |
18 | 25 |
|
19 | 26 | //===----------------------------------------------------------------------===// |
@@ -105,6 +112,26 @@ class QCISELECTICCI<bits<3> funct3, string opcodestr> |
105 | 112 | let rs1 = imm; |
106 | 113 | } |
107 | 114 |
|
| 115 | +let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in |
| 116 | +class QCILoadMultiple<bits<2> funct2, DAGOperand InTyRs2, string opcodestr> |
| 117 | + : RVInstRBase<0b111, OPC_CUSTOM_0, (outs GPRNoX0:$rd), |
| 118 | + (ins GPR:$rs1, InTyRs2:$rs2, uimm7_lsb00:$imm), |
| 119 | + opcodestr, "$rd, $rs2, ${imm}(${rs1})"> { |
| 120 | + bits<7> imm; |
| 121 | + let Inst{31-25} = {funct2, imm{6-2}}; |
| 122 | +} |
| 123 | + |
| 124 | + |
| 125 | +// rd corresponds to the source for the store 'rs3' described in the spec. |
| 126 | +let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in |
| 127 | +class QCIStoreMultiple<bits<2> funct2, DAGOperand InTyRs2, string opcodestr> |
| 128 | + : RVInstRBase<0b111, OPC_CUSTOM_1, (outs), |
| 129 | + (ins GPR:$rd, GPR:$rs1, InTyRs2:$rs2, uimm7_lsb00:$imm), |
| 130 | + opcodestr, "$rd, $rs2, ${imm}(${rs1})"> { |
| 131 | + bits<7> imm; |
| 132 | + let Inst{31-25} = {funct2, imm{6-2}}; |
| 133 | +} |
| 134 | + |
108 | 135 | //===----------------------------------------------------------------------===// |
109 | 136 | // Instructions |
110 | 137 | //===----------------------------------------------------------------------===// |
@@ -167,3 +194,34 @@ let Predicates = [HasVendorXqcics, IsRV32], DecoderNamespace = "Xqcics" in { |
167 | 194 | def QC_SELECTIEQI : QCISELECTICCI <0b010, "qc.selectieqi">; |
168 | 195 | def QC_SELECTINEI : QCISELECTICCI <0b011, "qc.selectinei">; |
169 | 196 | } // Predicates = [HasVendorXqcics, IsRV32], DecoderNamespace = "Xqcics" |
| 197 | + |
| 198 | +let Predicates = [HasVendorXqcilsm, IsRV32], DecoderNamespace = "Xqcilsm" in { |
| 199 | + def QC_SWM : QCIStoreMultiple<0b00, GPRNoX0, "qc.swm">; |
| 200 | + def QC_SWMI : QCIStoreMultiple<0b01, uimm5nonzero, "qc.swmi">; |
| 201 | + def QC_SETWM : QCIStoreMultiple<0b10, GPRNoX0, "qc.setwm">; |
| 202 | + def QC_SETWMI : QCIStoreMultiple<0b11, uimm5nonzero, "qc.setwmi">; |
| 203 | + |
| 204 | + def QC_LWM : QCILoadMultiple<0b00, GPRNoX0, "qc.lwm">; |
| 205 | + def QC_LWMI : QCILoadMultiple<0b01, uimm5nonzero, "qc.lwmi">; |
| 206 | +} // Predicates = [HasVendorXqcilsm, IsRV32], DecoderNamespace = "Xqcilsm" |
| 207 | + |
| 208 | +//===----------------------------------------------------------------------===// |
| 209 | +// Aliases |
| 210 | +//===----------------------------------------------------------------------===// |
| 211 | + |
| 212 | +let Predicates = [HasVendorXqcilsm, IsRV32] in { |
| 213 | +let EmitPriority = 0 in { |
| 214 | + def : InstAlias<"qc.swm $rs3, $rs2, (${rs1})", |
| 215 | + (QC_SWM GPR:$rs3, GPR:$rs1, GPRNoX0:$rs2, 0)>; |
| 216 | + def : InstAlias<"qc.swmi $rs3, $length, (${rs1})", |
| 217 | + (QC_SWMI GPR:$rs3, GPR:$rs1, uimm5nonzero:$length, 0)>; |
| 218 | + def : InstAlias<"qc.setwm $rs3, $rs2, (${rs1})", |
| 219 | + (QC_SETWM GPR:$rs3, GPR:$rs1, GPRNoX0:$rs2, 0)>; |
| 220 | + def : InstAlias<"qc.setwmi $rs3, $length, (${rs1})", |
| 221 | + (QC_SETWMI GPR:$rs3, GPR:$rs1, uimm5nonzero:$length, 0)>; |
| 222 | + def : InstAlias<"qc.lwm $rd, $rs2, (${rs1})", |
| 223 | + (QC_LWM GPRNoX0:$rd, GPR:$rs1, GPRNoX0:$rs2, 0)>; |
| 224 | + def : InstAlias<"qc.lwmi $rd, $length, (${rs1})", |
| 225 | + (QC_LWMI GPRNoX0:$rd, GPR:$rs1, uimm5nonzero:$length, 0)>; |
| 226 | +} // EmitPriority = 0 |
| 227 | +} // Predicates = [HasVendorXqcilsm, IsRV32] |
0 commit comments