Implement vector extract, insert, and swizzle.
Bug swiftshader:15
Change-Id: I81f88999e183ce3617d923249335ff02d6a9f1b1
Reviewed-on: https://swiftshader-review.googlesource.com/7396
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/Main.cpp b/src/Reactor/Main.cpp
index a7aa820..e1887b5 100644
--- a/src/Reactor/Main.cpp
+++ b/src/Reactor/Main.cpp
@@ -50,6 +50,10 @@
z += (2 << i) - (i / 3);
}
+ Float4 v;
+ v.z = As<Float>(z);
+ z = As<Int>(Float(Float4(v.xzxx).y));
+
Int sum = x + y + z;
Return(sum);
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index 13c83eb..b4cd724 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -695,12 +695,20 @@
Value *Nucleus::createExtractElement(Value *vector, Type *type, int index)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ auto result = ::function->makeVariable(T(type));
+ auto extract = Ice::InstExtractElement::create(::function, result, vector, ::context->getConstantInt32(index));
+ ::basicBlock->appendInst(extract);
+
+ return V(result);
}
Value *Nucleus::createInsertElement(Value *vector, Value *element, int index)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ auto result = ::function->makeVariable(vector->getType());
+ auto insert = Ice::InstInsertElement::create(::function, result, vector, element, ::context->getConstantInt32(index));
+ ::basicBlock->appendInst(insert);
+
+ return V(result);
}
Value *Nucleus::createShuffleVector(Value *V1, Value *V2, Value *mask)
@@ -730,7 +738,15 @@
static Value *createSwizzle4(Value *val, unsigned char select)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ auto result = ::function->makeVariable(val->getType());
+ auto shuffle = Ice::InstShuffleVector::create(::function, result, val, val);
+ shuffle->addIndex(Ice::ConstantInteger32::create(::context, Ice::IceType_i32, (select >> 0) & 0x03));
+ shuffle->addIndex(Ice::ConstantInteger32::create(::context, Ice::IceType_i32, (select >> 2) & 0x03));
+ shuffle->addIndex(Ice::ConstantInteger32::create(::context, Ice::IceType_i32, (select >> 4) & 0x03));
+ shuffle->addIndex(Ice::ConstantInteger32::create(::context, Ice::IceType_i32, (select >> 6) & 0x03));
+ ::basicBlock->appendInst(shuffle);
+
+ return V(result);
}
static Value *createMask4(Value *lhs, Value *rhs, unsigned char select)
@@ -5227,7 +5243,7 @@
Type *Float::getType()
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return T(Ice::IceType_f32);
}
Float2::Float2(RValue<Float4> cast)
@@ -5615,7 +5631,7 @@
Type *Float4::getType()
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return T(Ice::IceType_v4f32);
}
RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)