Fixes for intrinsics unsupported in earlier LLVM versions.
Specifically, don't use the half/float conversion routines with LLVM 3.0, and don't try to use RDRAND with anything before LLVM 3.2.
This commit is contained in:
@@ -31,7 +31,9 @@
|
|||||||
|
|
||||||
include(`target-avx-x2.ll')
|
include(`target-avx-x2.ll')
|
||||||
|
|
||||||
rdrand_definition()
|
ifelse(LLVM_VERSION, `LLVM_3_0', `rdrand_decls()',
|
||||||
|
LLVM_VERSION, `LLVM_3_1', `rdrand_decls()',
|
||||||
|
`rdrand_definition()')
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; int min/max
|
;; int min/max
|
||||||
@@ -73,6 +75,9 @@ gen_gather(double)
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; float/half conversions
|
;; float/half conversions
|
||||||
|
|
||||||
|
ifelse(LLVM_VERSION, `LLVM_3_0', `
|
||||||
|
;; nothing to define...
|
||||||
|
', `
|
||||||
declare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>) nounwind readnone
|
declare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>) nounwind readnone
|
||||||
; 0 is round nearest even
|
; 0 is round nearest even
|
||||||
declare <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float>, i32) nounwind readnone
|
declare <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float>, i32) nounwind readnone
|
||||||
@@ -123,4 +128,5 @@ define i16 @__float_to_half_uniform(float %v) nounwind readnone {
|
|||||||
%r = extractelement <8 x i16> %rv, i32 0
|
%r = extractelement <8 x i16> %rv, i32 0
|
||||||
ret i16 %r
|
ret i16 %r
|
||||||
}
|
}
|
||||||
|
'
|
||||||
|
)
|
||||||
|
|||||||
@@ -31,7 +31,9 @@
|
|||||||
|
|
||||||
include(`target-avx.ll')
|
include(`target-avx.ll')
|
||||||
|
|
||||||
rdrand_definition()
|
ifelse(LLVM_VERSION, `LLVM_3_0', `rdrand_decls()',
|
||||||
|
LLVM_VERSION, `LLVM_3_1', `rdrand_decls()',
|
||||||
|
`rdrand_definition()')
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; int min/max
|
;; int min/max
|
||||||
@@ -73,6 +75,9 @@ gen_gather(double)
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; float/half conversions
|
;; float/half conversions
|
||||||
|
|
||||||
|
ifelse(LLVM_VERSION, `LLVM_3_0', `
|
||||||
|
;; nothing to define...
|
||||||
|
', `
|
||||||
declare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>) nounwind readnone
|
declare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>) nounwind readnone
|
||||||
; 0 is round nearest even
|
; 0 is round nearest even
|
||||||
declare <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float>, i32) nounwind readnone
|
declare <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float>, i32) nounwind readnone
|
||||||
@@ -107,3 +112,4 @@ define i16 @__float_to_half_uniform(float %v) nounwind readnone {
|
|||||||
%r = extractelement <8 x i16> %rv, i32 0
|
%r = extractelement <8 x i16> %rv, i32 0
|
||||||
ret i16 %r
|
ret i16 %r
|
||||||
}
|
}
|
||||||
|
')
|
||||||
|
|||||||
@@ -31,7 +31,9 @@
|
|||||||
|
|
||||||
include(`target-avx-x2.ll')
|
include(`target-avx-x2.ll')
|
||||||
|
|
||||||
rdrand_definition()
|
ifelse(LLVM_VERSION, `LLVM_3_0', `rdrand_decls()',
|
||||||
|
LLVM_VERSION, `LLVM_3_1', `rdrand_decls()',
|
||||||
|
`rdrand_definition()')
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; int min/max
|
;; int min/max
|
||||||
@@ -68,6 +70,9 @@ define <16 x i32> @__max_varying_uint32(<16 x i32>, <16 x i32>) nounwind readonl
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; float/half conversions
|
;; float/half conversions
|
||||||
|
|
||||||
|
ifelse(LLVM_VERSION, `LLVM_3_0', `
|
||||||
|
;; nothing to define...
|
||||||
|
', `
|
||||||
declare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>) nounwind readnone
|
declare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>) nounwind readnone
|
||||||
; 0 is round nearest even
|
; 0 is round nearest even
|
||||||
declare <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float>, i32) nounwind readnone
|
declare <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float>, i32) nounwind readnone
|
||||||
@@ -118,7 +123,7 @@ define i16 @__float_to_half_uniform(float %v) nounwind readnone {
|
|||||||
%r = extractelement <8 x i16> %rv, i32 0
|
%r = extractelement <8 x i16> %rv, i32 0
|
||||||
ret i16 %r
|
ret i16 %r
|
||||||
}
|
}
|
||||||
|
')
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; gather
|
;; gather
|
||||||
|
|||||||
@@ -31,7 +31,9 @@
|
|||||||
|
|
||||||
include(`target-avx.ll')
|
include(`target-avx.ll')
|
||||||
|
|
||||||
rdrand_definition()
|
ifelse(LLVM_VERSION, `LLVM_3_0', `rdrand_decls()',
|
||||||
|
LLVM_VERSION, `LLVM_3_1', `rdrand_decls()',
|
||||||
|
`rdrand_definition()')
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; int min/max
|
;; int min/max
|
||||||
@@ -68,6 +70,9 @@ define <8 x i32> @__max_varying_uint32(<8 x i32>, <8 x i32>) nounwind readonly a
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; float/half conversions
|
;; float/half conversions
|
||||||
|
|
||||||
|
ifelse(LLVM_VERSION, `LLVM_3_0', `
|
||||||
|
;; nothing to define...
|
||||||
|
', `
|
||||||
declare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>) nounwind readnone
|
declare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>) nounwind readnone
|
||||||
; 0 is round nearest even
|
; 0 is round nearest even
|
||||||
declare <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float>, i32) nounwind readnone
|
declare <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float>, i32) nounwind readnone
|
||||||
@@ -102,6 +107,7 @@ define i16 @__float_to_half_uniform(float %v) nounwind readnone {
|
|||||||
%r = extractelement <8 x i16> %rv, i32 0
|
%r = extractelement <8 x i16> %rv, i32 0
|
||||||
ret i16 %r
|
ret i16 %r
|
||||||
}
|
}
|
||||||
|
')
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; gather
|
;; gather
|
||||||
|
|||||||
18
ispc.cpp
18
ispc.cpp
@@ -328,8 +328,14 @@ Target::GetTarget(const char *arch, const char *cpu, const char *isa,
|
|||||||
t->attributes = "+avx,+popcnt,+cmov,+f16c,+rdrand";
|
t->attributes = "+avx,+popcnt,+cmov,+f16c,+rdrand";
|
||||||
t->maskingIsFree = false;
|
t->maskingIsFree = false;
|
||||||
t->maskBitCount = 32;
|
t->maskBitCount = 32;
|
||||||
|
#if !defined(LLVM_3_0)
|
||||||
|
// LLVM 3.1+ only
|
||||||
t->hasHalf = true;
|
t->hasHalf = true;
|
||||||
|
#if !defined(LLVM_3_1)
|
||||||
|
// LLVM 3.2+ only
|
||||||
t->hasRand = true;
|
t->hasRand = true;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (!strcasecmp(isa, "avx1.1-x2")) {
|
else if (!strcasecmp(isa, "avx1.1-x2")) {
|
||||||
t->isa = Target::AVX11;
|
t->isa = Target::AVX11;
|
||||||
@@ -338,8 +344,14 @@ Target::GetTarget(const char *arch, const char *cpu, const char *isa,
|
|||||||
t->attributes = "+avx,+popcnt,+cmov,+f16c,+rdrand";
|
t->attributes = "+avx,+popcnt,+cmov,+f16c,+rdrand";
|
||||||
t->maskingIsFree = false;
|
t->maskingIsFree = false;
|
||||||
t->maskBitCount = 32;
|
t->maskBitCount = 32;
|
||||||
|
#if !defined(LLVM_3_0)
|
||||||
|
// LLVM 3.1+ only
|
||||||
t->hasHalf = true;
|
t->hasHalf = true;
|
||||||
|
#if !defined(LLVM_3_1)
|
||||||
|
// LLVM 3.2+ only
|
||||||
t->hasRand = true;
|
t->hasRand = true;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#ifndef LLVM_3_0
|
#ifndef LLVM_3_0
|
||||||
else if (!strcasecmp(isa, "avx2")) {
|
else if (!strcasecmp(isa, "avx2")) {
|
||||||
@@ -350,7 +362,10 @@ Target::GetTarget(const char *arch, const char *cpu, const char *isa,
|
|||||||
t->maskingIsFree = false;
|
t->maskingIsFree = false;
|
||||||
t->maskBitCount = 32;
|
t->maskBitCount = 32;
|
||||||
t->hasHalf = true;
|
t->hasHalf = true;
|
||||||
|
#if !defined(LLVM_3_1)
|
||||||
|
// LLVM 3.2+ only
|
||||||
t->hasRand = true;
|
t->hasRand = true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (!strcasecmp(isa, "avx2-x2")) {
|
else if (!strcasecmp(isa, "avx2-x2")) {
|
||||||
t->isa = Target::AVX2;
|
t->isa = Target::AVX2;
|
||||||
@@ -360,7 +375,10 @@ Target::GetTarget(const char *arch, const char *cpu, const char *isa,
|
|||||||
t->maskingIsFree = false;
|
t->maskingIsFree = false;
|
||||||
t->maskBitCount = 32;
|
t->maskBitCount = 32;
|
||||||
t->hasHalf = true;
|
t->hasHalf = true;
|
||||||
|
#if !defined(LLVM_3_1)
|
||||||
|
// LLVM 3.2+ only
|
||||||
t->hasRand = true;
|
t->hasRand = true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif // !LLVM_3_0
|
#endif // !LLVM_3_0
|
||||||
else {
|
else {
|
||||||
|
|||||||
Reference in New Issue
Block a user