Commit 1c58800e by Chris Forbes

Implement some common forms of OpStore

Bug: b/124388146 Change-Id: Ia3c4e6c81432dcfbca5bdd21c857108ee14bda9b Reviewed-on: https://swiftshader-review.googlesource.com/c/24788Reviewed-by: 's avatarBen Clayton <bclayton@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent e9f8f5b1
......@@ -660,6 +660,50 @@ namespace sw
}
break;
}
case spv::OpStore:
{
auto &object = getObject(insn.word(2));
auto &pointer = getObject(insn.word(1));
auto &pointerBase = getObject(pointer.pointerBase);
if (pointerBase.kind == Object::Kind::InterfaceVariable)
{
UNIMPLEMENTED("Location-based store not yet implemented");
}
if (pointerBase.storageClass == spv::StorageClassImage ||
pointerBase.storageClass == spv::StorageClassUniform ||
pointerBase.storageClass == spv::StorageClassUniformConstant)
{
UNIMPLEMENTED("Descriptor-backed store not yet implemented");
}
SpirvRoutine::Value& ptrBase = *(routine->lvalues)[pointer.pointerBase];
auto & src = *(routine->lvalues)[insn.word(2)];
if (pointer.kind == Object::Kind::Value)
{
auto offsets = As<Int4>(*(routine->lvalues)[insn.word(1)]);
for (auto i = 0u; i < object.sizeInComponents; i++)
{
// Scattered store
for (int j = 0; j < 4; j++)
{
auto dst = ptrBase[Int(i) + Extract(offsets, j)];
dst = Insert(dst, Extract(src[i], j), j);
}
}
}
else
{
// no divergent offsets
for (auto i = 0u; i < object.sizeInComponents; i++)
{
ptrBase[i] = src[i];
}
}
break;
}
default:
printf("emit: ignoring opcode %d\n", insn.opcode());
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment