+1
This commit is contained in:
@@ -497,6 +497,8 @@ lSetInternalFunctions(llvm::Module *module) {
|
|||||||
"__prefetch_read_uniform_nt",
|
"__prefetch_read_uniform_nt",
|
||||||
"__rcp_uniform_float",
|
"__rcp_uniform_float",
|
||||||
"__rcp_varying_float",
|
"__rcp_varying_float",
|
||||||
|
"__rcp_uniform_double",
|
||||||
|
"__rcp_varying_double",
|
||||||
"__rdrand_i16",
|
"__rdrand_i16",
|
||||||
"__rdrand_i32",
|
"__rdrand_i32",
|
||||||
"__rdrand_i64",
|
"__rdrand_i64",
|
||||||
@@ -534,6 +536,8 @@ lSetInternalFunctions(llvm::Module *module) {
|
|||||||
"__round_varying_float",
|
"__round_varying_float",
|
||||||
"__rsqrt_uniform_float",
|
"__rsqrt_uniform_float",
|
||||||
"__rsqrt_varying_float",
|
"__rsqrt_varying_float",
|
||||||
|
"__rsqrt_uniform_double",
|
||||||
|
"__rsqrt_varying_double",
|
||||||
"__set_system_isa",
|
"__set_system_isa",
|
||||||
"__sext_uniform_bool",
|
"__sext_uniform_bool",
|
||||||
"__sext_varying_bool",
|
"__sext_varying_bool",
|
||||||
|
|||||||
@@ -687,3 +687,10 @@ define <16 x double> @__max_varying_double(<16 x double>, <16 x double>) nounwin
|
|||||||
binary4to16(ret, double, @llvm.x86.avx.max.pd.256, %0, %1)
|
binary4to16(ret, double, @llvm.x86.avx.max.pd.256, %0, %1)
|
||||||
ret <16 x double> %ret
|
ret <16 x double> %ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|
||||||
|
|||||||
@@ -559,3 +559,9 @@ gen_scatter(float)
|
|||||||
gen_scatter(i64)
|
gen_scatter(i64)
|
||||||
gen_scatter(double)
|
gen_scatter(double)
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|
||||||
|
|||||||
@@ -992,3 +992,9 @@ declare <WIDTH x i16> @__float_to_half_varying(<WIDTH x float> %v) nounwind read
|
|||||||
|
|
||||||
define_avgs()
|
define_avgs()
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|
||||||
|
|||||||
@@ -191,9 +191,13 @@ declare <WIDTH x double> @__max_varying_double(<WIDTH x double>,
|
|||||||
|
|
||||||
declare float @__rsqrt_uniform_float(float) nounwind readnone
|
declare float @__rsqrt_uniform_float(float) nounwind readnone
|
||||||
declare float @__rcp_uniform_float(float) nounwind readnone
|
declare float @__rcp_uniform_float(float) nounwind readnone
|
||||||
|
declare double @__rsqrt_uniform_double(double) nounwind readnone
|
||||||
|
declare double @__rcp_uniform_double(double) nounwind readnone
|
||||||
declare float @__sqrt_uniform_float(float) nounwind readnone
|
declare float @__sqrt_uniform_float(float) nounwind readnone
|
||||||
declare <WIDTH x float> @__rcp_varying_float(<WIDTH x float>) nounwind readnone
|
declare <WIDTH x float> @__rcp_varying_float(<WIDTH x float>) nounwind readnone
|
||||||
declare <WIDTH x float> @__rsqrt_varying_float(<WIDTH x float>) nounwind readnone
|
declare <WIDTH x float> @__rsqrt_varying_float(<WIDTH x float>) nounwind readnone
|
||||||
|
declare <WIDTH x double> @__rcp_varying_double(<WIDTH x double>) nounwind readnone
|
||||||
|
declare <WIDTH x double> @__rsqrt_varying_double(<WIDTH x double>) nounwind readnone
|
||||||
declare <WIDTH x float> @__sqrt_varying_float(<WIDTH x float>) nounwind readnone
|
declare <WIDTH x float> @__sqrt_varying_float(<WIDTH x float>) nounwind readnone
|
||||||
|
|
||||||
declare double @__sqrt_uniform_double(double) nounwind readnone
|
declare double @__sqrt_uniform_double(double) nounwind readnone
|
||||||
|
|||||||
@@ -515,3 +515,9 @@ define <8 x i16> @__avg_down_int16(<8 x i16>, <8 x i16>) nounwind readnone {
|
|||||||
%r = call <8 x i16> @llvm.arm.neon.vhadds.v8i16(<8 x i16> %0, <8 x i16> %1)
|
%r = call <8 x i16> @llvm.arm.neon.vhadds.v8i16(<8 x i16> %0, <8 x i16> %1)
|
||||||
ret <8 x i16> %r
|
ret <8 x i16> %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|||||||
@@ -485,3 +485,9 @@ define <4 x i16> @__avg_down_int16(<4 x i16>, <4 x i16>) nounwind readnone {
|
|||||||
%r = call <4 x i16> @llvm.arm.neon.vhadds.v4i16(<4 x i16> %0, <4 x i16> %1)
|
%r = call <4 x i16> @llvm.arm.neon.vhadds.v4i16(<4 x i16> %0, <4 x i16> %1)
|
||||||
ret <4 x i16> %r
|
ret <4 x i16> %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|||||||
@@ -581,3 +581,9 @@ define <16 x i16> @__avg_down_int16(<16 x i16>, <16 x i16>) nounwind readnone {
|
|||||||
v8tov16(i16, %r0, %r1, %r)
|
v8tov16(i16, %r0, %r1, %r)
|
||||||
ret <16 x i16> %r
|
ret <16 x i16> %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|||||||
@@ -652,3 +652,9 @@ define <8 x double> @__max_varying_double(<8 x double>, <8 x double>) nounwind r
|
|||||||
binary2to8(ret, double, @llvm.x86.sse2.max.pd, %0, %1)
|
binary2to8(ret, double, @llvm.x86.sse2.max.pd, %0, %1)
|
||||||
ret <8 x double> %ret
|
ret <8 x double> %ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|||||||
@@ -587,3 +587,9 @@ gen_scatter(i32)
|
|||||||
gen_scatter(float)
|
gen_scatter(float)
|
||||||
gen_scatter(i64)
|
gen_scatter(i64)
|
||||||
gen_scatter(double)
|
gen_scatter(double)
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|||||||
@@ -488,3 +488,10 @@ define <8 x i16> @__avg_up_uint16(<8 x i16>, <8 x i16>) {
|
|||||||
define_avg_up_int8()
|
define_avg_up_int8()
|
||||||
define_avg_up_int16()
|
define_avg_up_int16()
|
||||||
define_down_avgs()
|
define_down_avgs()
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|
||||||
|
|||||||
@@ -490,3 +490,10 @@ define <16 x i16> @__avg_up_uint16(<16 x i16>, <16 x i16>) nounwind readnone {
|
|||||||
define_avg_up_int8()
|
define_avg_up_int8()
|
||||||
define_avg_up_int16()
|
define_avg_up_int16()
|
||||||
define_down_avgs()
|
define_down_avgs()
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|
||||||
|
|||||||
@@ -592,3 +592,9 @@ define <8 x double> @__max_varying_double(<8 x double>, <8 x double>) nounwind r
|
|||||||
|
|
||||||
define_avgs()
|
define_avgs()
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|
||||||
|
|||||||
@@ -515,3 +515,9 @@ gen_scatter(double)
|
|||||||
|
|
||||||
define_avgs()
|
define_avgs()
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; reciprocals in double precision, if supported
|
||||||
|
|
||||||
|
rsqrt_double()
|
||||||
|
rcp_double()
|
||||||
|
|
||||||
|
|||||||
@@ -4531,3 +4531,37 @@ define(`define_avgs', `
|
|||||||
define_up_avgs()
|
define_up_avgs()
|
||||||
define_down_avgs()
|
define_down_avgs()
|
||||||
')
|
')
|
||||||
|
|
||||||
|
define(`rsqrt_double', `
|
||||||
|
define double @__rsqrt_uniform_double(double) nounwind alwaysinline readnone
|
||||||
|
{
|
||||||
|
%flt = fptrunc double %0 to float
|
||||||
|
%res = call float @__rsqrt_uniform_float(float %flt)
|
||||||
|
%dres = fpext float %res to double
|
||||||
|
ret double %dres
|
||||||
|
}
|
||||||
|
define <WIDTH x double> @__rsqrt_varying_double(<WIDTH x double>) nounwind alwaysinline readnone
|
||||||
|
{
|
||||||
|
%flt = fptrunc <WIDTH x double> %0 to <WIDTH x float>
|
||||||
|
%res = call <WIDTH x float> @__rsqrt_varying_float(<WIDTH x float> %flt)
|
||||||
|
%dres = fpext <WIDTH x float> %res to <WIDTH x double>
|
||||||
|
ret <WIDTH x double> %dres
|
||||||
|
}
|
||||||
|
')
|
||||||
|
|
||||||
|
define(`rcp_double', `
|
||||||
|
define double @__rcp_uniform_double(double) nounwind alwaysinline readnone
|
||||||
|
{
|
||||||
|
%flt = fptrunc double %0 to float
|
||||||
|
%res = call float @__rcp_uniform_float(float %flt)
|
||||||
|
%dres = fpext float %res to double
|
||||||
|
ret double %dres
|
||||||
|
}
|
||||||
|
define <WIDTH x double> @__rcp_varying_double(<WIDTH x double>) nounwind alwaysinline readnone
|
||||||
|
{
|
||||||
|
%flt = fptrunc <WIDTH x double> %0 to <WIDTH x float>
|
||||||
|
%res = call <WIDTH x float> @__rcp_varying_float(<WIDTH x float> %flt)
|
||||||
|
%dres = fpext <WIDTH x float> %res to <WIDTH x double>
|
||||||
|
ret <WIDTH x double> %dres
|
||||||
|
}
|
||||||
|
')
|
||||||
|
|||||||
@@ -3517,6 +3517,15 @@ static inline uniform double sqrt(uniform double v) {
|
|||||||
return __sqrt_uniform_double(v);
|
return __sqrt_uniform_double(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__declspec(safe)
|
||||||
|
static inline double rsqrt(double v) {
|
||||||
|
return __rsqrt_varying_double(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
__declspec(safe)
|
||||||
|
static inline uniform double rsqrt(uniform double v) {
|
||||||
|
return __rsqrt_uniform_double(v);
|
||||||
|
}
|
||||||
__declspec(safe)
|
__declspec(safe)
|
||||||
static inline double ldexp(double x, int n) {
|
static inline double ldexp(double x, int n) {
|
||||||
unsigned int64 ex = 0x7ff0000000000000;
|
unsigned int64 ex = 0x7ff0000000000000;
|
||||||
|
|||||||
Reference in New Issue
Block a user