[llvm] [DirectX][SPIR-V] Fix `copysign` backend lowering (PR #217421)
Farzon Lotfi via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 19 11:33:40 PDT 2026
================
@@ -1575,6 +1578,57 @@ bool SPIRVInstructionSelector::selectExtInst(Register ResVReg,
return false;
}
+bool SPIRVInstructionSelector::selectCopySign(Register ResVReg,
+ SPIRVTypeInst ResType,
+ MachineInstr &I) const {
+ if (STI.canUseExtInstSet(SPIRV::InstructionSet::OpenCL_std))
+ return selectExtInst(ResVReg, ResType, I, CL::copysign);
+
+ // There is no copysign instruction in the GLSL Extended Instruction set, so
+ // it is implemented with bit manipulation:
+ // bitcast((bitcast(magnitude) & ~signBit) | (bitcast(sign) & signBit))
+ Register MagnitudeReg = I.getOperand(1).getReg();
+ Register SignReg = I.getOperand(2).getReg();
+
+ const unsigned BitWidth = GR.getScalarOrVectorBitWidth(ResType);
+ const unsigned ComponentCount = GR.getScalarOrVectorComponentCount(ResType);
+ const bool IsVector = ComponentCount > 1;
+
+ SPIRVTypeInst IntType = GR.getOrCreateSPIRVIntegerType(BitWidth, I, TII);
+ if (IsVector)
+ IntType = GR.getOrCreateSPIRVVectorType(IntType, ComponentCount, I, TII);
+
+ const APInt SignMaskVal = APInt::getSignMask(BitWidth);
+ Register SignMask =
+ IsVector ? GR.getOrCreateConstVector(SignMaskVal, I, IntType, TII)
+ : GR.getOrCreateConstInt(SignMaskVal, I, IntType, TII);
+ Register NotSignMask =
+ IsVector ? GR.getOrCreateConstVector(~SignMaskVal, I, IntType, TII)
----------------
farzonl wrote:
same for the `IsVector` conditions below.
https://github.com/llvm/llvm-project/pull/217421
More information about the llvm-commits
mailing list