aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2016-09-29 11:15:15 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-09-29 15:48:04 +0000
commit1e114f136895a41397483f4454cf6ce0af1206cd (patch)
tree7881aaac86c306d86232cbdf8ef2e5946451a2e5
parent919f21f877a42b8c50531bcf813d7a1bc212f13c (diff)
*SkTCast<int*>(float*) -> memcpy
In some build configurations (I think, GN, GCC 6, Debug) I get a warning that i is used unintialized. This likely has something to do with GCC correctly seeing that the SkTCast construction there is illegal aliasing, and perhaps thus "doesn't happen". Might be that if the SkTCast gets inlined, it decides its implementation is secretly kosher, and so Release builds don't see this. None of this happens with the GCCs we have on the bots... too old? Instead use memcpy() here, which is well defined to do what we intended. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2758 Change-Id: Iaf5c75fbd852193b0b861bf5e71450502511d102 Reviewed-on: https://skia-review.googlesource.com/2758 Commit-Queue: Ben Wagner <bungeman@google.com> Reviewed-by: Ben Wagner <bungeman@google.com>
-rw-r--r--bench/MathBench.cpp12
-rw-r--r--include/private/SkFloatingPoint.h6
2 files changed, 5 insertions, 13 deletions
diff --git a/bench/MathBench.cpp b/bench/MathBench.cpp
index 05a5f8a2d5..541a1052dc 100644
--- a/bench/MathBench.cpp
+++ b/bench/MathBench.cpp
@@ -126,23 +126,13 @@ private:
typedef MathBench INHERITED;
};
-static inline float SkFastInvSqrt(float x) {
- float xhalf = 0.5f*x;
- uint32_t i = *SkTCast<uint32_t*>(&x);
- i = 0x5f3759df - (i>>1);
- x = *SkTCast<float*>(&i);
- x = x*(1.5f-xhalf*x*x);
-// x = x*(1.5f-xhalf*x*x); // this line takes err from 10^-3 to 10^-6
- return x;
-}
-
class FastISqrtMathBench : public MathBench {
public:
FastISqrtMathBench() : INHERITED("fastIsqrt") {}
protected:
void performTest(float* SK_RESTRICT dst, const float* SK_RESTRICT src, int count) override {
for (int i = 0; i < count; ++i) {
- dst[i] = SkFastInvSqrt(src[i]);
+ dst[i] = sk_float_rsqrt(src[i]);
}
}
private:
diff --git a/include/private/SkFloatingPoint.h b/include/private/SkFloatingPoint.h
index 8d8843eb58..6a6edf3651 100644
--- a/include/private/SkFloatingPoint.h
+++ b/include/private/SkFloatingPoint.h
@@ -107,9 +107,11 @@ static const uint32_t kIEEENotANumber = 0x7fffffff;
static inline float sk_float_rsqrt_portable(float x) {
// Get initial estimate.
- int i = *SkTCast<int*>(&x);
+ int i;
+ memcpy(&i, &x, 4);
i = 0x5F1FFFF9 - (i>>1);
- float estimate = *SkTCast<float*>(&i);
+ float estimate;
+ memcpy(&estimate, &i, 4);
// One step of Newton's method to refine.
const float estimate_sq = estimate*estimate;