Skip to content

Commit a02945a

Browse files
author
z30050559
committed
[Draft][RISCV] Give a simple testcase on RISCV regarding HwMode
Give a simple testcase on RISCV regarding HwMode as a reference.
1 parent c5f65ee commit a02945a

File tree

8 files changed

+62
-7
lines changed

8 files changed

+62
-7
lines changed

llvm/lib/Target/RISCV/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ tablegen(LLVM RISCVGenAsmWriter.inc -gen-asm-writer)
77
tablegen(LLVM RISCVGenCompressInstEmitter.inc -gen-compress-inst-emitter)
88
tablegen(LLVM RISCVGenMacroFusion.inc -gen-macro-fusion-pred)
99
tablegen(LLVM RISCVGenDAGISel.inc -gen-dag-isel)
10-
tablegen(LLVM RISCVGenDisassemblerTables.inc -gen-disassembler)
10+
tablegen(LLVM RISCVGenDisassemblerTables.inc -gen-disassembler --suppress-per-hwmode-duplicates=O1)
1111
tablegen(LLVM RISCVGenInstrInfo.inc -gen-instr-info)
1212
tablegen(LLVM RISCVGenMCCodeEmitter.inc -gen-emitter)
1313
tablegen(LLVM RISCVGenMCPseudoLowering.inc -gen-pseudo-lowering)

llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,8 @@ DecodeStatus RISCVDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
640640
TRY_TO_DECODE_FEATURE(
641641
RISCV::FeatureStdExtZcmp, DecoderTableRVZcmp16,
642642
"Zcmp table (16-bit Push/Pop & Double Move Instructions)");
643+
TRY_TO_DECODE_AND_ADD_SP(STI.hasFeature(RISCV::FeatureEncodingTmp),
644+
DecoderTable_EncodingTmp16, "For HwMode check");
643645
TRY_TO_DECODE_AND_ADD_SP(true, DecoderTable16,
644646
"RISCV_C table (16-bit Instruction)");
645647

llvm/lib/Target/RISCV/RISCVFeatures.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,15 +1150,21 @@ def Feature32Bit
11501150
: SubtargetFeature<"32bit", "IsRV32", "true", "Implements RV32">;
11511151
def Feature64Bit
11521152
: SubtargetFeature<"64bit", "IsRV64", "true", "Implements RV64">;
1153+
def FeatureEncodingTmp
1154+
: SubtargetFeature<"TmpE", "IsTmpE", "true", "Implements encoding tmp">;
11531155
def IsRV64 : Predicate<"Subtarget->is64Bit()">,
11541156
AssemblerPredicate<(all_of Feature64Bit),
11551157
"RV64I Base Instruction Set">;
11561158
def IsRV32 : Predicate<"!Subtarget->is64Bit()">,
11571159
AssemblerPredicate<(all_of (not Feature64Bit)),
11581160
"RV32I Base Instruction Set">;
1161+
def IsTmpE : Predicate<"Subtarget->isETmp()">,
1162+
AssemblerPredicate<(all_of FeatureEncodingTmp),
1163+
"RV32I Encoding tmp">;
11591164

11601165
defvar RV32 = DefaultMode;
11611166
def RV64 : HwMode<"+64bit", [IsRV64]>;
1167+
def EncodingTmp : HwMode<"+TmpE", [IsRV64]>;
11621168

11631169
def FeatureRVE
11641170
: SubtargetFeature<"e", "IsRVE", "true",

llvm/lib/Target/RISCV/RISCVInstrInfoZcmop.td

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,60 @@
1111
//
1212
//===----------------------------------------------------------------------===//
1313

