+1
This commit is contained in:
@@ -497,6 +497,8 @@ lSetInternalFunctions(llvm::Module *module) {
|
||||
"__prefetch_read_uniform_nt",
|
||||
"__rcp_uniform_float",
|
||||
"__rcp_varying_float",
|
||||
"__rcp_uniform_double",
|
||||
"__rcp_varying_double",
|
||||
"__rdrand_i16",
|
||||
"__rdrand_i32",
|
||||
"__rdrand_i64",
|
||||
@@ -534,6 +536,8 @@ lSetInternalFunctions(llvm::Module *module) {
|
||||
"__round_varying_float",
|
||||
"__rsqrt_uniform_float",
|
||||
"__rsqrt_varying_float",
|
||||
"__rsqrt_uniform_double",
|
||||
"__rsqrt_varying_double",
|
||||
"__set_system_isa",
|
||||
"__sext_uniform_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)
|
||||
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(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()
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; 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 @__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 <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 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 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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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(i64)
|
||||
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_int16()
|
||||
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_int16()
|
||||
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()
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; reciprocals in double precision, if supported
|
||||
|
||||
rsqrt_double()
|
||||
rcp_double()
|
||||
|
||||
|
||||
@@ -515,3 +515,9 @@ gen_scatter(double)
|
||||
|
||||
define_avgs()
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; reciprocals in double precision, if supported
|
||||
|
||||
rsqrt_double()
|
||||
rcp_double()
|
||||
|
||||
|
||||
@@ -4531,3 +4531,37 @@ define(`define_avgs', `
|
||||
define_up_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);
|
||||
}
|
||||
|
||||
__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)
|
||||
static inline double ldexp(double x, int n) {
|
||||
unsigned int64 ex = 0x7ff0000000000000;
|
||||
|
||||
Reference in New Issue
Block a user