Skip to content

Commit 3f33e7b

Browse files
[RISCV] Add Andes XAndesVSIntLoad (Andes Vector INT4 Load) extension (#147005)
The spec can be found at: https://github.com/andestech/andes-v5-isa/releases/tag/ast-v5_4_0-release. This patch only implements MC support for XAndesVSIntLoad. --------- Co-authored-by: Lino Hsing-Yu Peng <linopeng@andestech.com>
1 parent 9d8a1be commit 3f33e7b

File tree

11 files changed

+101
-1
lines changed

11 files changed

+101
-1
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@
162162
// CHECK-NEXT: xandesvbfhcvt 5.0 'XAndesVBFHCvt' (Andes Vector BFLOAT16 Conversion Extension)
163163
// CHECK-NEXT: xandesvdot 5.0 'XAndesVDot' (Andes Vector Dot Product Extension)
164164
// CHECK-NEXT: xandesvpackfph 5.0 'XAndesVPackFPH' (Andes Vector Packed FP16 Extension)
165+
// CHECK-NEXT: xandesvsintload 5.0 'XAndesVSIntLoad' (Andes Vector INT4 Load Extension)
165166
// CHECK-NEXT: xcvalu 1.0 'XCValu' (CORE-V ALU Operations)
166167
// CHECK-NEXT: xcvbi 1.0 'XCVbi' (CORE-V Immediate Branching)
167168
// CHECK-NEXT: xcvbitmanip 1.0 'XCVbitmanip' (CORE-V Bit Manipulation)

clang/test/Preprocessor/riscv-target-features-andes.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
// CHECK-NOT: __riscv_xandesperf {{.*$}}
77
// CHECK-NOT: __riscv_xandesvbfhcvt {{.*$}}
8+
// CHECK-NOT: __riscv_xandesvsintload {{.*$}}
89
// CHECK-NOT: __riscv_xandesvpackfph {{.*$}}
910
// CHECK-NOT: __riscv_xandesvdot {{.*$}}
1011

@@ -24,6 +25,14 @@
2425
// RUN: -o - | FileCheck --check-prefix=CHECK-XANDESVBFHCVT %s
2526
// CHECK-XANDESVBFHCVT: __riscv_xandesvbfhcvt 5000000{{$}}
2627

28+
// RUN: %clang --target=riscv32 \
29+
// RUN: -march=rv32i_xandesvsintload -E -dM %s \
30+
// RUN: -o - | FileCheck --check-prefix=CHECK-XANDESVSINTLOAD %s
31+
// RUN: %clang --target=riscv64 \
32+
// RUN: -march=rv64i_xandesvsintload -E -dM %s \
33+
// RUN: -o - | FileCheck --check-prefix=CHECK-XANDESVSINTLOAD %s
34+
// CHECK-XANDESVSINTLOAD: __riscv_xandesvsintload 5000000{{$}}
35+
2736
// RUN: %clang --target=riscv32 \
2837
// RUN: -march=rv32i_xandesvpackfph -E -dM %s \
2938
// RUN: -o - | FileCheck --check-prefix=CHECK-XANDESVPACKFPH %s

llvm/docs/RISCVUsage.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,9 @@ The current vendor extensions supported are:
519519
``XAndesVBFHCvt``
520520
LLVM implements `version 5.0.0 of the Andes Vector BFLOAT16 Conversion Extension specification <https://github.com/andestech/andes-v5-isa/releases/download/ast-v5_4_0-release/AndeStar_V5_ISA_Spec_UM165-v1.5.08-20250317.pdf>`__ by Andes Technology. All instructions are prefixed with `nds.` as described in the specification.
521521

522+
``XAndesVSINTLoad``
523+
LLVM implements `version 5.0.0 of the Andes Vector INT4 Load Extension specification <https://github.com/andestech/andes-v5-isa/releases/download/ast-v5_4_0-release/AndeStar_V5_ISA_Spec_UM165-v1.5.08-20250317.pdf>`__ by Andes Technology. All instructions are prefixed with `nds.` as described in the specification.
524+
522525
``XAndesVPackFPH``
523526
LLVM implements `version 5.0.0 of the Andes Vector Packed FP16 Extension specification <https://github.com/andestech/andes-v5-isa/releases/download/ast-v5_4_0-release/AndeStar_V5_ISA_Spec_UM165-v1.5.08-20250317.pdf>`__ by Andes Technology. All instructions are prefixed with `nds.` as described in the specification.
524527

llvm/docs/ReleaseNotes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ Changes to the RISC-V Backend
213213
* Adds assembler support for the Andes `XAndesvbfhcvt` (Andes Vector BFLOAT16 Conversion extension).
214214
* `-mcpu=andes-ax45mpv` was added.
215215
* Removed -mattr=+no-rvc-hints that could be used to disable parsing and generation of RVC hints.
216+
* Adds assembler support for the Andes `XAndesvsintload` (Andes Vector INT4 Load extension).
216217

217218
Changes to the WebAssembly Backend
218219
----------------------------------

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,8 @@ static constexpr FeatureBitset XTHeadGroup = {
775775

776776
static constexpr FeatureBitset XAndesGroup = {
777777
RISCV::FeatureVendorXAndesPerf, RISCV::FeatureVendorXAndesVBFHCvt,
778-
RISCV::FeatureVendorXAndesVPackFPH, RISCV::FeatureVendorXAndesVDot};
778+
RISCV::FeatureVendorXAndesVSIntLoad, RISCV::FeatureVendorXAndesVPackFPH,
779+
RISCV::FeatureVendorXAndesVDot};
779780

780781
static constexpr DecoderListEntry DecoderList32[]{
781782
// Vendor Extensions

llvm/lib/Target/RISCV/RISCVFeatures.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1607,6 +1607,14 @@ def HasVendorXAndesVBFHCvt
16071607
AssemblerPredicate<(all_of FeatureVendorXAndesVBFHCvt),
16081608
"'XAndesVBFHCvt' (Andes Vector BFLOAT16 Conversion Extension)">;
16091609

1610+
def FeatureVendorXAndesVSIntLoad
1611+
: RISCVExtension<5, 0, "Andes Vector INT4 Load Extension",
1612+
[FeatureStdExtZve32x]>;
1613+
def HasVendorXAndesVSIntLoad
1614+
: Predicate<"Subtarget->hasVendorXAndesVSIntLoad()">,
1615+
AssemblerPredicate<(all_of FeatureVendorXAndesVSIntLoad),
1616+
"'XAndesVSIntLoad' (Andes Vector INT4 Load Extension)">;
1617+
16101618
def FeatureVendorXAndesVPackFPH
16111619
: RISCVExtension<5, 0,
16121620
"Andes Vector Packed FP16 Extension", [FeatureStdExtF]>;

llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,29 @@ class NDSRVInstVBFHCvt<bits<5> vs1, string opcodestr>
393393
let Uses = [VL, VTYPE];
394394
}
395395

396+
class NDSRVInstVLN<bits<5> funct5, string opcodestr>
397+
: RVInst<(outs VR:$vd), (ins GPRMemZeroOffset:$rs1, VMaskOp:$vm),
398+
opcodestr, "$vd, ${rs1}$vm", [], InstFormatR>,
399+
VLESchedMC {
400+
bits<5> rs1;
401+
bits<5> vd;
402+
bit vm;
403+
404+
let Inst{31-26} = 0b000001;
405+
let Inst{25} = vm;
406+
let Inst{24-20} = funct5;
407+
let Inst{19-15} = rs1;
408+
let Inst{14-12} = 0b100;
409+
let Inst{11-7} = vd;
410+
let Inst{6-0} = OPC_CUSTOM_2.Value;
411+
let hasSideEffects = 0;
412+
let mayLoad = 1;
413+
let mayStore = 0;
414+
415+
let Uses = [VTYPE, VL];
416+
let RVVConstraint = VMConstraint;
417+
}
418+
396419
//===----------------------------------------------------------------------===//
397420
// Multiclass
398421
//===----------------------------------------------------------------------===//
@@ -550,6 +573,15 @@ let Uses = [FRM, VL, VTYPE] in
550573
def NDS_VFNCVT_BF16_S : NDSRVInstVBFHCvt<0b00001, "nds.vfncvt.bf16.s">;
551574
}
552575

