Skip to content

Commit 7eab3c6

Browse files
committed
[RISCV][MC] Add assembler support for XRivosVisni
This implements assembler support for the XRivosVisni custom/vendor extension from Rivos Inc. which is defined in: https://github.com/rivosinc/rivos-custom-extensions (See src/xrivosvisni.adoc) Codegen support will follow in a separate change.
1 parent 00f02fe commit 7eab3c6

File tree

7 files changed

+122
-3
lines changed

7 files changed

+122
-3
lines changed

clang/test/Driver/print-supported-extensions-riscv.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@
204204
// CHECK-NEXT: xqcilo 0.2 'Xqcilo' (Qualcomm uC Large Offset Load Store Extension)
205205
// CHECK-NEXT: xqcilsm 0.2 'Xqcilsm' (Qualcomm uC Load Store Multiple Extension)
206206
// CHECK-NEXT: xqcisls 0.2 'Xqcisls' (Qualcomm uC Scaled Load Store Extension)
207+
// CHECK-NEXT: xrivosvisni 0.1 'XRivosVisni' (Rivos Vector Small Integer New)
207208
// CHECK-NEXT: xrivosvizip 0.1 'XRivosVizip' (Rivos Vector Register Zips)
208209
// CHECK-EMPTY:
209210
// CHECK-NEXT: Supported Profiles

llvm/docs/RISCVUsage.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,9 @@ The current vendor extensions supported are:
468468
``Xmipslsp``
469469
LLVM implements load/store pair instructions for the `p8700 processor <https://mips.com/products/hardware/p8700/>` by MIPS.
470470

471+
``experimental-XRivosVisni``
472+
LLVM implements `version 0.1 of the Rivos Vector Integer Small New Instructions extension specification <https://github.com/rivosinc/rivos-custom-extensions>`__.
473+
471474
``experimental-XRivosVizip``
472475
LLVM implements `version 0.1 of the Rivos Vector Register Zips extension specification <https://github.com/rivosinc/rivos-custom-extensions>`__.
473476

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,10 @@ void RISCVDisassembler::addSPOperands(MCInst &MI) const {
622622
#define TRY_TO_DECODE_FEATURE_ANY(FEATURES, DECODER_TABLE, DESC) \
623623
TRY_TO_DECODE((STI.getFeatureBits() & (FEATURES)).any(), DECODER_TABLE, DESC)
624624

625+
static constexpr FeatureBitset XRivosFeatureGroup = {
626+
RISCV::FeatureVendorXRivosVisni, RISCV::FeatureVendorXRivosVizip,
627+
};
628+
625629
static constexpr FeatureBitset XqciFeatureGroup = {
626630
RISCV::FeatureVendorXqcia, RISCV::FeatureVendorXqciac,
627631
RISCV::FeatureVendorXqcicli, RISCV::FeatureVendorXqcicm,
@@ -717,12 +721,11 @@ DecodeStatus RISCVDisassembler::getInstruction32(MCInst &MI, uint64_t &Size,
717721
"CORE-V SIMD extensions");
718722
TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXCVbi, DecoderTableXCVbi32,
719723
"CORE-V Immediate Branching");
720-
721724
TRY_TO_DECODE_FEATURE_ANY(XqciFeatureGroup, DecoderTableXqci32,
722725
"Qualcomm uC Extensions");
723726

724-
TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXRivosVizip, DecoderTableXRivos32,
725-
"Rivos");
727+
TRY_TO_DECODE_FEATURE_ANY(XRivosFeatureGroup, DecoderTableXRivos32,
728+
"Rivos");
726729

727730
TRY_TO_DECODE(true, DecoderTable32, "RISCV32");
728731

llvm/lib/Target/RISCV/RISCVFeatures.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1376,6 +1376,13 @@ def HasVendorXqcilo
13761376

13771377
// Rivos Extension(s)
13781378

1379+
def FeatureVendorXRivosVisni
1380+
: RISCVExperimentalExtension<0, 1, "Rivos Vector Small Integer New">;
1381+
def HasVendorXRivosVisni
1382+
: Predicate<"Subtarget->hasVendorXRivosVisni()">,
1383+
AssemblerPredicate<(all_of FeatureVendorXRivosVisni),
1384+
"'XRivosVizisni' (Rivos Vector Small Integer New)">;
1385+
13791386
def FeatureVendorXRivosVizip
13801387
: RISCVExperimentalExtension<0, 1, "Rivos Vector Register Zips">;
13811388
def HasVendorXRivosVizip

