Skip to content

Commit 22707fd

Browse files
authored
[RISCV] Add Andes XAndesBFHCvt (Andes Scalar BFLOAT16) extension (#148563)
The spec can be found at: https://github.com/andestech/andes-v5-isa/releases/tag/ast-v5_4_0-release. The extension includes only two instructions: one for converting from f32 to f16, and another for converting from f16 to f32. This patch only implements MC support for XAndesBFHCvt.
1 parent cbba8f0 commit 22707fd

File tree

10 files changed

+54
-1
lines changed

10 files changed

+54
-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
@@ -158,6 +158,7 @@
158158
// CHECK-NEXT: svnapot 1.0 'Svnapot' (NAPOT Translation Contiguity)
159159
// CHECK-NEXT: svpbmt 1.0 'Svpbmt' (Page-Based Memory Types)
160160
// CHECK-NEXT: svvptc 1.0 'Svvptc' (Obviating Memory-Management Instructions after Marking PTEs Valid)
161+
// CHECK-NEXT: xandesbfhcvt 5.0 'XAndesBFHCvt' (Andes Scalar BFLOAT16 Conversion Extension)
161162
// CHECK-NEXT: xandesperf 5.0 'XAndesPerf' (Andes Performance Extension)
162163
// CHECK-NEXT: xandesvbfhcvt 5.0 'XAndesVBFHCvt' (Andes Vector BFLOAT16 Conversion Extension)
163164
// CHECK-NEXT: xandesvdot 5.0 'XAndesVDot' (Andes Vector Dot Product Extension)

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// RUN: -o - | FileCheck %s
55

66
// CHECK-NOT: __riscv_xandesperf {{.*$}}
7+
// CHECK-NOT: __riscv_xandesbfhcvt {{.*$}}
78
// CHECK-NOT: __riscv_xandesvbfhcvt {{.*$}}
89
// CHECK-NOT: __riscv_xandesvsintload {{.*$}}
910
// CHECK-NOT: __riscv_xandesvpackfph {{.*$}}
@@ -17,6 +18,14 @@
1718
// RUN: -o - | FileCheck --check-prefix=CHECK-XANDESPERF %s
1819
// CHECK-XANDESPERF: __riscv_xandesperf 5000000{{$}}
1920

21+
// RUN: %clang --target=riscv32 \
22+
// RUN: -march=rv32i_xandesbfhcvt -E -dM %s \
23+
// RUN: -o - | FileCheck --check-prefix=CHECK-XANDESBFHCVT %s
24+
// RUN: %clang --target=riscv64 \
25+
// RUN: -march=rv64i_xandesbfhcvt -E -dM %s \
26+
// RUN: -o - | FileCheck --check-prefix=CHECK-XANDESBFHCVT %s
27+
// CHECK-XANDESBFHCVT: __riscv_xandesbfhcvt 5000000{{$}}
28+
2029
// RUN: %clang --target=riscv32 \
2130
// RUN: -march=rv32i_xandesvbfhcvt -E -dM %s \
2231
// RUN: -o - | FileCheck --check-prefix=CHECK-XANDESVBFHCVT %s

llvm/docs/RISCVUsage.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,9 @@ The current vendor extensions supported are:
516516
``XAndesPerf``
517517
LLVM implements `version 5.0.0 of the Andes Performance 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.
518518

519+
``XAndesBFHCvt``
520+
LLVM implements `version 5.0.0 of the Andes Scalar 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.
521+
519522
``XAndesVBFHCvt``
520523
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.
521524

llvm/docs/ReleaseNotes.md

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

218219
Changes to the WebAssembly Backend
219220
----------------------------------

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,8 @@ static constexpr FeatureBitset XTHeadGroup = {
774774
RISCV::FeatureVendorXTHeadVdot};
775775

776776
static constexpr FeatureBitset XAndesGroup = {
777-
RISCV::FeatureVendorXAndesPerf, RISCV::FeatureVendorXAndesVBFHCvt,
777+
RISCV::FeatureVendorXAndesPerf, RISCV::FeatureVendorXAndesBFHCvt,
778+
RISCV::FeatureVendorXAndesVBFHCvt,
778779
RISCV::FeatureVendorXAndesVSIntLoad, RISCV::FeatureVendorXAndesVPackFPH,
779780
RISCV::FeatureVendorXAndesVDot};
780781

llvm/lib/Target/RISCV/RISCVFeatures.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,14 @@ def HasVendorXAndesPerf
15991599
AssemblerPredicate<(all_of FeatureVendorXAndesPerf),
16001600
"'XAndesPerf' (Andes Performance Extension)">;
16011601

1602+
def FeatureVendorXAndesBFHCvt
1603+
: RISCVExtension<5, 0, "Andes Scalar BFLOAT16 Conversion Extension",
1604+
[FeatureStdExtF]>;
1605+
def HasVendorXAndesBFHCvt
1606+
: Predicate<"Subtarget->hasVendorXAndesBFHCvt()">,
1607+
AssemblerPredicate<(all_of FeatureVendorXAndesBFHCvt),
1608+
"'XAndesBFHCvt' (Andes Scalar BFLOAT16 Conversion Extension)">;
1609+
16021610
def FeatureVendorXAndesVBFHCvt
16031611
: RISCVExtension<5, 0, "Andes Vector BFLOAT16 Conversion Extension",
16041612
[FeatureStdExtZve32f]>;

llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,17 @@ class NDSRVInstSDGP<bits<3> funct3, string opcodestr>
348348
let mayStore = 1;
349349
}
350350

