Skip to content

Commit aef63c5

Browse files
authored
[RISCV] Assembler support for XRivosVizip (#127694)
This implements assembler support for the XRivosVizip custom/vendor extension from Rivos Inc. which is defined in: https://github.com/rivosinc/rivos-custom-extensions (See src/xrivosvizip.adoc) Codegen support will follow in a separate change.
1 parent 5d0c5c6 commit aef63c5

File tree

8 files changed

+111
-0
lines changed

8 files changed

+111
-0
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@
203203
// CHECK-NEXT: xqcilo 0.2 'Xqcilo' (Qualcomm uC Large Offset Load Store Extension)
204204
// CHECK-NEXT: xqcilsm 0.2 'Xqcilsm' (Qualcomm uC Load Store Multiple Extension)
205205
// CHECK-NEXT: xqcisls 0.2 'Xqcisls' (Qualcomm uC Scaled Load Store Extension)
206+
// CHECK-NEXT: xrivosvizip 0.1 'XRivosVizip' (Rivos Vector Register Zips)
206207
// CHECK-EMPTY:
207208
// CHECK-NEXT: Supported Profiles
208209
// CHECK-NEXT: rva20s64

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

+3
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,9 @@ DecodeStatus RISCVDisassembler::getInstruction32(MCInst &MI, uint64_t &Size,
711711
"Qualcomm uC Conditional Move");
712712
TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXqciint, DecoderTableXqciint32,
713713
"Qualcomm uC Interrupts");
714+
TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXRivosVizip, DecoderTableXRivos32,
715+
"Rivos");
716+
714717
TRY_TO_DECODE(true, DecoderTable32, "RISCV32");
715718

716719
return MCDisassembler::Fail;

llvm/lib/Target/RISCV/RISCVFeatures.td

+9
Original file line numberDiff line numberDiff line change
@@ -1366,6 +1366,15 @@ def HasVendorXqcilo
13661366
AssemblerPredicate<(all_of FeatureVendorXqcilo),
13671367
"'Xqcilo' (Qualcomm uC Large Offset Load Store Extension)">;
13681368

1369+
// Rivos Extension(s)
1370+
1371+
def FeatureVendorXRivosVizip
1372+
: RISCVExperimentalExtension<0, 1, "Rivos Vector Register Zips">;
1373+
def HasVendorXRivosVizip
1374+
: Predicate<"Subtarget->hasVendorXRivosVizip()">,
1375+
AssemblerPredicate<(all_of FeatureVendorXRivosVizip),
1376+
"'XRivosVizip' (Rivos Vector Register Zips)">;
1377+
13691378
//===----------------------------------------------------------------------===//
13701379
// LLVM specific features and extensions
13711380
//===----------------------------------------------------------------------===//

llvm/lib/Target/RISCV/RISCVInstrInfo.td

+1
Original file line numberDiff line numberDiff line change
@@ -2148,6 +2148,7 @@ include "RISCVInstrInfoXCV.td"
21482148
include "RISCVInstrInfoXwch.td"
21492149
include "RISCVInstrInfoXqci.td"
21502150
include "RISCVInstrInfoXMips.td"
2151+
include "RISCVInstrInfoXRivos.td"
21512152

