OSDN Git Service

Implement cast operations.
authorNicolas Capens <capn@google.com>
Fri, 30 Sep 2016 09:04:21 +0000 (05:04 -0400)
committerNicolas Capens <capn@google.com>
Wed, 5 Oct 2016 20:40:43 +0000 (20:40 +0000)
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>
src/Reactor/LLVMReactor.cpp
src/Reactor/Nucleus.hpp
src/Reactor/SubzeroReactor.cpp

index f1d1631..7948012 100644 (file)
@@ -524,16 +524,6 @@ namespace sw
                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));
index a221db3..aae8ad9 100644 (file)
@@ -113,8 +113,6 @@ namespace sw
                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);
 
index bdb00d2..ade6e83 100644 (file)
@@ -498,59 +498,63 @@ namespace sw
                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)