summaryrefslogtreecommitdiffstats
path: root/src/shader_recompiler/frontend/maxwell/translate/impl/impl.h
blob: ed81d9c369c6f68969b9e85bdb7c0cca151dd438 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
// Copyright 2021 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.

#pragma once

#include "shader_recompiler/environment.h"
#include "shader_recompiler/frontend/ir/basic_block.h"
#include "shader_recompiler/frontend/ir/ir_emitter.h"
#include "shader_recompiler/frontend/maxwell/instruction.h"

namespace Shader::Maxwell {

enum class CompareOp : u64 {
    False,
    LessThan,
    Equal,
    LessThanEqual,
    GreaterThan,
    NotEqual,
    GreaterThanEqual,
    True,
};

enum class BooleanOp : u64 {
    AND,
    OR,
    XOR,
};

enum class PredicateOp : u64 {
    False,
    True,
    Zero,
    NonZero,
};

enum class FPCompareOp : u64 {
    F,
    LT,
    EQ,
    LE,
    GT,
    NE,
    GE,
    NUM,
    Nan,
    LTU,
    EQU,
    LEU,
    GTU,
    NEU,
    GEU,
    T,
};

class TranslatorVisitor {
public:
    explicit TranslatorVisitor(Environment& env_, IR::Block& block) : env{env_}, ir(block) {}

    Environment& env;
    IR::IREmitter ir;

    void AL2P(u64 insn);
    void ALD(u64 insn);
    void AST(u64 insn);
    void ATOM_cas(u64 insn);
    void ATOM(u64 insn);
    void ATOMS_cas(u64 insn);
    void ATOMS(u64 insn);
    void B2R(u64 insn);
    void BAR(u64 insn);
    void BFE_reg(u64 insn);
    void BFE_cbuf(u64 insn);
    void BFE_imm(u64 insn);
    void BFI_reg(u64 insn);
    void BFI_rc(u64 insn);
    void BFI_cr(u64 insn);
    void BFI_imm(u64 insn);
    void BPT(u64 insn);
    void BRA(u64 insn);
    void BRK(u64 insn);
    void BRX(u64 insn);
    void CAL();
    void CCTL(u64 insn);
    void CCTLL(u64 insn);
    void CONT(u64 insn);
    void CS2R(u64 insn);
    void CSET(u64 insn);
    void CSETP(u64 insn);
    void DADD_reg(u64 insn);
    void DADD_cbuf(u64 insn);
    void DADD_imm(u64 insn);
    void DEPBAR();
    void DFMA_reg(u64 insn);
    void DFMA_rc(u64 insn);
    void DFMA_cr(u64 insn);
    void DFMA_imm(u64 insn);
    void DMNMX_reg(u64 insn);
    void DMNMX_cbuf(u64 insn);
    void DMNMX_imm(u64 insn);
    void DMUL_reg(u64 insn);
    void DMUL_cbuf(u64 insn);
    void DMUL_imm(u64 insn);
    void DSET_reg(u64 insn);
    void DSET_cbuf(u64 insn);
    void DSET_imm(u64 insn);
    void DSETP_reg(u64 insn);
    void DSETP_cbuf(u64 insn);
    void DSETP_imm(u64 insn);
    void EXIT();
    void F2F_reg(u64 insn);
    void F2F_cbuf(u64 insn);
    void F2F_imm(u64 insn);
    void F2I_reg(u64 insn);
    void F2I_cbuf(u64 insn);
    void F2I_imm(u64 insn);
    void FADD_reg(u64 insn);
    void FADD_cbuf(u64 insn);
    void FADD_imm(u64 insn);
    void FADD32I(u64 insn);
    void FCHK_reg(u64 insn);
    void FCHK_cbuf(u64 insn);
    void FCHK_imm(u64 insn);
    void FCMP_reg(u64 insn);
    void FCMP_rc(u64 insn);
    void FCMP_cr(u64 insn);
    void FCMP_imm(u64 insn);
    void FFMA_reg(u64 insn);
    void FFMA_rc(u64 insn);
    void FFMA_cr(u64 insn);
    void FFMA_imm(u64 insn);
    void FFMA32I(u64 insn);
    void FLO_reg(u64 insn);
    void FLO_cbuf(u64 insn);
    void FLO_imm(u64 insn);
    void FMNMX_reg(u64 insn);
    void FMNMX_cbuf(u64 insn);
    void FMNMX_imm(u64 insn);
    void FMUL_reg(u64 insn);
    void FMUL_cbuf(u64 insn);
    void FMUL_imm(u64 insn);
    void FMUL32I(u64 insn);
    void FSET_reg(u64 insn);
    void FSET_cbuf(u64 insn);
    void FSET_imm(u64 insn);
    void FSETP_reg(u64 insn);
    void FSETP_cbuf(u64 insn);
    void FSETP_imm(u64 insn);
    void FSWZADD(u64 insn);
    void GETCRSPTR(u64 insn);
    void GETLMEMBASE(u64 insn);
    void HADD2_reg(u64 insn);
    void HADD2_cbuf(u64 insn);
    void HADD2_imm(u64 insn);
    void HADD2_32I(u64 insn);
    void HFMA2_reg(u64 insn);
    void HFMA2_rc(u64 insn);
    void HFMA2_cr(u64 insn);
    void HFMA2_imm(u64 insn);
    void HFMA2_32I(u64 insn);
    void HMUL2_reg(u64 insn);
    void HMUL2_cbuf(u64 insn);
    void HMUL2_imm(u64 insn);
    void HMUL2_32I(u64 insn);
    void HSET2_reg(u64 insn);
    void HSET2_cbuf(u64 insn);
    void HSET2_imm(u64 insn);
    void HSETP2_reg(u64 insn);
    void HSETP2_cbuf(u64 insn);
    void HSETP2_imm(u64 insn);
    void I2F_reg(u64 insn);
    void I2F_cbuf(u64 insn);
    void I2F_imm(u64 insn);
    void I2I_reg(u64 insn);
    void I2I_cbuf(u64 insn);
    void I2I_imm(u64 insn);
    void IADD_reg(u64 insn);
    void IADD_cbuf(u64 insn);
    void IADD_imm(u64 insn);
    void IADD3_reg(u64 insn);
    void IADD3_cbuf(u64 insn);
    void IADD3_imm(u64 insn);
    void IADD32I(u64 insn);
    void ICMP_reg(u64 insn);
    void ICMP_rc(u64 insn);
    void ICMP_cr(u64 insn);
    void ICMP_imm(u64 insn);
    void IDE(u64 insn);
    void IDP_reg(u64 insn);
    void IDP_imm(u64 insn);
    void IMAD_reg(u64 insn);
    void IMAD_rc(u64 insn);
    void IMAD_cr(u64 insn);
    void IMAD_imm(u64 insn);
    void IMAD32I(u64 insn);
    void IMADSP_reg(u64 insn);
    void IMADSP_rc(u64 insn);
    void IMADSP_cr(u64 insn);
    void IMADSP_imm(u64 insn);
    void IMNMX_reg(u64 insn);
    void IMNMX_cbuf(u64 insn);
    void IMNMX_imm(u64 insn);
    void IMUL_reg(u64 insn);
    void IMUL_cbuf(u64 insn);
    void IMUL_imm(u64 insn);
    void IMUL32I(u64 insn);
    void IPA(u64 insn);
    void ISBERD(u64 insn);
    void ISCADD_reg(u64 insn);
    void ISCADD_cbuf(u64 insn);
    void ISCADD_imm(u64 insn);
    void ISCADD32I(u64 insn);
    void ISET_reg(u64 insn);
    void ISET_cbuf(u64 insn);
    void ISET_imm(u64 insn);
    void ISETP_reg(u64 insn);
    void ISETP_cbuf(u64 insn);
    void ISETP_imm(u64 insn);
    void JCAL(u64 insn);
    void JMP(u64 insn);
    void JMX(u64 insn);
    void KIL();
    void LD(u64 insn);
    void LDC(u64 insn);
    void LDG(u64 insn);
    void LDL(u64 insn);
    void LDS(u64 insn);
    void LEA_hi_reg(u64 insn);
    void LEA_hi_cbuf(u64 insn);
    void LEA_lo_reg(u64 insn);
    void LEA_lo_cbuf(u64 insn);
    void LEA_lo_imm(u64 insn);
    void LEPC(u64 insn);
    void LONGJMP(u64 insn);
    void LOP_reg(u64 insn);
    void LOP_cbuf(u64 insn);
    void LOP_imm(u64 insn);
    void LOP3_reg(u64 insn);
    void LOP3_cbuf(u64 insn);
    void LOP3_imm(u64 insn);
    void LOP32I(u64 insn);
    void MEMBAR(u64 insn);
    void MOV_reg(u64 insn);
    void MOV_cbuf(u64 insn);
    void MOV_imm(u64 insn);
    void MOV32I(u64 insn);
    void MUFU(u64 insn);
    void NOP(u64 insn);
    void OUT_reg(u64 insn);
    void OUT_cbuf(u64 insn);
    void OUT_imm(u64 insn);
    void P2R_reg(u64 insn);
    void P2R_cbuf(u64 insn);
    void P2R_imm(u64 insn);
    void PBK();
    void PCNT();
    void PEXIT(u64 insn);
    void PIXLD(u64 insn);
    void PLONGJMP(u64 insn);
    void POPC_reg(u64 insn);
    void POPC_cbuf(u64 insn);
    void POPC_imm(u64 insn);
    void PRET(u64 insn);
    void PRMT_reg(u64 insn);
    void PRMT_rc(u64 insn);
    void PRMT_cr(u64 insn);
    void PRMT_imm(u64 insn);
    void PSET(u64 insn);
    void PSETP(u64 insn);
    void R2B(u64 insn);
    void R2P_reg(u64 insn);
    void R2P_cbuf(u64 insn);
    void R2P_imm(u64 insn);
    void RAM(u64 insn);
    void RED(u64 insn);
    void RET(u64 insn);
    void RRO_reg(u64 insn);
    void RRO_cbuf(u64 insn);
    void RRO_imm(u64 insn);
    void RTT(u64 insn);
    void S2R(u64 insn);
    void SAM(u64 insn);
    void SEL_reg(u64 insn);
    void SEL_cbuf(u64 insn);
    void SEL_imm(u64 insn);
    void SETCRSPTR(u64 insn);
    void SETLMEMBASE(u64 insn);
    void SHF_l_reg(u64 insn);
    void SHF_l_imm(u64 insn);
    void SHF_r_reg(u64 insn);
    void SHF_r_imm(u64 insn);
    void SHFL(u64 insn);
    void SHL_reg(u64 insn);
    void SHL_cbuf(u64 insn);
    void SHL_imm(u64 insn);
    void SHR_reg(u64 insn);
    void SHR_cbuf(u64 insn);
    void SHR_imm(u64 insn);
    void SSY();
    void ST(u64 insn);
    void STG(u64 insn);
    void STL(u64 insn);
    void STP(u64 insn);
    void STS(u64 insn);
    void SUATOM_cas(u64 insn);
    void SULD(u64 insn);
    void SURED(u64 insn);
    void SUST(u64 insn);
    void SYNC(u64 insn);
    void TEX(u64 insn);
    void TEX_b(u64 insn);
    void TEXS(u64 insn);
    void TLD(u64 insn);
    void TLD_b(u64 insn);
    void TLD4(u64 insn);
    void TLD4_b(u64 insn);
    void TLD4S(u64 insn);
    void TLDS(u64 insn);
    void TMML(u64 insn);
    void TMML_b(u64 insn);
    void TXA(u64 insn);
    void TXD(u64 insn);
    void TXD_b(u64 insn);
    void TXQ(u64 insn);
    void TXQ_b(u64 insn);
    void VABSDIFF(u64 insn);
    void VABSDIFF4(u64 insn);
    void VADD(u64 insn);
    void VMAD(u64 insn);
    void VMNMX(u64 insn);
    void VOTE(u64 insn);
    void VOTE_vtg(u64 insn);
    void VSET(u64 insn);
    void VSETP(u64 insn);
    void VSHL(u64 insn);
    void VSHR(u64 insn);
    void XMAD_reg(u64 insn);
    void XMAD_rc(u64 insn);
    void XMAD_cr(u64 insn);
    void XMAD_imm(u64 insn);

    [[nodiscard]] IR::U32 X(IR::Reg reg);
    [[nodiscard]] IR::F32 F(IR::Reg reg);

    void X(IR::Reg dest_reg, const IR::U32& value);
    void F(IR::Reg dest_reg, const IR::F32& value);

    [[nodiscard]] IR::U32 GetReg8(u64 insn);
    [[nodiscard]] IR::U32 GetReg20(u64 insn);
    [[nodiscard]] IR::U32 GetReg39(u64 insn);
    [[nodiscard]] IR::F32 GetFloatReg20(u64 insn);
    [[nodiscard]] IR::F32 GetFloatReg39(u64 insn);
    [[nodiscard]] IR::F64 GetDoubleReg20(u64 insn);

    [[nodiscard]] IR::U32 GetCbuf(u64 insn);
    [[nodiscard]] IR::F32 GetFloatCbuf(u64 insn);
    [[nodiscard]] IR::F64 GetDoubleCbuf(u64 insn);

    [[nodiscard]] IR::U32 GetImm20(u64 insn);
    [[nodiscard]] IR::F32 GetFloatImm20(u64 insn);
    [[nodiscard]] IR::F64 GetDoubleImm20(u64 insn);

    [[nodiscard]] IR::U32 GetImm32(u64 insn);
    [[nodiscard]] IR::F32 GetFloatImm32(u64 insn);

    void SetZFlag(const IR::U1& value);
    void SetSFlag(const IR::U1& value);
    void SetCFlag(const IR::U1& value);
    void SetOFlag(const IR::U1& value);

    void ResetZero();
    void ResetSFlag();
    void ResetCFlag();
    void ResetOFlag();
};

} // namespace Shader::Maxwell