Merge pull request #569 from dbabokin/unmasked
Fix for incorrect implementation of reduce_[min|max]_[float|double]
This commit is contained in:
44
stdlib.ispc
44
stdlib.ispc
@@ -918,9 +918,14 @@ static inline uniform float reduce_min(float v) {
|
|||||||
// For the lanes where the mask is off, replace the given value with
|
// For the lanes where the mask is off, replace the given value with
|
||||||
// infinity, so that it doesn't affect the result.
|
// infinity, so that it doesn't affect the result.
|
||||||
int iflt_max = 0x7f800000; // infinity
|
int iflt_max = 0x7f800000; // infinity
|
||||||
// Must use __floatbits_varying_int32, not floatbits(), since with the
|
// unmasked block is needed to make sure that argument for unmasked
|
||||||
// latter the current mask enters into the returned result...
|
// function __reduce_min_float() are calculated without a mask.
|
||||||
return __reduce_min_float(__mask ? v : __floatbits_varying_int32(iflt_max));
|
bool test = __mask;
|
||||||
|
uniform float result;
|
||||||
|
unmasked {
|
||||||
|
result = __reduce_min_float(test ? v : floatbits(iflt_max));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
__declspec(safe)
|
__declspec(safe)
|
||||||
@@ -928,9 +933,14 @@ static inline uniform float reduce_max(float v) {
|
|||||||
// For the lanes where the mask is off, replace the given value with
|
// For the lanes where the mask is off, replace the given value with
|
||||||
// negative infinity, so that it doesn't affect the result.
|
// negative infinity, so that it doesn't affect the result.
|
||||||
const int iflt_neg_max = 0xff800000; // -infinity
|
const int iflt_neg_max = 0xff800000; // -infinity
|
||||||
// Must use __floatbits_varying_int32, not floatbits(), since with the
|
// unmasked block is needed to make sure that argument for unmasked
|
||||||
// latter the current mask enters into the returned result...
|
// function __reduce_max_float() are calculated without a mask.
|
||||||
return __reduce_max_float(__mask ? v : __floatbits_varying_int32(iflt_neg_max));
|
bool test = __mask;
|
||||||
|
uniform float result;
|
||||||
|
unmasked {
|
||||||
|
result = __reduce_max_float(test ? v : floatbits(iflt_neg_max));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
__declspec(safe)
|
__declspec(safe)
|
||||||
@@ -986,17 +996,27 @@ static inline uniform double reduce_add(double x) {
|
|||||||
__declspec(safe)
|
__declspec(safe)
|
||||||
static inline uniform double reduce_min(double v) {
|
static inline uniform double reduce_min(double v) {
|
||||||
int64 iflt_max = 0x7ff0000000000000; // infinity
|
int64 iflt_max = 0x7ff0000000000000; // infinity
|
||||||
// Must use __doublebits_varying_int64, not doublebits(), since with the
|
// unmasked block is needed to make sure that argument for unmasked
|
||||||
// latter the current mask enters into the returned result...
|
// function __reduce_min_double() are calculated without a mask.
|
||||||
return __reduce_min_double(__mask ? v : __doublebits_varying_int64(iflt_max));
|
bool test = __mask;
|
||||||
|
uniform double result;
|
||||||
|
unmasked {
|
||||||
|
result = __reduce_min_double(test ? v : doublebits(iflt_max));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
__declspec(safe)
|
__declspec(safe)
|
||||||
static inline uniform double reduce_max(double v) {
|
static inline uniform double reduce_max(double v) {
|
||||||
const int64 iflt_neg_max = 0xfff0000000000000; // -infinity
|
const int64 iflt_neg_max = 0xfff0000000000000; // -infinity
|
||||||
// Must use __doublebits_varying_int64, not doublebits(), since with the
|
// unmasked block is needed to make sure that argument for unmasked
|
||||||
// latter the current mask enters into the returned result...
|
// function __reduce_max_double() are calculated without a mask.
|
||||||
return __reduce_max_double(__mask ? v : __doublebits_varying_int64(iflt_neg_max));
|
bool test = __mask;
|
||||||
|
uniform double result;
|
||||||
|
unmasked {
|
||||||
|
result = __reduce_max_double(test ? v : doublebits(iflt_neg_max));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
__declspec(safe)
|
__declspec(safe)
|
||||||
|
|||||||
Reference in New Issue
Block a user