Skip to content

Commit 00128a2

Browse files
authored
[RISCV] Implement Clang Builtins for XCValu Extension in CV32E40P (#100684)
This commit adds the Clang Builtins, C API header and relevant tests for XCValu extension. Spec: https://github.com/openhwgroup/core-v-sw/blob/master/specifications/corev-builtin-spec.md Contributor: @melonedo, @PaoloS02
1 parent 75fad47 commit 00128a2

File tree

10 files changed

+1003
-74
lines changed

10 files changed

+1003
-74
lines changed

clang/include/clang/Basic/BuiltinsRISCV.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,8 @@ let Features = "zihintntl", Attributes = [CustomTypeChecking] in {
146146
def ntl_load : RISCVBuiltin<"void(...)">;
147147
def ntl_store : RISCVBuiltin<"void(...)">;
148148
} // Features = "zihintntl", Attributes = [CustomTypeChecking]
149+
150+
//===----------------------------------------------------------------------===//
151+
// XCV extensions.
152+
//===----------------------------------------------------------------------===//
153+
include "clang/Basic/BuiltinsRISCVXCV.td"
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//==- BuiltinsRISCVXCV.td - RISC-V CORE-V Builtin database ----*- C++ -*-==//
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 defines the CORE-V-specific builtin function database. Users of
10+
// this file must define the BUILTIN macro to make use of this information.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
class RISCXCVBuiltin<string prototype, string features = ""> : TargetBuiltin {
15+
let Spellings = ["__builtin_riscv_cv_" # NAME];
16+
let Prototype = prototype;
17+
let Features = features;
18+
}
19+
20+
let Attributes = [NoThrow, Const] in {
21+
//===----------------------------------------------------------------------===//
22+
// XCValu extension.
23+
//===----------------------------------------------------------------------===//
24+
def alu_slet : RISCXCVBuiltin<"int(int, int)", "xcvalu">;
25+
def alu_sletu : RISCXCVBuiltin<"int(unsigned int, unsigned int)", "xcvalu">;
26+
def alu_exths : RISCXCVBuiltin<"int(int)", "xcvalu">;
27+
def alu_exthz : RISCXCVBuiltin<"unsigned int(unsigned int)", "xcvalu">;
28+
def alu_extbs : RISCXCVBuiltin<"int(int)", "xcvalu">;
29+
def alu_extbz : RISCXCVBuiltin<"unsigned int(unsigned int)", "xcvalu">;
30+
31+
def alu_clip : RISCXCVBuiltin<"int(int, int)", "xcvalu">;
32+
def alu_clipu : RISCXCVBuiltin<"unsigned int(unsigned int, unsigned int)", "xcvalu">;
33+
def alu_addN : RISCXCVBuiltin<"int(int, int, unsigned int)", "xcvalu">;
34+
def alu_adduN : RISCXCVBuiltin<"unsigned int(unsigned int, unsigned int, unsigned int)", "xcvalu">;
35+
def alu_addRN : RISCXCVBuiltin<"int(int, int, unsigned int)", "xcvalu">;
36+
def alu_adduRN : RISCXCVBuiltin<"unsigned int(unsigned int, unsigned int, unsigned int)", "xcvalu">;
37+
def alu_subN : RISCXCVBuiltin<"int(int, int, unsigned int)", "xcvalu">;
38+
def alu_subuN : RISCXCVBuiltin<"unsigned int(unsigned int, unsigned int, unsigned int)", "xcvalu">;
39+
def alu_subRN : RISCXCVBuiltin<"int(int, int, unsigned int)", "xcvalu">;
40+
def alu_subuRN : RISCXCVBuiltin<"unsigned int(unsigned int, unsigned int, unsigned int)", "xcvalu">;
41+
} // Attributes = [NoThrow, Const]

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22340,10 +22340,60 @@ Value *CodeGenFunction::EmitRISCVBuiltinExpr(unsigned BuiltinID,
2234022340

2234122341
return Store;
2234222342
}
22343+
// XCValu
22344+
case RISCV::BI__builtin_riscv_cv_alu_addN:
22345+
ID = Intrinsic::riscv_cv_alu_addN;
22346+
break;
22347+
case RISCV::BI__builtin_riscv_cv_alu_addRN:
22348+
ID = Intrinsic::riscv_cv_alu_addRN;
22349+
break;
22350+
case RISCV::BI__builtin_riscv_cv_alu_adduN:
22351+
ID = Intrinsic::riscv_cv_alu_adduN;
22352+
break;
22353+
case RISCV::BI__builtin_riscv_cv_alu_adduRN:
22354+
ID = Intrinsic::riscv_cv_alu_adduRN;
22355+
break;
22356+
case RISCV::BI__builtin_riscv_cv_alu_clip:
22357+
ID = Intrinsic::riscv_cv_alu_clip;
22358+
break;
22359+
case RISCV::BI__builtin_riscv_cv_alu_clipu:
22360+
ID = Intrinsic::riscv_cv_alu_clipu;
22361+
break;
22362+
case RISCV::BI__builtin_riscv_cv_alu_extbs:
22363+
return Builder.CreateSExt(Builder.CreateTrunc(Ops[0], Int8Ty), Int32Ty,
22364+
"extbs");
22365+
case RISCV::BI__builtin_riscv_cv_alu_extbz:
22366+
return Builder.CreateZExt(Builder.CreateTrunc(Ops[0], Int8Ty), Int32Ty,
22367+
"extbz");
22368+
case RISCV::BI__builtin_riscv_cv_alu_exths:
22369+
return Builder.CreateSExt(Builder.CreateTrunc(Ops[0], Int16Ty), Int32Ty,
22370+
"exths");
22371+
case RISCV::BI__builtin_riscv_cv_alu_exthz:
22372+
return Builder.CreateZExt(Builder.CreateTrunc(Ops[0], Int16Ty), Int32Ty,
22373+
"exthz");
22374+
case RISCV::BI__builtin_riscv_cv_alu_slet:
22375+
return Builder.CreateZExt(Builder.CreateICmpSLE(Ops[0], Ops[1]), Int32Ty,
22376+
"sle");
22377+
case RISCV::BI__builtin_riscv_cv_alu_sletu:
22378+
return Builder.CreateZExt(Builder.CreateICmpULE(Ops[0], Ops[1]), Int32Ty,
22379+
"sleu");
22380+
case RISCV::BI__builtin_riscv_cv_alu_subN:
22381+
ID = Intrinsic::riscv_cv_alu_subN;
22382+
break;
22383+
case RISCV::BI__builtin_riscv_cv_alu_subRN:
22384+
ID = Intrinsic::riscv_cv_alu_subRN;
22385+
break;
22386+
case RISCV::BI__builtin_riscv_cv_alu_subuN:
22387+
ID = Intrinsic::riscv_cv_alu_subuN;
22388+
break;
22389+
case RISCV::BI__builtin_riscv_cv_alu_subuRN:
22390+
ID = Intrinsic::riscv_cv_alu_subuRN;
22391+
break;
2234322392

22344-
// Vector builtins are handled from here.
22393+
// Vector builtins are handled from here.
2234522394
#include "clang/Basic/riscv_vector_builtin_cg.inc"
22346-
// SiFive Vector builtins are handled from here.
22395+
22396+
// SiFive Vector builtins are handled from here.
2234722397
#include "clang/Basic/riscv_sifive_vector_builtin_cg.inc"
2234822398
}
2234922399

clang/lib/Headers/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ set(ppc_htm_files
120120

121121
set(riscv_files
122122
riscv_bitmanip.h
123+
riscv_corev_alu.h
123124
riscv_crypto.h
124125
riscv_ntlh.h
125126
sifive_vector.h

clang/lib/Headers/riscv_corev_alu.h

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
/*===---- riscv_corev_alu.h - CORE-V ALU intrinsics ------------------------===
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+
10+
#ifndef __RISCV_COREV_ALU_H
11+
#define __RISCV_COREV_ALU_H
12+
13+
#include <stdint.h>
14+
15+
#if defined(__cplusplus)
16+
extern "C" {
17+
#endif
18+
19+
#if defined(__riscv_xcvalu)
20+
21+
#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
22+
23+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_abs(long a) {
24+
return __builtin_abs(a);
25+
}
26+
27+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_alu_slet(long a, long b) {
28+
return __builtin_riscv_cv_alu_slet(a, b);
29+
}
30+
31+
static __inline__ long __DEFAULT_FN_ATTRS
32+
__riscv_cv_alu_sletu(unsigned long a, unsigned long b) {
33+
return __builtin_riscv_cv_alu_sletu(a, b);
34+
}
35+
36+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_alu_min(long a, long b) {
37+
return __builtin_elementwise_min(a, b);
38+
}
39+
40+
static __inline__ unsigned long __DEFAULT_FN_ATTRS
41+
__riscv_cv_alu_minu(unsigned long a, unsigned long b) {
42+
return __builtin_elementwise_min(a, b);
43+
}
44+
45+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_alu_max(long a, long b) {
46+
return __builtin_elementwise_max(a, b);
47+
}
48+
49+
static __inline__ unsigned long __DEFAULT_FN_ATTRS
50+
__riscv_cv_alu_maxu(unsigned long a, unsigned long b) {
51+
return __builtin_elementwise_max(a, b);
52+
}
53+
54+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_alu_exths(int16_t a) {
55+
return __builtin_riscv_cv_alu_exths(a);
56+
}
57+
58+
static __inline__ unsigned long __DEFAULT_FN_ATTRS
59+
__riscv_cv_alu_exthz(uint16_t a) {
60+
return __builtin_riscv_cv_alu_exthz(a);
61+
}
62+
63+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_alu_extbs(int8_t a) {
64+
return __builtin_riscv_cv_alu_extbs(a);
65+
}
66+
67+
static __inline__ unsigned long __DEFAULT_FN_ATTRS
68+
__riscv_cv_alu_extbz(uint8_t a) {
69+
return __builtin_riscv_cv_alu_extbz(a);
70+
}
71+
72+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_alu_clip(long a,
73+
unsigned long b) {
74+
return __builtin_riscv_cv_alu_clip(a, b);
75+
}
76+
77+
static __inline__ unsigned long __DEFAULT_FN_ATTRS
78+
__riscv_cv_alu_clipu(unsigned long a, unsigned long b) {
79+
return __builtin_riscv_cv_alu_clipu(a, b);
80+
}
81+
82+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_alu_addN(long a, long b,
83+
uint8_t shft) {
84+
return __builtin_riscv_cv_alu_addN(a, b, shft);
85+
}
86+
87+
static __inline__ unsigned long __DEFAULT_FN_ATTRS
88+
__riscv_cv_alu_adduN(unsigned long a, unsigned long b, uint8_t shft) {
89+
return __builtin_riscv_cv_alu_adduN(a, b, shft);
90+
}
91+
92+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_alu_addRN(long a, long b,
93+
uint8_t shft) {
94+
return __builtin_riscv_cv_alu_addRN(a, b, shft);
95+
}
96+
97+
static __inline__ unsigned long __DEFAULT_FN_ATTRS
98+
__riscv_cv_alu_adduRN(unsigned long a, unsigned long b, uint8_t shft) {
99+
return __builtin_riscv_cv_alu_adduRN(a, b, shft);
100+
}
101+
102+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_alu_subN(long a, long b,
103+
uint8_t shft) {
104+
return __builtin_riscv_cv_alu_subN(a, b, shft);
105+
}
106+
107+
static __inline__ unsigned long __DEFAULT_FN_ATTRS
108+
__riscv_cv_alu_subuN(unsigned long a, unsigned long b, uint8_t shft) {
109+
return __builtin_riscv_cv_alu_subuN(a, b, shft);
110+
}
111+
112+
static __inline__ long __DEFAULT_FN_ATTRS __riscv_cv_alu_subRN(long a, long b,
113+
uint8_t shft) {
114+
return __builtin_riscv_cv_alu_subRN(a, b, shft);
115+
}
116+
117+
static __inline__ unsigned long __DEFAULT_FN_ATTRS
118+
__riscv_cv_alu_subuRN(unsigned long a, unsigned long b, uint8_t shft) {
119+
return __builtin_riscv_cv_alu_subuRN(a, b, shft);
120+
}
121+
122+
#endif // defined(__riscv_xcvalu)
123+
124+
#if defined(__cplusplus)
125+
}
126+
#endif
127+
128+
#endif // define __RISCV_COREV_ALU_H

0 commit comments

Comments
 (0)