14+
multiclass tmpEclass<bits<3> imm3> {
15+
def NAME#commonE : InstructionEncoding {
16+
field bits<16> Inst;
17+
field bits<16> SoftFail = 0;
18+
let Size = 2;
19+
bit mayLoad = 0;
20+
bit mayStore = 0;
21+
bit hasSideEffects = 0;
22+
let Inst{1-0} = 0b01;
23+
let Inst{6-2} = 0;
24+
let Inst{7} = 0b1; //differ
25+
let Inst{10-8} = imm3;
26+
let Inst{12-11} = 0;
27+
let Inst{15-13} = 0b011;
28+
}
29+
30+
def NAME#specialE : InstructionEncoding {
31+
field bits<16> Inst;
32+
field bits<16> SoftFail = 0;
33+
let Size = 2;
34+
bit mayLoad = 0;
35+
bit mayStore = 0;
36+
bit hasSideEffects = 0;
37+
let Inst{1-0} = 0b01;
38+
let Inst{6-2} = 0;
39+
let Inst{7} = 0b0; //differ
40+
let Inst{10-8} = imm3;
41+
let Inst{12-11} = 0;
42+
let Inst{15-13} = 0b011;
43+
}
44+
}
45+
1446
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
1547
class CMOPInst<bits<3> imm3, string opcodestr>
1648
: RVInst16CI<0b011, 0b01, (outs), (ins), opcodestr, ""> {
1749
let Inst{6-2} = 0;
1850
let Inst{7} = 1;
1951
let Inst{10-8} = imm3;
2052
let Inst{12-11} = 0;
53+
let EncodingInfos = EncodingByHwMode<[DefaultMode, EncodingTmp],
54+
[!cast<InstructionEncoding>(NAME#commonE),
55+
!cast<InstructionEncoding>(NAME#specialE)]>;
2156
}
2257

2358
// CMOP1, CMOP5 is used by Zicfiss.
2459
let Predicates = [HasStdExtZcmop, NoHasStdExtZicfiss] in {
60+
defm CMOP1 : tmpEclass<0>;
61+
defm CMOP5 : tmpEclass<2>;
2562
def CMOP1 : CMOPInst<0, "cmop.1">, Sched<[]>;
2663
def CMOP5 : CMOPInst<2, "cmop.5">, Sched<[]>;
2764
}
2865

2966
foreach n = [3, 7, 9, 11, 13, 15] in {
3067
let Predicates = [HasStdExtZcmop] in
68+
defm CMOP # n : tmpEclass<!srl(n, 1)>;
3169
def CMOP # n : CMOPInst<!srl(n, 1), "cmop." # n>, Sched<[]>;
3270
}

llvm/lib/Target/RISCV/RISCVProcessors.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def GENERIC_RV32 : RISCVProcessorModel<"generic-rv32",
6060
GenericTuneInfo;
6161
def GENERIC_RV64 : RISCVProcessorModel<"generic-rv64",
6262
NoSchedModel,
63-
[Feature64Bit]>,
63+
[Feature64Bit, FeatureEncodingTmp]>,
6464
GenericTuneInfo;
6565
// Support generic for compatibility with other targets. The triple will be used
6666
// to change to the appropriate rv32/rv64 version.

llvm/lib/Target/RISCV/RISCVSubtarget.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,11 @@ RISCVSubtarget::RISCVSubtarget(const Triple &TT, StringRef CPU,
100100
RVVVectorBitsMin(RVVVectorBitsMin), RVVVectorBitsMax(RVVVectorBitsMax),
101101
FrameLowering(
102102
initializeSubtargetDependencies(TT, CPU, TuneCPU, FS, ABIName)),
103-
InstrInfo(*this), RegInfo(getHwMode()), TLInfo(TM, *this) {
103+
InstrInfo(*this), RegInfo(getHwMode(HwMode_RegInfo)), TLInfo(TM, *this) {
104104
CallLoweringInfo.reset(new RISCVCallLowering(*getTargetLowering()));
105105
Legalizer.reset(new RISCVLegalizerInfo(*this));
106106

107-
auto *RBI = new RISCVRegisterBankInfo(getHwMode());
107+
auto *RBI = new RISCVRegisterBankInfo(getHwMode(HwMode_RegInfo));
108108
RegBankInfo.reset(RBI);
109109
InstSelector.reset(createRISCVInstructionSelector(
110110
*static_cast<const RISCVTargetMachine *>(&TM), *this, *RBI));

llvm/lib/Target/RISCV/RISCVSubtarget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ class RISCVSubtarget : public RISCVGenSubtargetInfo {
165165
}
166166

167167
bool is64Bit() const { return IsRV64; }
168+
bool isETmp() const { return IsTmpE; }
168169
MVT getXLenVT() const {
169170
return is64Bit() ? MVT::i64 : MVT::i32;
170171
}

llvm/test/MC/RISCV/rvzcmop-valid.s

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,50 @@
11
# RUN: llvm-mc %s -triple=riscv32 -mattr=+zcmop -show-encoding \
22
# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
33
# RUN: llvm-mc %s -triple=riscv64 -mattr=+zcmop -show-encoding \
4-
# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
4+
# RUN: | FileCheck -check-prefixes=CHECK-ASM-64,CHECK-ASM-AND-OBJ %s
55
# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+zcmop < %s \
6-
# RUN: | llvm-objdump --mattr=+zcmop -d -r - \
6+
# RUN: | llvm-objdump --triple=riscv32 --mattr=+zcmop -d -r - \
77
# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
88
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+zcmop < %s \
9-
# RUN: | llvm-objdump --mattr=+zcmop -d -r - \
9+
# RUN: | llvm-objdump --triple=riscv64 --mattr=+zcmop -d -r - \
1010
# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
1111

1212
# CHECK-ASM-AND-OBJ: cmop.1
1313
# CHECK-ASM: encoding: [0x81,0x60]
14+
# CHECK-ASM-64: encoding: [0x01,0x60]
1415
cmop.1
1516

1617
# CHECK-ASM-AND-OBJ: cmop.3
1718
# CHECK-ASM: encoding: [0x81,0x61]
19+
# CHECK-ASM-64: encoding: [0x01,0x61]
1820
cmop.3
1921

2022
# CHECK-ASM-AND-OBJ: cmop.5
2123
# CHECK-ASM: encoding: [0x81,0x62]
24+
# CHECK-ASM-64: encoding: [0x01,0x62]
2225
cmop.5
2326

2427
# CHECK-ASM-AND-OBJ: cmop.7
2528
# CHECK-ASM: encoding: [0x81,0x63]
29+
# CHECK-ASM-64: encoding: [0x01,0x63]
2630
cmop.7
2731

2832
# CHECK-ASM-AND-OBJ: cmop.9
2933
# CHECK-ASM: encoding: [0x81,0x64]
34+
# CHECK-ASM-64: encoding: [0x01,0x64]
3035
cmop.9
3136

3237
# CHECK-ASM-AND-OBJ: cmop.11
3338
# CHECK-ASM: encoding: [0x81,0x65]
39+
# CHECK-ASM-64: encoding: [0x01,0x65]
3440
cmop.11
3541

3642
# CHECK-ASM-AND-OBJ: cmop.13
3743
# CHECK-ASM: encoding: [0x81,0x66]
44+
# CHECK-ASM-64: encoding: [0x01,0x66]
3845
cmop.13
3946

4047
# CHECK-ASM-AND-OBJ: cmop.15
4148
# CHECK-ASM: encoding: [0x81,0x67]
49+
# CHECK-ASM-64: encoding: [0x01,0x67]
4250
cmop.15

0 commit comments

Comments
 (0)