Fix array addressing of emulated vector types.
operator[] on a pointer was using the vector register size (16 bytes)
instead of the size of the (emulated) vector type.
Change-Id: Ice8677b41a3af81176fe9495fd02ede9f8b0482f
Reviewed-on: https://swiftshader-review.googlesource.com/8569
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 3187777..7ba4e50 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -140,6 +140,25 @@
return reinterpret_cast<BasicBlock*>(b);
}
+ static size_t typeSize(Type *type)
+ {
+ if(reinterpret_cast<std::intptr_t>(type) & EmulatedBits)
+ {
+ switch(reinterpret_cast<std::intptr_t>(type))
+ {
+ case Type_v2i32: return 8;
+ case Type_v4i16: return 8;
+ case Type_v2i16: return 4;
+ case Type_v8i8: return 8;
+ case Type_v4i8: return 4;
+ case Type_v2f32: return 8;
+ default: assert(false);
+ }
+ }
+
+ return Ice::typeWidthInBytes(T(type));
+ }
+
Optimization optimization[10] = {InstructionCombining, Disabled};
using ElfHeader = std::conditional<sizeof(void*) == 8, Elf64_Ehdr, Elf32_Ehdr>::type;
@@ -744,34 +763,12 @@
if(valueType & EmulatedBits)
{
- switch(valueType)
- {
- case Type_v4i8:
- case Type_v2i16:
- {
- const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::LoadSubVector, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
- auto target = ::context->getConstantUndef(Ice::IceType_i32);
- auto load = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
- load->addArg(ptr);
- load->addArg(::context->getConstantInt32(4));
- ::basicBlock->appendInst(load);
- }
- break;
- case Type_v2i32:
- case Type_v8i8:
- case Type_v4i16:
- case Type_v2f32:
- {
- const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::LoadSubVector, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
- auto target = ::context->getConstantUndef(Ice::IceType_i32);
- auto load = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
- load->addArg(ptr);
- load->addArg(::context->getConstantInt32(8));
- ::basicBlock->appendInst(load);
- }
- break;
- default: assert(false && "UNIMPLEMENTED");
- }
+ const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::LoadSubVector, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
+ auto target = ::context->getConstantUndef(Ice::IceType_i32);
+ auto load = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
+ load->addArg(ptr);
+ load->addArg(::context->getConstantInt32(typeSize(type)));
+ ::basicBlock->appendInst(load);
}
else
{
@@ -788,36 +785,13 @@
if(valueType & EmulatedBits)
{
- switch(valueType)
- {
- case Type_v4i8:
- case Type_v2i16:
- {
- const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::StoreSubVector, Ice::Intrinsics::SideEffects_T, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_T};
- auto target = ::context->getConstantUndef(Ice::IceType_i32);
- auto store = Ice::InstIntrinsicCall::create(::function, 3, nullptr, target, intrinsic);
- store->addArg(value);
- store->addArg(ptr);
- store->addArg(::context->getConstantInt32(4));
- ::basicBlock->appendInst(store);
- }
- break;
- case Type_v2i32:
- case Type_v8i8:
- case Type_v4i16:
- case Type_v2f32:
- {
- const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::StoreSubVector, Ice::Intrinsics::SideEffects_T, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_T};
- auto target = ::context->getConstantUndef(Ice::IceType_i32);
- auto store = Ice::InstIntrinsicCall::create(::function, 3, nullptr, target, intrinsic);
- store->addArg(value);
- store->addArg(ptr);
- store->addArg(::context->getConstantInt32(8));
- ::basicBlock->appendInst(store);
- }
- break;
- default: assert(false && "UNIMPLEMENTED");
- }
+ const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::StoreSubVector, Ice::Intrinsics::SideEffects_T, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_T};
+ auto target = ::context->getConstantUndef(Ice::IceType_i32);
+ auto store = Ice::InstIntrinsicCall::create(::function, 3, nullptr, target, intrinsic);
+ store->addArg(value);
+ store->addArg(ptr);
+ store->addArg(::context->getConstantInt32(typeSize(type)));
+ ::basicBlock->appendInst(store);
}
else
{
@@ -836,7 +810,7 @@
if(auto *constant = llvm::dyn_cast<Ice::ConstantInteger32>(index))
{
- int32_t offset = constant->getValue() * (int)Ice::typeWidthInBytes(T(type));
+ int32_t offset = constant->getValue() * (int)typeSize(type);
if(offset == 0)
{
@@ -848,7 +822,7 @@
if(!Ice::isByteSizedType(T(type)))
{
- index = createMul(index, createConstantInt((int)Ice::typeWidthInBytes(T(type))));
+ index = createMul(index, createConstantInt((int)typeSize(type)));
}
if(sizeof(void*) == 8)