Skip to content

Commit 13c7385

Browse files
NikitaRudenkoIntelvladimirlaz
authored andcommitted
Add infrastructure for SPV_INTEL_float_controls2 extension
Extension is published at intel#1611
1 parent 16b732b commit 13c7385

File tree

9 files changed

+138
-4
lines changed

9 files changed

+138
-4
lines changed

llvm-spirv/include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ EXT(SPV_INTEL_io_pipes)
1919
EXT(SPV_INTEL_inline_assembly)
2020
EXT(SPV_INTEL_arbitrary_precision_integers)
2121
EXT(SPV_INTEL_optimization_hints)
22+
EXT(SPV_INTEL_float_controls2)

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2541,6 +2541,18 @@ bool LLVMToSPIRV::transExecutionMode() {
25412541
BF->addExecutionMode(BM->add(new SPIRVExecutionMode(
25422542
BF, static_cast<ExecutionMode>(EMode), TargetWidth)));
25432543
} break;
2544+
case spv::ExecutionModeRoundingModeRTPINTEL:
2545+
case spv::ExecutionModeRoundingModeRTNINTEL:
2546+
case spv::ExecutionModeFloatingPointModeALTINTEL:
2547+
case spv::ExecutionModeFloatingPointModeIEEEINTEL: {
2548+
if (!BM->isAllowedToUseExtension(
2549+
ExtensionID::SPV_INTEL_float_controls2))
2550+
break;
2551+
unsigned TargetWidth;
2552+
N.get(TargetWidth);
2553+
BF->addExecutionMode(BM->add(new SPIRVExecutionMode(
2554+
BF, static_cast<ExecutionMode>(EMode), TargetWidth)));
2555+
} break;
25442556
default:
25452557
llvm_unreachable("invalid execution mode");
25462558
}

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVEntry.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,10 @@ void SPIRVExecutionMode::decode(std::istream &I) {
487487
case ExecutionModeSignedZeroInfNanPreserve:
488488
case ExecutionModeRoundingModeRTE:
489489
case ExecutionModeRoundingModeRTZ:
490+
case ExecutionModeRoundingModeRTPINTEL:
491+
case ExecutionModeRoundingModeRTNINTEL:
492+
case ExecutionModeFloatingPointModeALTINTEL:
493+
case ExecutionModeFloatingPointModeIEEEINTEL:
490494
case ExecutionModeSubgroupSize:
491495
case ExecutionModeMaxWorkDimINTEL:
492496
case ExecutionModeNumSIMDWorkitemsINTEL:

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVEntry.h

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -674,21 +674,28 @@ class SPIRVComponentExecutionModes {
674674
public:
675675
void addExecutionMode(SPIRVExecutionMode *ExecMode) {
676676
// There should not be more than 1 execution mode kind except the ones
677-
// mentioned in SPV_KHR_float_controls.
677+
// mentioned in SPV_KHR_float_controls and SPV_INTEL_float_controls2.
678678
#ifndef NDEBUG
679679
auto IsDenorm = [](auto EMK) {
680680
return EMK == ExecutionModeDenormPreserve ||
681681
EMK == ExecutionModeDenormFlushToZero;
682682
};
683683
auto IsRoundingMode = [](auto EMK) {
684684
return EMK == ExecutionModeRoundingModeRTE ||
685-
EMK == ExecutionModeRoundingModeRTZ;
685+
EMK == ExecutionModeRoundingModeRTZ ||
686+
EMK == ExecutionModeRoundingModeRTPINTEL ||
687+
EMK == ExecutionModeRoundingModeRTNINTEL;
688+
};
689+
auto IsFPMode = [](auto EMK) {
690+
return EMK == ExecutionModeFloatingPointModeALTINTEL ||
691+
EMK == ExecutionModeFloatingPointModeIEEEINTEL;
686692
};
687693
auto IsOtherFP = [](auto EMK) {
688694
return EMK == ExecutionModeSignedZeroInfNanPreserve;
689695
};
690696
auto IsFloatControl = [&](auto EMK) {
691-
return IsDenorm(EMK) || IsRoundingMode(EMK) || IsOtherFP(EMK);
697+
return IsDenorm(EMK) || IsRoundingMode(EMK) || IsFPMode(EMK) ||
698+
IsOtherFP(EMK);
692699
};
693700
auto IsCompatible = [&](SPIRVExecutionMode *EM0, SPIRVExecutionMode *EM1) {
694701
if (EM0->getTargetId() != EM1->getTargetId())
@@ -702,7 +709,8 @@ class SPIRVComponentExecutionModes {
702709
if (TW0 != TW1)
703710
return true;
704711
return !(IsDenorm(EMK0) && IsDenorm(EMK1)) &&
705-
!(IsRoundingMode(EMK0) && IsRoundingMode(EMK1));
712+
!(IsRoundingMode(EMK0) && IsRoundingMode(EMK1)) &&
713+
!(IsFPMode(EMK0) && IsFPMode(EMK1));
706714
};
707715
for (auto I = ExecModes.begin(); I != ExecModes.end(); ++I) {
708716
assert(IsCompatible(ExecMode, (*I).second) &&
@@ -814,6 +822,9 @@ class SPIRVCapability : public SPIRVEntryNoId<OpCapability> {
814822
case CapabilityRoundingModeRTE:
815823
case CapabilityRoundingModeRTZ:
816824
return getSet(ExtensionID::SPV_KHR_float_controls);
825+
case CapabilityRoundToInfinityINTEL:
826+
case CapabilityFloatingPointModeINTEL:
827+
return getSet(ExtensionID::SPV_INTEL_float_controls2);
817828
default:
818829
return SPIRVExtSet();
819830
}

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVEnum.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,14 @@ template <> inline void SPIRVMap<SPIRVExecutionModeKind, SPIRVCapVec>::init() {
244244
{CapabilitySignedZeroInfNanPreserve});
245245
ADD_VEC_INIT(ExecutionModeRoundingModeRTE, {CapabilityRoundingModeRTE});
246246
ADD_VEC_INIT(ExecutionModeRoundingModeRTZ, {CapabilityRoundingModeRTZ});
247+
ADD_VEC_INIT(ExecutionModeRoundingModeRTPINTEL,
248+
{CapabilityRoundToInfinityINTEL});
249+
ADD_VEC_INIT(ExecutionModeRoundingModeRTNINTEL,
250+
{CapabilityRoundToInfinityINTEL});
251+
ADD_VEC_INIT(ExecutionModeFloatingPointModeALTINTEL,
252+
{CapabilityFloatingPointModeINTEL});
253+
ADD_VEC_INIT(ExecutionModeFloatingPointModeIEEEINTEL,
254+
{CapabilityFloatingPointModeINTEL});
247255
}
248256

249257
template <> inline void SPIRVMap<SPIRVMemoryModelKind, SPIRVCapVec>::init() {

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVIsValidEnum.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ inline bool isValid(spv::ExecutionMode V) {
149149
case ExecutionModeSignedZeroInfNanPreserve:
150150
case ExecutionModeRoundingModeRTE:
151151
case ExecutionModeRoundingModeRTZ:
152+
case ExecutionModeRoundingModeRTPINTEL:
153+
case ExecutionModeRoundingModeRTNINTEL:
154+
case ExecutionModeFloatingPointModeALTINTEL:
155+
case ExecutionModeFloatingPointModeIEEEINTEL:
152156
return true;
153157
default:
154158
return false;
@@ -586,6 +590,8 @@ inline bool isValid(spv::Capability V) {
586590
case CapabilitySignedZeroInfNanPreserve:
587591
case CapabilityRoundingModeRTE:
588592
case CapabilityRoundingModeRTZ:
593+
case CapabilityRoundToInfinityINTEL:
594+
case CapabilityFloatingPointModeINTEL:
589595
case CapabilityFPGAMemoryAttributesINTEL:
590596
case CapabilityArbitraryPrecisionIntegersINTEL:
591597
case CapabilityFPGALoopControlsINTEL:

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,10 @@ template <> inline void SPIRVMap<ExecutionMode, std::string>::init() {
129129
add(ExecutionModeSignedZeroInfNanPreserve, "SignedZeroInfNanPreserve");
130130
add(ExecutionModeRoundingModeRTE, "RoundingModeRTE");
131131
add(ExecutionModeRoundingModeRTZ, "RoundingModeRTZ");
132+
add(ExecutionModeRoundingModeRTPINTEL, "RoundingModeRTPINTEL");
133+
add(ExecutionModeRoundingModeRTNINTEL, "RoundingModeRTNINTEL");
134+
add(ExecutionModeFloatingPointModeALTINTEL, "FloatingPointModeALTINTEL");
135+
add(ExecutionModeFloatingPointModeIEEEINTEL, "FloatingPointModeIEEEINTEL");
132136
}
133137
SPIRV_DEF_NAMEMAP(ExecutionMode, SPIRVExecutionModeNameMap)
134138

@@ -508,6 +512,8 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
508512
add(CapabilitySubgroupImageMediaBlockIOINTEL,
509513
"SubgroupImageMediaBlockIOINTEL");
510514
add(CapabilityAsmINTEL, "AsmINTEL");
515+
add(CapabilityRoundToInfinityINTEL, "RoundToInfinityINTEL");
516+
add(CapabilityFloatingPointModeINTEL, "FloatingPointModeINTEL");
511517
add(CapabilitySubgroupAvcMotionEstimationINTEL,
512518
"SubgroupAvcMotionEstimationINTEL");
513519
add(CapabilitySubgroupAvcMotionEstimationIntraINTEL,

llvm-spirv/lib/SPIRV/libSPIRV/spirv.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,10 @@ enum ExecutionMode {
162162
ExecutionModeSampleInterlockUnorderedEXT = 5369,
163163
ExecutionModeShadingRateInterlockOrderedEXT = 5370,
164164
ExecutionModeShadingRateInterlockUnorderedEXT = 5371,
165+
ExecutionModeRoundingModeRTPINTEL = 5620,
166+
ExecutionModeRoundingModeRTNINTEL = 5621,
167+
ExecutionModeFloatingPointModeALTINTEL = 5622,
168+
ExecutionModeFloatingPointModeIEEEINTEL = 5623,
165169
ExecutionModeMaxWorkgroupSizeINTEL = 5893,
166170
ExecutionModeMaxWorkDimINTEL = 5894,
167171
ExecutionModeNoGlobalOffsetINTEL = 5895,
@@ -931,6 +935,8 @@ enum Capability {
931935
CapabilitySubgroupAvcMotionEstimationINTEL = 5696,
932936
CapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697,
933937
CapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698,
938+
CapabilityRoundToInfinityINTEL = 5582,
939+
CapabilityFloatingPointModeINTEL = 5583,
934940
CapabilityFPGAMemoryAttributesINTEL = 5824,
935941
CapabilityArbitraryPrecisionIntegersINTEL = 5844,
936942
CapabilityUnstructuredLoopControlsINTEL = 5886,
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-ext=+SPV_INTEL_float_controls2
3+
; RUN: llvm-spirv %t.spv -o %t.spt --to-text
4+
; RUN: FileCheck %s --input-file %t.spt -check-prefix=SPV
5+
6+
; ModuleID = 'float_control.bc'
7+
source_filename = "float_control.cpp"
8+
target datalayout = "e-p:64:64-i64:64-n8:16:32"
9+
target triple = "spir"
10+
11+
; Function Attrs: noinline norecurse nounwind readnone
12+
define dso_local dllexport spir_kernel void @k_float_controls_0(i32 %ibuf, i32 %obuf) local_unnamed_addr {
13+
entry:
14+
ret void
15+
}
16+
17+
; Function Attrs: noinline norecurse nounwind readnone
18+
define dso_local dllexport spir_kernel void @k_float_controls_1(i32 %ibuf, i32 %obuf) local_unnamed_addr {
19+
entry:
20+
ret void
21+
}
22+
23+
; Function Attrs: noinline norecurse nounwind readnone
24+
define dso_local dllexport spir_kernel void @k_float_controls_2(i32 %ibuf, i32 %obuf) local_unnamed_addr {
25+
entry:
26+
ret void
27+
}
28+
29+
; Function Attrs: noinline norecurse nounwind readnone
30+
define dso_local dllexport spir_kernel void @k_float_controls_3(i32 %ibuf, i32 %obuf) local_unnamed_addr {
31+
entry:
32+
ret void
33+
}
34+
35+
36+
!llvm.module.flags = !{!12}
37+
!llvm.ident = !{!13}
38+
!spirv.EntryPoint = !{}
39+
!spirv.ExecutionMode = !{!15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26}
40+
41+
; SPV-DAG: EntryPoint {{[0-9]+}} [[KERNEL0:[0-9]+]] "k_float_controls_0"
42+
; SPV-DAG: EntryPoint {{[0-9]+}} [[KERNEL1:[0-9]+]] "k_float_controls_1"
43+
; SPV-DAG: EntryPoint {{[0-9]+}} [[KERNEL2:[0-9]+]] "k_float_controls_2"
44+
; SPV-DAG: EntryPoint {{[0-9]+}} [[KERNEL3:[0-9]+]] "k_float_controls_3"
45+
!0 = !{void (i32, i32)* @k_float_controls_0, !"k_float_controls_0", !1, i32 0, !2, !3, !4, i32 0, i32 0}
46+
!1 = !{i32 2, i32 2}
47+
!2 = !{i32 32, i32 36}
48+
!3 = !{i32 0, i32 0}
49+
!4 = !{!"", !""}
50+
!12 = !{i32 1, !"wchar_size", i32 4}
51+
!13 = !{!"clang version 8.0.1"}
52+
!14 = !{i32 1, i32 0}
53+
54+
; SPV-DAG: ExecutionMode [[KERNEL0]] 5620 64
55+
!15 = !{void (i32, i32)* @k_float_controls_0, i32 5620, i32 64}
56+
; SPV-DAG: ExecutionMode [[KERNEL0]] 5620 32
57+
!16 = !{void (i32, i32)* @k_float_controls_0, i32 5620, i32 32}
58+
; SPV-DAG: ExecutionMode [[KERNEL0]] 5620 16
59+
!17 = !{void (i32, i32)* @k_float_controls_0, i32 5620, i32 16}
60+
61+
; SPV-DAG: ExecutionMode [[KERNEL1]] 5621 64
62+
!18 = !{void (i32, i32)* @k_float_controls_1, i32 5621, i32 64}
63+
; SPV-DAG: ExecutionMode [[KERNEL1]] 5621 32
64+
!19 = !{void (i32, i32)* @k_float_controls_1, i32 5621, i32 32}
65+
; SPV-DAG: ExecutionMode [[KERNEL1]] 5621 16
66+
!20 = !{void (i32, i32)* @k_float_controls_1, i32 5621, i32 16}
67+
68+
; SPV-DAG: ExecutionMode [[KERNEL2]] 5622 64
69+
!21 = !{void (i32, i32)* @k_float_controls_2, i32 5622, i32 64}
70+
; SPV-DAG: ExecutionMode [[KERNEL2]] 5622 32
71+
!22 = !{void (i32, i32)* @k_float_controls_2, i32 5622, i32 32}
72+
; SPV-DAG: ExecutionMode [[KERNEL2]] 5622 16
73+
!23 = !{void (i32, i32)* @k_float_controls_2, i32 5622, i32 16}
74+
75+
; SPV-DAG: ExecutionMode [[KERNEL3]] 5623 64
76+
!24 = !{void (i32, i32)* @k_float_controls_3, i32 5623, i32 64}
77+
; SPV-DAG: ExecutionMode [[KERNEL3]] 5623 32
78+
!25 = !{void (i32, i32)* @k_float_controls_3, i32 5623, i32 32}
79+
; SPV-DAG: ExecutionMode [[KERNEL3]] 5623 16
80+
!26 = !{void (i32, i32)* @k_float_controls_3, i32 5623, i32 16}

0 commit comments

Comments
 (0)