Skip to content

Commit 7b6a3f6

Browse files
committed
--Updated the test file
1 parent e700f15 commit 7b6a3f6

File tree

8 files changed

+401
-1
lines changed

8 files changed

+401
-1
lines changed

llvm/docs/SPIRVUsage.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,9 @@ Below is a list of supported SPIR-V extensions, sorted alphabetically by their e
241241
- Adds predicated load and store instructions that conditionally read from or write to memory based on a boolean predicate.
242242
* - ``SPV_KHR_maximal_reconvergence``
243243
- Adds execution mode and capability to enable maximal reconvergence.
244+
* - ``SPV_INTEL_arbitrary_precision_fixed_point``
245+
- Add instructions for fixed point arithmetic. The extension works without SPV_INTEL_arbitrary_precision_integers, but together they allow greater flexibility in representing arbitrary precision data types.
246+
244247

245248
SPIR-V representation in LLVM IR
246249
================================

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2390,6 +2390,77 @@ static bool generateBindlessImageINTELInst(const SPIRV::IncomingCall *Call,
23902390
return buildBindlessImageINTELInst(Call, Opcode, MIRBuilder, GR);
23912391
}
23922392

2393+
static bool buildAPFixedPointInst(const SPIRV::IncomingCall *Call,
2394+
unsigned Opcode, MachineIRBuilder &MIRBuilder,
2395+
SPIRVGlobalRegistry *GR) {
2396+
MachineRegisterInfo *MRI = MIRBuilder.getMRI();
2397+
SmallVector<uint32_t, 1> ImmArgs;
2398+
Register InputReg = Call->Arguments[0];
2399+
const Type *RetTy = GR->getTypeForSPIRVType(Call->ReturnType);
2400+
bool IsSRet = RetTy->isVoidTy();
2401+
2402+
if (IsSRet) {
2403+
const LLT ValTy = MRI->getType(InputReg);
2404+
Register ActualRetValReg = MRI->createGenericVirtualRegister(ValTy);
2405+
SPIRVType *InstructionType =
2406+
GR->getPointeeType(GR->getSPIRVTypeForVReg(InputReg));
2407+
InputReg = Call->Arguments[1];
2408+
auto InputType = GR->getTypeForSPIRVType(GR->getSPIRVTypeForVReg(InputReg));
2409+
Register PtrInputReg;
2410+
if (InputType->getTypeID() == llvm::Type::TypeID::TypedPointerTyID) {
2411+
LLT InputLLT = MRI->getType(InputReg);
2412+
PtrInputReg = MRI->createGenericVirtualRegister(InputLLT);
2413+
SPIRVType *PtrType =
2414+
GR->getPointeeType(GR->getSPIRVTypeForVReg(InputReg));
2415+
MachineMemOperand *MMO1 = MIRBuilder.getMF().getMachineMemOperand(
2416+
MachinePointerInfo(), MachineMemOperand::MOLoad,
2417+
InputLLT.getSizeInBytes(), Align(4));
2418+
MIRBuilder.buildLoad(PtrInputReg, InputReg, *MMO1);
2419+
MRI->setRegClass(PtrInputReg, &SPIRV::iIDRegClass);
2420+
GR->assignSPIRVTypeToVReg(PtrType, PtrInputReg, MIRBuilder.getMF());
2421+
}
2422+
2423+
for (unsigned index = 2; index < 7; index++) {
2424+
ImmArgs.push_back(getConstFromIntrinsic(Call->Arguments[index], MRI));
2425+
}
2426+
2427+
// Emit the instruction
2428+
auto MIB = MIRBuilder.buildInstr(Opcode)
2429+
.addDef(ActualRetValReg)
2430+
.addUse(GR->getSPIRVTypeID(InstructionType));
2431+
if (PtrInputReg)
2432+
MIB.addUse(PtrInputReg);
2433+
else
2434+
MIB.addUse(InputReg);
2435+
2436+
for (uint32_t Imm : ImmArgs)
2437+
MIB.addImm(Imm);
2438+
unsigned Size = ValTy.getSizeInBytes();
2439+
// Store result to the pointer passed in Arg[0]
2440+
MachineMemOperand *MMO = MIRBuilder.getMF().getMachineMemOperand(
2441+
MachinePointerInfo(), MachineMemOperand::MOStore, Size, Align(4));
2442+
MRI->setRegClass(ActualRetValReg, &SPIRV::pIDRegClass);
2443+
MIRBuilder.buildStore(ActualRetValReg, Call->Arguments[0], *MMO);
2444+
return true;
2445+
} else {
2446+
for (unsigned index = 1; index < 6; index++)
2447+
ImmArgs.push_back(getConstFromIntrinsic(Call->Arguments[index], MRI));
2448+
2449+
return buildOpFromWrapper(MIRBuilder, Opcode, Call,
2450+
GR->getSPIRVTypeID(Call->ReturnType), ImmArgs);
2451+
}
2452+
}
2453+
2454+
static bool generateAPFixedPointInst(const SPIRV::IncomingCall *Call,
2455+
MachineIRBuilder &MIRBuilder,
2456+
SPIRVGlobalRegistry *GR) {
2457+
const SPIRV::DemangledBuiltin *Builtin = Call->Builtin;
2458+
unsigned Opcode =
2459+
SPIRV::lookupNativeBuiltin(Builtin->Name, Builtin->Set)->Opcode;
2460+
2461+
return buildAPFixedPointInst(Call, Opcode, MIRBuilder, GR);
2462+
}
2463+
23932464
static bool
23942465
generateTernaryBitwiseFunctionINTELInst(const SPIRV::IncomingCall *Call,
23952466
MachineIRBuilder &MIRBuilder,
@@ -3042,6 +3113,8 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
30423113
return generateExtendedBitOpsInst(Call.get(), MIRBuilder, GR);
30433114
case SPIRV::BindlessINTEL:
30443115
return generateBindlessImageINTELInst(Call.get(), MIRBuilder, GR);
3116+
case SPIRV::ArbitraryPrecisionFixedPoint:
3117+
return generateAPFixedPointInst(Call.get(), MIRBuilder, GR);
30453118
case SPIRV::TernaryBitwiseINTEL:
30463119
return generateTernaryBitwiseFunctionINTELInst(Call.get(), MIRBuilder, GR);
30473120
case SPIRV::Block2DLoadStore:

llvm/lib/Target/SPIRV/SPIRVBuiltins.td

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def TernaryBitwiseINTEL : BuiltinGroup;
7171
def Block2DLoadStore : BuiltinGroup;
7272
def Pipe : BuiltinGroup;
7373
def PredicatedLoadStore : BuiltinGroup;
74+
def ArbitraryPrecisionFixedPoint : BuiltinGroup;
7475

7576
//===----------------------------------------------------------------------===//
7677
// Class defining a demangled builtin record. The information in the record
@@ -1176,6 +1177,19 @@ defm : DemangledNativeBuiltin<"clock_read_hilo_work_group", OpenCL_std, KernelCl
11761177
defm : DemangledNativeBuiltin<"clock_read_hilo_sub_group", OpenCL_std, KernelClock, 0, 0, OpReadClockKHR>;
11771178
defm : DemangledNativeBuiltin<"__spirv_ReadClockKHR", OpenCL_std, KernelClock, 1, 1, OpReadClockKHR>;
11781179

1180+
//SPV_INTEL_arbitrary_precision_fixed_point
1181+
defm : DemangledNativeBuiltin<"__spirv_FixedSqrtINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedSqrtINTEL>;
1182+
defm : DemangledNativeBuiltin<"__spirv_FixedRecipINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedRecipINTEL>;
1183+
defm : DemangledNativeBuiltin<"__spirv_FixedRsqrtINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedRsqrtINTEL>;
1184+
defm : DemangledNativeBuiltin<"__spirv_FixedSinINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedSinINTEL>;
1185+
defm : DemangledNativeBuiltin<"__spirv_FixedCosINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedCosINTEL>;
1186+
defm : DemangledNativeBuiltin<"__spirv_FixedSinCosINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedSinCosINTEL>;
1187+
defm : DemangledNativeBuiltin<"__spirv_FixedSinPiINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedSinPiINTEL>;
1188+
defm : DemangledNativeBuiltin<"__spirv_FixedCosPiINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedCosPiINTEL>;
1189+
defm : DemangledNativeBuiltin<"__spirv_FixedSinCosPiINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedSinCosPiINTEL>;
1190+
defm : DemangledNativeBuiltin<"__spirv_FixedLogINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedLogINTEL>;
1191+
defm : DemangledNativeBuiltin<"__spirv_FixedExpINTEL", OpenCL_std, ArbitraryPrecisionFixedPoint, 6 , 8, OpFixedExpINTEL>;
1192+
11791193
//===----------------------------------------------------------------------===//
11801194
// Class defining an atomic instruction on floating-point numbers.
11811195
//

llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,11 @@ static const std::map<std::string, SPIRV::Extension::Extension, std::less<>>
159159
{"SPV_KHR_maximal_reconvergence",
160160
SPIRV::Extension::Extension::SPV_KHR_maximal_reconvergence},
161161
{"SPV_INTEL_kernel_attributes",
162-
SPIRV::Extension::Extension::SPV_INTEL_kernel_attributes}};
162+
SPIRV::Extension::Extension::SPV_INTEL_kernel_attributes},
163+
{"SPV_INTEL_int4", SPIRV::Extension::Extension::SPV_INTEL_int4},
164+
{"SPV_INTEL_arbitrary_precision_fixed_point",
165+
SPIRV::Extension::Extension::
166+
SPV_INTEL_arbitrary_precision_fixed_point}};
163167

