|
18 | 18 | // Operand and SDNode transformation definitions. |
19 | 19 | //===----------------------------------------------------------------------===// |
20 | 20 |
|
21 | | -def simm10 : RISCVSImmLeafOp<10>; |
| 21 | +// A 10-bit signed immediate allowing range [-512, 1023] |
| 22 | +// but will decode to [-512, 511]. |
| 23 | +def simm10_unsigned : RISCVOp { |
| 24 | + let ParserMatchClass = SImmAsmOperand<10, "Unsigned">; |
| 25 | + let EncoderMethod = "getImmOpValue"; |
| 26 | + let DecoderMethod = "decodeSImmOperand<10>"; |
| 27 | + let OperandType = "OPERAND_SIMM10_UNSIGNED"; |
| 28 | + let MCOperandPredicate = [{ |
| 29 | + int64_t Imm; |
| 30 | + if (!MCOp.evaluateAsConstantImm(Imm)) |
| 31 | + return false; |
| 32 | + return isInt<10>(Imm) || isUInt<10>(Imm); |
| 33 | + }]; |
| 34 | +} |
22 | 35 |
|
23 | 36 | //===----------------------------------------------------------------------===// |
24 | 37 | // Instruction class templates |
25 | 38 | //===----------------------------------------------------------------------===// |
26 | 39 |
|
27 | 40 | let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in |
28 | 41 | class RVPUnaryImm10<bits<7> funct7, string opcodestr> |
29 | | - : RVInstIBase<0b010, OPC_OP_IMM_32, (outs GPR:$rd), (ins simm10:$simm10), |
30 | | - opcodestr, "$rd, $simm10"> { |
31 | | - bits<10> simm10; |
| 42 | + : RVInstIBase<0b010, OPC_OP_IMM_32, (outs GPR:$rd), (ins simm10_unsigned:$simm10u), |
| 43 | + opcodestr, "$rd, $simm10u"> { |
| 44 | + bits<10> simm10u; |
32 | 45 |
|
33 | 46 | let Inst{31-25} = funct7; |
34 | | - let Inst{24-16} = simm10{8-0}; |
35 | | - let Inst{15} = simm10{9}; |
| 47 | + let Inst{24-16} = simm10u{8-0}; |
| 48 | + let Inst{15} = simm10u{9}; |
36 | 49 | } |
37 | 50 |
|
38 | 51 | let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in |
|
0 commit comments