576+
//===----------------------------------------------------------------------===//
577+
// XAndesVSIntLoad
578+
//===----------------------------------------------------------------------===//
579+
580+
let Predicates = [HasVendorXAndesVSIntLoad] in {
581+
def NDS_VLN8_V : NDSRVInstVLN<0b00010, "nds.vln8.v">;
582+
def NDS_VLNU8_V : NDSRVInstVLN<0b00011, "nds.vlnu8.v">;
583+
}
584+
553585
//===----------------------------------------------------------------------===//
554586
// XAndesVPackFPH
555587
//===----------------------------------------------------------------------===//

llvm/test/CodeGen/RISCV/attributes.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcisync %s -o - | FileCheck --check-prefix=RV32XQCISYNC %s
108108
; RUN: llc -mtriple=riscv32 -mattr=+xandesperf %s -o - | FileCheck --check-prefix=RV32XANDESPERF %s
109109
; RUN: llc -mtriple=riscv32 -mattr=+xandesvbfhcvt %s -o - | FileCheck --check-prefix=RV32XANDESVBFHCVT %s
110+
; RUN: llc -mtriple=riscv32 -mattr=+xandesvsintload %s -o - | FileCheck --check-prefix=RV32XANDESVSINTLOAD %s
110111
; RUN: llc -mtriple=riscv32 -mattr=+xandesvdot %s -o - | FileCheck --check-prefix=RV32XANDESVDOT %s
111112
; RUN: llc -mtriple=riscv32 -mattr=+xandesvpackfph %s -o - | FileCheck --check-prefix=RV32XANDESVPACKFPH %s
112113
; RUN: llc -mtriple=riscv32 -mattr=+zaamo %s -o - | FileCheck --check-prefix=RV32ZAAMO %s
@@ -262,6 +263,7 @@
262263
; RUN: llc -mtriple=riscv64 -mattr=+xtheadvdot %s -o - | FileCheck --check-prefixes=CHECK,RV64XTHEADVDOT %s
263264
; RUN: llc -mtriple=riscv64 -mattr=+xandesperf %s -o - | FileCheck --check-prefix=RV64XANDESPERF %s
264265
; RUN: llc -mtriple=riscv64 -mattr=+xandesvbfhcvt %s -o - | FileCheck --check-prefix=RV64XANDESVBFHCVT %s
266+
; RUN: llc -mtriple=riscv64 -mattr=+xandesvsintload %s -o - | FileCheck --check-prefix=RV64XANDESVSINTLOAD %s
265267
; RUN: llc -mtriple=riscv64 -mattr=+xandesvdot %s -o - | FileCheck --check-prefix=RV64XANDESVDOT %s
266268
; RUN: llc -mtriple=riscv64 -mattr=+xandesvpackfph %s -o - | FileCheck --check-prefix=RV64XANDESVPACKFPH %s
267269
; RUN: llc -mtriple=riscv64 -mattr=+za64rs %s -o - | FileCheck --check-prefixes=CHECK,RV64ZA64RS %s
@@ -461,6 +463,7 @@
461463
; RV32XQCISYNC: attribute 5, "rv32i2p1_zca1p0_xqcisync0p3"
462464
; RV32XANDESPERF: .attribute 5, "rv32i2p1_xandesperf5p0"
463465
; RV32XANDESVBFHCVT: .attribute 5, "rv32i2p1_f2p2_zicsr2p0_zve32f1p0_zve32x1p0_zvl32b1p0_xandesvbfhcvt5p0"
466+
; RV32XANDESVSINTLOAD: .attribute 5, "rv32i2p1_zicsr2p0_zve32x1p0_zvl32b1p0_xandesvsintload5p0"
464467
; RV32XANDESVDOT: .attribute 5, "rv32i2p1_zicsr2p0_zve32x1p0_zvl32b1p0_xandesvdot5p0"
465468
; RV32XANDESVPACKFPH: .attribute 5, "rv32i2p1_f2p2_zicsr2p0_xandesvpackfph5p0"
466469
; RV32ZAAMO: .attribute 5, "rv32i2p1_zaamo1p0"
@@ -618,6 +621,7 @@
618621
; RV64XTHEADVDOT: .attribute 5, "rv64i2p1_f2p2_d2p2_v1p0_zicsr2p0_zve32f1p0_zve32x1p0_zve64d1p0_zve64f1p0_zve64x1p0_zvl128b1p0_zvl32b1p0_zvl64b1p0_xtheadvdot1p0"
619622
; RV64XANDESPERF: .attribute 5, "rv64i2p1_xandesperf5p0"
620623
; RV64XANDESVBFHCVT: .attribute 5, "rv64i2p1_f2p2_zicsr2p0_zve32f1p0_zve32x1p0_zvl32b1p0_xandesvbfhcvt5p0"
624+
; RV64XANDESVSINTLOAD: .attribute 5, "rv64i2p1_zicsr2p0_zve32x1p0_zvl32b1p0_xandesvsintload5p0"
621625
; RV64XANDESVDOT: .attribute 5, "rv64i2p1_zicsr2p0_zve32x1p0_zvl32b1p0_xandesvdot5p0"
622626
; RV64XANDESVPACKFPH: .attribute 5, "rv64i2p1_f2p2_zicsr2p0_xandesvpackfph5p0"
623627
; RV64ZTSO: .attribute 5, "rv64i2p1_ztso1p0"