llvm/lib/Target/RISCV/RISCVInstrInfoXRivos.td

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,46 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
class RVInstVXI<bits<6> funct6, RISCVVFormat opv, dag outs, dag ins,
14+
string opcodestr, string argstr>
15+
: RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> {
16+
bits<5> imm;
17+
bits<5> rs1;
18+
bits<5> vd;
19+
bit vm;
20+
21+
let Inst{31-26} = funct6;
22+
let Inst{25} = vm;
23+
let Inst{24-20} = imm;
24+
let Inst{19-15} = rs1;
25+
let Inst{14-12} = opv.Value;
26+
let Inst{11-7} = vd;
27+
let Inst{6-0} = OPC_OP_V.Value;
28+
29+
let Uses = [VTYPE, VL];
30+
let RVVConstraint = VMConstraint;
31+
}
32+
33+
class RVInstXVI<bits<6> funct6, RISCVVFormat opv, dag outs, dag ins,
34+
string opcodestr, string argstr>
35+
: RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> {
36+
bits<5> imm;
37+
bits<5> vs2;
38+
bits<5> rd;
39+
bit vm;
40+
41+
let Inst{31-26} = funct6;
42+
let Inst{25} = vm;
43+
let Inst{24-20} = vs2;
44+
let Inst{19-15} = imm;
45+
let Inst{14-12} = opv.Value;
46+
let Inst{11-7} = rd;
47+
let Inst{6-0} = OPC_OP_V.Value;
48+
49+
let Uses = [VTYPE, VL];
50+
let RVVConstraint = VMConstraint;
51+
}
52+
1353
//===----------------------------------------------------------------------===//
1454
// XRivosVizip
1555
//===----------------------------------------------------------------------===//
@@ -25,3 +65,27 @@ defm RI_VZIP2B_V : VALU_IV_V<"ri.vzip2b", 0b010100>;
2565
defm RI_VUNZIP2A_V : VALU_IV_V<"ri.vunzip2a", 0b001000>;
2666
defm RI_VUNZIP2B_V : VALU_IV_V<"ri.vunzip2b", 0b011000>;
2767
}
68+
69+
//===----------------------------------------------------------------------===//
70+
// XRivosVisni
71+
//===----------------------------------------------------------------------===//
72+
73+
let Predicates = [HasVendorXRivosVisni], DecoderNamespace = "XRivos",
74+
Inst<6-0> = OPC_CUSTOM_2.Value, mayLoad = false, mayStore = false,
75+
hasSideEffects = false in {
76+
77+
let isReMaterializable = 1, isAsCheapAsAMove = 1, vm = 0, vs2=0 in
78+
def RI_VZERO : RVInstV<0b000000, 0b00000, OPCFG, (outs VR:$vd),
79+
(ins), "ri.vzero", "$vd">;
80+
81+
let vm = 0, Constraints = "$vd = $vd_wb", RVVConstraint = NoConstraint in
82+
def RI_VINSERT : RVInstVXI<0b010000, OPMVX, (outs VR:$vd_wb),
83+
(ins VR:$vd, GPR:$rs1, uimm5:$imm),
84+
"ri.vinsert.v.x", "$vd, $rs1, $imm">;
85+
86+
let vm = 1, RVVConstraint = NoConstraint in
87+
def RI_VEXTRACT : RVInstXVI<0b010111, OPMVV, (outs GPR:$rd),
88+
(ins VR:$vs2, uimm5:$imm),
89+
"ri.vextract.x.v", "$rd, $vs2, $imm">;
90+
91+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# RUN: llvm-mc %s -triple=riscv32 -mattr=+experimental-xrivosvisni -riscv-no-aliases -show-encoding \
2+
# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
3+
# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+experimental-xrivosvisni < %s \
4+
# RUN: | llvm-objdump --mattr=+experimental-xrivosvisni -M no-aliases --no-print-imm-hex -d -r - \
5+
# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
6+
# RUN: llvm-mc %s -triple=riscv64 -mattr=+experimental-xrivosvisni -riscv-no-aliases -show-encoding \
7+
# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
8+
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+experimental-xrivosvisni < %s \
9+
# RUN: | llvm-objdump --mattr=+experimental-xrivosvisni -M no-aliases --no-print-imm-hex -d -r - \
10+
# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
11+
12+
# CHECK-ASM-AND-OBJ: ri.vzero v1
13+
# CHECK-ASM: encoding: [0xdb,0x70,0x00,0x00]
14+
ri.vzero v1
15+
# CHECK-ASM-AND-OBJ: vzero v2
16+
# CHECK-ASM: encoding: [0x5b,0x71,0x00,0x00]
17+
ri.vzero v2
18+
# CHECK-ASM-AND-OBJ: vzero v3
19+
# CHECK-ASM: encoding: [0xdb,0x71,0x00,0x00]
20+
ri.vzero v3
21+
22+
# CHECK-ASM-AND-OBJ: ri.vinsert.v.x v0, zero, 0
23+
# CHECK-ASM: encoding: [0x5b,0x60,0x00,0x40]
24+
ri.vinsert.v.x v0, x0, 0
25+
# CHECK-ASM-AND-OBJ: ri.vinsert.v.x v1, s4, 13
26+
# CHECK-ASM: encoding: [0xdb,0x60,0xda,0x40]
27+
ri.vinsert.v.x v1, x20, 13
28+
# CHECK-ASM-AND-OBJ: ri.vinsert.v.x v1, zero, 1
29+
# CHECK-ASM: encoding: [0xdb,0x60,0x10,0x40]
30+
ri.vinsert.v.x v1, x0, 1
31+
# CHECK-ASM-AND-OBJ: ri.vinsert.v.x v23, ra, 1
32+
# CHECK-ASM: encoding: [0xdb,0xeb,0x10,0x40]
33+
ri.vinsert.v.x v23, x1, 1
34+
35+
# CHECK-ASM-AND-OBJ: ri.vextract.x.v s4, v1, 13
36+
# CHECK-ASM: encoding: [0x5b,0xaa,0x16,0x5e]
37+
ri.vextract.x.v x20, v1, 13
38+
# CHECK-ASM-AND-OBJ: ri.vextract.x.v s5, v2, 31
39+
# CHECK-ASM: encoding: [0xdb,0xaa,0x2f,0x5e]
40+
ri.vextract.x.v x21, v2, 31

llvm/unittests/TargetParser/RISCVISAInfoTest.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,6 +1130,7 @@ Experimental extensions
11301130
xqcilo 0.2
11311131
xqcilsm 0.2
11321132
xqcisls 0.2
1133+
xrivosvisni 0.1
11331134
xrivosvizip 0.1
11341135
11351136
Supported Profiles

0 commit comments

Comments
 (0)