164168
bool SPIRVExtensionsParser::parse(cl::Option &O, StringRef ArgName,
165169
StringRef ArgValue,

llvm/lib/Target/SPIRV/SPIRVInstrInfo.td

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -993,3 +993,28 @@ def OpPredicatedLoadINTEL: Op<6528, (outs ID:$res), (ins TYPE:$resType, ID:$ptr,
993993
"$res = OpPredicatedLoadINTEL $resType $ptr $predicate $default_value">;
994994
def OpPredicatedStoreINTEL: Op<6529, (outs), (ins ID:$ptr, ID:$object, ID:$predicate, variable_ops),
995995
"OpPredicatedStoreINTEL $ptr $object $predicate">;
996+
997+
//SPV_INTEL_arbitrary_precision_fixed_point
998+
def OpFixedSqrtINTEL: Op<5923, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
999+
"$res = OpFixedSqrtINTEL $result_type $input $sign $l $rl $q $o">;
1000+
def OpFixedRecipINTEL: Op<5924, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
1001+
"$res = OpFixedRecipINTEL $result_type $input $sign $l $rl $q $o">;
1002+
def OpFixedRsqrtINTEL: Op<5925, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
1003+
"$res = OpFixedRsqrtINTEL $result_type $input $sign $l $rl $q $o">;
1004+
def OpFixedSinINTEL: Op<5926, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
1005+
"$res = OpFixedSinINTEL $result_type $input $sign $l $rl $q $o">;
1006+
def OpFixedCosINTEL: Op<5927, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
1007+
"$res = OpFixedCosINTEL $result_type $input $sign $l $rl $q $o">;
1008+
def OpFixedSinCosINTEL: Op<5928, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
1009+
"$res = OpFixedSinCosINTEL $result_type $input $sign $l $rl $q $o">;
1010+
def OpFixedSinPiINTEL: Op<5929, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
1011+
"$res = OpFixedSinPiINTEL $result_type $input $sign $l $rl $q $o">;
1012+
def OpFixedCosPiINTEL: Op<5930, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
1013+
"$res = OpFixedCosPiINTEL $result_type $input $sign $l $rl $q $o">;
1014+
def OpFixedSinCosPiINTEL: Op<5931, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
1015+
"$res = OpFixedSinCosPiINTEL $result_type $input $sign $l $rl $q $o">;
1016+
def OpFixedLogINTEL: Op<5932, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
1017+
"$res = OpFixedLogINTEL $result_type $input $sign $l $rl $q $o">;
1018+
def OpFixedExpINTEL: Op<5933, (outs ID:$res), (ins TYPE:$result_type, ID:$input, i32imm:$sign, i32imm:$l, i32imm:$rl, i32imm:$q, i32imm:$o),
1019+
"$res = OpFixedExpINTEL $result_type $input $sign $l $rl $q $o">;
1020+

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,6 +1670,27 @@ void addInstrRequirements(const MachineInstr &MI,
16701670
Reqs.addCapability(SPIRV::Capability::GroupNonUniformRotateKHR);
16711671
Reqs.addCapability(SPIRV::Capability::GroupNonUniform);
16721672
break;
1673+
case SPIRV::OpFixedCosINTEL:
1674+
case SPIRV::OpFixedSinINTEL:
1675+
case SPIRV::OpFixedCosPiINTEL:
1676+
case SPIRV::OpFixedSinPiINTEL:
1677+
case SPIRV::OpFixedExpINTEL:
1678+
case SPIRV::OpFixedLogINTEL:
1679+
case SPIRV::OpFixedRecipINTEL:
1680+
case SPIRV::OpFixedSqrtINTEL:
1681+
case SPIRV::OpFixedSinCosINTEL:
1682+
case SPIRV::OpFixedSinCosPiINTEL:
1683+
case SPIRV::OpFixedRsqrtINTEL:
1684+
if (!ST.canUseExtension(
1685+
SPIRV::Extension::SPV_INTEL_arbitrary_precision_fixed_point))
1686+
report_fatal_error("This instruction requires the "
1687+
"following SPIR-V extension: "
1688+
"SPV_INTEL_arbitrary_precision_fixed_point",
1689+
false);
1690+
Reqs.addExtension(
1691+
SPIRV::Extension::SPV_INTEL_arbitrary_precision_fixed_point);
1692+
Reqs.addCapability(SPIRV::Capability::ArbitraryPrecisionFixedPointINTEL);
1693+
break;
16731694
case SPIRV::OpGroupIMulKHR:
16741695
case SPIRV::OpGroupFMulKHR:
16751696
case SPIRV::OpGroupBitwiseAndKHR:

llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ defm SPV_INTEL_predicated_io : ExtensionOperand<127, [EnvOpenCL]>;
389389
defm SPV_KHR_maximal_reconvergence : ExtensionOperand<128, [EnvVulkan]>;
390390
defm SPV_INTEL_bfloat16_arithmetic
391391
: ExtensionOperand<129, [EnvVulkan, EnvOpenCL]>;
392+
defm SPV_INTEL_arbitrary_precision_fixed_point : ExtensionOperand<130, [EnvOpenCL]>;
392393

393394
//===----------------------------------------------------------------------===//
394395
// Multiclass used to define Capabilities enum values and at the same time
@@ -608,9 +609,13 @@ defm PredicatedIOINTEL : CapabilityOperand<6257, 0, 0, [SPV_INTEL_predicated_io]
608609
defm Int4TypeINTEL : CapabilityOperand<5112, 0, 0, [SPV_INTEL_int4], []>;
609610
defm Int4CooperativeMatrixINTEL : CapabilityOperand<5114, 0, 0, [SPV_INTEL_int4], [Int4TypeINTEL, CooperativeMatrixKHR]>;
610611
defm TensorFloat32RoundingINTEL : CapabilityOperand<6425, 0, 0, [SPV_INTEL_tensor_float32_conversion], []>;
612+
<<<<<<< HEAD
611613
defm BFloat16TypeKHR : CapabilityOperand<5116, 0, 0, [SPV_KHR_bfloat16], []>;
612614
defm BFloat16DotProductKHR : CapabilityOperand<5117, 0, 0, [SPV_KHR_bfloat16], [BFloat16TypeKHR]>;
613615
defm BFloat16CooperativeMatrixKHR : CapabilityOperand<5118, 0, 0, [SPV_KHR_bfloat16], [BFloat16TypeKHR, CooperativeMatrixKHR]>;
616+
=======
617+
defm ArbitraryPrecisionFixedPointINTEL : CapabilityOperand<5922, 0, 0, [SPV_INTEL_arbitrary_precision_fixed_point], []>;
618+
>>>>>>> 3bfee8723b1d (--Updated the test file)
614619

615620
//===----------------------------------------------------------------------===//
616621
// Multiclass used to define SourceLanguage enum values and at the same time

0 commit comments

Comments
 (0)