Skip to content

Commit d109c0a

Browse files
[SPIRV] Added Support for the SPV_INTEL_arbitrary_precesion_floating_point
1 parent 019913e commit d109c0a

File tree

8 files changed

+472
-0
lines changed

8 files changed

+472
-0
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2746,6 +2746,49 @@ static bool generateVectorLoadStoreInst(const SPIRV::IncomingCall *Call,
27462746
return true;
27472747
}
27482748

2749+
static bool generateAFPInst(const SPIRV::IncomingCall *Call,
2750+
MachineIRBuilder &MIRBuilder,
2751+
SPIRVGlobalRegistry *GR) {
2752+
const auto *Builtin = Call->Builtin;
2753+
auto *MRI = MIRBuilder.getMRI();
2754+
unsigned Opcode =
2755+
SPIRV::lookupNativeBuiltin(Builtin->Name, Builtin->Set)->Opcode;
2756+
const Type *RetTy = GR->getTypeForSPIRVType(Call->ReturnType);
2757+
bool IsVoid = RetTy->isVoidTy();
2758+
auto MIB = MIRBuilder.buildInstr(Opcode);
2759+
Register DestReg;
2760+
if (IsVoid) {
2761+
LLT PtrTy = MRI->getType(Call->Arguments[0]);
2762+
DestReg = MRI->createGenericVirtualRegister(PtrTy);
2763+
MRI->setRegClass(DestReg, &SPIRV::pIDRegClass);
2764+
SPIRVType *PointeeTy =
2765+
GR->getPointeeType(GR->getSPIRVTypeForVReg(Call->Arguments[0]));
2766+
MIB.addDef(DestReg);
2767+
MIB.addUse(GR->getSPIRVTypeID(PointeeTy));
2768+
} else {
2769+
MIB.addDef(Call->ReturnRegister);
2770+
MIB.addUse(GR->getSPIRVTypeID(Call->ReturnType));
2771+
}
2772+
for (unsigned i = IsVoid ? 1 : 0; i < Call->Arguments.size(); ++i) {
2773+
Register Arg = Call->Arguments[i];
2774+
MachineInstr *DefMI = MRI->getUniqueVRegDef(Arg);
2775+
if (DefMI->getOpcode() == TargetOpcode::G_CONSTANT &&
2776+
DefMI->getOperand(1).isCImm()) {
2777+
MIB.addImm(getConstFromIntrinsic(Arg, MRI));
2778+
} else {
2779+
MIB.addUse(Arg);
2780+
}
2781+
}
2782+
if (IsVoid) {
2783+
LLT PtrTy = MRI->getType(Call->Arguments[0]);
2784+
MachineMemOperand *MMO = MIRBuilder.getMF().getMachineMemOperand(
2785+
MachinePointerInfo(), MachineMemOperand::MOStore,
2786+
PtrTy.getSizeInBytes(), Align(4));
2787+
MIRBuilder.buildStore(DestReg, Call->Arguments[0], *MMO);
2788+
}
2789+
return true;
2790+
}
2791+
27492792
static bool generateLoadStoreInst(const SPIRV::IncomingCall *Call,
27502793
MachineIRBuilder &MIRBuilder,
27512794
SPIRVGlobalRegistry *GR) {
@@ -2948,6 +2991,8 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
29482991
return generateTernaryBitwiseFunctionINTELInst(Call.get(), MIRBuilder, GR);
29492992
case SPIRV::Block2DLoadStore:
29502993
return generate2DBlockIOINTELInst(Call.get(), MIRBuilder, GR);
2994+
case SPIRV::ArbitraryFloatingPoint:
2995+
return generateAFPInst(Call.get(), MIRBuilder, GR);
29512996
}
29522997
return false;
29532998
}

llvm/lib/Target/SPIRV/SPIRVBuiltins.td

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ def ExtendedBitOps : BuiltinGroup;
6969
def BindlessINTEL : BuiltinGroup;
7070
def TernaryBitwiseINTEL : BuiltinGroup;
7171
def Block2DLoadStore : BuiltinGroup;
72+
def ArbitraryFloatingPoint: BuiltinGroup;
7273

7374
//===----------------------------------------------------------------------===//
7475
// Class defining a demangled builtin record. The information in the record
@@ -713,6 +714,49 @@ defm : DemangledNativeBuiltin<"__spirv_CooperativeMatrixStoreCheckedINTEL", Open
713714
defm : DemangledNativeBuiltin<"__spirv_CooperativeMatrixConstructCheckedINTEL", OpenCL_std, CoopMatr, 5, 5, OpCooperativeMatrixConstructCheckedINTEL>;
714715
defm : DemangledNativeBuiltin<"__spirv_CooperativeMatrixGetElementCoordINTEL", OpenCL_std, CoopMatr, 2, 2, OpCooperativeMatrixGetElementCoordINTEL>;
715716

