Implement cast operations.
Bug swiftshader:6
Change-Id: I12e1c109c5954ef65ea00750c2d5b027c0c7765a
Reviewed-on: https://swiftshader-review.googlesource.com/7394
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index f1d1631..7948012 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -524,16 +524,6 @@
return V(::builder->CreateFPExt(v, destType));
}
- Value *Nucleus::createPtrToInt(Value *v, Type *destType)
- {
- return V(::builder->CreatePtrToInt(v, destType));
- }
-
- Value *Nucleus::createIntToPtr(Value *v, Type *destType)
- {
- return V(::builder->CreateIntToPtr(v, destType));
- }
-
Value *Nucleus::createBitCast(Value *v, Type *destType)
{
return V(::builder->CreateBitCast(v, destType));
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp
index a221db3..aae8ad9 100644
--- a/src/Reactor/Nucleus.hpp
+++ b/src/Reactor/Nucleus.hpp
@@ -113,8 +113,6 @@
static Value *createSIToFP(Value *V, Type *destType);
static Value *createFPTrunc(Value *V, Type *destType);
static Value *createFPExt(Value *V, Type *destType);
- static Value *createPtrToInt(Value *V, Type *destType);
- static Value *createIntToPtr(Value *V, Type *destType);
static Value *createBitCast(Value *V, Type *destType);
static Value *createIntCast(Value *V, Type *destType, bool isSigned);
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index bdb00d2..ade6e83 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -498,59 +498,63 @@
assert(false && "UNIMPLEMENTED"); return nullptr;
}
+ static Value *createCast(Ice::InstCast::OpKind op, Value *v, Type *destType)
+ {
+ if(T(v->getType()) == destType)
+ {
+ return v;
+ }
+
+ Ice::Variable *result = ::function->makeVariable(T(destType));
+ Ice::InstCast *cast = Ice::InstCast::create(::function, op, result, v);
+ ::basicBlock->appendInst(cast);
+
+ return V(result);
+ }
+
Value *Nucleus::createTrunc(Value *v, Type *destType)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return createCast(Ice::InstCast::Trunc, v, destType);
}
Value *Nucleus::createZExt(Value *v, Type *destType)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return createCast(Ice::InstCast::Zext, v, destType);
}
Value *Nucleus::createSExt(Value *v, Type *destType)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return createCast(Ice::InstCast::Sext, v, destType);
}
Value *Nucleus::createFPToSI(Value *v, Type *destType)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return createCast(Ice::InstCast::Fptosi, v, destType);
}
Value *Nucleus::createUIToFP(Value *v, Type *destType)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return createCast(Ice::InstCast::Uitofp, v, destType);
}
Value *Nucleus::createSIToFP(Value *v, Type *destType)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return createCast(Ice::InstCast::Sitofp, v, destType);
}
Value *Nucleus::createFPTrunc(Value *v, Type *destType)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return createCast(Ice::InstCast::Fptrunc, v, destType);
}
Value *Nucleus::createFPExt(Value *v, Type *destType)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
- }
-
- Value *Nucleus::createPtrToInt(Value *v, Type *destType)
- {
- assert(false && "UNIMPLEMENTED"); return nullptr;
- }
-
- Value *Nucleus::createIntToPtr(Value *v, Type *destType)
- {
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return createCast(Ice::InstCast::Fpext, v, destType);
}
Value *Nucleus::createBitCast(Value *v, Type *destType)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return createCast(Ice::InstCast::Bitcast, v, destType);
}
Value *Nucleus::createIntCast(Value *v, Type *destType, bool isSigned)