Skip to content
This repository was archived by the owner on Apr 23, 2021. It is now read-only.

Commit c571417

Browse files
Mahesh Ravishankartensorflower-gardener
authored andcommitted
Add floating-point comparison operations to SPIR-V dialect.
Use the existing SPV_LogicalOp specification to add the floating-point comparison operations (both ordered and unordered versions). To make it easier to import the op-definitions automatically modify the dialect generation script to update the different .td files based on whether the operation is an arithmetic op, logical op, etc. Also allow specification of multiple opcodes with define_inst.sh. Since this reuses the SPV_LogicalOp framework, no tests specific to the floating point comparison ops are added with this CL. PiperOrigin-RevId: 266561634
1 parent 3776ee2 commit c571417

File tree

4 files changed

+571
-110
lines changed

4 files changed

+571
-110
lines changed

include/mlir/Dialect/SPIRV/SPIRVBase.td

Lines changed: 82 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -72,70 +72,82 @@ class SPV_OpCode<string name, int val> {
7272

7373
// Begin opcode section. Generated from SPIR-V spec; DO NOT MODIFY!
7474

75-
def SPV_OC_OpNop : I32EnumAttrCase<"OpNop", 0>;
76-
def SPV_OC_OpName : I32EnumAttrCase<"OpName", 5>;
77-
def SPV_OC_OpExtension : I32EnumAttrCase<"OpExtension", 10>;
78-
def SPV_OC_OpMemoryModel : I32EnumAttrCase<"OpMemoryModel", 14>;
79-
def SPV_OC_OpEntryPoint : I32EnumAttrCase<"OpEntryPoint", 15>;
80-
def SPV_OC_OpExecutionMode : I32EnumAttrCase<"OpExecutionMode", 16>;
81-
def SPV_OC_OpCapability : I32EnumAttrCase<"OpCapability", 17>;
82-
def SPV_OC_OpTypeVoid : I32EnumAttrCase<"OpTypeVoid", 19>;
83-
def SPV_OC_OpTypeBool : I32EnumAttrCase<"OpTypeBool", 20>;
84-
def SPV_OC_OpTypeInt : I32EnumAttrCase<"OpTypeInt", 21>;
85-
def SPV_OC_OpTypeFloat : I32EnumAttrCase<"OpTypeFloat", 22>;
86-
def SPV_OC_OpTypeVector : I32EnumAttrCase<"OpTypeVector", 23>;
87-
def SPV_OC_OpTypeArray : I32EnumAttrCase<"OpTypeArray", 28>;
88-
def SPV_OC_OpTypeStruct : I32EnumAttrCase<"OpTypeStruct", 30>;
89-
def SPV_OC_OpTypePointer : I32EnumAttrCase<"OpTypePointer", 32>;
90-
def SPV_OC_OpTypeFunction : I32EnumAttrCase<"OpTypeFunction", 33>;
91-
def SPV_OC_OpConstantTrue : I32EnumAttrCase<"OpConstantTrue", 41>;
92-
def SPV_OC_OpConstantFalse : I32EnumAttrCase<"OpConstantFalse", 42>;
93-
def SPV_OC_OpConstant : I32EnumAttrCase<"OpConstant", 43>;
94-
def SPV_OC_OpConstantComposite : I32EnumAttrCase<"OpConstantComposite", 44>;
95-
def SPV_OC_OpConstantNull : I32EnumAttrCase<"OpConstantNull", 46>;
96-
def SPV_OC_OpSpecConstantTrue : I32EnumAttrCase<"OpSpecConstantTrue", 48>;
97-
def SPV_OC_OpSpecConstantFalse : I32EnumAttrCase<"OpSpecConstantFalse", 49>;
98-
def SPV_OC_OpSpecConstant : I32EnumAttrCase<"OpSpecConstant", 50>;
99-
def SPV_OC_OpSpecConstantComposite : I32EnumAttrCase<"OpSpecConstantComposite", 51>;
100-
def SPV_OC_OpFunction : I32EnumAttrCase<"OpFunction", 54>;
101-
def SPV_OC_OpFunctionParameter : I32EnumAttrCase<"OpFunctionParameter", 55>;
102-
def SPV_OC_OpFunctionEnd : I32EnumAttrCase<"OpFunctionEnd", 56>;
103-
def SPV_OC_OpVariable : I32EnumAttrCase<"OpVariable", 59>;
104-
def SPV_OC_OpLoad : I32EnumAttrCase<"OpLoad", 61>;
105-
def SPV_OC_OpStore : I32EnumAttrCase<"OpStore", 62>;
106-
def SPV_OC_OpAccessChain : I32EnumAttrCase<"OpAccessChain", 65>;
107-
def SPV_OC_OpDecorate : I32EnumAttrCase<"OpDecorate", 71>;
108-
def SPV_OC_OpMemberDecorate : I32EnumAttrCase<"OpMemberDecorate", 72>;
109-
def SPV_OC_OpCompositeExtract : I32EnumAttrCase<"OpCompositeExtract", 81>;
110-
def SPV_OC_OpIAdd : I32EnumAttrCase<"OpIAdd", 128>;
111-
def SPV_OC_OpFAdd : I32EnumAttrCase<"OpFAdd", 129>;
112-
def SPV_OC_OpISub : I32EnumAttrCase<"OpISub", 130>;
113-
def SPV_OC_OpFSub : I32EnumAttrCase<"OpFSub", 131>;
114-
def SPV_OC_OpIMul : I32EnumAttrCase<"OpIMul", 132>;
115-
def SPV_OC_OpFMul : I32EnumAttrCase<"OpFMul", 133>;
116-
def SPV_OC_OpUDiv : I32EnumAttrCase<"OpUDiv", 134>;
117-
def SPV_OC_OpSDiv : I32EnumAttrCase<"OpSDiv", 135>;
118-
def SPV_OC_OpFDiv : I32EnumAttrCase<"OpFDiv", 136>;
119-
def SPV_OC_OpUMod : I32EnumAttrCase<"OpUMod", 137>;
120-
def SPV_OC_OpSRem : I32EnumAttrCase<"OpSRem", 138>;
121-
def SPV_OC_OpSMod : I32EnumAttrCase<"OpSMod", 139>;
122-
def SPV_OC_OpFRem : I32EnumAttrCase<"OpFRem", 140>;
123-
def SPV_OC_OpFMod : I32EnumAttrCase<"OpFMod", 141>;
124-
def SPV_OC_OpIEqual : I32EnumAttrCase<"OpIEqual", 170>;
125-
def SPV_OC_OpINotEqual : I32EnumAttrCase<"OpINotEqual", 171>;
126-
def SPV_OC_OpUGreaterThan : I32EnumAttrCase<"OpUGreaterThan", 172>;
127-
def SPV_OC_OpSGreaterThan : I32EnumAttrCase<"OpSGreaterThan", 173>;
128-
def SPV_OC_OpUGreaterThanEqual : I32EnumAttrCase<"OpUGreaterThanEqual", 174>;
129-
def SPV_OC_OpSGreaterThanEqual : I32EnumAttrCase<"OpSGreaterThanEqual", 175>;
130-
def SPV_OC_OpULessThan : I32EnumAttrCase<"OpULessThan", 176>;
131-
def SPV_OC_OpSLessThan : I32EnumAttrCase<"OpSLessThan", 177>;
132-
def SPV_OC_OpULessThanEqual : I32EnumAttrCase<"OpULessThanEqual", 178>;
133-
def SPV_OC_OpSLessThanEqual : I32EnumAttrCase<"OpSLessThanEqual", 179>;
134-
def SPV_OC_OpLabel : I32EnumAttrCase<"OpLabel", 248>;
135-
def SPV_OC_OpBranch : I32EnumAttrCase<"OpBranch", 249>;
136-
def SPV_OC_OpBranchConditional : I32EnumAttrCase<"OpBranchConditional", 250>;
137-
def SPV_OC_OpReturn : I32EnumAttrCase<"OpReturn", 253>;
138-
def SPV_OC_OpReturnValue : I32EnumAttrCase<"OpReturnValue", 254>;
75+
def SPV_OC_OpNop : I32EnumAttrCase<"OpNop", 0>;
76+
def SPV_OC_OpName : I32EnumAttrCase<"OpName", 5>;
77+
def SPV_OC_OpExtension : I32EnumAttrCase<"OpExtension", 10>;
78+
def SPV_OC_OpMemoryModel : I32EnumAttrCase<"OpMemoryModel", 14>;
79+
def SPV_OC_OpEntryPoint : I32EnumAttrCase<"OpEntryPoint", 15>;
80+
def SPV_OC_OpExecutionMode : I32EnumAttrCase<"OpExecutionMode", 16>;
81+
def SPV_OC_OpCapability : I32EnumAttrCase<"OpCapability", 17>;
82+
def SPV_OC_OpTypeVoid : I32EnumAttrCase<"OpTypeVoid", 19>;
83+
def SPV_OC_OpTypeBool : I32EnumAttrCase<"OpTypeBool", 20>;
84+
def SPV_OC_OpTypeInt : I32EnumAttrCase<"OpTypeInt", 21>;
85+
def SPV_OC_OpTypeFloat : I32EnumAttrCase<"OpTypeFloat", 22>;
86+
def SPV_OC_OpTypeVector : I32EnumAttrCase<"OpTypeVector", 23>;
87+
def SPV_OC_OpTypeArray : I32EnumAttrCase<"OpTypeArray", 28>;
88+
def SPV_OC_OpTypeStruct : I32EnumAttrCase<"OpTypeStruct", 30>;
89+
def SPV_OC_OpTypePointer : I32EnumAttrCase<"OpTypePointer", 32>;
90+
def SPV_OC_OpTypeFunction : I32EnumAttrCase<"OpTypeFunction", 33>;
91+
def SPV_OC_OpConstantTrue : I32EnumAttrCase<"OpConstantTrue", 41>;
92+
def SPV_OC_OpConstantFalse : I32EnumAttrCase<"OpConstantFalse", 42>;
93+
def SPV_OC_OpConstant : I32EnumAttrCase<"OpConstant", 43>;
94+
def SPV_OC_OpConstantComposite : I32EnumAttrCase<"OpConstantComposite", 44>;
95+
def SPV_OC_OpConstantNull : I32EnumAttrCase<"OpConstantNull", 46>;
96+
def SPV_OC_OpSpecConstantTrue : I32EnumAttrCase<"OpSpecConstantTrue", 48>;
97+
def SPV_OC_OpSpecConstantFalse : I32EnumAttrCase<"OpSpecConstantFalse", 49>;
98+
def SPV_OC_OpSpecConstant : I32EnumAttrCase<"OpSpecConstant", 50>;
99+
def SPV_OC_OpSpecConstantComposite : I32EnumAttrCase<"OpSpecConstantComposite", 51>;
100+
def SPV_OC_OpFunction : I32EnumAttrCase<"OpFunction", 54>;
101+
def SPV_OC_OpFunctionParameter : I32EnumAttrCase<"OpFunctionParameter", 55>;
102+
def SPV_OC_OpFunctionEnd : I32EnumAttrCase<"OpFunctionEnd", 56>;
103+
def SPV_OC_OpVariable : I32EnumAttrCase<"OpVariable", 59>;
104+
def SPV_OC_OpLoad : I32EnumAttrCase<"OpLoad", 61>;
105+
def SPV_OC_OpStore : I32EnumAttrCase<"OpStore", 62>;
106+
def SPV_OC_OpAccessChain : I32EnumAttrCase<"OpAccessChain", 65>;
107+
def SPV_OC_OpDecorate : I32EnumAttrCase<"OpDecorate", 71>;
108+
def SPV_OC_OpMemberDecorate : I32EnumAttrCase<"OpMemberDecorate", 72>;
109+
def SPV_OC_OpCompositeExtract : I32EnumAttrCase<"OpCompositeExtract", 81>;
110+
def SPV_OC_OpIAdd : I32EnumAttrCase<"OpIAdd", 128>;
111+
def SPV_OC_OpFAdd : I32EnumAttrCase<"OpFAdd", 129>;
112+
def SPV_OC_OpISub : I32EnumAttrCase<"OpISub", 130>;
113+
def SPV_OC_OpFSub : I32EnumAttrCase<"OpFSub", 131>;
114+
def SPV_OC_OpIMul : I32EnumAttrCase<"OpIMul", 132>;
115+
def SPV_OC_OpFMul : I32EnumAttrCase<"OpFMul", 133>;
116+
def SPV_OC_OpUDiv : I32EnumAttrCase<"OpUDiv", 134>;
117+
def SPV_OC_OpSDiv : I32EnumAttrCase<"OpSDiv", 135>;
118+
def SPV_OC_OpFDiv : I32EnumAttrCase<"OpFDiv", 136>;
119+
def SPV_OC_OpUMod : I32EnumAttrCase<"OpUMod", 137>;
120+
def SPV_OC_OpSRem : I32EnumAttrCase<"OpSRem", 138>;
121+
def SPV_OC_OpSMod : I32EnumAttrCase<"OpSMod", 139>;
122+
def SPV_OC_OpFRem : I32EnumAttrCase<"OpFRem", 140>;
123+
def SPV_OC_OpFMod : I32EnumAttrCase<"OpFMod", 141>;
124+
def SPV_OC_OpIEqual : I32EnumAttrCase<"OpIEqual", 170>;
125+
def SPV_OC_OpINotEqual : I32EnumAttrCase<"OpINotEqual", 171>;
126+
def SPV_OC_OpUGreaterThan : I32EnumAttrCase<"OpUGreaterThan", 172>;
127+
def SPV_OC_OpSGreaterThan : I32EnumAttrCase<"OpSGreaterThan", 173>;
128+
def SPV_OC_OpUGreaterThanEqual : I32EnumAttrCase<"OpUGreaterThanEqual", 174>;
129+
def SPV_OC_OpSGreaterThanEqual : I32EnumAttrCase<"OpSGreaterThanEqual", 175>;
130+
def SPV_OC_OpULessThan : I32EnumAttrCase<"OpULessThan", 176>;
131+
def SPV_OC_OpSLessThan : I32EnumAttrCase<"OpSLessThan", 177>;
132+
def SPV_OC_OpULessThanEqual : I32EnumAttrCase<"OpULessThanEqual", 178>;
133+
def SPV_OC_OpSLessThanEqual : I32EnumAttrCase<"OpSLessThanEqual", 179>;
134+
def SPV_OC_OpFOrdEqual : I32EnumAttrCase<"OpFOrdEqual", 180>;
135+
def SPV_OC_OpFUnordEqual : I32EnumAttrCase<"OpFUnordEqual", 181>;
136+
def SPV_OC_OpFOrdNotEqual : I32EnumAttrCase<"OpFOrdNotEqual", 182>;
137+
def SPV_OC_OpFUnordNotEqual : I32EnumAttrCase<"OpFUnordNotEqual", 183>;
138+
def SPV_OC_OpFOrdLessThan : I32EnumAttrCase<"OpFOrdLessThan", 184>;
139+
def SPV_OC_OpFUnordLessThan : I32EnumAttrCase<"OpFUnordLessThan", 185>;
140+
def SPV_OC_OpFOrdGreaterThan : I32EnumAttrCase<"OpFOrdGreaterThan", 186>;
141+
def SPV_OC_OpFUnordGreaterThan : I32EnumAttrCase<"OpFUnordGreaterThan", 187>;
142+
def SPV_OC_OpFOrdLessThanEqual : I32EnumAttrCase<"OpFOrdLessThanEqual", 188>;
143+
def SPV_OC_OpFUnordLessThanEqual : I32EnumAttrCase<"OpFUnordLessThanEqual", 189>;
144+
def SPV_OC_OpFOrdGreaterThanEqual : I32EnumAttrCase<"OpFOrdGreaterThanEqual", 190>;
145+
def SPV_OC_OpFUnordGreaterThanEqual : I32EnumAttrCase<"OpFUnordGreaterThanEqual", 191>;
146+
def SPV_OC_OpLabel : I32EnumAttrCase<"OpLabel", 248>;
147+
def SPV_OC_OpBranch : I32EnumAttrCase<"OpBranch", 249>;
148+
def SPV_OC_OpBranchConditional : I32EnumAttrCase<"OpBranchConditional", 250>;
149+
def SPV_OC_OpReturn : I32EnumAttrCase<"OpReturn", 253>;
150+
def SPV_OC_OpReturnValue : I32EnumAttrCase<"OpReturnValue", 254>;
139151

140152
def SPV_OpcodeAttr :
141153
I32EnumAttr<"Opcode", "valid SPIR-V instructions", [
@@ -156,7 +168,12 @@ def SPV_OpcodeAttr :
156168
SPV_OC_OpINotEqual, SPV_OC_OpUGreaterThan, SPV_OC_OpSGreaterThan,
157169
SPV_OC_OpUGreaterThanEqual, SPV_OC_OpSGreaterThanEqual, SPV_OC_OpULessThan,
158170
SPV_OC_OpSLessThan, SPV_OC_OpULessThanEqual, SPV_OC_OpSLessThanEqual,
159-
SPV_OC_OpLabel, SPV_OC_OpBranch, SPV_OC_OpBranchConditional, SPV_OC_OpReturn,
171+
SPV_OC_OpFOrdEqual, SPV_OC_OpFUnordEqual, SPV_OC_OpFOrdNotEqual,
172+
SPV_OC_OpFUnordNotEqual, SPV_OC_OpFOrdLessThan, SPV_OC_OpFUnordLessThan,
173+
SPV_OC_OpFOrdGreaterThan, SPV_OC_OpFUnordGreaterThan,
174+
SPV_OC_OpFOrdLessThanEqual, SPV_OC_OpFUnordLessThanEqual,
175+
SPV_OC_OpFOrdGreaterThanEqual, SPV_OC_OpFUnordGreaterThanEqual, SPV_OC_OpLabel,
176+
SPV_OC_OpBranch, SPV_OC_OpBranchConditional, SPV_OC_OpReturn,
160177
SPV_OC_OpReturnValue
161178
]> {
162179
let returnType = "::mlir::spirv::Opcode";

0 commit comments

Comments
 (0)