Commit d3a2d3d7 by Alexis Hetu Committed by Alexis Hétu

New read/write cases for integer types

Added new read/write functionality for integer types. Also added cases for integer types in some utility functions. Change-Id: I5efc7c4957d3a1591b47a5df888a9534776033be Reviewed-on: https://swiftshader-review.googlesource.com/4114Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 506ef481
...@@ -209,49 +209,103 @@ namespace sw ...@@ -209,49 +209,103 @@ namespace sw
template<const int n> template<const int n>
inline unsigned int unorm(float x) inline unsigned int unorm(float x)
{ {
const unsigned int max = 0xFFFFFFFF >> (32 - n); static const unsigned int max = 0xFFFFFFFF >> (32 - n);
static const float maxf = static_cast<float>(max);
if(x > 1) if(x >= 1.0f)
{ {
return max; return max;
} }
else if(x < 0) else if(x <= 0.0f)
{ {
return 0; return 0;
} }
else else
{ {
return (unsigned int)(max * x + 0.5f); return static_cast<unsigned int>(maxf * x + 0.5f);
} }
} }
template<const int n> template<const int n>
inline int snorm(float x) inline int snorm(float x)
{ {
const unsigned int min = 0x80000000 >> (32 - n); static const unsigned int min = 0x80000000 >> (32 - n);
const unsigned int max = 0xFFFFFFFF >> (32 - n + 1); static const unsigned int max = 0xFFFFFFFF >> (32 - n + 1);
const unsigned int range = 0xFFFFFFFF >> (32 - n); static const float maxf = static_cast<float>(max);
static const unsigned int range = 0xFFFFFFFF >> (32 - n);
if(x > 0) if(x >= 0.0f)
{ {
if(x > 1) if(x >= 1.0f)
{ {
return max; return max;
} }
else else
{ {
return (int)(max * x + 0.5f); return static_cast<int>(maxf * x + 0.5f);
} }
} }
else else
{ {
if(x < -1) if(x <= -1.0f)
{ {
return min; return min;
} }
else else
{ {
return (int)(max * x - 0.5f) & range; return static_cast<int>(maxf * x - 0.5f) & range;
}
}
}
template<const int n>
inline unsigned int ucast(float x)
{
static const unsigned int max = 0xFFFFFFFF >> (32 - n);
static const float maxf = static_cast<float>(max);
if(x >= maxf)
{
return max;
}
else if(x <= 0.0f)
{
return 0;
}
else
{
return static_cast<unsigned int>(x + 0.5f);
}
}
template<const int n>
inline int scast(float x)
{
static const unsigned int min = 0x80000000 >> (32 - n);
static const unsigned int max = 0xFFFFFFFF >> (32 - n + 1);
static const float maxf = static_cast<float>(max);
static const unsigned int range = 0xFFFFFFFF >> (32 - n);
if(x > 0.0f)
{
if(x >= maxf)
{
return max;
}
else
{
return static_cast<int>(maxf * x + 0.5f);
}
}
else
{
if(x <= -1.0f)
{
return min;
}
else
{
return static_cast<int>(maxf * x - 0.5f) & range;
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment