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)