Implement Pointer<> support for Subzero.
Bug swiftshader:11
Change-Id: I794ef54a7c2ecde71ee6344c63955d2f838ff189
Reviewed-on: https://swiftshader-review.googlesource.com/7331
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index 9adc3fb..a27b986 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -245,13 +245,24 @@
Value *Nucleus::allocateStackVariable(Type *t, int arraySize)
{
+ assert(arraySize == 0 && "UNIMPLEMENTED");
+
Ice::Type type = T(t);
- Ice::Variable *value = ::function->makeVariable(type);
- assert(type == Ice::IceType_i32 && arraySize == 0 && "UNIMPLEMENTED");
- auto bytes = Ice::ConstantInteger32::create(::context, type, 4);
- auto alloca = Ice::InstAlloca::create(::function, value, bytes, 4);
- ::function->getEntryNode()->appendInst(alloca);
- return V(value);
+
+ int32_t size = 0;
+ switch(type)
+ {
+ case Ice::IceType_i32: size = 4; break;
+ case Ice::IceType_i64: size = 8; break;
+ default: assert(false && "UNIMPLEMENTED" && type);
+ }
+
+ auto bytes = Ice::ConstantInteger32::create(::context, type, size);
+ auto address = ::function->makeVariable(T(getPointerType(t)));
+ auto alloca = Ice::InstAlloca::create(::function, address, bytes, size);
+ ::function->getEntryNode()->getInsts().push_front(alloca);
+
+ return V(address);
}
BasicBlock *Nucleus::createBasicBlock()
@@ -425,9 +436,9 @@
assert(false && "UNIMPLEMENTED"); return nullptr;
}
- Value *Nucleus::createLoad(Value *ptr, bool isVolatile, unsigned int align)
+ Value *Nucleus::createLoad(Value *ptr, Type *type, bool isVolatile, unsigned int align)
{
- Ice::Variable *value = ::function->makeVariable(ptr->getType());
+ Ice::Variable *value = ::function->makeVariable(T(type));
auto load = Ice::InstLoad::create(::function, value, ptr, align);
::basicBlock->appendInst(load);
return V(value);
@@ -687,7 +698,14 @@
Type *Nucleus::getPointerType(Type *ElementType)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ if(sizeof(void*) == 8)
+ {
+ return T(Ice::IceType_i64);
+ }
+ else
+ {
+ return T(Ice::IceType_i32);
+ }
}
Constant *Nucleus::createNullValue(Type *Ty)
@@ -755,14 +773,14 @@
return T(Ice::IceType_void);
}
- LValue::LValue(Type *type, int arraySize)
+ LValue::LValue(Type *type, int arraySize) : type(type)
{
address = Nucleus::allocateStackVariable(type, arraySize);
}
Value *LValue::loadValue(unsigned int alignment) const
{
- return Nucleus::createLoad(address, false, alignment);
+ return Nucleus::createLoad(address, type, false, alignment);
}
Value *LValue::storeValue(Value *value, unsigned int alignment) const