351+
class NDSRVInstBFHCvt<bits<7> funct7, bits<5> rs1val, DAGOperand rdty,
352+
DAGOperand rs2ty, string opcodestr>
353+
: RVInstR<funct7, 0b100, OPC_CUSTOM_2, (outs rdty:$rd),
354+
(ins rs2ty:$rs2), opcodestr, "$rd, $rs2"> {
355+
let rs1 = rs1val;
356+
let hasSideEffects = 0;
357+
let mayLoad = 0;
358+
let mayStore = 0;
359+
let mayRaiseFPException = 1;
360+
}
361+
351362
class NDSRVInstVFPMAD<bits<6> funct6, string opcodestr>
352363
: RVInst<(outs VR:$vd), (ins VR:$vs2, FPR32:$rs1, VMaskOp:$vm),
353364
opcodestr # "." # "vf", "$vd, $rs1, $vs2$vm", [], InstFormatR>,
@@ -630,6 +641,19 @@ def NDS_LDGP : NDSRVInstLDGP<0b011, "nds.ldgp">;
630641
def NDS_SDGP : NDSRVInstSDGP<0b111, "nds.sdgp">;
631642
} // Predicates = [HasVendorXAndesPerf, IsRV64]
632643

644+
//===----------------------------------------------------------------------===//
645+
// XAndesBFHCvt
646+
//===----------------------------------------------------------------------===//
647+
648+
let Predicates = [HasVendorXAndesBFHCvt] in {
649+
def NDS_FCVT_S_BF16 : NDSRVInstBFHCvt<0b0000000, 0b00010,
650+
FPR32, FPR16, "nds.fcvt.s.bf16">,
651+
Sched<[WriteFCvtF16ToF32, ReadFCvtF16ToF32]>;
652+
def NDS_FCVT_BF16_S : NDSRVInstBFHCvt<0b0000000, 0b00011,
653+
FPR16, FPR32, "nds.fcvt.bf16.s">,
654+
Sched<[WriteFCvtF32ToF16, ReadFCvtF32ToF16]>;
655+
}
656+
633657
//===----------------------------------------------------------------------===//
634658
// XAndesVBFHCvt
635659
//===----------------------------------------------------------------------===//