21522153
//===----------------------------------------------------------------------===//
21532154
// Global ISel
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//===-- RISCVInstrInfoXRivos.td ----------------------------*- tablegen -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file describes the vendor extensions defined by Rivos Inc.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
//===----------------------------------------------------------------------===//
14+
// XRivosVizip
15+
//===----------------------------------------------------------------------===//
16+
17+
18+
let Predicates = [HasVendorXRivosVizip], DecoderNamespace = "XRivos",
19+
Constraints = "@earlyclobber $vd", RVVConstraint = Vrgather,
20+
Inst<6-0> = OPC_CUSTOM_2.Value in {
21+
defm RV_VZIPEVEN_V : VALU_IV_V<"rv.vzipeven", 0b001100>;
22+
defm RV_VZIPODD_V : VALU_IV_V<"rv.vzipodd", 0b011100>;
23+
defm RV_VZIP2A_V : VALU_IV_V<"rv.vzip2a", 0b000100>;
24+
defm RV_VZIP2B_V : VALU_IV_V<"rv.vzip2b", 0b010100>;
25+
defm RV_VUNZIP2A_V : VALU_IV_V<"rv.vunzip2a", 0b001000>;
26+
defm RV_VUNZIP2B_V : VALU_IV_V<"rv.vunzip2b", 0b011000>;
27+
}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# RUN: not llvm-mc -triple riscv64 -mattr=+experimental-xrivosvizip < %s 2>&1 | \
2+
# RUN: FileCheck %s
3+
4+
# Disallowed source/dest overlap cases
5+
# CHECK: error: the destination vector register group cannot overlap the source vector register group
6+
rv.vzipeven.vv v2, v2, v3
7+
# CHECK: error: the destination vector register group cannot overlap the source vector register group
8+
rv.vzipeven.vv v3, v2, v3
9+
# CHECK: error: the destination vector register group cannot overlap the mask register
10+
rv.vzipeven.vv v0, v2, v3, v0.t
+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# RUN: llvm-mc %s -triple=riscv32 -mattr=+experimental-xrivosvizip -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-xrivosvizip < %s \
4+
# RUN: | llvm-objdump --mattr=+experimental-xrivosvizip -M no-aliases -d -r - \
5+
# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
6+
# RUN: llvm-mc %s -triple=riscv64 -mattr=+experimental-xrivosvizip -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-xrivosvizip < %s \
9+
# RUN: | llvm-objdump --mattr=+experimental-xrivosvizip -M no-aliases -d -r - \
10+
# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
11+
12+
# CHECK-ASM-AND-OBJ: rv.vzipeven.vv v1, v2, v3
13+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x32]
14+
rv.vzipeven.vv v1, v2, v3
15+
# CHECK-ASM-AND-OBJ: rv.vzipeven.vv v1, v2, v3, v0.t
16+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x30]
17+
rv.vzipeven.vv v1, v2, v3, v0.t
18+
# CHECK-ASM-AND-OBJ: rv.vzipodd.vv v1, v2, v3
19+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x72]
20+
rv.vzipodd.vv v1, v2, v3
21+
# CHECK-ASM-AND-OBJ: rv.vzipodd.vv v1, v2, v3, v0.t
22+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x70]
23+
rv.vzipodd.vv v1, v2, v3, v0.t
24+
25+
# CHECK-ASM-AND-OBJ: rv.vzip2a.vv v1, v2, v3
26+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x12]
27+
rv.vzip2a.vv v1, v2, v3
28+
# CHECK-ASM-AND-OBJ: rv.vzip2a.vv v1, v2, v3, v0.t
29+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x10]
30+
rv.vzip2a.vv v1, v2, v3, v0.t
31+
# CHECK-ASM-AND-OBJ: rv.vzip2b.vv v1, v2, v3
32+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x52]
33+
rv.vzip2b.vv v1, v2, v3
34+
# CHECK-ASM-AND-OBJ: rv.vzip2b.vv v1, v2, v3, v0.t
35+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x50]
36+
rv.vzip2b.vv v1, v2, v3, v0.t
37+
38+
# CHECK-ASM-AND-OBJ: rv.vunzip2a.vv v1, v2, v3
39+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x22]
40+
rv.vunzip2a.vv v1, v2, v3
41+
# CHECK-ASM-AND-OBJ: rv.vunzip2a.vv v1, v2, v3, v0.t
42+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x20]
43+
rv.vunzip2a.vv v1, v2, v3, v0.t
44+
# CHECK-ASM-AND-OBJ: rv.vunzip2b.vv v1, v2, v3
45+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x62]
46+
rv.vunzip2b.vv v1, v2, v3
47+
# CHECK-ASM-AND-OBJ: rv.vunzip2b.vv v1, v2, v3, v0.t
48+
# CHECK-ASM: encoding: [0xdb,0x80,0x21,0x60]
49+
rv.vunzip2b.vv v1, v2, v3, v0.t
50+
51+
# Overlap between source registers *is* allowed
52+
53+
# CHECK-ASM-AND-OBJ: rv.vzipeven.vv v1, v2, v2
54+
# CHECK-ASM: encoding: [0xdb,0x00,0x21,0x32]
55+
rv.vzipeven.vv v1, v2, v2
56+
57+
# CHECK-ASM-AND-OBJ: rv.vzipeven.vv v1, v2, v0, v0.t
58+
# CHECK-ASM: encoding: [0xdb,0x00,0x20,0x30]
59+
rv.vzipeven.vv v1, v2, v0, v0.t

llvm/unittests/TargetParser/RISCVISAInfoTest.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,7 @@ Experimental extensions
11291129
xqcilo 0.2
11301130
xqcilsm 0.2
11311131
xqcisls 0.2
1132+
xrivosvizip 0.1
11321133
11331134
Supported Profiles
11341135
rva20s64

0 commit comments

Comments
 (0)