summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend')
-rw-r--r--src/shader_recompiler/backend/bindings.h19
-rw-r--r--src/shader_recompiler/backend/spirv/emit_context.h9
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv.h571
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_image.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_instructions.h583
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_select.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_special.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp1
23 files changed, 629 insertions, 572 deletions
diff --git a/src/shader_recompiler/backend/bindings.h b/src/shader_recompiler/backend/bindings.h
new file mode 100644
index 000000000..35503000c
--- /dev/null
+++ b/src/shader_recompiler/backend/bindings.h
@@ -0,0 +1,19 @@
1// Copyright 2021 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include "common/common_types.h"
8
9namespace Shader::Backend {
10
11struct Bindings {
12 u32 unified{};
13 u32 uniform_buffer{};
14 u32 storage_buffer{};
15 u32 texture{};
16 u32 image{};
17};
18
19} // namespace Shader::Backend
diff --git a/src/shader_recompiler/backend/spirv/emit_context.h b/src/shader_recompiler/backend/spirv/emit_context.h
index 30b08104d..8b000f1ec 100644
--- a/src/shader_recompiler/backend/spirv/emit_context.h
+++ b/src/shader_recompiler/backend/spirv/emit_context.h
@@ -9,6 +9,7 @@
9 9
10#include <sirit/sirit.h> 10#include <sirit/sirit.h>
11 11
12#include "shader_recompiler/backend/bindings.h"
12#include "shader_recompiler/frontend/ir/program.h" 13#include "shader_recompiler/frontend/ir/program.h"
13#include "shader_recompiler/profile.h" 14#include "shader_recompiler/profile.h"
14#include "shader_recompiler/shader_info.h" 15#include "shader_recompiler/shader_info.h"
@@ -17,14 +18,6 @@ namespace Shader::Backend::SPIRV {
17 18
18using Sirit::Id; 19using Sirit::Id;
19 20
20struct Bindings {
21 u32 unified{};
22 u32 uniform_buffer{};
23 u32 storage_buffer{};
24 u32 texture{};
25 u32 image{};
26};
27
28class VectorTypes { 21class VectorTypes {
29public: 22public:
30 void Define(Sirit::Module& sirit_ctx, Id base_type, std::string_view name); 23 void Define(Sirit::Module& sirit_ctx, Id base_type, std::string_view name);
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
index 3f9adc902..0681dfd16 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
@@ -9,6 +9,7 @@
9#include <vector> 9#include <vector>
10 10
11#include "shader_recompiler/backend/spirv/emit_spirv.h" 11#include "shader_recompiler/backend/spirv/emit_spirv.h"
12#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
12#include "shader_recompiler/frontend/ir/basic_block.h" 13#include "shader_recompiler/frontend/ir/basic_block.h"
13#include "shader_recompiler/frontend/ir/program.h" 14#include "shader_recompiler/frontend/ir/program.h"
14 15
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.h b/src/shader_recompiler/backend/spirv/emit_spirv.h
index 47d62b190..d8ab2d8ed 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.h
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.h
@@ -4,9 +4,12 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <vector>
8
7#include <sirit/sirit.h> 9#include <sirit/sirit.h>
8 10
9#include "common/common_types.h" 11#include "common/common_types.h"
12#include "shader_recompiler/backend/bindings.h"
10#include "shader_recompiler/backend/spirv/emit_context.h" 13#include "shader_recompiler/backend/spirv/emit_context.h"
11#include "shader_recompiler/frontend/ir/program.h" 14#include "shader_recompiler/frontend/ir/program.h"
12#include "shader_recompiler/profile.h" 15#include "shader_recompiler/profile.h"
@@ -16,569 +19,9 @@ namespace Shader::Backend::SPIRV {
16[[nodiscard]] std::vector<u32> EmitSPIRV(const Profile& profile, IR::Program& program, 19[[nodiscard]] std::vector<u32> EmitSPIRV(const Profile& profile, IR::Program& program,
17 Bindings& binding); 20 Bindings& binding);
18 21
19// Microinstruction emitters 22[[nodiscard]] inline std::vector<u32> EmitSPIRV(const Profile& profile, IR::Program& program) {
20Id EmitPhi(EmitContext& ctx, IR::Inst* inst); 23 Bindings binding;
21void EmitVoid(EmitContext& ctx); 24 return EmitSPIRV(profile, program, binding);
22Id EmitIdentity(EmitContext& ctx, const IR::Value& value); 25}
23void EmitBranch(EmitContext& ctx, Id label);
24void EmitBranchConditional(EmitContext& ctx, Id condition, Id true_label, Id false_label);
25void EmitLoopMerge(EmitContext& ctx, Id merge_label, Id continue_label);
26void EmitSelectionMerge(EmitContext& ctx, Id merge_label);
27void EmitReturn(EmitContext& ctx);
28void EmitJoin(EmitContext& ctx);
29void EmitUnreachable(EmitContext& ctx);
30void EmitDemoteToHelperInvocation(EmitContext& ctx, Id continue_label);
31void EmitBarrier(EmitContext& ctx);
32void EmitWorkgroupMemoryBarrier(EmitContext& ctx);
33void EmitDeviceMemoryBarrier(EmitContext& ctx);
34void EmitPrologue(EmitContext& ctx);
35void EmitEpilogue(EmitContext& ctx);
36void EmitEmitVertex(EmitContext& ctx, const IR::Value& stream);
37void EmitEndPrimitive(EmitContext& ctx, const IR::Value& stream);
38void EmitGetRegister(EmitContext& ctx);
39void EmitSetRegister(EmitContext& ctx);
40void EmitGetPred(EmitContext& ctx);
41void EmitSetPred(EmitContext& ctx);
42void EmitSetGotoVariable(EmitContext& ctx);
43void EmitGetGotoVariable(EmitContext& ctx);
44void EmitSetIndirectBranchVariable(EmitContext& ctx);
45void EmitGetIndirectBranchVariable(EmitContext& ctx);
46Id EmitGetCbufU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
47Id EmitGetCbufS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
48Id EmitGetCbufU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
49Id EmitGetCbufS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
50Id EmitGetCbufU32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
51Id EmitGetCbufF32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
52Id EmitGetCbufU32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
53Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, Id vertex);
54void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, Id vertex);
55Id EmitGetAttributeIndexed(EmitContext& ctx, Id offset, Id vertex);
56void EmitSetAttributeIndexed(EmitContext& ctx, Id offset, Id value, Id vertex);
57Id EmitGetPatch(EmitContext& ctx, IR::Patch patch);
58void EmitSetPatch(EmitContext& ctx, IR::Patch patch, Id value);
59void EmitSetFragColor(EmitContext& ctx, u32 index, u32 component, Id value);
60void EmitSetSampleMask(EmitContext& ctx, Id value);
61void EmitSetFragDepth(EmitContext& ctx, Id value);
62void EmitGetZFlag(EmitContext& ctx);
63void EmitGetSFlag(EmitContext& ctx);
64void EmitGetCFlag(EmitContext& ctx);
65void EmitGetOFlag(EmitContext& ctx);
66void EmitSetZFlag(EmitContext& ctx);
67void EmitSetSFlag(EmitContext& ctx);
68void EmitSetCFlag(EmitContext& ctx);
69void EmitSetOFlag(EmitContext& ctx);
70Id EmitWorkgroupId(EmitContext& ctx);
71Id EmitLocalInvocationId(EmitContext& ctx);
72Id EmitInvocationId(EmitContext& ctx);
73Id EmitSampleId(EmitContext& ctx);
74Id EmitIsHelperInvocation(EmitContext& ctx);
75Id EmitYDirection(EmitContext& ctx);
76Id EmitLoadLocal(EmitContext& ctx, Id word_offset);
77void EmitWriteLocal(EmitContext& ctx, Id word_offset, Id value);
78Id EmitUndefU1(EmitContext& ctx);
79Id EmitUndefU8(EmitContext& ctx);
80Id EmitUndefU16(EmitContext& ctx);
81Id EmitUndefU32(EmitContext& ctx);
82Id EmitUndefU64(EmitContext& ctx);
83void EmitLoadGlobalU8(EmitContext& ctx);
84void EmitLoadGlobalS8(EmitContext& ctx);
85void EmitLoadGlobalU16(EmitContext& ctx);
86void EmitLoadGlobalS16(EmitContext& ctx);
87Id EmitLoadGlobal32(EmitContext& ctx, Id address);
88Id EmitLoadGlobal64(EmitContext& ctx, Id address);
89Id EmitLoadGlobal128(EmitContext& ctx, Id address);
90void EmitWriteGlobalU8(EmitContext& ctx);
91void EmitWriteGlobalS8(EmitContext& ctx);
92void EmitWriteGlobalU16(EmitContext& ctx);
93void EmitWriteGlobalS16(EmitContext& ctx);
94void EmitWriteGlobal32(EmitContext& ctx, Id address, Id value);
95void EmitWriteGlobal64(EmitContext& ctx, Id address, Id value);
96void EmitWriteGlobal128(EmitContext& ctx, Id address, Id value);
97Id EmitLoadStorageU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
98Id EmitLoadStorageS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
99Id EmitLoadStorageU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
100Id EmitLoadStorageS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
101Id EmitLoadStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
102Id EmitLoadStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
103Id EmitLoadStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
104void EmitWriteStorageU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
105 Id value);
106void EmitWriteStorageS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
107 Id value);
108void EmitWriteStorageU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
109 Id value);
110void EmitWriteStorageS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
111 Id value);
112void EmitWriteStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
113 Id value);
114void EmitWriteStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
115 Id value);
116void EmitWriteStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
117 Id value);
118Id EmitLoadSharedU8(EmitContext& ctx, Id offset);
119Id EmitLoadSharedS8(EmitContext& ctx, Id offset);
120Id EmitLoadSharedU16(EmitContext& ctx, Id offset);
121Id EmitLoadSharedS16(EmitContext& ctx, Id offset);
122Id EmitLoadSharedU32(EmitContext& ctx, Id offset);
123Id EmitLoadSharedU64(EmitContext& ctx, Id offset);
124Id EmitLoadSharedU128(EmitContext& ctx, Id offset);
125void EmitWriteSharedU8(EmitContext& ctx, Id offset, Id value);
126void EmitWriteSharedU16(EmitContext& ctx, Id offset, Id value);
127void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value);
128void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value);
129void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value);
130Id EmitCompositeConstructU32x2(EmitContext& ctx, Id e1, Id e2);
131Id EmitCompositeConstructU32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
132Id EmitCompositeConstructU32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
133Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index);
134Id EmitCompositeExtractU32x3(EmitContext& ctx, Id composite, u32 index);
135Id EmitCompositeExtractU32x4(EmitContext& ctx, Id composite, u32 index);
136Id EmitCompositeInsertU32x2(EmitContext& ctx, Id composite, Id object, u32 index);
137Id EmitCompositeInsertU32x3(EmitContext& ctx, Id composite, Id object, u32 index);
138Id EmitCompositeInsertU32x4(EmitContext& ctx, Id composite, Id object, u32 index);
139Id EmitCompositeConstructF16x2(EmitContext& ctx, Id e1, Id e2);
140Id EmitCompositeConstructF16x3(EmitContext& ctx, Id e1, Id e2, Id e3);
141Id EmitCompositeConstructF16x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
142Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index);
143Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index);
144Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index);
145Id EmitCompositeInsertF16x2(EmitContext& ctx, Id composite, Id object, u32 index);
146Id EmitCompositeInsertF16x3(EmitContext& ctx, Id composite, Id object, u32 index);
147Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index);
148Id EmitCompositeConstructF32x2(EmitContext& ctx, Id e1, Id e2);
149Id EmitCompositeConstructF32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
150Id EmitCompositeConstructF32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
151Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index);
152Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index);
153Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index);
154Id EmitCompositeInsertF32x2(EmitContext& ctx, Id composite, Id object, u32 index);
155Id EmitCompositeInsertF32x3(EmitContext& ctx, Id composite, Id object, u32 index);
156Id EmitCompositeInsertF32x4(EmitContext& ctx, Id composite, Id object, u32 index);
157void EmitCompositeConstructF64x2(EmitContext& ctx);
158void EmitCompositeConstructF64x3(EmitContext& ctx);
159void EmitCompositeConstructF64x4(EmitContext& ctx);
160void EmitCompositeExtractF64x2(EmitContext& ctx);
161void EmitCompositeExtractF64x3(EmitContext& ctx);
162void EmitCompositeExtractF64x4(EmitContext& ctx);
163Id EmitCompositeInsertF64x2(EmitContext& ctx, Id composite, Id object, u32 index);
164Id EmitCompositeInsertF64x3(EmitContext& ctx, Id composite, Id object, u32 index);
165Id EmitCompositeInsertF64x4(EmitContext& ctx, Id composite, Id object, u32 index);
166Id EmitSelectU1(EmitContext& ctx, Id cond, Id true_value, Id false_value);
167Id EmitSelectU8(EmitContext& ctx, Id cond, Id true_value, Id false_value);
168Id EmitSelectU16(EmitContext& ctx, Id cond, Id true_value, Id false_value);
169Id EmitSelectU32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
170Id EmitSelectU64(EmitContext& ctx, Id cond, Id true_value, Id false_value);
171Id EmitSelectF16(EmitContext& ctx, Id cond, Id true_value, Id false_value);
172Id EmitSelectF32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
173Id EmitSelectF64(EmitContext& ctx, Id cond, Id true_value, Id false_value);
174void EmitBitCastU16F16(EmitContext& ctx);
175Id EmitBitCastU32F32(EmitContext& ctx, Id value);
176void EmitBitCastU64F64(EmitContext& ctx);
177void EmitBitCastF16U16(EmitContext& ctx);
178Id EmitBitCastF32U32(EmitContext& ctx, Id value);
179void EmitBitCastF64U64(EmitContext& ctx);
180Id EmitPackUint2x32(EmitContext& ctx, Id value);
181Id EmitUnpackUint2x32(EmitContext& ctx, Id value);
182Id EmitPackFloat2x16(EmitContext& ctx, Id value);
183Id EmitUnpackFloat2x16(EmitContext& ctx, Id value);
184Id EmitPackHalf2x16(EmitContext& ctx, Id value);
185Id EmitUnpackHalf2x16(EmitContext& ctx, Id value);
186Id EmitPackDouble2x32(EmitContext& ctx, Id value);
187Id EmitUnpackDouble2x32(EmitContext& ctx, Id value);
188void EmitGetZeroFromOp(EmitContext& ctx);
189void EmitGetSignFromOp(EmitContext& ctx);
190void EmitGetCarryFromOp(EmitContext& ctx);
191void EmitGetOverflowFromOp(EmitContext& ctx);
192void EmitGetSparseFromOp(EmitContext& ctx);
193void EmitGetInBoundsFromOp(EmitContext& ctx);
194Id EmitFPAbs16(EmitContext& ctx, Id value);
195Id EmitFPAbs32(EmitContext& ctx, Id value);
196Id EmitFPAbs64(EmitContext& ctx, Id value);
197Id EmitFPAdd16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
198Id EmitFPAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
199Id EmitFPAdd64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
200Id EmitFPFma16(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
201Id EmitFPFma32(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
202Id EmitFPFma64(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
203Id EmitFPMax32(EmitContext& ctx, Id a, Id b);
204Id EmitFPMax64(EmitContext& ctx, Id a, Id b);
205Id EmitFPMin32(EmitContext& ctx, Id a, Id b);
206Id EmitFPMin64(EmitContext& ctx, Id a, Id b);
207Id EmitFPMul16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
208Id EmitFPMul32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
209Id EmitFPMul64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
210Id EmitFPNeg16(EmitContext& ctx, Id value);
211Id EmitFPNeg32(EmitContext& ctx, Id value);
212Id EmitFPNeg64(EmitContext& ctx, Id value);
213Id EmitFPSin(EmitContext& ctx, Id value);
214Id EmitFPCos(EmitContext& ctx, Id value);
215Id EmitFPExp2(EmitContext& ctx, Id value);
216Id EmitFPLog2(EmitContext& ctx, Id value);
217Id EmitFPRecip32(EmitContext& ctx, Id value);
218Id EmitFPRecip64(EmitContext& ctx, Id value);
219Id EmitFPRecipSqrt32(EmitContext& ctx, Id value);
220Id EmitFPRecipSqrt64(EmitContext& ctx, Id value);
221Id EmitFPSqrt(EmitContext& ctx, Id value);
222Id EmitFPSaturate16(EmitContext& ctx, Id value);
223Id EmitFPSaturate32(EmitContext& ctx, Id value);
224Id EmitFPSaturate64(EmitContext& ctx, Id value);
225Id EmitFPClamp16(EmitContext& ctx, Id value, Id min_value, Id max_value);
226Id EmitFPClamp32(EmitContext& ctx, Id value, Id min_value, Id max_value);
227Id EmitFPClamp64(EmitContext& ctx, Id value, Id min_value, Id max_value);
228Id EmitFPRoundEven16(EmitContext& ctx, Id value);
229Id EmitFPRoundEven32(EmitContext& ctx, Id value);
230Id EmitFPRoundEven64(EmitContext& ctx, Id value);
231Id EmitFPFloor16(EmitContext& ctx, Id value);
232Id EmitFPFloor32(EmitContext& ctx, Id value);
233Id EmitFPFloor64(EmitContext& ctx, Id value);
234Id EmitFPCeil16(EmitContext& ctx, Id value);
235Id EmitFPCeil32(EmitContext& ctx, Id value);
236Id EmitFPCeil64(EmitContext& ctx, Id value);
237Id EmitFPTrunc16(EmitContext& ctx, Id value);
238Id EmitFPTrunc32(EmitContext& ctx, Id value);
239Id EmitFPTrunc64(EmitContext& ctx, Id value);
240Id EmitFPOrdEqual16(EmitContext& ctx, Id lhs, Id rhs);
241Id EmitFPOrdEqual32(EmitContext& ctx, Id lhs, Id rhs);
242Id EmitFPOrdEqual64(EmitContext& ctx, Id lhs, Id rhs);
243Id EmitFPUnordEqual16(EmitContext& ctx, Id lhs, Id rhs);
244Id EmitFPUnordEqual32(EmitContext& ctx, Id lhs, Id rhs);
245Id EmitFPUnordEqual64(EmitContext& ctx, Id lhs, Id rhs);
246Id EmitFPOrdNotEqual16(EmitContext& ctx, Id lhs, Id rhs);
247Id EmitFPOrdNotEqual32(EmitContext& ctx, Id lhs, Id rhs);
248Id EmitFPOrdNotEqual64(EmitContext& ctx, Id lhs, Id rhs);
249Id EmitFPUnordNotEqual16(EmitContext& ctx, Id lhs, Id rhs);
250Id EmitFPUnordNotEqual32(EmitContext& ctx, Id lhs, Id rhs);
251Id EmitFPUnordNotEqual64(EmitContext& ctx, Id lhs, Id rhs);
252Id EmitFPOrdLessThan16(EmitContext& ctx, Id lhs, Id rhs);
253Id EmitFPOrdLessThan32(EmitContext& ctx, Id lhs, Id rhs);
254Id EmitFPOrdLessThan64(EmitContext& ctx, Id lhs, Id rhs);
255Id EmitFPUnordLessThan16(EmitContext& ctx, Id lhs, Id rhs);
256Id EmitFPUnordLessThan32(EmitContext& ctx, Id lhs, Id rhs);
257Id EmitFPUnordLessThan64(EmitContext& ctx, Id lhs, Id rhs);
258Id EmitFPOrdGreaterThan16(EmitContext& ctx, Id lhs, Id rhs);
259Id EmitFPOrdGreaterThan32(EmitContext& ctx, Id lhs, Id rhs);
260Id EmitFPOrdGreaterThan64(EmitContext& ctx, Id lhs, Id rhs);
261Id EmitFPUnordGreaterThan16(EmitContext& ctx, Id lhs, Id rhs);
262Id EmitFPUnordGreaterThan32(EmitContext& ctx, Id lhs, Id rhs);
263Id EmitFPUnordGreaterThan64(EmitContext& ctx, Id lhs, Id rhs);
264Id EmitFPOrdLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
265Id EmitFPOrdLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
266Id EmitFPOrdLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
267Id EmitFPUnordLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
268Id EmitFPUnordLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
269Id EmitFPUnordLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
270Id EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
271Id EmitFPOrdGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
272Id EmitFPOrdGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
273Id EmitFPUnordGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
274Id EmitFPUnordGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
275Id EmitFPUnordGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
276Id EmitFPIsNan16(EmitContext& ctx, Id value);
277Id EmitFPIsNan32(EmitContext& ctx, Id value);
278Id EmitFPIsNan64(EmitContext& ctx, Id value);
279Id EmitIAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
280Id EmitIAdd64(EmitContext& ctx, Id a, Id b);
281Id EmitISub32(EmitContext& ctx, Id a, Id b);
282Id EmitISub64(EmitContext& ctx, Id a, Id b);
283Id EmitIMul32(EmitContext& ctx, Id a, Id b);
284Id EmitINeg32(EmitContext& ctx, Id value);
285Id EmitINeg64(EmitContext& ctx, Id value);
286Id EmitIAbs32(EmitContext& ctx, Id value);
287Id EmitIAbs64(EmitContext& ctx, Id value);
288Id EmitShiftLeftLogical32(EmitContext& ctx, Id base, Id shift);
289Id EmitShiftLeftLogical64(EmitContext& ctx, Id base, Id shift);
290Id EmitShiftRightLogical32(EmitContext& ctx, Id base, Id shift);
291Id EmitShiftRightLogical64(EmitContext& ctx, Id base, Id shift);
292Id EmitShiftRightArithmetic32(EmitContext& ctx, Id base, Id shift);
293Id EmitShiftRightArithmetic64(EmitContext& ctx, Id base, Id shift);
294Id EmitBitwiseAnd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
295Id EmitBitwiseOr32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
296Id EmitBitwiseXor32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
297Id EmitBitFieldInsert(EmitContext& ctx, Id base, Id insert, Id offset, Id count);
298Id EmitBitFieldSExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
299Id EmitBitFieldUExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
300Id EmitBitReverse32(EmitContext& ctx, Id value);
301Id EmitBitCount32(EmitContext& ctx, Id value);
302Id EmitBitwiseNot32(EmitContext& ctx, Id value);
303Id EmitFindSMsb32(EmitContext& ctx, Id value);
304Id EmitFindUMsb32(EmitContext& ctx, Id value);
305Id EmitSMin32(EmitContext& ctx, Id a, Id b);
306Id EmitUMin32(EmitContext& ctx, Id a, Id b);
307Id EmitSMax32(EmitContext& ctx, Id a, Id b);
308Id EmitUMax32(EmitContext& ctx, Id a, Id b);
309Id EmitSClamp32(EmitContext& ctx, IR::Inst* inst, Id value, Id min, Id max);
310Id EmitUClamp32(EmitContext& ctx, IR::Inst* inst, Id value, Id min, Id max);
311Id EmitSLessThan(EmitContext& ctx, Id lhs, Id rhs);
312Id EmitULessThan(EmitContext& ctx, Id lhs, Id rhs);
313Id EmitIEqual(EmitContext& ctx, Id lhs, Id rhs);
314Id EmitSLessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
315Id EmitULessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
316Id EmitSGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
317Id EmitUGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
318Id EmitINotEqual(EmitContext& ctx, Id lhs, Id rhs);
319Id EmitSGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
320Id EmitUGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
321Id EmitSharedAtomicIAdd32(EmitContext& ctx, Id pointer_offset, Id value);
322Id EmitSharedAtomicSMin32(EmitContext& ctx, Id pointer_offset, Id value);
323Id EmitSharedAtomicUMin32(EmitContext& ctx, Id pointer_offset, Id value);
324Id EmitSharedAtomicSMax32(EmitContext& ctx, Id pointer_offset, Id value);
325Id EmitSharedAtomicUMax32(EmitContext& ctx, Id pointer_offset, Id value);
326Id EmitSharedAtomicInc32(EmitContext& ctx, Id pointer_offset, Id value);
327Id EmitSharedAtomicDec32(EmitContext& ctx, Id pointer_offset, Id value);
328Id EmitSharedAtomicAnd32(EmitContext& ctx, Id pointer_offset, Id value);
329Id EmitSharedAtomicOr32(EmitContext& ctx, Id pointer_offset, Id value);
330Id EmitSharedAtomicXor32(EmitContext& ctx, Id pointer_offset, Id value);
331Id EmitSharedAtomicExchange32(EmitContext& ctx, Id pointer_offset, Id value);
332Id EmitSharedAtomicExchange64(EmitContext& ctx, Id pointer_offset, Id value);
333Id EmitStorageAtomicIAdd32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
334 Id value);
335Id EmitStorageAtomicSMin32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
336 Id value);
337Id EmitStorageAtomicUMin32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
338 Id value);
339Id EmitStorageAtomicSMax32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
340 Id value);
341Id EmitStorageAtomicUMax32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
342 Id value);
343Id EmitStorageAtomicInc32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
344 Id value);
345Id EmitStorageAtomicDec32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
346 Id value);
347Id EmitStorageAtomicAnd32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
348 Id value);
349Id EmitStorageAtomicOr32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
350 Id value);
351Id EmitStorageAtomicXor32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
352 Id value);
353Id EmitStorageAtomicExchange32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
354 Id value);
355Id EmitStorageAtomicIAdd64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
356 Id value);
357Id EmitStorageAtomicSMin64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
358 Id value);
359Id EmitStorageAtomicUMin64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
360 Id value);
361Id EmitStorageAtomicSMax64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
362 Id value);
363Id EmitStorageAtomicUMax64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
364 Id value);
365Id EmitStorageAtomicAnd64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
366 Id value);
367Id EmitStorageAtomicOr64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
368 Id value);
369Id EmitStorageAtomicXor64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
370 Id value);
371Id EmitStorageAtomicExchange64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
372 Id value);
373Id EmitStorageAtomicAddF32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
374 Id value);
375Id EmitStorageAtomicAddF16x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
376 Id value);
377Id EmitStorageAtomicAddF32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
378 Id value);
379Id EmitStorageAtomicMinF16x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
380 Id value);
381Id EmitStorageAtomicMinF32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
382 Id value);
383Id EmitStorageAtomicMaxF16x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
384 Id value);
385Id EmitStorageAtomicMaxF32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
386 Id value);
387Id EmitGlobalAtomicIAdd32(EmitContext& ctx);
388Id EmitGlobalAtomicSMin32(EmitContext& ctx);
389Id EmitGlobalAtomicUMin32(EmitContext& ctx);
390Id EmitGlobalAtomicSMax32(EmitContext& ctx);
391Id EmitGlobalAtomicUMax32(EmitContext& ctx);
392Id EmitGlobalAtomicInc32(EmitContext& ctx);
393Id EmitGlobalAtomicDec32(EmitContext& ctx);
394Id EmitGlobalAtomicAnd32(EmitContext& ctx);
395Id EmitGlobalAtomicOr32(EmitContext& ctx);
396Id EmitGlobalAtomicXor32(EmitContext& ctx);
397Id EmitGlobalAtomicExchange32(EmitContext& ctx);
398Id EmitGlobalAtomicIAdd64(EmitContext& ctx);
399Id EmitGlobalAtomicSMin64(EmitContext& ctx);
400Id EmitGlobalAtomicUMin64(EmitContext& ctx);
401Id EmitGlobalAtomicSMax64(EmitContext& ctx);
402Id EmitGlobalAtomicUMax64(EmitContext& ctx);
403Id EmitGlobalAtomicInc64(EmitContext& ctx);
404Id EmitGlobalAtomicDec64(EmitContext& ctx);
405Id EmitGlobalAtomicAnd64(EmitContext& ctx);
406Id EmitGlobalAtomicOr64(EmitContext& ctx);
407Id EmitGlobalAtomicXor64(EmitContext& ctx);
408Id EmitGlobalAtomicExchange64(EmitContext& ctx);
409Id EmitGlobalAtomicAddF32(EmitContext& ctx);
410Id EmitGlobalAtomicAddF16x2(EmitContext& ctx);
411Id EmitGlobalAtomicAddF32x2(EmitContext& ctx);
412Id EmitGlobalAtomicMinF16x2(EmitContext& ctx);
413Id EmitGlobalAtomicMinF32x2(EmitContext& ctx);
414Id EmitGlobalAtomicMaxF16x2(EmitContext& ctx);
415Id EmitGlobalAtomicMaxF32x2(EmitContext& ctx);
416Id EmitLogicalOr(EmitContext& ctx, Id a, Id b);
417Id EmitLogicalAnd(EmitContext& ctx, Id a, Id b);
418Id EmitLogicalXor(EmitContext& ctx, Id a, Id b);
419Id EmitLogicalNot(EmitContext& ctx, Id value);
420Id EmitConvertS16F16(EmitContext& ctx, Id value);
421Id EmitConvertS16F32(EmitContext& ctx, Id value);
422Id EmitConvertS16F64(EmitContext& ctx, Id value);
423Id EmitConvertS32F16(EmitContext& ctx, Id value);
424Id EmitConvertS32F32(EmitContext& ctx, Id value);
425Id EmitConvertS32F64(EmitContext& ctx, Id value);
426Id EmitConvertS64F16(EmitContext& ctx, Id value);
427Id EmitConvertS64F32(EmitContext& ctx, Id value);
428Id EmitConvertS64F64(EmitContext& ctx, Id value);
429Id EmitConvertU16F16(EmitContext& ctx, Id value);
430Id EmitConvertU16F32(EmitContext& ctx, Id value);
431Id EmitConvertU16F64(EmitContext& ctx, Id value);
432Id EmitConvertU32F16(EmitContext& ctx, Id value);
433Id EmitConvertU32F32(EmitContext& ctx, Id value);
434Id EmitConvertU32F64(EmitContext& ctx, Id value);
435Id EmitConvertU64F16(EmitContext& ctx, Id value);
436Id EmitConvertU64F32(EmitContext& ctx, Id value);
437Id EmitConvertU64F64(EmitContext& ctx, Id value);
438Id EmitConvertU64U32(EmitContext& ctx, Id value);
439Id EmitConvertU32U64(EmitContext& ctx, Id value);
440Id EmitConvertF16F32(EmitContext& ctx, Id value);
441Id EmitConvertF32F16(EmitContext& ctx, Id value);
442Id EmitConvertF32F64(EmitContext& ctx, Id value);
443Id EmitConvertF64F32(EmitContext& ctx, Id value);
444Id EmitConvertF16S8(EmitContext& ctx, Id value);
445Id EmitConvertF16S16(EmitContext& ctx, Id value);
446Id EmitConvertF16S32(EmitContext& ctx, Id value);
447Id EmitConvertF16S64(EmitContext& ctx, Id value);
448Id EmitConvertF16U8(EmitContext& ctx, Id value);
449Id EmitConvertF16U16(EmitContext& ctx, Id value);
450Id EmitConvertF16U32(EmitContext& ctx, Id value);
451Id EmitConvertF16U64(EmitContext& ctx, Id value);
452Id EmitConvertF32S8(EmitContext& ctx, Id value);
453Id EmitConvertF32S16(EmitContext& ctx, Id value);
454Id EmitConvertF32S32(EmitContext& ctx, Id value);
455Id EmitConvertF32S64(EmitContext& ctx, Id value);
456Id EmitConvertF32U8(EmitContext& ctx, Id value);
457Id EmitConvertF32U16(EmitContext& ctx, Id value);
458Id EmitConvertF32U32(EmitContext& ctx, Id value);
459Id EmitConvertF32U64(EmitContext& ctx, Id value);
460Id EmitConvertF64S8(EmitContext& ctx, Id value);
461Id EmitConvertF64S16(EmitContext& ctx, Id value);
462Id EmitConvertF64S32(EmitContext& ctx, Id value);
463Id EmitConvertF64S64(EmitContext& ctx, Id value);
464Id EmitConvertF64U8(EmitContext& ctx, Id value);
465Id EmitConvertF64U16(EmitContext& ctx, Id value);
466Id EmitConvertF64U32(EmitContext& ctx, Id value);
467Id EmitConvertF64U64(EmitContext& ctx, Id value);
468Id EmitBindlessImageSampleImplicitLod(EmitContext&);
469Id EmitBindlessImageSampleExplicitLod(EmitContext&);
470Id EmitBindlessImageSampleDrefImplicitLod(EmitContext&);
471Id EmitBindlessImageSampleDrefExplicitLod(EmitContext&);
472Id EmitBindlessImageGather(EmitContext&);
473Id EmitBindlessImageGatherDref(EmitContext&);
474Id EmitBindlessImageFetch(EmitContext&);
475Id EmitBindlessImageQueryDimensions(EmitContext&);
476Id EmitBindlessImageQueryLod(EmitContext&);
477Id EmitBindlessImageGradient(EmitContext&);
478Id EmitBindlessImageRead(EmitContext&);
479Id EmitBindlessImageWrite(EmitContext&);
480Id EmitBoundImageSampleImplicitLod(EmitContext&);
481Id EmitBoundImageSampleExplicitLod(EmitContext&);
482Id EmitBoundImageSampleDrefImplicitLod(EmitContext&);
483Id EmitBoundImageSampleDrefExplicitLod(EmitContext&);
484Id EmitBoundImageGather(EmitContext&);
485Id EmitBoundImageGatherDref(EmitContext&);
486Id EmitBoundImageFetch(EmitContext&);
487Id EmitBoundImageQueryDimensions(EmitContext&);
488Id EmitBoundImageQueryLod(EmitContext&);
489Id EmitBoundImageGradient(EmitContext&);
490Id EmitBoundImageRead(EmitContext&);
491Id EmitBoundImageWrite(EmitContext&);
492Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
493 Id bias_lc, const IR::Value& offset);
494Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
495 Id lod_lc, const IR::Value& offset);
496Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
497 Id coords, Id dref, Id bias_lc, const IR::Value& offset);
498Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
499 Id coords, Id dref, Id lod_lc, const IR::Value& offset);
500Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
501 const IR::Value& offset, const IR::Value& offset2);
502Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
503 const IR::Value& offset, const IR::Value& offset2, Id dref);
504Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset,
505 Id lod, Id ms);
506Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id lod);
507Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
508Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
509 Id derivates, Id offset, Id lod_clamp);
510Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
511void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id color);
512Id EmitBindlessImageAtomicIAdd32(EmitContext&);
513Id EmitBindlessImageAtomicSMin32(EmitContext&);
514Id EmitBindlessImageAtomicUMin32(EmitContext&);
515Id EmitBindlessImageAtomicSMax32(EmitContext&);
516Id EmitBindlessImageAtomicUMax32(EmitContext&);
517Id EmitBindlessImageAtomicInc32(EmitContext&);
518Id EmitBindlessImageAtomicDec32(EmitContext&);
519Id EmitBindlessImageAtomicAnd32(EmitContext&);
520Id EmitBindlessImageAtomicOr32(EmitContext&);
521Id EmitBindlessImageAtomicXor32(EmitContext&);
522Id EmitBindlessImageAtomicExchange32(EmitContext&);
523Id EmitBoundImageAtomicIAdd32(EmitContext&);
524Id EmitBoundImageAtomicSMin32(EmitContext&);
525Id EmitBoundImageAtomicUMin32(EmitContext&);
526Id EmitBoundImageAtomicSMax32(EmitContext&);
527Id EmitBoundImageAtomicUMax32(EmitContext&);
528Id EmitBoundImageAtomicInc32(EmitContext&);
529Id EmitBoundImageAtomicDec32(EmitContext&);
530Id EmitBoundImageAtomicAnd32(EmitContext&);
531Id EmitBoundImageAtomicOr32(EmitContext&);
532Id EmitBoundImageAtomicXor32(EmitContext&);
533Id EmitBoundImageAtomicExchange32(EmitContext&);
534Id EmitImageAtomicIAdd32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
535 Id value);
536Id EmitImageAtomicSMin32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
537 Id value);
538Id EmitImageAtomicUMin32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
539 Id value);
540Id EmitImageAtomicSMax32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
541 Id value);
542Id EmitImageAtomicUMax32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
543 Id value);
544Id EmitImageAtomicInc32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
545 Id value);
546Id EmitImageAtomicDec32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
547 Id value);
548Id EmitImageAtomicAnd32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
549 Id value);
550Id EmitImageAtomicOr32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
551 Id value);
552Id EmitImageAtomicXor32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
553 Id value);
554Id EmitImageAtomicExchange32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
555 Id value);
556Id EmitLaneId(EmitContext& ctx);
557Id EmitVoteAll(EmitContext& ctx, Id pred);
558Id EmitVoteAny(EmitContext& ctx, Id pred);
559Id EmitVoteEqual(EmitContext& ctx, Id pred);
560Id EmitSubgroupBallot(EmitContext& ctx, Id pred);
561Id EmitSubgroupEqMask(EmitContext& ctx);
562Id EmitSubgroupLtMask(EmitContext& ctx);
563Id EmitSubgroupLeMask(EmitContext& ctx);
564Id EmitSubgroupGtMask(EmitContext& ctx);
565Id EmitSubgroupGeMask(EmitContext& ctx);
566Id EmitShuffleIndex(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
567 Id segmentation_mask);
568Id EmitShuffleUp(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
569 Id segmentation_mask);
570Id EmitShuffleDown(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
571 Id segmentation_mask);
572Id EmitShuffleButterfly(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
573 Id segmentation_mask);
574Id EmitFSwizzleAdd(EmitContext& ctx, Id op_a, Id op_b, Id swizzle);
575
576Id EmitDPdxFine(EmitContext& ctx, Id op_a);
577
578Id EmitDPdyFine(EmitContext& ctx, Id op_a);
579
580Id EmitDPdxCoarse(EmitContext& ctx, Id op_a);
581
582Id EmitDPdyCoarse(EmitContext& ctx, Id op_a);
583 26
584} // namespace Shader::Backend::SPIRV 27} // namespace Shader::Backend::SPIRV
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp
index 6e17d1c7e..053800eb7 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8namespace { 9namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
index 705aebd81..e0b52a001 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6#include "shader_recompiler/frontend/ir/modifiers.h" 7#include "shader_recompiler/frontend/ir/modifiers.h"
7 8
8namespace Shader::Backend::SPIRV { 9namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp
index 93a45d834..bb11f4f4e 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8 9
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp
index 079e226de..10ff4ecab 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6#include "shader_recompiler/frontend/ir/modifiers.h" 7#include "shader_recompiler/frontend/ir/modifiers.h"
7 8
8namespace Shader::Backend::SPIRV { 9namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp
index ef32184ea..8e57ff070 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp
@@ -6,6 +6,7 @@
6#include <utility> 6#include <utility>
7 7
8#include "shader_recompiler/backend/spirv/emit_spirv.h" 8#include "shader_recompiler/backend/spirv/emit_spirv.h"
9#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
9 10
10namespace Shader::Backend::SPIRV { 11namespace Shader::Backend::SPIRV {
11namespace { 12namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp
index b4a6fbb93..6154c46be 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8 9
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp
index acb8957fe..fd74e475f 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8namespace { 9namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
index b3afbef25..61cf25f9c 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6#include "shader_recompiler/frontend/ir/modifiers.h" 7#include "shader_recompiler/frontend/ir/modifiers.h"
7 8
8namespace Shader::Backend::SPIRV { 9namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
index 6680cf1b3..5832104df 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
@@ -5,6 +5,7 @@
5#include <boost/container/static_vector.hpp> 5#include <boost/container/static_vector.hpp>
6 6
7#include "shader_recompiler/backend/spirv/emit_spirv.h" 7#include "shader_recompiler/backend/spirv/emit_spirv.h"
8#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
8#include "shader_recompiler/frontend/ir/modifiers.h" 9#include "shader_recompiler/frontend/ir/modifiers.h"
9 10
10namespace Shader::Backend::SPIRV { 11namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp
index 05bed22b9..d7f1a365a 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6#include "shader_recompiler/frontend/ir/modifiers.h" 7#include "shader_recompiler/frontend/ir/modifiers.h"
7 8
8namespace Shader::Backend::SPIRV { 9namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h
new file mode 100644
index 000000000..b5eec3cd1
--- /dev/null
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h
@@ -0,0 +1,583 @@
1// Copyright 2021 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <sirit/sirit.h>
6
7#include "common/common_types.h"
8
9namespace IR {
10enum class Attribute : u64;
11enum class Patch : u64;
12class Inst;
13class Value;
14} // namespace IR
15
16namespace Shader::Backend::SPIRV {
17
18using Sirit::Id;
19
20class EmitContext;
21
22// Microinstruction emitters
23Id EmitPhi(EmitContext& ctx, IR::Inst* inst);
24void EmitVoid(EmitContext& ctx);
25Id EmitIdentity(EmitContext& ctx, const IR::Value& value);
26void EmitBranch(EmitContext& ctx, Id label);
27void EmitBranchConditional(EmitContext& ctx, Id condition, Id true_label, Id false_label);
28void EmitLoopMerge(EmitContext& ctx, Id merge_label, Id continue_label);
29void EmitSelectionMerge(EmitContext& ctx, Id merge_label);
30void EmitReturn(EmitContext& ctx);
31void EmitJoin(EmitContext& ctx);
32void EmitUnreachable(EmitContext& ctx);
33void EmitDemoteToHelperInvocation(EmitContext& ctx, Id continue_label);
34void EmitBarrier(EmitContext& ctx);
35void EmitWorkgroupMemoryBarrier(EmitContext& ctx);
36void EmitDeviceMemoryBarrier(EmitContext& ctx);
37void EmitPrologue(EmitContext& ctx);
38void EmitEpilogue(EmitContext& ctx);
39void EmitEmitVertex(EmitContext& ctx, const IR::Value& stream);
40void EmitEndPrimitive(EmitContext& ctx, const IR::Value& stream);
41void EmitGetRegister(EmitContext& ctx);
42void EmitSetRegister(EmitContext& ctx);
43void EmitGetPred(EmitContext& ctx);
44void EmitSetPred(EmitContext& ctx);
45void EmitSetGotoVariable(EmitContext& ctx);
46void EmitGetGotoVariable(EmitContext& ctx);
47void EmitSetIndirectBranchVariable(EmitContext& ctx);
48void EmitGetIndirectBranchVariable(EmitContext& ctx);
49Id EmitGetCbufU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
50Id EmitGetCbufS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
51Id EmitGetCbufU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
52Id EmitGetCbufS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
53Id EmitGetCbufU32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
54Id EmitGetCbufF32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
55Id EmitGetCbufU32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
56Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, Id vertex);
57void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, Id vertex);
58Id EmitGetAttributeIndexed(EmitContext& ctx, Id offset, Id vertex);
59void EmitSetAttributeIndexed(EmitContext& ctx, Id offset, Id value, Id vertex);
60Id EmitGetPatch(EmitContext& ctx, IR::Patch patch);
61void EmitSetPatch(EmitContext& ctx, IR::Patch patch, Id value);
62void EmitSetFragColor(EmitContext& ctx, u32 index, u32 component, Id value);
63void EmitSetSampleMask(EmitContext& ctx, Id value);
64void EmitSetFragDepth(EmitContext& ctx, Id value);
65void EmitGetZFlag(EmitContext& ctx);
66void EmitGetSFlag(EmitContext& ctx);
67void EmitGetCFlag(EmitContext& ctx);
68void EmitGetOFlag(EmitContext& ctx);
69void EmitSetZFlag(EmitContext& ctx);
70void EmitSetSFlag(EmitContext& ctx);
71void EmitSetCFlag(EmitContext& ctx);
72void EmitSetOFlag(EmitContext& ctx);
73Id EmitWorkgroupId(EmitContext& ctx);
74Id EmitLocalInvocationId(EmitContext& ctx);
75Id EmitInvocationId(EmitContext& ctx);
76Id EmitSampleId(EmitContext& ctx);
77Id EmitIsHelperInvocation(EmitContext& ctx);
78Id EmitYDirection(EmitContext& ctx);
79Id EmitLoadLocal(EmitContext& ctx, Id word_offset);
80void EmitWriteLocal(EmitContext& ctx, Id word_offset, Id value);
81Id EmitUndefU1(EmitContext& ctx);
82Id EmitUndefU8(EmitContext& ctx);
83Id EmitUndefU16(EmitContext& ctx);
84Id EmitUndefU32(EmitContext& ctx);
85Id EmitUndefU64(EmitContext& ctx);
86void EmitLoadGlobalU8(EmitContext& ctx);
87void EmitLoadGlobalS8(EmitContext& ctx);
88void EmitLoadGlobalU16(EmitContext& ctx);
89void EmitLoadGlobalS16(EmitContext& ctx);
90Id EmitLoadGlobal32(EmitContext& ctx, Id address);
91Id EmitLoadGlobal64(EmitContext& ctx, Id address);
92Id EmitLoadGlobal128(EmitContext& ctx, Id address);
93void EmitWriteGlobalU8(EmitContext& ctx);
94void EmitWriteGlobalS8(EmitContext& ctx);
95void EmitWriteGlobalU16(EmitContext& ctx);
96void EmitWriteGlobalS16(EmitContext& ctx);
97void EmitWriteGlobal32(EmitContext& ctx, Id address, Id value);
98void EmitWriteGlobal64(EmitContext& ctx, Id address, Id value);
99void EmitWriteGlobal128(EmitContext& ctx, Id address, Id value);
100Id EmitLoadStorageU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
101Id EmitLoadStorageS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
102Id EmitLoadStorageU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
103Id EmitLoadStorageS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
104Id EmitLoadStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
105Id EmitLoadStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
106Id EmitLoadStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
107void EmitWriteStorageU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
108 Id value);
109void EmitWriteStorageS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
110 Id value);
111void EmitWriteStorageU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
112 Id value);
113void EmitWriteStorageS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
114 Id value);
115void EmitWriteStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
116 Id value);
117void EmitWriteStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
118 Id value);
119void EmitWriteStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
120 Id value);
121Id EmitLoadSharedU8(EmitContext& ctx, Id offset);
122Id EmitLoadSharedS8(EmitContext& ctx, Id offset);
123Id EmitLoadSharedU16(EmitContext& ctx, Id offset);
124Id EmitLoadSharedS16(EmitContext& ctx, Id offset);
125Id EmitLoadSharedU32(EmitContext& ctx, Id offset);
126Id EmitLoadSharedU64(EmitContext& ctx, Id offset);
127Id EmitLoadSharedU128(EmitContext& ctx, Id offset);
128void EmitWriteSharedU8(EmitContext& ctx, Id offset, Id value);
129void EmitWriteSharedU16(EmitContext& ctx, Id offset, Id value);
130void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value);
131void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value);
132void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value);
133Id EmitCompositeConstructU32x2(EmitContext& ctx, Id e1, Id e2);
134Id EmitCompositeConstructU32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
135Id EmitCompositeConstructU32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
136Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index);
137Id EmitCompositeExtractU32x3(EmitContext& ctx, Id composite, u32 index);
138Id EmitCompositeExtractU32x4(EmitContext& ctx, Id composite, u32 index);
139Id EmitCompositeInsertU32x2(EmitContext& ctx, Id composite, Id object, u32 index);
140Id EmitCompositeInsertU32x3(EmitContext& ctx, Id composite, Id object, u32 index);
141Id EmitCompositeInsertU32x4(EmitContext& ctx, Id composite, Id object, u32 index);
142Id EmitCompositeConstructF16x2(EmitContext& ctx, Id e1, Id e2);
143Id EmitCompositeConstructF16x3(EmitContext& ctx, Id e1, Id e2, Id e3);
144Id EmitCompositeConstructF16x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
145Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index);
146Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index);
147Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index);
148Id EmitCompositeInsertF16x2(EmitContext& ctx, Id composite, Id object, u32 index);
149Id EmitCompositeInsertF16x3(EmitContext& ctx, Id composite, Id object, u32 index);
150Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index);
151Id EmitCompositeConstructF32x2(EmitContext& ctx, Id e1, Id e2);
152Id EmitCompositeConstructF32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
153Id EmitCompositeConstructF32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
154Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index);
155Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index);
156Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index);
157Id EmitCompositeInsertF32x2(EmitContext& ctx, Id composite, Id object, u32 index);
158Id EmitCompositeInsertF32x3(EmitContext& ctx, Id composite, Id object, u32 index);
159Id EmitCompositeInsertF32x4(EmitContext& ctx, Id composite, Id object, u32 index);
160void EmitCompositeConstructF64x2(EmitContext& ctx);
161void EmitCompositeConstructF64x3(EmitContext& ctx);
162void EmitCompositeConstructF64x4(EmitContext& ctx);
163void EmitCompositeExtractF64x2(EmitContext& ctx);
164void EmitCompositeExtractF64x3(EmitContext& ctx);
165void EmitCompositeExtractF64x4(EmitContext& ctx);
166Id EmitCompositeInsertF64x2(EmitContext& ctx, Id composite, Id object, u32 index);
167Id EmitCompositeInsertF64x3(EmitContext& ctx, Id composite, Id object, u32 index);
168Id EmitCompositeInsertF64x4(EmitContext& ctx, Id composite, Id object, u32 index);
169Id EmitSelectU1(EmitContext& ctx, Id cond, Id true_value, Id false_value);
170Id EmitSelectU8(EmitContext& ctx, Id cond, Id true_value, Id false_value);
171Id EmitSelectU16(EmitContext& ctx, Id cond, Id true_value, Id false_value);
172Id EmitSelectU32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
173Id EmitSelectU64(EmitContext& ctx, Id cond, Id true_value, Id false_value);
174Id EmitSelectF16(EmitContext& ctx, Id cond, Id true_value, Id false_value);
175Id EmitSelectF32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
176Id EmitSelectF64(EmitContext& ctx, Id cond, Id true_value, Id false_value);
177void EmitBitCastU16F16(EmitContext& ctx);
178Id EmitBitCastU32F32(EmitContext& ctx, Id value);
179void EmitBitCastU64F64(EmitContext& ctx);
180void EmitBitCastF16U16(EmitContext& ctx);
181Id EmitBitCastF32U32(EmitContext& ctx, Id value);
182void EmitBitCastF64U64(EmitContext& ctx);
183Id EmitPackUint2x32(EmitContext& ctx, Id value);
184Id EmitUnpackUint2x32(EmitContext& ctx, Id value);
185Id EmitPackFloat2x16(EmitContext& ctx, Id value);
186Id EmitUnpackFloat2x16(EmitContext& ctx, Id value);
187Id EmitPackHalf2x16(EmitContext& ctx, Id value);
188Id EmitUnpackHalf2x16(EmitContext& ctx, Id value);
189Id EmitPackDouble2x32(EmitContext& ctx, Id value);
190Id EmitUnpackDouble2x32(EmitContext& ctx, Id value);
191void EmitGetZeroFromOp(EmitContext& ctx);
192void EmitGetSignFromOp(EmitContext& ctx);
193void EmitGetCarryFromOp(EmitContext& ctx);
194void EmitGetOverflowFromOp(EmitContext& ctx);
195void EmitGetSparseFromOp(EmitContext& ctx);
196void EmitGetInBoundsFromOp(EmitContext& ctx);
197Id EmitFPAbs16(EmitContext& ctx, Id value);
198Id EmitFPAbs32(EmitContext& ctx, Id value);
199Id EmitFPAbs64(EmitContext& ctx, Id value);
200Id EmitFPAdd16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
201Id EmitFPAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
202Id EmitFPAdd64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
203Id EmitFPFma16(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
204Id EmitFPFma32(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
205Id EmitFPFma64(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
206Id EmitFPMax32(EmitContext& ctx, Id a, Id b);
207Id EmitFPMax64(EmitContext& ctx, Id a, Id b);
208Id EmitFPMin32(EmitContext& ctx, Id a, Id b);
209Id EmitFPMin64(EmitContext& ctx, Id a, Id b);
210Id EmitFPMul16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
211Id EmitFPMul32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
212Id EmitFPMul64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
213Id EmitFPNeg16(EmitContext& ctx, Id value);
214Id EmitFPNeg32(EmitContext& ctx, Id value);
215Id EmitFPNeg64(EmitContext& ctx, Id value);
216Id EmitFPSin(EmitContext& ctx, Id value);
217Id EmitFPCos(EmitContext& ctx, Id value);
218Id EmitFPExp2(EmitContext& ctx, Id value);
219Id EmitFPLog2(EmitContext& ctx, Id value);
220Id EmitFPRecip32(EmitContext& ctx, Id value);
221Id EmitFPRecip64(EmitContext& ctx, Id value);
222Id EmitFPRecipSqrt32(EmitContext& ctx, Id value);
223Id EmitFPRecipSqrt64(EmitContext& ctx, Id value);
224Id EmitFPSqrt(EmitContext& ctx, Id value);
225Id EmitFPSaturate16(EmitContext& ctx, Id value);
226Id EmitFPSaturate32(EmitContext& ctx, Id value);
227Id EmitFPSaturate64(EmitContext& ctx, Id value);
228Id EmitFPClamp16(EmitContext& ctx, Id value, Id min_value, Id max_value);
229Id EmitFPClamp32(EmitContext& ctx, Id value, Id min_value, Id max_value);
230Id EmitFPClamp64(EmitContext& ctx, Id value, Id min_value, Id max_value);
231Id EmitFPRoundEven16(EmitContext& ctx, Id value);
232Id EmitFPRoundEven32(EmitContext& ctx, Id value);
233Id EmitFPRoundEven64(EmitContext& ctx, Id value);
234Id EmitFPFloor16(EmitContext& ctx, Id value);
235Id EmitFPFloor32(EmitContext& ctx, Id value);
236Id EmitFPFloor64(EmitContext& ctx, Id value);
237Id EmitFPCeil16(EmitContext& ctx, Id value);
238Id EmitFPCeil32(EmitContext& ctx, Id value);
239Id EmitFPCeil64(EmitContext& ctx, Id value);
240Id EmitFPTrunc16(EmitContext& ctx, Id value);
241Id EmitFPTrunc32(EmitContext& ctx, Id value);
242Id EmitFPTrunc64(EmitContext& ctx, Id value);
243Id EmitFPOrdEqual16(EmitContext& ctx, Id lhs, Id rhs);
244Id EmitFPOrdEqual32(EmitContext& ctx, Id lhs, Id rhs);
245Id EmitFPOrdEqual64(EmitContext& ctx, Id lhs, Id rhs);
246Id EmitFPUnordEqual16(EmitContext& ctx, Id lhs, Id rhs);
247Id EmitFPUnordEqual32(EmitContext& ctx, Id lhs, Id rhs);
248Id EmitFPUnordEqual64(EmitContext& ctx, Id lhs, Id rhs);
249Id EmitFPOrdNotEqual16(EmitContext& ctx, Id lhs, Id rhs);
250Id EmitFPOrdNotEqual32(EmitContext& ctx, Id lhs, Id rhs);
251Id EmitFPOrdNotEqual64(EmitContext& ctx, Id lhs, Id rhs);
252Id EmitFPUnordNotEqual16(EmitContext& ctx, Id lhs, Id rhs);
253Id EmitFPUnordNotEqual32(EmitContext& ctx, Id lhs, Id rhs);
254Id EmitFPUnordNotEqual64(EmitContext& ctx, Id lhs, Id rhs);
255Id EmitFPOrdLessThan16(EmitContext& ctx, Id lhs, Id rhs);
256Id EmitFPOrdLessThan32(EmitContext& ctx, Id lhs, Id rhs);
257Id EmitFPOrdLessThan64(EmitContext& ctx, Id lhs, Id rhs);
258Id EmitFPUnordLessThan16(EmitContext& ctx, Id lhs, Id rhs);
259Id EmitFPUnordLessThan32(EmitContext& ctx, Id lhs, Id rhs);
260Id EmitFPUnordLessThan64(EmitContext& ctx, Id lhs, Id rhs);
261Id EmitFPOrdGreaterThan16(EmitContext& ctx, Id lhs, Id rhs);
262Id EmitFPOrdGreaterThan32(EmitContext& ctx, Id lhs, Id rhs);
263Id EmitFPOrdGreaterThan64(EmitContext& ctx, Id lhs, Id rhs);
264Id EmitFPUnordGreaterThan16(EmitContext& ctx, Id lhs, Id rhs);
265Id EmitFPUnordGreaterThan32(EmitContext& ctx, Id lhs, Id rhs);
266Id EmitFPUnordGreaterThan64(EmitContext& ctx, Id lhs, Id rhs);
267Id EmitFPOrdLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
268Id EmitFPOrdLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
269Id EmitFPOrdLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
270Id EmitFPUnordLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
271Id EmitFPUnordLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
272Id EmitFPUnordLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
273Id EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
274Id EmitFPOrdGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
275Id EmitFPOrdGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
276Id EmitFPUnordGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
277Id EmitFPUnordGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
278Id EmitFPUnordGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
279Id EmitFPIsNan16(EmitContext& ctx, Id value);
280Id EmitFPIsNan32(EmitContext& ctx, Id value);
281Id EmitFPIsNan64(EmitContext& ctx, Id value);
282Id EmitIAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
283Id EmitIAdd64(EmitContext& ctx, Id a, Id b);
284Id EmitISub32(EmitContext& ctx, Id a, Id b);
285Id EmitISub64(EmitContext& ctx, Id a, Id b);
286Id EmitIMul32(EmitContext& ctx, Id a, Id b);
287Id EmitINeg32(EmitContext& ctx, Id value);
288Id EmitINeg64(EmitContext& ctx, Id value);
289Id EmitIAbs32(EmitContext& ctx, Id value);
290Id EmitIAbs64(EmitContext& ctx, Id value);
291Id EmitShiftLeftLogical32(EmitContext& ctx, Id base, Id shift);
292Id EmitShiftLeftLogical64(EmitContext& ctx, Id base, Id shift);
293Id EmitShiftRightLogical32(EmitContext& ctx, Id base, Id shift);
294Id EmitShiftRightLogical64(EmitContext& ctx, Id base, Id shift);
295Id EmitShiftRightArithmetic32(EmitContext& ctx, Id base, Id shift);
296Id EmitShiftRightArithmetic64(EmitContext& ctx, Id base, Id shift);
297Id EmitBitwiseAnd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
298Id EmitBitwiseOr32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
299Id EmitBitwiseXor32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
300Id EmitBitFieldInsert(EmitContext& ctx, Id base, Id insert, Id offset, Id count);
301Id EmitBitFieldSExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
302Id EmitBitFieldUExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
303Id EmitBitReverse32(EmitContext& ctx, Id value);
304Id EmitBitCount32(EmitContext& ctx, Id value);
305Id EmitBitwiseNot32(EmitContext& ctx, Id value);
306Id EmitFindSMsb32(EmitContext& ctx, Id value);
307Id EmitFindUMsb32(EmitContext& ctx, Id value);
308Id EmitSMin32(EmitContext& ctx, Id a, Id b);
309Id EmitUMin32(EmitContext& ctx, Id a, Id b);
310Id EmitSMax32(EmitContext& ctx, Id a, Id b);
311Id EmitUMax32(EmitContext& ctx, Id a, Id b);
312Id EmitSClamp32(EmitContext& ctx, IR::Inst* inst, Id value, Id min, Id max);
313Id EmitUClamp32(EmitContext& ctx, IR::Inst* inst, Id value, Id min, Id max);
314Id EmitSLessThan(EmitContext& ctx, Id lhs, Id rhs);
315Id EmitULessThan(EmitContext& ctx, Id lhs, Id rhs);
316Id EmitIEqual(EmitContext& ctx, Id lhs, Id rhs);
317Id EmitSLessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
318Id EmitULessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
319Id EmitSGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
320Id EmitUGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
321Id EmitINotEqual(EmitContext& ctx, Id lhs, Id rhs);
322Id EmitSGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
323Id EmitUGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
324Id EmitSharedAtomicIAdd32(EmitContext& ctx, Id pointer_offset, Id value);
325Id EmitSharedAtomicSMin32(EmitContext& ctx, Id pointer_offset, Id value);
326Id EmitSharedAtomicUMin32(EmitContext& ctx, Id pointer_offset, Id value);
327Id EmitSharedAtomicSMax32(EmitContext& ctx, Id pointer_offset, Id value);
328Id EmitSharedAtomicUMax32(EmitContext& ctx, Id pointer_offset, Id value);
329Id EmitSharedAtomicInc32(EmitContext& ctx, Id pointer_offset, Id value);
330Id EmitSharedAtomicDec32(EmitContext& ctx, Id pointer_offset, Id value);
331Id EmitSharedAtomicAnd32(EmitContext& ctx, Id pointer_offset, Id value);
332Id EmitSharedAtomicOr32(EmitContext& ctx, Id pointer_offset, Id value);
333Id EmitSharedAtomicXor32(EmitContext& ctx, Id pointer_offset, Id value);
334Id EmitSharedAtomicExchange32(EmitContext& ctx, Id pointer_offset, Id value);
335Id EmitSharedAtomicExchange64(EmitContext& ctx, Id pointer_offset, Id value);
336Id EmitStorageAtomicIAdd32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
337 Id value);
338Id EmitStorageAtomicSMin32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
339 Id value);
340Id EmitStorageAtomicUMin32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
341 Id value);
342Id EmitStorageAtomicSMax32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
343 Id value);
344Id EmitStorageAtomicUMax32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
345 Id value);
346Id EmitStorageAtomicInc32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
347 Id value);
348Id EmitStorageAtomicDec32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
349 Id value);
350Id EmitStorageAtomicAnd32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
351 Id value);
352Id EmitStorageAtomicOr32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
353 Id value);
354Id EmitStorageAtomicXor32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
355 Id value);
356Id EmitStorageAtomicExchange32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
357 Id value);
358Id EmitStorageAtomicIAdd64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
359 Id value);
360Id EmitStorageAtomicSMin64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
361 Id value);
362Id EmitStorageAtomicUMin64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
363 Id value);
364Id EmitStorageAtomicSMax64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
365 Id value);
366Id EmitStorageAtomicUMax64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
367 Id value);
368Id EmitStorageAtomicAnd64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
369 Id value);
370Id EmitStorageAtomicOr64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
371 Id value);
372Id EmitStorageAtomicXor64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
373 Id value);
374Id EmitStorageAtomicExchange64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
375 Id value);
376Id EmitStorageAtomicAddF32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
377 Id value);
378Id EmitStorageAtomicAddF16x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
379 Id value);
380Id EmitStorageAtomicAddF32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
381 Id value);
382Id EmitStorageAtomicMinF16x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
383 Id value);
384Id EmitStorageAtomicMinF32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
385 Id value);
386Id EmitStorageAtomicMaxF16x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
387 Id value);
388Id EmitStorageAtomicMaxF32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
389 Id value);
390Id EmitGlobalAtomicIAdd32(EmitContext& ctx);
391Id EmitGlobalAtomicSMin32(EmitContext& ctx);
392Id EmitGlobalAtomicUMin32(EmitContext& ctx);
393Id EmitGlobalAtomicSMax32(EmitContext& ctx);
394Id EmitGlobalAtomicUMax32(EmitContext& ctx);
395Id EmitGlobalAtomicInc32(EmitContext& ctx);
396Id EmitGlobalAtomicDec32(EmitContext& ctx);
397Id EmitGlobalAtomicAnd32(EmitContext& ctx);
398Id EmitGlobalAtomicOr32(EmitContext& ctx);
399Id EmitGlobalAtomicXor32(EmitContext& ctx);
400Id EmitGlobalAtomicExchange32(EmitContext& ctx);
401Id EmitGlobalAtomicIAdd64(EmitContext& ctx);
402Id EmitGlobalAtomicSMin64(EmitContext& ctx);
403Id EmitGlobalAtomicUMin64(EmitContext& ctx);
404Id EmitGlobalAtomicSMax64(EmitContext& ctx);
405Id EmitGlobalAtomicUMax64(EmitContext& ctx);
406Id EmitGlobalAtomicInc64(EmitContext& ctx);
407Id EmitGlobalAtomicDec64(EmitContext& ctx);
408Id EmitGlobalAtomicAnd64(EmitContext& ctx);
409Id EmitGlobalAtomicOr64(EmitContext& ctx);
410Id EmitGlobalAtomicXor64(EmitContext& ctx);
411Id EmitGlobalAtomicExchange64(EmitContext& ctx);
412Id EmitGlobalAtomicAddF32(EmitContext& ctx);
413Id EmitGlobalAtomicAddF16x2(EmitContext& ctx);
414Id EmitGlobalAtomicAddF32x2(EmitContext& ctx);
415Id EmitGlobalAtomicMinF16x2(EmitContext& ctx);
416Id EmitGlobalAtomicMinF32x2(EmitContext& ctx);
417Id EmitGlobalAtomicMaxF16x2(EmitContext& ctx);
418Id EmitGlobalAtomicMaxF32x2(EmitContext& ctx);
419Id EmitLogicalOr(EmitContext& ctx, Id a, Id b);
420Id EmitLogicalAnd(EmitContext& ctx, Id a, Id b);
421Id EmitLogicalXor(EmitContext& ctx, Id a, Id b);
422Id EmitLogicalNot(EmitContext& ctx, Id value);
423Id EmitConvertS16F16(EmitContext& ctx, Id value);
424Id EmitConvertS16F32(EmitContext& ctx, Id value);
425Id EmitConvertS16F64(EmitContext& ctx, Id value);
426Id EmitConvertS32F16(EmitContext& ctx, Id value);
427Id EmitConvertS32F32(EmitContext& ctx, Id value);
428Id EmitConvertS32F64(EmitContext& ctx, Id value);
429Id EmitConvertS64F16(EmitContext& ctx, Id value);
430Id EmitConvertS64F32(EmitContext& ctx, Id value);
431Id EmitConvertS64F64(EmitContext& ctx, Id value);
432Id EmitConvertU16F16(EmitContext& ctx, Id value);
433Id EmitConvertU16F32(EmitContext& ctx, Id value);
434Id EmitConvertU16F64(EmitContext& ctx, Id value);
435Id EmitConvertU32F16(EmitContext& ctx, Id value);
436Id EmitConvertU32F32(EmitContext& ctx, Id value);
437Id EmitConvertU32F64(EmitContext& ctx, Id value);
438Id EmitConvertU64F16(EmitContext& ctx, Id value);
439Id EmitConvertU64F32(EmitContext& ctx, Id value);
440Id EmitConvertU64F64(EmitContext& ctx, Id value);
441Id EmitConvertU64U32(EmitContext& ctx, Id value);
442Id EmitConvertU32U64(EmitContext& ctx, Id value);
443Id EmitConvertF16F32(EmitContext& ctx, Id value);
444Id EmitConvertF32F16(EmitContext& ctx, Id value);
445Id EmitConvertF32F64(EmitContext& ctx, Id value);
446Id EmitConvertF64F32(EmitContext& ctx, Id value);
447Id EmitConvertF16S8(EmitContext& ctx, Id value);
448Id EmitConvertF16S16(EmitContext& ctx, Id value);
449Id EmitConvertF16S32(EmitContext& ctx, Id value);
450Id EmitConvertF16S64(EmitContext& ctx, Id value);
451Id EmitConvertF16U8(EmitContext& ctx, Id value);
452Id EmitConvertF16U16(EmitContext& ctx, Id value);
453Id EmitConvertF16U32(EmitContext& ctx, Id value);
454Id EmitConvertF16U64(EmitContext& ctx, Id value);
455Id EmitConvertF32S8(EmitContext& ctx, Id value);
456Id EmitConvertF32S16(EmitContext& ctx, Id value);
457Id EmitConvertF32S32(EmitContext& ctx, Id value);
458Id EmitConvertF32S64(EmitContext& ctx, Id value);
459Id EmitConvertF32U8(EmitContext& ctx, Id value);
460Id EmitConvertF32U16(EmitContext& ctx, Id value);
461Id EmitConvertF32U32(EmitContext& ctx, Id value);
462Id EmitConvertF32U64(EmitContext& ctx, Id value);
463Id EmitConvertF64S8(EmitContext& ctx, Id value);
464Id EmitConvertF64S16(EmitContext& ctx, Id value);
465Id EmitConvertF64S32(EmitContext& ctx, Id value);
466Id EmitConvertF64S64(EmitContext& ctx, Id value);
467Id EmitConvertF64U8(EmitContext& ctx, Id value);
468Id EmitConvertF64U16(EmitContext& ctx, Id value);
469Id EmitConvertF64U32(EmitContext& ctx, Id value);
470Id EmitConvertF64U64(EmitContext& ctx, Id value);
471Id EmitBindlessImageSampleImplicitLod(EmitContext&);
472Id EmitBindlessImageSampleExplicitLod(EmitContext&);
473Id EmitBindlessImageSampleDrefImplicitLod(EmitContext&);
474Id EmitBindlessImageSampleDrefExplicitLod(EmitContext&);
475Id EmitBindlessImageGather(EmitContext&);
476Id EmitBindlessImageGatherDref(EmitContext&);
477Id EmitBindlessImageFetch(EmitContext&);
478Id EmitBindlessImageQueryDimensions(EmitContext&);
479Id EmitBindlessImageQueryLod(EmitContext&);
480Id EmitBindlessImageGradient(EmitContext&);
481Id EmitBindlessImageRead(EmitContext&);
482Id EmitBindlessImageWrite(EmitContext&);
483Id EmitBoundImageSampleImplicitLod(EmitContext&);
484Id EmitBoundImageSampleExplicitLod(EmitContext&);
485Id EmitBoundImageSampleDrefImplicitLod(EmitContext&);
486Id EmitBoundImageSampleDrefExplicitLod(EmitContext&);
487Id EmitBoundImageGather(EmitContext&);
488Id EmitBoundImageGatherDref(EmitContext&);
489Id EmitBoundImageFetch(EmitContext&);
490Id EmitBoundImageQueryDimensions(EmitContext&);
491Id EmitBoundImageQueryLod(EmitContext&);
492Id EmitBoundImageGradient(EmitContext&);
493Id EmitBoundImageRead(EmitContext&);
494Id EmitBoundImageWrite(EmitContext&);
495Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
496 Id bias_lc, const IR::Value& offset);
497Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
498 Id lod_lc, const IR::Value& offset);
499Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
500 Id coords, Id dref, Id bias_lc, const IR::Value& offset);
501Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
502 Id coords, Id dref, Id lod_lc, const IR::Value& offset);
503Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
504 const IR::Value& offset, const IR::Value& offset2);
505Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
506 const IR::Value& offset, const IR::Value& offset2, Id dref);
507Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset,
508 Id lod, Id ms);
509Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id lod);
510Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
511Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
512 Id derivates, Id offset, Id lod_clamp);
513Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
514void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id color);
515Id EmitBindlessImageAtomicIAdd32(EmitContext&);
516Id EmitBindlessImageAtomicSMin32(EmitContext&);
517Id EmitBindlessImageAtomicUMin32(EmitContext&);
518Id EmitBindlessImageAtomicSMax32(EmitContext&);
519Id EmitBindlessImageAtomicUMax32(EmitContext&);
520Id EmitBindlessImageAtomicInc32(EmitContext&);
521Id EmitBindlessImageAtomicDec32(EmitContext&);
522Id EmitBindlessImageAtomicAnd32(EmitContext&);
523Id EmitBindlessImageAtomicOr32(EmitContext&);
524Id EmitBindlessImageAtomicXor32(EmitContext&);
525Id EmitBindlessImageAtomicExchange32(EmitContext&);
526Id EmitBoundImageAtomicIAdd32(EmitContext&);
527Id EmitBoundImageAtomicSMin32(EmitContext&);
528Id EmitBoundImageAtomicUMin32(EmitContext&);
529Id EmitBoundImageAtomicSMax32(EmitContext&);
530Id EmitBoundImageAtomicUMax32(EmitContext&);
531Id EmitBoundImageAtomicInc32(EmitContext&);
532Id EmitBoundImageAtomicDec32(EmitContext&);
533Id EmitBoundImageAtomicAnd32(EmitContext&);
534Id EmitBoundImageAtomicOr32(EmitContext&);
535Id EmitBoundImageAtomicXor32(EmitContext&);
536Id EmitBoundImageAtomicExchange32(EmitContext&);
537Id EmitImageAtomicIAdd32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
538 Id value);
539Id EmitImageAtomicSMin32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
540 Id value);
541Id EmitImageAtomicUMin32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
542 Id value);
543Id EmitImageAtomicSMax32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
544 Id value);
545Id EmitImageAtomicUMax32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
546 Id value);
547Id EmitImageAtomicInc32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
548 Id value);
549Id EmitImageAtomicDec32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
550 Id value);
551Id EmitImageAtomicAnd32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
552 Id value);
553Id EmitImageAtomicOr32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
554 Id value);
555Id EmitImageAtomicXor32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
556 Id value);
557Id EmitImageAtomicExchange32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
558 Id value);
559Id EmitLaneId(EmitContext& ctx);
560Id EmitVoteAll(EmitContext& ctx, Id pred);
561Id EmitVoteAny(EmitContext& ctx, Id pred);
562Id EmitVoteEqual(EmitContext& ctx, Id pred);
563Id EmitSubgroupBallot(EmitContext& ctx, Id pred);
564Id EmitSubgroupEqMask(EmitContext& ctx);
565Id EmitSubgroupLtMask(EmitContext& ctx);
566Id EmitSubgroupLeMask(EmitContext& ctx);
567Id EmitSubgroupGtMask(EmitContext& ctx);
568Id EmitSubgroupGeMask(EmitContext& ctx);
569Id EmitShuffleIndex(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
570 Id segmentation_mask);
571Id EmitShuffleUp(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
572 Id segmentation_mask);
573Id EmitShuffleDown(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
574 Id segmentation_mask);
575Id EmitShuffleButterfly(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
576 Id segmentation_mask);
577Id EmitFSwizzleAdd(EmitContext& ctx, Id op_a, Id op_b, Id swizzle);
578Id EmitDPdxFine(EmitContext& ctx, Id op_a);
579Id EmitDPdyFine(EmitContext& ctx, Id op_a);
580Id EmitDPdxCoarse(EmitContext& ctx, Id op_a);
581Id EmitDPdyCoarse(EmitContext& ctx, Id op_a);
582
583} // namespace Shader::Backend::SPIRV
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp
index 86e6a4f3b..06ab23b1d 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8namespace { 9namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp
index bb434def2..b9a9500fc 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8 9
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp
index a6a3f3351..37a66095f 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp
@@ -5,6 +5,7 @@
5#include <bit> 5#include <bit>
6 6
7#include "shader_recompiler/backend/spirv/emit_spirv.h" 7#include "shader_recompiler/backend/spirv/emit_spirv.h"
8#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
8 9
9namespace Shader::Backend::SPIRV { 10namespace Shader::Backend::SPIRV {
10namespace { 11namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_select.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_select.cpp
index 0b45db45e..c5b4f4720 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_select.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_select.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8 9
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp
index 710d1cd25..9a79fc7a2 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8namespace { 9namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
index d5430e905..ba948f3c9 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8namespace { 9namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp
index 19b06dbe4..c9f469e90 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8 9
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
index 239e2ecab..78b1e1ba7 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "shader_recompiler/backend/spirv/emit_spirv.h" 5#include "shader_recompiler/backend/spirv/emit_spirv.h"
6#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
6 7
7namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
8namespace { 9namespace {