Implement negation and inversion.
Bug swiftshader:6
Change-Id: I1eaef2745f6e1aa3defb39f408df36e654f97b4d
Reviewed-on: https://swiftshader-review.googlesource.com/7956
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-on: https://swiftshader-review.googlesource.com/8161
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index d5a19b2..7b23e56 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -95,7 +95,7 @@
return reinterpret_cast<Value*>(v);
}
- Value *C(Ice::Constant *c) // Only safe for casting right-hand side operand
+ Value *C(Ice::Constant *c)
{
return reinterpret_cast<Value*>(c);
}
@@ -644,17 +644,30 @@
Value *Nucleus::createNeg(Value *v)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return createSub(createNullValue(T(v->getType())), v);
}
Value *Nucleus::createFNeg(Value *v)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ double c[4] = {-0.0, -0.0, -0.0, -0.0};
+ Value *negativeZero = Ice::isVectorType(v->getType()) ?
+ createConstantVector(c, T(v->getType())) :
+ C(::context->getConstantFloat(-0.0f));
+
+ return createFSub(negativeZero, v);
}
Value *Nucleus::createNot(Value *v)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ if(Ice::isScalarIntegerType(v->getType()))
+ {
+ return createXor(v, C(::context->getConstantInt(v->getType(), -1)));
+ }
+ else // Vector
+ {
+ int64_t c[4] = {-1, -1, -1, -1};
+ return createXor(v, createConstantVector(c, T(v->getType())));
+ }
}
Value *Nucleus::createLoad(Value *ptr, Type *type, bool isVolatile, unsigned int align)
@@ -3157,12 +3170,12 @@
RValue<Short4> operator-(RValue<Short4> val)
{
- assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
+ return RValue<Short4>(Nucleus::createNeg(val.value));
}
RValue<Short4> operator~(RValue<Short4> val)
{
- assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
+ return RValue<Short4>(Nucleus::createNot(val.value));
}
RValue<Short4> RoundShort4(RValue<Float4> cast)
@@ -3512,7 +3525,7 @@
RValue<UShort4> operator~(RValue<UShort4> val)
{
- assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
+ return RValue<UShort4>(Nucleus::createNot(val.value));
}
RValue<UShort4> Max(RValue<UShort4> x, RValue<UShort4> y)
@@ -4748,7 +4761,7 @@
RValue<Int2> operator~(RValue<Int2> val)
{
- assert(false && "UNIMPLEMENTED"); return RValue<Int2>(V(nullptr));
+ return RValue<Int2>(Nucleus::createNot(val.value));
}
RValue<Long1> UnpackLow(RValue<Int2> x, RValue<Int2> y)