[llvm] [SPIRV] Implement translation for llvm.modf.* intrinsics (PR #147556)
Dmitry Sidorov via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 9 06:04:13 PDT 2025
================
@@ -3990,6 +3995,77 @@ bool SPIRVInstructionSelector::selectLog10(Register ResVReg,
.constrainAllUses(TII, TRI, RBI);
}
+bool SPIRVInstructionSelector::selectModf(Register ResVReg,
+ const SPIRVType *ResType,
+ MachineInstr &I) const {
+ // llvm.modf has a single arg --the number to be decomposed-- and returns a
+ // struct { restype, restype }, while OpenCLLIB::modf has two args --the
+ // number to be decomposed and a pointer--, returns the fractional part and
+ // the integral part is stored in the pointer argument. Therefore, we can't
+ // use directly the OpenCLLIB::modf intrinsic. However, we can do some
+ // scaffolding to make it work. The idea is to create an alloca instruction
+ // to get a ptr, pass this ptr to OpenCL::modf, and then load the value
+ // from this ptr to place it in the struct. llvm.modf returns the fractional
+ // part as the first element of the result, and the integral part as the
+ // second element of the result.
+
+ // At this point, the return type is not a struct anymore, but rather two
+ // independent elements of SPIRVResType. We can get each independent element
+ // from I.getDefs() or I.getOperands().
+ ExtInstList ExtInsts = {{SPIRV::InstructionSet::OpenCL_std, CL::modf},
+ {SPIRV::InstructionSet::GLSL_std_450, GL::Modf}};
+ for (const auto &Ex : ExtInsts) {
+ SPIRV::InstructionSet::InstructionSet Set = Ex.first;
+ uint32_t Opcode = Ex.second;
----------------
MrSidims wrote:
Agree with Viktor, that it's probably better to use if/else here, but for a different reason. From https://registry.khronos.org/SPIR-V/specs/unified1/GLSL.std.450.html : `Modf is deprecated, use ModfStruct instead.` and `ModfStruct` has a different semantic. I don't have strong opinion whether to generate `ModfStruct` in this patch right away (up to you to decide), but obviously handling for `ModfStruct` will be different.
BTW, please leave `FIXME` comment in case if you don't want to generate `ModfStruct` right away.
https://github.com/llvm/llvm-project/pull/147556
More information about the llvm-commits
mailing list