diff options
| author | Lioncash <mathew1800@gmail.com> | 2017-01-23 15:48:14 -0500 |
|---|---|---|
| committer | Lioncash <mathew1800@gmail.com> | 2017-01-23 16:05:32 -0500 |
| commit | 1f596a23af0baafab89c7d101868380ccfe07dc2 (patch) | |
| tree | 271c0ebb054ca3972b013f43b5402134be677249 /Source/Core | |
| parent | 98311cd9f4c4a568d4e3790c2fba98714634dd30 (diff) | |
BPMemory: Eliminate union type punning
This is undefined behavior in C++.
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/VideoCommon/BPMemory.cpp | 24 | ||||
| -rw-r--r-- | Source/Core/VideoCommon/BPMemory.h | 24 |
2 files changed, 26 insertions, 22 deletions
diff --git a/Source/Core/VideoCommon/BPMemory.cpp b/Source/Core/VideoCommon/BPMemory.cpp index 1665976018..67eeb994b1 100644 --- a/Source/Core/VideoCommon/BPMemory.cpp +++ b/Source/Core/VideoCommon/BPMemory.cpp @@ -4,6 +4,30 @@ #include "VideoCommon/BPMemory.h" +#include <cstring> + // BP state // STATE_TO_SAVE BPMemory bpmem; + +float FogParam0::GetA() const +{ + // scale mantissa from 11 to 23 bits + const u32 integral = (static_cast<u32>(sign) << 31) | (static_cast<u32>(exponent) << 23) | + (static_cast<u32>(mantissa) << 12); + + float real; + std::memcpy(&real, &integral, sizeof(u32)); + return real; +} + +float FogParam3::GetC() const +{ + // scale mantissa from 11 to 23 bits + const u32 integral = (static_cast<u32>(c_sign) << 31) | (static_cast<u32>(c_exp) << 23) | + (static_cast<u32>(c_mant) << 12); + + float real; + std::memcpy(&real, &integral, sizeof(u32)); + return real; +} diff --git a/Source/Core/VideoCommon/BPMemory.h b/Source/Core/VideoCommon/BPMemory.h index 96a657fced..17033bfbe9 100644 --- a/Source/Core/VideoCommon/BPMemory.h +++ b/Source/Core/VideoCommon/BPMemory.h @@ -674,17 +674,7 @@ union FogParam0 u32 sign : 1; }; - float GetA() - { - union - { - u32 i; - float f; - } dummy; - dummy.i = ((u32)sign << 31) | ((u32)exponent << 23) | - ((u32)mantissa << 12); // scale mantissa from 11 to 23 bits - return dummy.f; - } + float GetA() const; u32 hex; }; @@ -701,17 +691,7 @@ union FogParam3 }; // amount to subtract from eyespacez after range adjustment - float GetC() - { - union - { - u32 i; - float f; - } dummy; - dummy.i = ((u32)c_sign << 31) | ((u32)c_exp << 23) | - ((u32)c_mant << 12); // scale mantissa from 11 to 23 bits - return dummy.f; - } + float GetC() const; u32 hex; }; |
