summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-hlsl.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-10-17 20:14:22 -0700
committerGitHub <noreply@github.com>2024-10-17 20:14:22 -0700
commita618b8c5e249b0f20e6c0c95f9da1b5cbfdbf08b (patch)
treed583c373d574a265fefe7f288a96c4b382e259b8 /source/slang/slang-emit-hlsl.cpp
parent11e1ecafa09396a3559fe245d729b40ce4f25d52 (diff)
Cleanup atomic intrinsics. (#5324)
* Cleanup atomic intrinsics. * Fix. * Fix glsl. * Remove hacky intrinsic expansion logic for glsl image atomics. * Fix all tests. * Fix. * Add `InterlockedAddF16Emulated`. * Fix glsl intrinsic. * Fix.
Diffstat (limited to 'source/slang/slang-emit-hlsl.cpp')
-rw-r--r--source/slang/slang-emit-hlsl.cpp47
1 files changed, 36 insertions, 11 deletions
diff --git a/source/slang/slang-emit-hlsl.cpp b/source/slang/slang-emit-hlsl.cpp
index b45b4c575..ae87fd6d5 100644
--- a/source/slang/slang-emit-hlsl.cpp
+++ b/source/slang/slang-emit-hlsl.cpp
@@ -498,6 +498,10 @@ void HLSLSourceEmitter::emitEntryPointAttributesImpl(IRFunc* irFunc, IREntryPoin
bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
+ auto diagnoseFloatAtommic = [&]()
+ {
+ getSink()->diagnose(inst, Diagnostics::unsupportedTargetIntrinsic, "floating point atomic operation");
+ };
switch (inst->getOp())
{
case kIROp_AtomicLoad:
@@ -519,7 +523,8 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedExchange(");
+ m_writer->emit("InterlockedExchange");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", ");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
@@ -532,7 +537,10 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedCompareExchange(");
+ m_writer->emit("InterlockedCompareExchange");
+ if (inst->getDataType()->getOp() == kIROp_FloatType)
+ m_writer->emit("FloatBitwise");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", ");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
@@ -547,7 +555,12 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedAdd(");
+ if (inst->getDataType()->getOp() == kIROp_FloatType)
+ {
+ diagnoseFloatAtommic();
+ }
+ m_writer->emit("InterlockedAdd");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", ");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
@@ -560,7 +573,12 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedAdd(");
+ if (inst->getDataType()->getOp() == kIROp_FloatType)
+ {
+ diagnoseFloatAtommic();
+ }
+ m_writer->emit("InterlockedAdd");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", -(");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
@@ -573,7 +591,8 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedAnd(");
+ m_writer->emit("InterlockedAnd");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", ");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
@@ -586,7 +605,8 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedOr(");
+ m_writer->emit("InterlockedOr");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", ");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
@@ -599,7 +619,8 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedXor(");
+ m_writer->emit("InterlockedXor");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", ");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
@@ -612,7 +633,8 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedMin(");
+ m_writer->emit("InterlockedMin");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", ");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
@@ -625,7 +647,8 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedMax(");
+ m_writer->emit("InterlockedMax");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", ");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
@@ -638,7 +661,8 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedAdd(");
+ m_writer->emit("InterlockedAdd");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", 1, ");
m_writer->emit(getName(inst));
@@ -649,7 +673,8 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
emitType(inst->getDataType(), getName(inst));
m_writer->emit(";\n");
- m_writer->emit("InterlockedAdd(");
+ m_writer->emit("InterlockedAdd");
+ m_writer->emit("(");
emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
m_writer->emit(", -1, ");
m_writer->emit(getName(inst));