diff options
| author | Yong He <yonghe@outlook.com> | 2024-10-17 20:14:22 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-17 20:14:22 -0700 |
| commit | a618b8c5e249b0f20e6c0c95f9da1b5cbfdbf08b (patch) | |
| tree | d583c373d574a265fefe7f288a96c4b382e259b8 /source/slang/slang-emit-hlsl.cpp | |
| parent | 11e1ecafa09396a3559fe245d729b40ce4f25d52 (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.cpp | 47 |
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)); |
