Commit 8ef6d109 by Alexis Hetu Committed by Alexis Hétu

isnan and isinf implementation

Added the missing implementation for isinf and isnan. Change-Id: Ice603956a4ed8ef9515ae8f501b2876ce5fab584 Reviewed-on: https://swiftshader-review.googlesource.com/13608Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent d27cdd56
...@@ -5791,6 +5791,16 @@ namespace sw ...@@ -5791,6 +5791,16 @@ namespace sw
return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGT(x.value, y.value), Int4::getType())); return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGT(x.value, y.value), Int4::getType()));
} }
RValue<Int4> IsInf(RValue<Float4> x)
{
return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000));
}
RValue<Int4> IsNan(RValue<Float4> x)
{
return ~CmpEQ(x, x);
}
RValue<Float4> Round(RValue<Float4> x) RValue<Float4> Round(RValue<Float4> x)
{ {
if(CPUID::supportsSSE4_1()) if(CPUID::supportsSSE4_1())
......
...@@ -2110,6 +2110,8 @@ namespace sw ...@@ -2110,6 +2110,8 @@ namespace sw
RValue<Int4> CmpNEQ(RValue<Float4> x, RValue<Float4> y); RValue<Int4> CmpNEQ(RValue<Float4> x, RValue<Float4> y);
RValue<Int4> CmpNLT(RValue<Float4> x, RValue<Float4> y); RValue<Int4> CmpNLT(RValue<Float4> x, RValue<Float4> y);
RValue<Int4> CmpNLE(RValue<Float4> x, RValue<Float4> y); RValue<Int4> CmpNLE(RValue<Float4> x, RValue<Float4> y);
RValue<Int4> IsInf(RValue<Float4> x);
RValue<Int4> IsNan(RValue<Float4> x);
RValue<Float4> Round(RValue<Float4> x); RValue<Float4> Round(RValue<Float4> x);
RValue<Float4> Trunc(RValue<Float4> x); RValue<Float4> Trunc(RValue<Float4> x);
RValue<Float4> Frac(RValue<Float4> x); RValue<Float4> Frac(RValue<Float4> x);
......
...@@ -6967,6 +6967,16 @@ namespace sw ...@@ -6967,6 +6967,16 @@ namespace sw
return RValue<Int4>(Nucleus::createFCmpOGT(x.value, y.value)); return RValue<Int4>(Nucleus::createFCmpOGT(x.value, y.value));
} }
RValue<Int4> IsInf(RValue<Float4> x)
{
return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000));
}
RValue<Int4> IsNan(RValue<Float4> x)
{
return ~CmpEQ(x, x);
}
RValue<Float4> Round(RValue<Float4> x) RValue<Float4> Round(RValue<Float4> x)
{ {
if(emulateIntrinsics || CPUID::ARM) if(emulateIntrinsics || CPUID::ARM)
......
...@@ -230,6 +230,8 @@ namespace sw ...@@ -230,6 +230,8 @@ namespace sw
case Shader::OPCODE_LRP: lrp(d, s0, s1, s2); break; case Shader::OPCODE_LRP: lrp(d, s0, s1, s2); break;
case Shader::OPCODE_STEP: step(d, s0, s1); break; case Shader::OPCODE_STEP: step(d, s0, s1); break;
case Shader::OPCODE_SMOOTH: smooth(d, s0, s1, s2); break; case Shader::OPCODE_SMOOTH: smooth(d, s0, s1, s2); break;
case Shader::OPCODE_ISINF: isinf(d, s0); break;
case Shader::OPCODE_ISNAN: isnan(d, s0); break;
case Shader::OPCODE_FLOATBITSTOINT: case Shader::OPCODE_FLOATBITSTOINT:
case Shader::OPCODE_FLOATBITSTOUINT: case Shader::OPCODE_FLOATBITSTOUINT:
case Shader::OPCODE_INTBITSTOFLOAT: case Shader::OPCODE_INTBITSTOFLOAT:
......
...@@ -1030,6 +1030,22 @@ namespace sw ...@@ -1030,6 +1030,22 @@ namespace sw
dst.w = src0.w * (src1.w - src2.w) + src2.w; dst.w = src0.w * (src1.w - src2.w) + src2.w;
} }
void ShaderCore::isinf(Vector4f &dst, const Vector4f &src)
{
dst.x = As<Float4>(IsInf(src.x));
dst.y = As<Float4>(IsInf(src.y));
dst.z = As<Float4>(IsInf(src.z));
dst.w = As<Float4>(IsInf(src.w));
}
void ShaderCore::isnan(Vector4f &dst, const Vector4f &src)
{
dst.x = As<Float4>(IsNan(src.x));
dst.y = As<Float4>(IsNan(src.y));
dst.z = As<Float4>(IsNan(src.z));
dst.w = As<Float4>(IsNan(src.w));
}
void ShaderCore::smooth(Vector4f &dst, const Vector4f &edge0, const Vector4f &edge1, const Vector4f &x) void ShaderCore::smooth(Vector4f &dst, const Vector4f &edge0, const Vector4f &edge1, const Vector4f &x)
{ {
Float4 tx = Min(Max((x.x - edge0.x) / (edge1.x - edge0.x), Float4(0.0f)), Float4(1.0f)); dst.x = tx * tx * (Float4(3.0f) - Float4(2.0f) * tx); Float4 tx = Min(Max((x.x - edge0.x) / (edge1.x - edge0.x), Float4(0.0f)), Float4(1.0f)); dst.x = tx * tx * (Float4(3.0f) - Float4(2.0f) * tx);
......
...@@ -282,6 +282,8 @@ namespace sw ...@@ -282,6 +282,8 @@ namespace sw
void lit(Vector4f &dst, const Vector4f &src); void lit(Vector4f &dst, const Vector4f &src);
void att(Vector4f &dst, const Vector4f &src0, const Vector4f &src1); void att(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void lrp(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2); void lrp(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
void isinf(Vector4f &dst, const Vector4f &src);
void isnan(Vector4f &dst, const Vector4f &src);
void smooth(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2); void smooth(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
void packHalf2x16(Vector4f &dst, const Vector4f &src); void packHalf2x16(Vector4f &dst, const Vector4f &src);
void unpackHalf2x16(Vector4f &dst, const Vector4f &src); void unpackHalf2x16(Vector4f &dst, const Vector4f &src);
......
...@@ -208,6 +208,8 @@ namespace sw ...@@ -208,6 +208,8 @@ namespace sw
case Shader::OPCODE_LRP: lrp(d, s0, s1, s2); break; case Shader::OPCODE_LRP: lrp(d, s0, s1, s2); break;
case Shader::OPCODE_STEP: step(d, s0, s1); break; case Shader::OPCODE_STEP: step(d, s0, s1); break;
case Shader::OPCODE_SMOOTH: smooth(d, s0, s1, s2); break; case Shader::OPCODE_SMOOTH: smooth(d, s0, s1, s2); break;
case Shader::OPCODE_ISINF: isinf(d, s0); break;
case Shader::OPCODE_ISNAN: isnan(d, s0); break;
case Shader::OPCODE_FLOATBITSTOINT: case Shader::OPCODE_FLOATBITSTOINT:
case Shader::OPCODE_FLOATBITSTOUINT: case Shader::OPCODE_FLOATBITSTOUINT:
case Shader::OPCODE_INTBITSTOFLOAT: case Shader::OPCODE_INTBITSTOFLOAT:
......
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