llvm/test/CodeGen/RISCV/features-info.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@
176176
; CHECK-NEXT: xandesvbfhcvt - 'XAndesVBFHCvt' (Andes Vector BFLOAT16 Conversion Extension).
177177
; CHECK-NEXT: xandesvdot - 'XAndesVDot' (Andes Vector Dot Product Extension).
178178
; CHECK-NEXT: xandesvpackfph - 'XAndesVPackFPH' (Andes Vector Packed FP16 Extension).
179+
; CHECK-NEXT: xandesvsintload - 'XAndesVSIntLoad' (Andes Vector INT4 Load Extension).
179180
; CHECK-NEXT: xcvalu - 'XCValu' (CORE-V ALU Operations).
180181
; CHECK-NEXT: xcvbi - 'XCVbi' (CORE-V Immediate Branching).
181182
; CHECK-NEXT: xcvbitmanip - 'XCVbitmanip' (CORE-V Bit Manipulation).
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# XAndesVSIntLoad - Andes Vector INT4 Load Extension
2+
# RUN: llvm-mc %s -triple=riscv32 -mattr=+xandesvsintload -show-encoding \
3+
# RUN: | FileCheck -check-prefixes=CHECK-ASM %s
4+
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+xandesvsintload < %s \
5+
# RUN: | llvm-objdump --mattr=+xandesvsintload -M no-aliases -d -r - \
6+
# RUN: | FileCheck -check-prefixes=CHECK-OBJ %s
7+
# RUN: not llvm-mc -triple=riscv32 -show-encoding %s 2>&1 \
8+
# RUN: | FileCheck %s --check-prefix=CHECK-ERROR
9+
# RUN: llvm-mc %s -triple=riscv64 -mattr=+xandesvsintload -show-encoding \
10+
# RUN: | FileCheck -check-prefixes=CHECK-ASM %s
11+
# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+xandesvsintload < %s \
12+
# RUN: | llvm-objdump --mattr=+xandesvsintload -M no-aliases -d -r - \
13+
# RUN: | FileCheck -check-prefixes=CHECK-OBJ %s
14+
# RUN: not llvm-mc -triple=riscv64 -show-encoding %s 2>&1 \
15+
# RUN: | FileCheck %s --check-prefix=CHECK-ERROR
16+
17+
# CHECK-OBJ: nds.vln8.v v8, (a0)
18+
# CHECK-ASM: nds.vln8.v v8, (a0)
19+
# CHECK-ASM: encoding: [0x5b,0x44,0x25,0x06]
20+
# CHECK-ERROR: instruction requires the following: 'XAndesVSIntLoad' (Andes Vector INT4 Load Extension){{$}}
21+
nds.vln8.v v8, (a0)
22+
23+
# CHECK-OBJ: nds.vln8.v v8, (a0), v0.t
24+
# CHECK-ASM: nds.vln8.v v8, (a0), v0.t
25+
# CHECK-ASM: encoding: [0x5b,0x44,0x25,0x04]
26+
# CHECK-ERROR: instruction requires the following: 'XAndesVSIntLoad' (Andes Vector INT4 Load Extension){{$}}
27+
nds.vln8.v v8, (a0), v0.t
28+
29+
# CHECK-OBJ: nds.vlnu8.v v8, (a0)
30+
# CHECK-ASM: nds.vlnu8.v v8, (a0)
31+
# CHECK-ASM: encoding: [0x5b,0x44,0x35,0x06]
32+
# CHECK-ERROR: instruction requires the following: 'XAndesVSIntLoad' (Andes Vector INT4 Load Extension){{$}}
33+
nds.vlnu8.v v8, (a0)
34+
35+
# CHECK-OBJ: nds.vlnu8.v v8, (a0), v0.t
36+
# CHECK-ASM: nds.vlnu8.v v8, (a0), v0.t
37+
# CHECK-ASM: encoding: [0x5b,0x44,0x35,0x04]
38+
# CHECK-ERROR: instruction requires the following: 'XAndesVSIntLoad' (Andes Vector INT4 Load Extension){{$}}
39+
nds.vlnu8.v v8, (a0), v0.t

0 commit comments

Comments
 (0)