Fix floating-point constant vector initialization. Bug swiftshader:17 Change-Id: Idc1ea72f71770eb1378afb850d16026430adef60 Reviewed-on: https://swiftshader-review.googlesource.com/7754 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com> Reviewed-on: https://swiftshader-review.googlesource.com/8135 Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp index 67d5edb..52fca8b 100644 --- a/src/Reactor/SubzeroReactor.cpp +++ b/src/Reactor/SubzeroReactor.cpp
@@ -1124,63 +1124,78 @@ assert(false && "UNIMPLEMENTED"); return nullptr; } - Value *Nucleus::createConstantVector(const int64_t *c, Type *type) + Value *Nucleus::createConstantVector(const int64_t *constants, Type *type) { const int vectorSize = 16; assert(Ice::typeWidthInBytes(T(type)) == vectorSize); const int alignment = vectorSize; auto globalPool = ::function->getGlobalPool(); + const int64_t *i = constants; + const double *f = reinterpret_cast<const double*>(constants); Ice::VariableDeclaration::DataInitializer *dataInitializer = nullptr; + switch((int)reinterpret_cast<intptr_t>(type)) { case Ice::IceType_v4i32: + { + const int initializer[4] = {(int)i[0], (int)i[1], (int)i[2], (int)i[3]}; + static_assert(sizeof(initializer) == vectorSize, "!"); + dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); + } + break; case Ice::IceType_v4f32: { - const int initializer[4] = {(int)c[0], (int)c[1], (int)c[2], (int)c[3]}; + const float initializer[4] = {(float)f[0], (float)f[1], (float)f[2], (float)f[3]}; static_assert(sizeof(initializer) == vectorSize, "!"); dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); } break; case Ice::IceType_v8i16: { - const short initializer[8] = {(short)c[0], (short)c[1], (short)c[2], (short)c[3], (short)c[4], (short)c[5], (short)c[6], (short)c[7]}; + const short initializer[8] = {(short)i[0], (short)i[1], (short)i[2], (short)i[3], (short)i[4], (short)i[5], (short)i[6], (short)i[7]}; static_assert(sizeof(initializer) == vectorSize, "!"); dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); } break; case Ice::IceType_v16i8: { - const char initializer[16] = {(char)c[0], (char)c[1], (char)c[2], (char)c[3], (char)c[4], (char)c[5], (char)c[6], (char)c[7], (char)c[8], (char)c[9], (char)c[10], (char)c[11], (char)c[12], (char)c[13], (char)c[14], (char)c[15]}; + const char initializer[16] = {(char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[4], (char)i[5], (char)i[6], (char)i[7], (char)i[8], (char)i[9], (char)i[10], (char)i[11], (char)i[12], (char)i[13], (char)i[14], (char)i[15]}; static_assert(sizeof(initializer) == vectorSize, "!"); dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); } break; case Type_v2i32: + { + const int initializer[4] = {(int)i[0], (int)i[1], (int)i[0], (int)i[1]}; + static_assert(sizeof(initializer) == vectorSize, "!"); + dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); + } + break; case Type_v2f32: { - const int initializer[4] = {(int)c[0], (int)c[1], (int)c[0], (int)c[1]}; + const float initializer[4] = {(float)f[0], (float)f[1], (float)f[0], (float)f[1]}; static_assert(sizeof(initializer) == vectorSize, "!"); dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); } break; case Type_v4i16: { - const short initializer[8] = {(short)c[0], (short)c[1], (short)c[2], (short)c[3], (short)c[0], (short)c[1], (short)c[2], (short)c[3]}; + const short initializer[8] = {(short)i[0], (short)i[1], (short)i[2], (short)i[3], (short)i[0], (short)i[1], (short)i[2], (short)i[3]}; static_assert(sizeof(initializer) == vectorSize, "!"); dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); } break; case Type_v8i8: { - const char initializer[16] = {(char)c[0], (char)c[1], (char)c[2], (char)c[3], (char)c[4], (char)c[5], (char)c[6], (char)c[7], (char)c[0], (char)c[1], (char)c[2], (char)c[3], (char)c[4], (char)c[5], (char)c[6], (char)c[7]}; + const char initializer[16] = {(char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[4], (char)i[5], (char)i[6], (char)i[7], (char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[4], (char)i[5], (char)i[6], (char)i[7]}; static_assert(sizeof(initializer) == vectorSize, "!"); dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); } break; case Type_v4i8: { - const char initializer[16] = {(char)c[0], (char)c[1], (char)c[2], (char)c[3], (char)c[0], (char)c[1], (char)c[2], (char)c[3], (char)c[0], (char)c[1], (char)c[2], (char)c[3], (char)c[0], (char)c[1], (char)c[2], (char)c[3]}; + const char initializer[16] = {(char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[0], (char)i[1], (char)i[2], (char)i[3]}; static_assert(sizeof(initializer) == vectorSize, "!"); dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); }