arm_dyncom_trans.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. #pragma once
  2. #include <cstddef>
  3. #include "common/common_types.h"
  4. struct ARMul_State;
  5. typedef unsigned int (*shtop_fp_t)(ARMul_State* cpu, unsigned int sht_oper);
  6. enum class TransExtData {
  7. COND = (1 << 0),
  8. NON_BRANCH = (1 << 1),
  9. DIRECT_BRANCH = (1 << 2),
  10. INDIRECT_BRANCH = (1 << 3),
  11. CALL = (1 << 4),
  12. RET = (1 << 5),
  13. END_OF_PAGE = (1 << 6),
  14. THUMB = (1 << 7),
  15. SINGLE_STEP = (1 << 8)
  16. };
  17. struct arm_inst {
  18. unsigned int idx;
  19. unsigned int cond;
  20. TransExtData br;
  21. char component[0];
  22. };
  23. struct generic_arm_inst {
  24. u32 Ra;
  25. u32 Rm;
  26. u32 Rn;
  27. u32 Rd;
  28. u8 op1;
  29. u8 op2;
  30. };
  31. struct adc_inst {
  32. unsigned int I;
  33. unsigned int S;
  34. unsigned int Rn;
  35. unsigned int Rd;
  36. unsigned int shifter_operand;
  37. shtop_fp_t shtop_func;
  38. };
  39. struct add_inst {
  40. unsigned int I;
  41. unsigned int S;
  42. unsigned int Rn;
  43. unsigned int Rd;
  44. unsigned int shifter_operand;
  45. shtop_fp_t shtop_func;
  46. };
  47. struct orr_inst {
  48. unsigned int I;
  49. unsigned int S;
  50. unsigned int Rn;
  51. unsigned int Rd;
  52. unsigned int shifter_operand;
  53. shtop_fp_t shtop_func;
  54. };
  55. struct and_inst {
  56. unsigned int I;
  57. unsigned int S;
  58. unsigned int Rn;
  59. unsigned int Rd;
  60. unsigned int shifter_operand;
  61. shtop_fp_t shtop_func;
  62. };
  63. struct eor_inst {
  64. unsigned int I;
  65. unsigned int S;
  66. unsigned int Rn;
  67. unsigned int Rd;
  68. unsigned int shifter_operand;
  69. shtop_fp_t shtop_func;
  70. };
  71. struct bbl_inst {
  72. unsigned int L;
  73. int signed_immed_24;
  74. unsigned int next_addr;
  75. unsigned int jmp_addr;
  76. };
  77. struct bx_inst {
  78. unsigned int Rm;
  79. };
  80. struct blx_inst {
  81. union {
  82. s32 signed_immed_24;
  83. u32 Rm;
  84. } val;
  85. unsigned int inst;
  86. };
  87. struct clz_inst {
  88. unsigned int Rm;
  89. unsigned int Rd;
  90. };
  91. struct cps_inst {
  92. unsigned int imod0;
  93. unsigned int imod1;
  94. unsigned int mmod;
  95. unsigned int A, I, F;
  96. unsigned int mode;
  97. };
  98. struct clrex_inst {};
  99. struct cpy_inst {
  100. unsigned int Rm;
  101. unsigned int Rd;
  102. };
  103. struct bic_inst {
  104. unsigned int I;
  105. unsigned int S;
  106. unsigned int Rn;
  107. unsigned int Rd;
  108. unsigned int shifter_operand;
  109. shtop_fp_t shtop_func;
  110. };
  111. struct sub_inst {
  112. unsigned int I;
  113. unsigned int S;
  114. unsigned int Rn;
  115. unsigned int Rd;
  116. unsigned int shifter_operand;
  117. shtop_fp_t shtop_func;
  118. };
  119. struct tst_inst {
  120. unsigned int I;
  121. unsigned int S;
  122. unsigned int Rn;
  123. unsigned int Rd;
  124. unsigned int shifter_operand;
  125. shtop_fp_t shtop_func;
  126. };
  127. struct cmn_inst {
  128. unsigned int I;
  129. unsigned int Rn;
  130. unsigned int shifter_operand;
  131. shtop_fp_t shtop_func;
  132. };
  133. struct teq_inst {
  134. unsigned int I;
  135. unsigned int Rn;
  136. unsigned int shifter_operand;
  137. shtop_fp_t shtop_func;
  138. };
  139. struct stm_inst {
  140. unsigned int inst;
  141. };
  142. struct bkpt_inst {
  143. u32 imm;
  144. };
  145. struct stc_inst {};
  146. struct ldc_inst {};
  147. struct swi_inst {
  148. unsigned int num;
  149. };
  150. struct cmp_inst {
  151. unsigned int I;
  152. unsigned int Rn;
  153. unsigned int shifter_operand;
  154. shtop_fp_t shtop_func;
  155. };
  156. struct mov_inst {
  157. unsigned int I;
  158. unsigned int S;
  159. unsigned int Rd;
  160. unsigned int shifter_operand;
  161. shtop_fp_t shtop_func;
  162. };
  163. struct mvn_inst {
  164. unsigned int I;
  165. unsigned int S;
  166. unsigned int Rd;
  167. unsigned int shifter_operand;
  168. shtop_fp_t shtop_func;
  169. };
  170. struct rev_inst {
  171. unsigned int Rd;
  172. unsigned int Rm;
  173. unsigned int op1;
  174. unsigned int op2;
  175. };
  176. struct rsb_inst {
  177. unsigned int I;
  178. unsigned int S;
  179. unsigned int Rn;
  180. unsigned int Rd;
  181. unsigned int shifter_operand;
  182. shtop_fp_t shtop_func;
  183. };
  184. struct rsc_inst {
  185. unsigned int I;
  186. unsigned int S;
  187. unsigned int Rn;
  188. unsigned int Rd;
  189. unsigned int shifter_operand;
  190. shtop_fp_t shtop_func;
  191. };
  192. struct sbc_inst {
  193. unsigned int I;
  194. unsigned int S;
  195. unsigned int Rn;
  196. unsigned int Rd;
  197. unsigned int shifter_operand;
  198. shtop_fp_t shtop_func;
  199. };
  200. struct mul_inst {
  201. unsigned int S;
  202. unsigned int Rd;
  203. unsigned int Rs;
  204. unsigned int Rm;
  205. };
  206. struct smul_inst {
  207. unsigned int Rd;
  208. unsigned int Rs;
  209. unsigned int Rm;
  210. unsigned int x;
  211. unsigned int y;
  212. };
  213. struct umull_inst {
  214. unsigned int S;
  215. unsigned int RdHi;
  216. unsigned int RdLo;
  217. unsigned int Rs;
  218. unsigned int Rm;
  219. };
  220. struct smlad_inst {
  221. unsigned int m;
  222. unsigned int Rm;
  223. unsigned int Rd;
  224. unsigned int Ra;
  225. unsigned int Rn;
  226. unsigned int op1;
  227. unsigned int op2;
  228. };
  229. struct smla_inst {
  230. unsigned int x;
  231. unsigned int y;
  232. unsigned int Rm;
  233. unsigned int Rd;
  234. unsigned int Rs;
  235. unsigned int Rn;
  236. };
  237. struct smlalxy_inst {
  238. unsigned int x;
  239. unsigned int y;
  240. unsigned int RdLo;
  241. unsigned int RdHi;
  242. unsigned int Rm;
  243. unsigned int Rn;
  244. };
  245. struct ssat_inst {
  246. unsigned int Rn;
  247. unsigned int Rd;
  248. unsigned int imm5;
  249. unsigned int sat_imm;
  250. unsigned int shift_type;
  251. };
  252. struct umaal_inst {
  253. unsigned int Rn;
  254. unsigned int Rm;
  255. unsigned int RdHi;
  256. unsigned int RdLo;
  257. };
  258. struct umlal_inst {
  259. unsigned int S;
  260. unsigned int Rm;
  261. unsigned int Rs;
  262. unsigned int RdHi;
  263. unsigned int RdLo;
  264. };
  265. struct smlal_inst {
  266. unsigned int S;
  267. unsigned int Rm;
  268. unsigned int Rs;
  269. unsigned int RdHi;
  270. unsigned int RdLo;
  271. };
  272. struct smlald_inst {
  273. unsigned int RdLo;
  274. unsigned int RdHi;
  275. unsigned int Rm;
  276. unsigned int Rn;
  277. unsigned int swap;
  278. unsigned int op1;
  279. unsigned int op2;
  280. };
  281. struct mla_inst {
  282. unsigned int S;
  283. unsigned int Rn;
  284. unsigned int Rd;
  285. unsigned int Rs;
  286. unsigned int Rm;
  287. };
  288. struct mrc_inst {
  289. unsigned int opcode_1;
  290. unsigned int opcode_2;
  291. unsigned int cp_num;
  292. unsigned int crn;
  293. unsigned int crm;
  294. unsigned int Rd;
  295. unsigned int inst;
  296. };
  297. struct mcr_inst {
  298. unsigned int opcode_1;
  299. unsigned int opcode_2;
  300. unsigned int cp_num;
  301. unsigned int crn;
  302. unsigned int crm;
  303. unsigned int Rd;
  304. unsigned int inst;
  305. };
  306. struct mcrr_inst {
  307. unsigned int opcode_1;
  308. unsigned int cp_num;
  309. unsigned int crm;
  310. unsigned int rt;
  311. unsigned int rt2;
  312. };
  313. struct mrs_inst {
  314. unsigned int R;
  315. unsigned int Rd;
  316. };
  317. struct msr_inst {
  318. unsigned int field_mask;
  319. unsigned int R;
  320. unsigned int inst;
  321. };
  322. struct pld_inst {};
  323. struct sxtb_inst {
  324. unsigned int Rd;
  325. unsigned int Rm;
  326. unsigned int rotate;
  327. };
  328. struct sxtab_inst {
  329. unsigned int Rd;
  330. unsigned int Rn;
  331. unsigned int Rm;
  332. unsigned rotate;
  333. };
  334. struct sxtah_inst {
  335. unsigned int Rd;
  336. unsigned int Rn;
  337. unsigned int Rm;
  338. unsigned int rotate;
  339. };
  340. struct sxth_inst {
  341. unsigned int Rd;
  342. unsigned int Rm;
  343. unsigned int rotate;
  344. };
  345. struct uxtab_inst {
  346. unsigned int Rn;
  347. unsigned int Rd;
  348. unsigned int rotate;
  349. unsigned int Rm;
  350. };
  351. struct uxtah_inst {
  352. unsigned int Rn;
  353. unsigned int Rd;
  354. unsigned int rotate;
  355. unsigned int Rm;
  356. };
  357. struct uxth_inst {
  358. unsigned int Rd;
  359. unsigned int Rm;
  360. unsigned int rotate;
  361. };
  362. struct cdp_inst {
  363. unsigned int opcode_1;
  364. unsigned int CRn;
  365. unsigned int CRd;
  366. unsigned int cp_num;
  367. unsigned int opcode_2;
  368. unsigned int CRm;
  369. unsigned int inst;
  370. };
  371. struct uxtb_inst {
  372. unsigned int Rd;
  373. unsigned int Rm;
  374. unsigned int rotate;
  375. };
  376. struct swp_inst {
  377. unsigned int Rn;
  378. unsigned int Rd;
  379. unsigned int Rm;
  380. };
  381. struct setend_inst {
  382. unsigned int set_bigend;
  383. };
  384. struct b_2_thumb {
  385. unsigned int imm;
  386. };
  387. struct b_cond_thumb {
  388. unsigned int imm;
  389. unsigned int cond;
  390. };
  391. struct bl_1_thumb {
  392. unsigned int imm;
  393. };
  394. struct bl_2_thumb {
  395. unsigned int imm;
  396. };
  397. struct blx_1_thumb {
  398. unsigned int imm;
  399. unsigned int instr;
  400. };
  401. struct pkh_inst {
  402. unsigned int Rm;
  403. unsigned int Rn;
  404. unsigned int Rd;
  405. unsigned char imm;
  406. };
  407. // Floating point VFPv3 structures
  408. #define VFP_INTERPRETER_STRUCT
  409. #include "core/arm/skyeye_common/vfp/vfpinstr.cpp"
  410. #undef VFP_INTERPRETER_STRUCT
  411. typedef void (*get_addr_fp_t)(ARMul_State* cpu, unsigned int inst, unsigned int& virt_addr);
  412. struct ldst_inst {
  413. unsigned int inst;
  414. get_addr_fp_t get_addr;
  415. };
  416. typedef arm_inst* ARM_INST_PTR;
  417. typedef ARM_INST_PTR (*transop_fp_t)(unsigned int, int);
  418. extern const transop_fp_t arm_instruction_trans[];
  419. extern const size_t arm_instruction_trans_len;
  420. #define TRANS_CACHE_SIZE (64 * 1024 * 2000)
  421. extern char trans_cache_buf[TRANS_CACHE_SIZE];
  422. extern size_t trans_cache_buf_top;