Skip to content

Commit 2153c76

Browse files
authored
Fix gccbuiltins_*.di generation for LLVM >= 15. (#4350)
Fix gccbuiltins_*.di generation for LLVM >= 15. Adds simple testcase to test that generation of intrinsics import files is indeed happening. This uncovered missing vector type aliases for MIPS, fixed that too. Resolves issue #4347
1 parent c5cf086 commit 2153c76

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

runtime/druntime/src/core/simd.d

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ template Vector(T)
3939

4040
/* Handy aliases
4141
*/
42+
version (LDC)
43+
{
44+
static if (is(Vector!(void[4]))) alias Vector!(void[4]) void4; ///
45+
static if (is(Vector!(byte[4]))) alias Vector!(byte[4]) byte4; ///
46+
static if (is(Vector!(ubyte[4]))) alias Vector!(ubyte[4]) ubyte4; ///
47+
static if (is(Vector!(short[2]))) alias Vector!(short[2]) short2; ///
48+
static if (is(Vector!(ushort[2]))) alias Vector!(ushort[2]) ushort2; ///
49+
}
4250
static if (is(Vector!(void[8]))) alias Vector!(void[8]) void8; ///
4351
static if (is(Vector!(double[1]))) alias Vector!(double[1]) double1; ///
4452
static if (is(Vector!(float[2]))) alias Vector!(float[2]) float2; ///
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Very basic test to check that instrinsics include file is made correctly.
2+
// Related to https://github.com/ldc-developers/ldc/issues/4347
3+
4+
// Just do SemA, no codegen, such that it works on all CI systems.
5+
// RUN: %ldc -o- %s
6+
7+
import core.simd;
8+
static import ldc.gccbuiltins_aarch64;
9+
static import ldc.gccbuiltins_arm;
10+
static import ldc.gccbuiltins_mips;
11+
static import ldc.gccbuiltins_nvvm;
12+
static import ldc.gccbuiltins_ppc;
13+
static import ldc.gccbuiltins_x86;
14+
15+
short2 s2;
16+
short8 s8;
17+
double2 d2;
18+
void* ptr;
19+
20+
void main()
21+
{
22+
ldc.gccbuiltins_aarch64.__builtin_arm_isb(1);
23+
24+
ldc.gccbuiltins_arm.__builtin_arm_dmb(2);
25+
26+
short2 mips = ldc.gccbuiltins_mips.__builtin_mips_addq_s_ph(s2, s2);
27+
28+
double nvvm = ldc.gccbuiltins_nvvm.__nvvm_fma_rz_d(1.0, 2.0, 3.0);
29+
30+
short8 ppc8 = ldc.gccbuiltins_ppc.__builtin_altivec_crypto_vpmsumh(s8, s8);
31+
32+
ldc.gccbuiltins_x86.__builtin_ia32_lfence();
33+
ldc.gccbuiltins_x86.__builtin_ia32_umonitor(ptr);
34+
double2 x86 = ldc.gccbuiltins_x86.__builtin_ia32_maxpd(d2, d2);
35+
}

utils/gen_gccbuiltins.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@
2929
using namespace std;
3030
using namespace llvm;
3131

32+
#if LDC_LLVM_VER >= 1500
33+
#define BUILTIN_NAME_STRING "ClangBuiltinName"
34+
#else
35+
#define BUILTIN_NAME_STRING "GCCBuiltinName"
36+
#endif
37+
3238
string dtype(Record* rec, bool readOnlyMem)
3339
{
3440
Init* typeInit = rec->getValueInit("VT");
@@ -85,10 +91,10 @@ StringRef attributes(ListInit* propertyList)
8591

8692
void processRecord(raw_ostream& os, Record& rec, string arch)
8793
{
88-
if(!rec.getValue("GCCBuiltinName"))
94+
if(!rec.getValue(BUILTIN_NAME_STRING))
8995
return;
9096

91-
const StringRef builtinName = rec.getValueAsString("GCCBuiltinName");
97+
const StringRef builtinName = rec.getValueAsString(BUILTIN_NAME_STRING);
9298
string name = rec.getName().str();
9399

94100
if(name.substr(0, 4) != "int_" || name.find(arch) == string::npos)

0 commit comments

Comments
 (0)