llvm/test/CodeGen/RISCV/attributes.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcisls %s -o - | FileCheck --check-prefix=RV32XQCISLS %s
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
109+
; RUN: llc -mtriple=riscv32 -mattr=+xandesbfhcvt %s -o - | FileCheck --check-prefix=RV32XANDESBFHCVT %s
109110
; RUN: llc -mtriple=riscv32 -mattr=+xandesvbfhcvt %s -o - | FileCheck --check-prefix=RV32XANDESVBFHCVT %s
110111
; RUN: llc -mtriple=riscv32 -mattr=+xandesvsintload %s -o - | FileCheck --check-prefix=RV32XANDESVSINTLOAD %s
111112
; RUN: llc -mtriple=riscv32 -mattr=+xandesvdot %s -o - | FileCheck --check-prefix=RV32XANDESVDOT %s
@@ -262,6 +263,7 @@
262263
; RUN: llc -mtriple=riscv64 -mattr=+xtheadsync %s -o - | FileCheck --check-prefix=RV64XTHEADSYNC %s
263264
; RUN: llc -mtriple=riscv64 -mattr=+xtheadvdot %s -o - | FileCheck --check-prefixes=CHECK,RV64XTHEADVDOT %s
264265
; RUN: llc -mtriple=riscv64 -mattr=+xandesperf %s -o - | FileCheck --check-prefix=RV64XANDESPERF %s
266+
; RUN: llc -mtriple=riscv64 -mattr=+xandesbfhcvt %s -o - | FileCheck --check-prefix=RV64XANDESBFHCVT %s
265267
; RUN: llc -mtriple=riscv64 -mattr=+xandesvbfhcvt %s -o - | FileCheck --check-prefix=RV64XANDESVBFHCVT %s
266268
; RUN: llc -mtriple=riscv64 -mattr=+xandesvsintload %s -o - | FileCheck --check-prefix=RV64XANDESVSINTLOAD %s
267269
; RUN: llc -mtriple=riscv64 -mattr=+xandesvdot %s -o - | FileCheck --check-prefix=RV64XANDESVDOT %s
@@ -462,6 +464,7 @@
462464
; RV32XQCISLS: .attribute 5, "rv32i2p1_xqcisls0p2"
463465
; RV32XQCISYNC: attribute 5, "rv32i2p1_zca1p0_xqcisync0p3"
464466
; RV32XANDESPERF: .attribute 5, "rv32i2p1_xandesperf5p0"
467+
; RV32XANDESBFHCVT: .attribute 5, "rv32i2p1_f2p2_zicsr2p0_xandesbfhcvt5p0"
465468
; RV32XANDESVBFHCVT: .attribute 5, "rv32i2p1_f2p2_zicsr2p0_zve32f1p0_zve32x1p0_zvl32b1p0_xandesvbfhcvt5p0"
466469
; RV32XANDESVSINTLOAD: .attribute 5, "rv32i2p1_zicsr2p0_zve32x1p0_zvl32b1p0_xandesvsintload5p0"
467470
; RV32XANDESVDOT: .attribute 5, "rv32i2p1_zicsr2p0_zve32x1p0_zvl32b1p0_xandesvdot5p0"
@@ -620,6 +623,7 @@
620623
; RV64XTHEADSYNC: .attribute 5, "rv64i2p1_xtheadsync1p0"
621624
; RV64XTHEADVDOT: .attribute 5, "rv64i2p1_f2p2_d2p2_v1p0_zicsr2p0_zve32f1p0_zve32x1p0_zve64d1p0_zve64f1p0_zve64x1p0_zvl128b1p0_zvl32b1p0_zvl64b1p0_xtheadvdot1p0"
622625
; RV64XANDESPERF: .attribute 5, "rv64i2p1_xandesperf5p0"
626+
; RV64XANDESBFHCVT: .attribute 5, "rv64i2p1_f2p2_zicsr2p0_xandesbfhcvt5p0"
623627
; RV64XANDESVBFHCVT: .attribute 5, "rv64i2p1_f2p2_zicsr2p0_zve32f1p0_zve32x1p0_zvl32b1p0_xandesvbfhcvt5p0"
624628
; RV64XANDESVSINTLOAD: .attribute 5, "rv64i2p1_zicsr2p0_zve32x1p0_zvl32b1p0_xandesvsintload5p0"
625629
; RV64XANDESVDOT: .attribute 5, "rv64i2p1_zicsr2p0_zve32x1p0_zvl32b1p0_xandesvdot5p0"

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@
173173
; CHECK-NEXT: ventana-veyron - Ventana Veyron-Series processors.
174174
; CHECK-NEXT: vl-dependent-latency - Latency of vector instructions is dependent on the dynamic value of vl.
175175
; CHECK-NEXT: vxrm-pipeline-flush - VXRM writes causes pipeline flush.
176+
; CHECK-NEXT: xandesbfhcvt - 'XAndesBFHCvt' (Andes Scalar BFLOAT16 Conversion Extension).
176177
; CHECK-NEXT: xandesperf - 'XAndesPerf' (Andes Performance Extension).
177178
; CHECK-NEXT: xandesvbfhcvt - 'XAndesVBFHCvt' (Andes Vector BFLOAT16 Conversion Extension).
178179
; CHECK-NEXT: xandesvdot - 'XAndesVDot' (Andes Vector Dot Product Extension).

llvm/unittests/TargetParser/RISCVISAInfoTest.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,7 @@ R"(All available -march extensions for RISC-V
11291129
svnapot 1.0
11301130
svpbmt 1.0
11311131
svvptc 1.0
1132+
xandesbfhcvt 5.0
11321133
xandesperf 5.0
11331134
xandesvbfhcvt 5.0
11341135
xandesvdot 5.0

0 commit comments

Comments
 (0)