Merged with upstream/master
This commit is contained in:
109
ispc.cpp
109
ispc.cpp
@@ -170,7 +170,7 @@ static const char *supportedCPUs[] = {
|
||||
, "core-avx-i", "core-avx2"
|
||||
#endif // LLVM 3.2+
|
||||
#if !defined(LLVM_3_1) && !defined(LLVM_3_2) && !defined(LLVM_3_3)
|
||||
, "slm"
|
||||
, "slm"
|
||||
#endif // LLVM 3.4+
|
||||
};
|
||||
|
||||
@@ -193,6 +193,7 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
m_tf_attributes(NULL),
|
||||
#endif
|
||||
m_nativeVectorWidth(-1),
|
||||
m_dataTypeWidth(-1),
|
||||
m_vectorWidth(-1),
|
||||
m_generatePIC(pic),
|
||||
m_maskingIsFree(false),
|
||||
@@ -317,9 +318,10 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "sse2-i32x4")) {
|
||||
this->m_isa = Target::SSE2;
|
||||
this->m_nativeVectorWidth = 4;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 4;
|
||||
this->m_attributes = "+sse,+sse2,-sse3,-sse4a,-ssse3,-popcnt"
|
||||
#if defined(LLVM_3_4)
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",-sse4.1,-sse4.2"
|
||||
#else
|
||||
",-sse41,-sse42"
|
||||
@@ -332,9 +334,10 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "sse2-i32x8")) {
|
||||
this->m_isa = Target::SSE2;
|
||||
this->m_nativeVectorWidth = 4;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 8;
|
||||
this->m_attributes = "+sse,+sse2,-sse3,-sse4a,-ssse3,-popcnt"
|
||||
#if defined(LLVM_3_4)
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",-sse4.1,-sse4.2"
|
||||
#else
|
||||
",-sse41,-sse42"
|
||||
@@ -347,11 +350,12 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "sse4-i32x4")) {
|
||||
this->m_isa = Target::SSE4;
|
||||
this->m_nativeVectorWidth = 4;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 4;
|
||||
// TODO: why not sse42 and popcnt?
|
||||
this->m_attributes = "+sse,+sse2,+sse3,-sse4a,+ssse3,-popcnt,+cmov"
|
||||
#if defined(LLVM_3_4)
|
||||
",+sse4.1,-sse4.2"
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",+sse4.1,-sse4.2"
|
||||
#else
|
||||
",+sse41,-sse42"
|
||||
#endif
|
||||
@@ -364,10 +368,11 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "sse4-i32x8")) {
|
||||
this->m_isa = Target::SSE4;
|
||||
this->m_nativeVectorWidth = 4;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 8;
|
||||
this->m_attributes = "+sse,+sse2,+sse3,-sse4a,+ssse3,-popcnt,+cmov"
|
||||
#if defined(LLVM_3_4)
|
||||
",+sse4.1,-sse4.2"
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",+sse4.1,-sse4.2"
|
||||
#else
|
||||
",+sse41,-sse42"
|
||||
#endif
|
||||
@@ -378,10 +383,11 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
else if (!strcasecmp(isa, "sse4-i8x16")) {
|
||||
this->m_isa = Target::SSE4;
|
||||
this->m_nativeVectorWidth = 16;
|
||||
this->m_dataTypeWidth = 8;
|
||||
this->m_vectorWidth = 16;
|
||||
this->m_attributes = "+sse,+sse2,+sse3,-sse4a,+ssse3,-popcnt,+cmov"
|
||||
#if defined(LLVM_3_4)
|
||||
",+sse4.1,-sse4.2"
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",+sse4.1,-sse4.2"
|
||||
#else
|
||||
",+sse41,-sse42"
|
||||
#endif
|
||||
@@ -392,10 +398,11 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
else if (!strcasecmp(isa, "sse4-i16x8")) {
|
||||
this->m_isa = Target::SSE4;
|
||||
this->m_nativeVectorWidth = 8;
|
||||
this->m_dataTypeWidth = 16;
|
||||
this->m_vectorWidth = 8;
|
||||
this->m_attributes = "+sse,+sse2,+sse3,-sse4a,+ssse3,-popcnt,+cmov"
|
||||
#if defined(LLVM_3_4)
|
||||
",+sse4.1,-sse4.2"
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",+sse4.1,-sse4.2"
|
||||
#else
|
||||
",+sse41,-sse42"
|
||||
#endif
|
||||
@@ -466,11 +473,21 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
this->m_maskingIsFree = false;
|
||||
this->m_maskBitCount = 32;
|
||||
}
|
||||
else if (!strcasecmp(isa, "avx1-i32x4")) {
|
||||
this->m_isa = Target::AVX;
|
||||
this->m_nativeVectorWidth = 8;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 4;
|
||||
this->m_attributes = "+avx,+popcnt,+cmov";
|
||||
this->m_maskingIsFree = false;
|
||||
this->m_maskBitCount = 32;
|
||||
}
|
||||
else if (!strcasecmp(isa, "avx") ||
|
||||
!strcasecmp(isa, "avx1") ||
|
||||
!strcasecmp(isa, "avx1-i32x8")) {
|
||||
this->m_isa = Target::AVX;
|
||||
this->m_nativeVectorWidth = 8;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 8;
|
||||
this->m_attributes = "+avx,+popcnt,+cmov";
|
||||
this->m_maskingIsFree = false;
|
||||
@@ -480,6 +497,7 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "avx1-i64x4")) {
|
||||
this->m_isa = Target::AVX;
|
||||
this->m_nativeVectorWidth = 8; /* native vector width in terms of floats */
|
||||
this->m_dataTypeWidth = 64;
|
||||
this->m_vectorWidth = 4;
|
||||
this->m_attributes = "+avx,+popcnt,+cmov";
|
||||
this->m_maskingIsFree = false;
|
||||
@@ -490,6 +508,7 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "avx1-i32x16")) {
|
||||
this->m_isa = Target::AVX;
|
||||
this->m_nativeVectorWidth = 8;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 16;
|
||||
this->m_attributes = "+avx,+popcnt,+cmov";
|
||||
this->m_maskingIsFree = false;
|
||||
@@ -499,9 +518,10 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "avx1.1-i32x8")) {
|
||||
this->m_isa = Target::AVX11;
|
||||
this->m_nativeVectorWidth = 8;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 8;
|
||||
this->m_attributes = "+avx,+popcnt,+cmov,+f16c"
|
||||
#if defined(LLVM_3_4)
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",+rdrnd"
|
||||
#else
|
||||
",+rdrand"
|
||||
@@ -519,14 +539,15 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "avx1.1-i32x16")) {
|
||||
this->m_isa = Target::AVX11;
|
||||
this->m_nativeVectorWidth = 8;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 16;
|
||||
this->m_attributes = "+avx,+popcnt,+cmov,+f16c"
|
||||
#if defined(LLVM_3_4)
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",+rdrnd"
|
||||
#else
|
||||
",+rdrand"
|
||||
#endif
|
||||
;
|
||||
;
|
||||
this->m_maskingIsFree = false;
|
||||
this->m_maskBitCount = 32;
|
||||
this->m_hasHalf = true;
|
||||
@@ -538,14 +559,15 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
else if (!strcasecmp(isa, "avx1.1-i64x4")) {
|
||||
this->m_isa = Target::AVX11;
|
||||
this->m_nativeVectorWidth = 8; /* native vector width in terms of floats */
|
||||
this->m_dataTypeWidth = 64;
|
||||
this->m_vectorWidth = 4;
|
||||
this->m_attributes = "+avx,+popcnt,+cmov,+f16c"
|
||||
#if defined(LLVM_3_4)
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",+rdrnd"
|
||||
#else
|
||||
",+rdrand"
|
||||
#endif
|
||||
;
|
||||
;
|
||||
this->m_maskingIsFree = false;
|
||||
this->m_maskBitCount = 64;
|
||||
this->m_hasHalf = true;
|
||||
@@ -558,9 +580,10 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "avx2-i32x8")) {
|
||||
this->m_isa = Target::AVX2;
|
||||
this->m_nativeVectorWidth = 8;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 8;
|
||||
this->m_attributes = "+avx2,+popcnt,+cmov,+f16c"
|
||||
#if defined(LLVM_3_4)
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",+rdrnd"
|
||||
#else
|
||||
",+rdrand"
|
||||
@@ -582,9 +605,10 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "avx2-i32x16")) {
|
||||
this->m_isa = Target::AVX2;
|
||||
this->m_nativeVectorWidth = 16;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 16;
|
||||
this->m_attributes = "+avx2,+popcnt,+cmov,+f16c"
|
||||
#if defined(LLVM_3_4)
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",+rdrnd"
|
||||
#else
|
||||
",+rdrand"
|
||||
@@ -605,9 +629,10 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
else if (!strcasecmp(isa, "avx2-i64x4")) {
|
||||
this->m_isa = Target::AVX2;
|
||||
this->m_nativeVectorWidth = 8; /* native vector width in terms of floats */
|
||||
this->m_dataTypeWidth = 64;
|
||||
this->m_vectorWidth = 4;
|
||||
this->m_attributes = "+avx2,+popcnt,+cmov,+f16c"
|
||||
#if defined(LLVM_3_4)
|
||||
#if defined(LLVM_3_4) || defined(LLVM_3_5)
|
||||
",+rdrnd"
|
||||
#else
|
||||
",+rdrand"
|
||||
@@ -629,6 +654,7 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
else if (!strcasecmp(isa, "neon-i8x16")) {
|
||||
this->m_isa = Target::NEON8;
|
||||
this->m_nativeVectorWidth = 16;
|
||||
this->m_dataTypeWidth = 8;
|
||||
this->m_vectorWidth = 16;
|
||||
this->m_attributes = "+neon,+fp16";
|
||||
this->m_hasHalf = true; // ??
|
||||
@@ -638,6 +664,7 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
else if (!strcasecmp(isa, "neon-i16x8")) {
|
||||
this->m_isa = Target::NEON16;
|
||||
this->m_nativeVectorWidth = 8;
|
||||
this->m_dataTypeWidth = 16;
|
||||
this->m_vectorWidth = 8;
|
||||
this->m_attributes = "+neon,+fp16";
|
||||
this->m_hasHalf = true; // ??
|
||||
@@ -648,6 +675,7 @@ Target::Target(const char *arch, const char *cpu, const char *isa, bool pic, boo
|
||||
!strcasecmp(isa, "neon-i32x4")) {
|
||||
this->m_isa = Target::NEON32;
|
||||
this->m_nativeVectorWidth = 4;
|
||||
this->m_dataTypeWidth = 32;
|
||||
this->m_vectorWidth = 4;
|
||||
this->m_attributes = "+neon,+fp16";
|
||||
this->m_hasHalf = true; // ??
|
||||
@@ -799,6 +827,7 @@ Target::SupportedTargets() {
|
||||
#endif
|
||||
"sse2-i32x4, sse2-i32x8, "
|
||||
"sse4-i32x4, sse4-i32x8, sse4-i16x8, sse4-i8x16, "
|
||||
"avx1-i32x4, "
|
||||
"avx1-i32x8, avx1-i32x16, avx1-i64x4, "
|
||||
"avx1.1-i32x8, avx1.1-i32x16, avx1.1-i64x4 "
|
||||
"avx2-i32x8, avx2-i32x16, avx2-i64x4, "
|
||||
@@ -840,6 +869,9 @@ Target::GetTripleString() const {
|
||||
return triple.str();
|
||||
}
|
||||
|
||||
// This function returns string representation of ISA for the purpose of
|
||||
// mangling. And may return any unique string, preferably short, like
|
||||
// sse4, avx and etc.
|
||||
const char *
|
||||
Target::ISAToString(ISA isa) {
|
||||
switch (isa) {
|
||||
@@ -877,6 +909,45 @@ Target::GetISAString() const {
|
||||
}
|
||||
|
||||
|
||||
// This function returns string representation of default target corresponding
|
||||
// to ISA. I.e. for SSE4 it's sse4-i32x4, for AVX11 it's avx1.1-i32x8. This
|
||||
// string may be used to initialize Target.
|
||||
const char *
|
||||
Target::ISAToTargetString(ISA isa) {
|
||||
switch (isa) {
|
||||
#ifdef ISPC_ARM_ENABLED
|
||||
case Target::NEON8:
|
||||
return "neon-8";
|
||||
case Target::NEON16:
|
||||
return "neon-16";
|
||||
case Target::NEON32:
|
||||
return "neon-32";
|
||||
#endif
|
||||
case Target::SSE2:
|
||||
return "sse2-i32x4";
|
||||
case Target::SSE4:
|
||||
return "sse4-i32x4";
|
||||
case Target::AVX:
|
||||
return "avx1-i32x8";
|
||||
case Target::AVX11:
|
||||
return "avx1.1-i32x8";
|
||||
case Target::AVX2:
|
||||
return "avx2-i32x8";
|
||||
case Target::GENERIC:
|
||||
return "generic-4";
|
||||
default:
|
||||
FATAL("Unhandled target in ISAToTargetString()");
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
const char *
|
||||
Target::GetISATargetString() const {
|
||||
return ISAToString(m_isa);
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
lGenericTypeLayoutIndeterminate(llvm::Type *type) {
|
||||
if (type->isPrimitiveType() || type->isIntegerTy())
|
||||
|
||||
Reference in New Issue
Block a user