717+
// Arbitrary Precision Floating Point builtin records:
718+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatGTINTEL", OpenCL_std, ArbitraryFloatingPoint, 4, 4, OpArbitraryFloatGTINTEL>;
719+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatGEINTEL", OpenCL_std, ArbitraryFloatingPoint, 4, 4, OpArbitraryFloatGEINTEL>;
720+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatLTINTEL", OpenCL_std, ArbitraryFloatingPoint, 4, 4, OpArbitraryFloatLTINTEL>;
721+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatLEINTEL", OpenCL_std, ArbitraryFloatingPoint, 4, 4, OpArbitraryFloatLEINTEL>;
722+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatEQINTEL", OpenCL_std, ArbitraryFloatingPoint, 4, 4, OpArbitraryFloatEQINTEL>;
723+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatRecipINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatRecipINTEL>;
724+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatCbrtINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatCbrtINTEL>;
725+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatHypotINTEL", OpenCL_std, ArbitraryFloatingPoint, 8, 8, OpArbitraryFloatHypotINTEL>;
726+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatSqrtINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatSqrtINTEL>;
727+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatLogINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatLogINTEL>;
728+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatLog2INTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatLog2INTEL>;
729+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatLog10INTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatLog10INTEL>;
730+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatLog1pINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatLog1pINTEL>;
731+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatExpINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatExpINTEL>;
732+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatExp2INTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatExp2INTEL>;
733+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatExp10INTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatExp10INTEL>;
734+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatExpm1INTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatExpm1INTEL>;
735+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatSinINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatSinINTEL>;
736+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatCosINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatCosINTEL>;
737+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatSinCosINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatSinCosINTEL>;
738+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatSinPiINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatSinPiINTEL>;
739+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatCosPiINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatCosPiINTEL>;
740+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatSinCosPiINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatSinCosPiINTEL>;
741+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatAddINTEL", OpenCL_std, ArbitraryFloatingPoint, 8, 8, OpArbitraryFloatAddINTEL>;
742+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatSubINTEL", OpenCL_std, ArbitraryFloatingPoint, 8, 8, OpArbitraryFloatSubINTEL>;
743+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatMulINTEL", OpenCL_std, ArbitraryFloatingPoint, 8, 8, OpArbitraryFloatMulINTEL>;
744+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatDivINTEL", OpenCL_std, ArbitraryFloatingPoint, 8, 8, OpArbitraryFloatDivINTEL>;
745+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatRSqrtINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatRSqrtINTEL>;
746+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatASinINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatASinINTEL>;
747+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatASinPiINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatASinPiINTEL>;
748+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatACosINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatACosINTEL>;
749+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatACosPiINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatACosPiINTEL>;
750+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatATanINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatATanINTEL>;
751+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatATanPiINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatATanPiINTEL>;
752+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatATan2INTEL", OpenCL_std, ArbitraryFloatingPoint, 8, 8, OpArbitraryFloatATan2INTEL>;
753+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatPowINTEL", OpenCL_std, ArbitraryFloatingPoint, 8, 8, OpArbitraryFloatPowINTEL>;
754+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatPowRINTEL", OpenCL_std, ArbitraryFloatingPoint, 8, 8, OpArbitraryFloatPowRINTEL>;
755+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatPowNINTEL", OpenCL_std, ArbitraryFloatingPoint, 8, 8, OpArbitraryFloatPowNINTEL>;
756+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatCastINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatCastINTEL>;
757+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatCastFromIntINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatCastFromIntINTEL>;
758+
defm : DemangledNativeBuiltin<"__spirv_ArbitraryFloatCastToIntINTEL", OpenCL_std, ArbitraryFloatingPoint, 6, 6, OpArbitraryFloatCastToIntINTEL>;
759+
716760
// SPV_INTEL_bindless_images builtin records:
717761
defm : DemangledNativeBuiltin<"__spirv_ConvertHandleToImageINTEL", OpenCL_std, BindlessINTEL, 1, 1, OpConvertHandleToImageINTEL>;
718762
defm : DemangledNativeBuiltin<"__spirv_ConvertHandleToSamplerINTEL", OpenCL_std, BindlessINTEL, 1, 1, OpConvertHandleToSamplerINTEL>;

llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ static const std::map<std::string, SPIRV::Extension::Extension, std::less<>>
5353
SPIRV::Extension::Extension::SPV_GOOGLE_user_type},
5454
{"SPV_INTEL_arbitrary_precision_integers",
5555
SPIRV::Extension::Extension::SPV_INTEL_arbitrary_precision_integers},
56+
{"SPV_INTEL_arbitrary_precision_floating_point",
57+
SPIRV::Extension::Extension::
58+
SPV_INTEL_arbitrary_precision_floating_point},
5659
{"SPV_INTEL_cache_controls",
5760
SPIRV::Extension::Extension::SPV_INTEL_cache_controls},
5861
{"SPV_INTEL_float_controls2",

0 commit comments

Comments
 (0)