diff --git a/include/sirit/sirit.h b/include/sirit/sirit.h index fc8c721..0003860 100644 --- a/include/sirit/sirit.h +++ b/include/sirit/sirit.h @@ -229,6 +229,10 @@ class Module { Id OpCompositeInsert(Id result_type, Id object, Id composite, const std::vector& indexes = {}); + /// Extract a part of a composite object. + Id OpCompositeExtract(Id result_type, Id composite, + const std::vector& indexes = {}); + // Annotation /// Add a decoration to target. diff --git a/src/insts/memory.cpp b/src/insts/memory.cpp index bffa2c0..7306cd8 100644 --- a/src/insts/memory.cpp +++ b/src/insts/memory.cpp @@ -11,7 +11,7 @@ namespace Sirit { Id Module::OpVariable(Id result_type, spv::StorageClass storage_class, - Id initializer) { + Id initializer) { auto op{std::make_unique(spv::Op::OpVariable, bound++, result_type)}; op->Add(static_cast(storage_class)); if (initializer) { @@ -21,7 +21,7 @@ Id Module::OpVariable(Id result_type, spv::StorageClass storage_class, } Id Module::OpLoad(Id result_type, Id pointer, - std::optional memory_access) { + std::optional memory_access) { auto op{std::make_unique(spv::Op::OpLoad, bound++, result_type)}; op->Add(pointer); if (memory_access) { @@ -31,7 +31,7 @@ Id Module::OpLoad(Id result_type, Id pointer, } Id Module::OpStore(Id pointer, Id object, - std::optional memory_access) { + std::optional memory_access) { auto op{std::make_unique(spv::Op::OpStore)}; op->Add(pointer); op->Add(object); @@ -42,7 +42,7 @@ Id Module::OpStore(Id pointer, Id object, } Id Module::OpAccessChain(Id result_type, Id base, - const std::vector& indexes) { + const std::vector& indexes) { assert(indexes.size() > 0); auto op{std::make_unique(spv::Op::OpAccessChain, bound++, result_type)}; op->Add(base); @@ -51,12 +51,22 @@ Id Module::OpAccessChain(Id result_type, Id base, } Id Module::OpCompositeInsert(Id result_type, Id object, Id composite, - const std::vector& indexes) { - auto op{std::make_unique(spv::Op::OpCompositeInsert, bound++, result_type)}; + const std::vector& indexes) { + auto op{ + std::make_unique(spv::Op::OpCompositeInsert, bound++, result_type)}; op->Add(object); op->Add(composite); op->Add(indexes); return AddCode(std::move(op)); } +Id Module::OpCompositeExtract(Id result_type, Id composite, + const std::vector& indexes) { + auto op{std::make_unique(spv::Op::OpCompositeExtract, bound++, + result_type)}; + op->Add(composite); + op->Add(indexes); + return AddCode(std::move(op)); +} + } // namespace Sirit