summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir.cpp
diff options
context:
space:
mode:
authorkaizhangNV <149626564+kaizhangNV@users.noreply.github.com>2024-12-12 16:50:44 -0600
committerGitHub <noreply@github.com>2024-12-12 14:50:44 -0800
commit78c9bd1c2fbd55889e62a2032e9bc96684ced3b5 (patch)
tree63332e647aa597450b642751c8c6b2fd7f66439e /source/slang/slang-ir.cpp
parentb4e63d7bc44fc969d24202fc51a774378a489294 (diff)
Bit extract (#5847)
* promoting bitfield extraction and insertion to become intrinsics for internal compiler use * removing duplicate intrinsics from glsl.meta.slang * refactor: update function signatures of bitfield extraction and insertion to use uint as the parameter type for offset and bits. --------- Co-authored-by: Nate Morrical <natemorrical@gmail.com> Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-ir.cpp')
-rw-r--r--source/slang/slang-ir.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp
index d1c16a3a1..5e5d94b14 100644
--- a/source/slang/slang-ir.cpp
+++ b/source/slang/slang-ir.cpp
@@ -1951,6 +1951,20 @@ static T* createInst(
}
template<typename T>
+static T* createInst(
+ IRBuilder* builder,
+ IROp op,
+ IRType* type,
+ IRInst* arg1,
+ IRInst* arg2,
+ IRInst* arg3,
+ IRInst* arg4)
+{
+ IRInst* args[] = {arg1, arg2, arg3, arg4};
+ return createInstImpl<T>(builder, op, type, 4, &args[0]);
+}
+
+template<typename T>
static T* createInstWithTrailingArgs(
IRBuilder* builder,
IROp op,
@@ -3625,7 +3639,25 @@ IRInst* IRBuilder::emitLookupInterfaceMethodInst(
IRInst* IRBuilder::emitGetSequentialIDInst(IRInst* rttiObj)
{
auto inst = createInst<IRAlloca>(this, kIROp_GetSequentialID, getUIntType(), rttiObj);
+ addInst(inst);
+ return inst;
+}
+IRInst* IRBuilder::emitBitfieldExtract(IRType* type, IRInst* value, IRInst* offset, IRInst* bits)
+{
+ auto inst = createInst<IRInst>(this, kIROp_BitfieldExtract, type, value, offset, bits);
+ addInst(inst);
+ return inst;
+}
+
+IRInst* IRBuilder::emitBitfieldInsert(
+ IRType* type,
+ IRInst* base,
+ IRInst* insert,
+ IRInst* offset,
+ IRInst* bits)
+{
+ auto inst = createInst<IRInst>(this, kIROp_BitfieldInsert, type, base, insert, offset, bits);
addInst(inst);
return inst;
}
@@ -8188,6 +8220,8 @@ bool IRInst::mightHaveSideEffects(SideEffectAnalysisOptions options)
case kIROp_PtrCast:
case kIROp_CastDynamicResource:
case kIROp_AllocObj:
+ case kIROp_BitfieldExtract:
+ case kIROp_BitfieldInsert:
case kIROp_PackAnyValue:
case kIROp_UnpackAnyValue:
case kIROp_Reinterpret: