impl.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. // Copyright 2021 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "shader_recompiler/environment.h"
  5. #include "shader_recompiler/frontend/ir/basic_block.h"
  6. #include "shader_recompiler/frontend/ir/ir_emitter.h"
  7. #include "shader_recompiler/frontend/maxwell/instruction.h"
  8. namespace Shader::Maxwell {
  9. class TranslatorVisitor {
  10. public:
  11. explicit TranslatorVisitor(Environment& env_, IR::Block& block) : env{env_} ,ir(block) {}
  12. Environment& env;
  13. IR::IREmitter ir;
  14. void AL2P(u64 insn);
  15. void ALD(u64 insn);
  16. void AST(u64 insn);
  17. void ATOM_cas(u64 insn);
  18. void ATOM(u64 insn);
  19. void ATOMS_cas(u64 insn);
  20. void ATOMS(u64 insn);
  21. void B2R(u64 insn);
  22. void BAR(u64 insn);
  23. void BFE_reg(u64 insn);
  24. void BFE_cbuf(u64 insn);
  25. void BFE_imm(u64 insn);
  26. void BFI_reg(u64 insn);
  27. void BFI_rc(u64 insn);
  28. void BFI_cr(u64 insn);
  29. void BFI_imm(u64 insn);
  30. void BPT(u64 insn);
  31. void BRA(u64 insn);
  32. void BRK(u64 insn);
  33. void BRX(u64 insn);
  34. void CAL(u64 insn);
  35. void CCTL(u64 insn);
  36. void CCTLL(u64 insn);
  37. void CONT(u64 insn);
  38. void CS2R(u64 insn);
  39. void CSET(u64 insn);
  40. void CSETP(u64 insn);
  41. void DADD_reg(u64 insn);
  42. void DADD_cbuf(u64 insn);
  43. void DADD_imm(u64 insn);
  44. void DEPBAR();
  45. void DFMA_reg(u64 insn);
  46. void DFMA_rc(u64 insn);
  47. void DFMA_cr(u64 insn);
  48. void DFMA_imm(u64 insn);
  49. void DMNMX_reg(u64 insn);
  50. void DMNMX_cbuf(u64 insn);
  51. void DMNMX_imm(u64 insn);
  52. void DMUL_reg(u64 insn);
  53. void DMUL_cbuf(u64 insn);
  54. void DMUL_imm(u64 insn);
  55. void DSET_reg(u64 insn);
  56. void DSET_cbuf(u64 insn);
  57. void DSET_imm(u64 insn);
  58. void DSETP_reg(u64 insn);
  59. void DSETP_cbuf(u64 insn);
  60. void DSETP_imm(u64 insn);
  61. void EXIT(u64 insn);
  62. void F2F_reg(u64 insn);
  63. void F2F_cbuf(u64 insn);
  64. void F2F_imm(u64 insn);
  65. void F2I_reg(u64 insn);
  66. void F2I_cbuf(u64 insn);
  67. void F2I_imm(u64 insn);
  68. void FADD_reg(u64 insn);
  69. void FADD_cbuf(u64 insn);
  70. void FADD_imm(u64 insn);
  71. void FADD32I(u64 insn);
  72. void FCHK_reg(u64 insn);
  73. void FCHK_cbuf(u64 insn);
  74. void FCHK_imm(u64 insn);
  75. void FCMP_reg(u64 insn);
  76. void FCMP_rc(u64 insn);
  77. void FCMP_cr(u64 insn);
  78. void FCMP_imm(u64 insn);
  79. void FFMA_reg(u64 insn);
  80. void FFMA_rc(u64 insn);
  81. void FFMA_cr(u64 insn);
  82. void FFMA_imm(u64 insn);
  83. void FFMA32I(u64 insn);
  84. void FLO_reg(u64 insn);
  85. void FLO_cbuf(u64 insn);
  86. void FLO_imm(u64 insn);
  87. void FMNMX_reg(u64 insn);
  88. void FMNMX_cbuf(u64 insn);
  89. void FMNMX_imm(u64 insn);
  90. void FMUL_reg(u64 insn);
  91. void FMUL_cbuf(u64 insn);
  92. void FMUL_imm(u64 insn);
  93. void FMUL32I(u64 insn);
  94. void FSET_reg(u64 insn);
  95. void FSET_cbuf(u64 insn);
  96. void FSET_imm(u64 insn);
  97. void FSETP_reg(u64 insn);
  98. void FSETP_cbuf(u64 insn);
  99. void FSETP_imm(u64 insn);
  100. void FSWZADD(u64 insn);
  101. void GETCRSPTR(u64 insn);
  102. void GETLMEMBASE(u64 insn);
  103. void HADD2_reg(u64 insn);
  104. void HADD2_cbuf(u64 insn);
  105. void HADD2_imm(u64 insn);
  106. void HADD2_32I(u64 insn);
  107. void HFMA2_reg(u64 insn);
  108. void HFMA2_rc(u64 insn);
  109. void HFMA2_cr(u64 insn);
  110. void HFMA2_imm(u64 insn);
  111. void HFMA2_32I(u64 insn);
  112. void HMUL2_reg(u64 insn);
  113. void HMUL2_cbuf(u64 insn);
  114. void HMUL2_imm(u64 insn);
  115. void HMUL2_32I(u64 insn);
  116. void HSET2_reg(u64 insn);
  117. void HSET2_cbuf(u64 insn);
  118. void HSET2_imm(u64 insn);
  119. void HSETP2_reg(u64 insn);
  120. void HSETP2_cbuf(u64 insn);
  121. void HSETP2_imm(u64 insn);
  122. void I2F_reg(u64 insn);
  123. void I2F_cbuf(u64 insn);
  124. void I2F_imm(u64 insn);
  125. void I2I_reg(u64 insn);
  126. void I2I_cbuf(u64 insn);
  127. void I2I_imm(u64 insn);
  128. void IADD_reg(u64 insn);
  129. void IADD_cbuf(u64 insn);
  130. void IADD_imm(u64 insn);
  131. void IADD3_reg(u64 insn);
  132. void IADD3_cbuf(u64 insn);
  133. void IADD3_imm(u64 insn);
  134. void IADD32I(u64 insn);
  135. void ICMP_reg(u64 insn);
  136. void ICMP_rc(u64 insn);
  137. void ICMP_cr(u64 insn);
  138. void ICMP_imm(u64 insn);
  139. void IDE(u64 insn);
  140. void IDP_reg(u64 insn);
  141. void IDP_imm(u64 insn);
  142. void IMAD_reg(u64 insn);
  143. void IMAD_rc(u64 insn);
  144. void IMAD_cr(u64 insn);
  145. void IMAD_imm(u64 insn);
  146. void IMAD32I(u64 insn);
  147. void IMADSP_reg(u64 insn);
  148. void IMADSP_rc(u64 insn);
  149. void IMADSP_cr(u64 insn);
  150. void IMADSP_imm(u64 insn);
  151. void IMNMX_reg(u64 insn);
  152. void IMNMX_cbuf(u64 insn);
  153. void IMNMX_imm(u64 insn);
  154. void IMUL_reg(u64 insn);
  155. void IMUL_cbuf(u64 insn);
  156. void IMUL_imm(u64 insn);
  157. void IMUL32I(u64 insn);
  158. void IPA(u64 insn);
  159. void ISBERD(u64 insn);
  160. void ISCADD_reg(u64 insn);
  161. void ISCADD_cbuf(u64 insn);
  162. void ISCADD_imm(u64 insn);
  163. void ISCADD32I(u64 insn);
  164. void ISET_reg(u64 insn);
  165. void ISET_cbuf(u64 insn);
  166. void ISET_imm(u64 insn);
  167. void ISETP_reg(u64 insn);
  168. void ISETP_cbuf(u64 insn);
  169. void ISETP_imm(u64 insn);
  170. void JCAL(u64 insn);
  171. void JMP(u64 insn);
  172. void JMX(u64 insn);
  173. void KIL(u64 insn);
  174. void LD(u64 insn);
  175. void LDC(u64 insn);
  176. void LDG(u64 insn);
  177. void LDL(u64 insn);
  178. void LDS(u64 insn);
  179. void LEA_hi_reg(u64 insn);
  180. void LEA_hi_cbuf(u64 insn);
  181. void LEA_lo_reg(u64 insn);
  182. void LEA_lo_cbuf(u64 insn);
  183. void LEA_lo_imm(u64 insn);
  184. void LEPC(u64 insn);
  185. void LONGJMP(u64 insn);
  186. void LOP_reg(u64 insn);
  187. void LOP_cbuf(u64 insn);
  188. void LOP_imm(u64 insn);
  189. void LOP3_reg(u64 insn);
  190. void LOP3_cbuf(u64 insn);
  191. void LOP3_imm(u64 insn);
  192. void LOP32I(u64 insn);
  193. void MEMBAR(u64 insn);
  194. void MOV_reg(u64 insn);
  195. void MOV_cbuf(u64 insn);
  196. void MOV_imm(u64 insn);
  197. void MOV32I(u64 insn);
  198. void MUFU(u64 insn);
  199. void NOP(u64 insn);
  200. void OUT_reg(u64 insn);
  201. void OUT_cbuf(u64 insn);
  202. void OUT_imm(u64 insn);
  203. void P2R_reg(u64 insn);
  204. void P2R_cbuf(u64 insn);
  205. void P2R_imm(u64 insn);
  206. void PBK();
  207. void PCNT(u64 insn);
  208. void PEXIT(u64 insn);
  209. void PIXLD(u64 insn);
  210. void PLONGJMP(u64 insn);
  211. void POPC_reg(u64 insn);
  212. void POPC_cbuf(u64 insn);
  213. void POPC_imm(u64 insn);
  214. void PRET(u64 insn);
  215. void PRMT_reg(u64 insn);
  216. void PRMT_rc(u64 insn);
  217. void PRMT_cr(u64 insn);
  218. void PRMT_imm(u64 insn);
  219. void PSET(u64 insn);
  220. void PSETP(u64 insn);
  221. void R2B(u64 insn);
  222. void R2P_reg(u64 insn);
  223. void R2P_cbuf(u64 insn);
  224. void R2P_imm(u64 insn);
  225. void RAM(u64 insn);
  226. void RED(u64 insn);
  227. void RET(u64 insn);
  228. void RRO_reg(u64 insn);
  229. void RRO_cbuf(u64 insn);
  230. void RRO_imm(u64 insn);
  231. void RTT(u64 insn);
  232. void S2R(u64 insn);
  233. void SAM(u64 insn);
  234. void SEL_reg(u64 insn);
  235. void SEL_cbuf(u64 insn);
  236. void SEL_imm(u64 insn);
  237. void SETCRSPTR(u64 insn);
  238. void SETLMEMBASE(u64 insn);
  239. void SHF_l_reg(u64 insn);
  240. void SHF_l_imm(u64 insn);
  241. void SHF_r_reg(u64 insn);
  242. void SHF_r_imm(u64 insn);
  243. void SHFL(u64 insn);
  244. void SHL_reg(u64 insn);
  245. void SHL_cbuf(u64 insn);
  246. void SHL_imm(u64 insn);
  247. void SHR_reg(u64 insn);
  248. void SHR_cbuf(u64 insn);
  249. void SHR_imm(u64 insn);
  250. void SSY();
  251. void ST(u64 insn);
  252. void STG(u64 insn);
  253. void STL(u64 insn);
  254. void STP(u64 insn);
  255. void STS(u64 insn);
  256. void SUATOM_cas(u64 insn);
  257. void SULD(u64 insn);
  258. void SURED(u64 insn);
  259. void SUST(u64 insn);
  260. void SYNC(u64 insn);
  261. void TEX(u64 insn);
  262. void TEX_b(u64 insn);
  263. void TEXS(u64 insn);
  264. void TLD(u64 insn);
  265. void TLD_b(u64 insn);
  266. void TLD4(u64 insn);
  267. void TLD4_b(u64 insn);
  268. void TLD4S(u64 insn);
  269. void TLDS(u64 insn);
  270. void TMML(u64 insn);
  271. void TMML_b(u64 insn);
  272. void TXA(u64 insn);
  273. void TXD(u64 insn);
  274. void TXD_b(u64 insn);
  275. void TXQ(u64 insn);
  276. void TXQ_b(u64 insn);
  277. void VABSDIFF(u64 insn);
  278. void VABSDIFF4(u64 insn);
  279. void VADD(u64 insn);
  280. void VMAD(u64 insn);
  281. void VMNMX(u64 insn);
  282. void VOTE(u64 insn);
  283. void VOTE_vtg(u64 insn);
  284. void VSET(u64 insn);
  285. void VSETP(u64 insn);
  286. void VSHL(u64 insn);
  287. void VSHR(u64 insn);
  288. void XMAD_reg(u64 insn);
  289. void XMAD_rc(u64 insn);
  290. void XMAD_cr(u64 insn);
  291. void XMAD_imm(u64 insn);
  292. [[nodiscard]] IR::U32 X(IR::Reg reg);
  293. void X(IR::Reg dest_reg, const IR::U32& value);
  294. [[nodiscard]] IR::U32 GetReg20(u64 insn);
  295. [[nodiscard]] IR::U32 GetReg39(u64 insn);
  296. [[nodiscard]] IR::U32 GetCbuf(u64 insn);
  297. [[nodiscard]] IR::U32 GetImm20(u64 insn);
  298. [[nodiscard]] IR::U32 GetImm32(u64 insn);
  299. void SetZFlag(const IR::U1& value);
  300. void SetSFlag(const IR::U1& value);
  301. void SetCFlag(const IR::U1& value);
  302. void SetOFlag(const IR::U1& value);
  303. void ResetZero();
  304. void ResetSFlag();
  305. void ResetCFlag();
  306. void ResetOFlag();
  307. };
  308. } // namespace Shader::Maxwell