AssemblyStep.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. typedef unsigned char AssemblyStep;
  7. enum AssemblyStepDefs
  8. {
  9. STEP_DONE = 32,
  10. STEP_ILLEGAL,
  11. STEP_REG,
  12. STEP_REG_PLUS_1,
  13. STEP_HREG,
  14. STEP_DREG,
  15. STEP_SREG,
  16. STEP_VMOV_IMM,
  17. STEP_SWPREG,
  18. STEP_DUMMY_REG,
  19. STEP_STACKREG,
  20. STEP_OPEQ,
  21. STEP_OPEQ2,
  22. STEP_NEXTOPN,
  23. STEP_DST2,
  24. STEP_CONSTANT,
  25. STEP_FCONSTANT_Z,
  26. STEP_T1_SETS_CR0,
  27. STEP_SHIFTER,
  28. STEP_DATA,
  29. STEP_LDRI,
  30. STEP_LDR,
  31. STEP_STRI,
  32. STEP_STR,
  33. STEP_OPCODE,
  34. STEP_HBIT,
  35. STEP_LABEL,
  36. STEP_CALL,
  37. STEP_CONDCOD,
  38. STEP_SBIT,
  39. STEP_AM1,
  40. STEP_IMM32,
  41. STEP_IBIT,
  42. STEP_IMM5_AM1,
  43. STEP_IMM5,
  44. STEP_AM,
  45. STEP_AM2,
  46. STEP_INDEXED,
  47. STEP_BASED,
  48. STEP_BASEREG,
  49. STEP_INDEXREG,
  50. STEP_STACKIMM,
  51. STEP_IMM12_AM2,
  52. STEP_AM3,
  53. STEP_UIMM8_AM3,
  54. STEP_UIMM16HS,
  55. STEP_AM4,
  56. STEP_SBZ,
  57. STEP_LXN,
  58. STEP_L24,
  59. STEP_INDIR,
  60. STEP_SYM,
  61. STEP_IMM_W5,
  62. STEP_IMM,
  63. STEP_IMM_H5,
  64. STEP_IMM_W7,
  65. STEP_IMM_W8,
  66. STEP_IMM_S8,
  67. STEP_IMM_DPW8,
  68. STEP_UIMM32,
  69. STEP_UIMM8,
  70. STEP_UIMM16,
  71. STEP_UIMM24,
  72. STEP_UIMM5,
  73. STEP_UIMM_WB5,
  74. STEP_UIMM3,
  75. STEP_OFFSET,
  76. STEP_REGLIST,
  77. STEP_SHIFTER_TYPE,
  78. STEP_SHIFTER_CONST,
  79. STEP_SCALE_CONST,
  80. STEP_FIXUP,
  81. STEP_LOFFSET1,
  82. STEP_LOFFSET2,
  83. STEP_VALUE,
  84. STEP_MULL,
  85. STEP_MRS,
  86. STEP_NAN,
  87. STEP_AM5,
  88. STEP_ZBIT,
  89. STEP_ACC,
  90. STEP_OPCODE3,
  91. STEP_WORD,
  92. STEP_COPROC,
  93. STEP_EXTR,
  94. STEP_IMM8,
  95. STEP_WLDRI,
  96. STEP_WSTRI,
  97. STEP_MASK,
  98. STEP_UIMM4,
  99. STEP_BIT,
  100. STEP_MODCONST_12,
  101. STEP_T2_IMM_16,
  102. STEP_T2_IMM_12,
  103. STEP_T2_SHIFT_IMM_5,
  104. STEP_T2_IMMSTACK_POS12_NEG8,
  105. STEP_NOT_CONSTANT,
  106. STEP_T2_CONST_SHIFT_TYPE,
  107. STEP_T2_CONST_SHIFT_NUM,
  108. STEP_T2_CONST_ROR,
  109. STEP_T2_CONST_ROR_NUM,
  110. STEP_T2_LSB,
  111. STEP_T2_xBFX_WIDTH,
  112. STEP_T2_BFx_WIDTH,
  113. STEP_T2_MEMIMM_POS12_NEG8,
  114. STEP_T2_REGLIST,
  115. STEP_T2_MEM_TYPE,
  116. STEP_T2_BRANCH20,
  117. STEP_T2_BRANCH24,
  118. STEP_T2_LXZ,
  119. STEP_T2_CBZ,
  120. STEP_T2_IT,
  121. STEP_MOVW_reloc,
  122. STEP_MOVT_reloc,
  123. STEP_Shift_IMM5,
  124. STEP_XT_CONST_ROR,
  125. STEP_XT_CONST_ROR_NUM,
  126. STEP_DREGLIST,
  127. STEP_NREG,
  128. STEP_QREG,
  129. STEP_FAKEQREG,
  130. STEP_IMM_OPCODE,
  131. STEP_NEON_AM5,
  132. STEP_UIMM16V7,
  133. STEP_A7_LSB,
  134. STEP_A7_xBFX_WIDTH,
  135. STEP_A7_BFx_WIDTH,
  136. STEP_NOSBIT,
  137. STEP_T2_INDIRSETUP_PC_OFF,
  138. STEP_AM_D_T,
  139. STEP_AM_D_T_STACK,
  140. STEP_T2_STACKSYM_IMM_12,
  141. STEP_R12,
  142. };
  143. // used by : ADD, SUB
  144. static const AssemblyStep Steps_T_Add_Sub_dnc [] =
  145. {
  146. STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3, STEP_NEXTOPN, STEP_CONSTANT, STEP_T1_SETS_CR0,
  147. STEP_UIMM3, 6, STEP_OPCODE, STEP_DONE
  148. };
  149. // used by : ADD, SUB
  150. static const AssemblyStep Steps_T_Add_Sub_ddc [] =
  151. {
  152. STEP_REG, 8, STEP_NEXTOPN, STEP_OPEQ, STEP_NEXTOPN, STEP_CONSTANT, STEP_T1_SETS_CR0,
  153. STEP_UIMM8, STEP_OPCODE, STEP_DONE
  154. };
  155. // used by : ADD, SUB
  156. static const AssemblyStep Steps_T_Add_Sub_dnm [] =
  157. {
  158. STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3, STEP_NEXTOPN, STEP_REG, 6,
  159. STEP_OPCODE, STEP_DONE
  160. };
  161. // used by : ADD
  162. static const AssemblyStep Steps_T_Add_High_dm [] =
  163. {
  164. STEP_HREG, 0, STEP_HBIT, 7, STEP_NEXTOPN, STEP_OPEQ, STEP_NEXTOPN,
  165. STEP_HREG, 3, STEP_HBIT, 6, STEP_OPCODE, STEP_NOSBIT, STEP_DONE
  166. };
  167. // used by : ADD
  168. static const AssemblyStep Steps_T_Add_SP_or_PC [] =
  169. {
  170. STEP_REG, 8, STEP_NEXTOPN, STEP_DUMMY_REG, STEP_NEXTOPN, STEP_CONSTANT,
  171. STEP_IMM_DPW8, STEP_OPCODE, STEP_DONE
  172. };
  173. // used by : ADD, SUB
  174. static const AssemblyStep Steps_T_Add_Sub_SP [] =
  175. {
  176. STEP_DUMMY_REG, STEP_NEXTOPN, STEP_DUMMY_REG, STEP_NEXTOPN, STEP_CONSTANT,
  177. STEP_IMM_W7, STEP_OPCODE, STEP_DONE
  178. };
  179. // Thumb2 : used by some ALU instructions (ADD, ADC, ...)
  180. // ALU rd, rd, rm
  181. static const AssemblyStep Steps_T2_ALU_ddm [] =
  182. {
  183. STEP_REG, 24, STEP_NEXTOPN, STEP_NEXTOPN, STEP_REG, 16,
  184. STEP_NEXTOPN, STEP_SBIT, 4,
  185. STEP_OPCODE, STEP_DONE
  186. };
  187. // Thumb2 : used by ADDW
  188. // ALU rd, rn, immediate12bits
  189. static const AssemblyStep Steps_T2_ALU_dn_imm12 [] =
  190. {
  191. STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN,
  192. STEP_CONSTANT, STEP_T2_IMM_12, STEP_OPCODE, STEP_DONE
  193. };
  194. // Thumb2: used by : B (unconditional) <label>
  195. static const AssemblyStep Steps_T2_BranchUncond [] =
  196. {
  197. STEP_T2_BRANCH24, STEP_OPCODE, STEP_DONE
  198. };
  199. static const AssemblyStep Steps_T2_BranchCond [] =
  200. {
  201. STEP_T2_BRANCH20, STEP_OPCODE, STEP_DONE
  202. };
  203. // Thumb2: used by : BL
  204. static const AssemblyStep Steps_T2_BL [] =
  205. {
  206. STEP_CALL, STEP_OPCODE, STEP_DONE
  207. };
  208. // used by : BL
  209. static const AssemblyStep Steps_T_BL [] =
  210. {
  211. STEP_CALL, STEP_OPCODE, STEP_DONE
  212. };
  213. // used by : BLX
  214. static const AssemblyStep Steps_T_BLX [] =
  215. {
  216. STEP_LABEL, STEP_OPCODE, STEP_DONE
  217. };
  218. // Thumb2: used by : BLX
  219. static const AssemblyStep Steps_T2_BLX [] =
  220. {
  221. STEP_CALL, STEP_OPCODE, STEP_DONE
  222. };
  223. // used by : BX
  224. static const AssemblyStep Steps_T_BX [] =
  225. {
  226. STEP_REG, 3, STEP_OPCODE, STEP_DONE
  227. };
  228. // used by : AND, MUL, BIC, ADC, SUB, SBC
  229. static const AssemblyStep Steps_T_ALU_dm [] =
  230. {
  231. STEP_REG, 0, STEP_NEXTOPN, STEP_OPEQ, STEP_NEXTOPN, STEP_REG, 3, STEP_T1_SETS_CR0,
  232. STEP_OPCODE, STEP_DONE
  233. };
  234. // used by : CMP
  235. // used by : CMP(1),
  236. static const AssemblyStep Steps_T_RR_dc [] =
  237. {
  238. STEP_REG, 8, STEP_NEXTOPN, STEP_CONSTANT,
  239. STEP_UIMM8, STEP_OPCODE, STEP_DONE
  240. };
  241. // used by : CMP(3),
  242. static const AssemblyStep Steps_T_HRR_ds [] =
  243. {
  244. STEP_HREG, 0, STEP_HBIT, 7, STEP_NEXTOPN,
  245. STEP_HREG, 3, STEP_HBIT, 6, STEP_OPCODE, STEP_DONE
  246. };
  247. static const AssemblyStep Steps_T2_n_modc12 [] =
  248. {
  249. STEP_REG, 0, STEP_NEXTOPN, STEP_CONSTANT,
  250. STEP_MODCONST_12, STEP_OPCODE, STEP_DONE
  251. };
  252. // used by : LDM
  253. static const AssemblyStep Steps_T_LDM_rspx [] =
  254. {
  255. STEP_INDIR, STEP_REGLIST, STEP_OFFSET, STEP_OPCODE, STEP_DONE
  256. };
  257. // used by : LDM
  258. static const AssemblyStep Steps_T_LDM_rrx [] =
  259. {
  260. STEP_INDIR, STEP_REGLIST, STEP_UIMM8, STEP_BASEREG, 8, STEP_OPCODE,
  261. STEP_DONE
  262. };
  263. // thumb2: used by : LDM
  264. static const AssemblyStep Steps_T2_LDM [] =
  265. {
  266. STEP_INDIR, STEP_REGLIST, STEP_T2_REGLIST, STEP_BASEREG, 0, STEP_OPCODE, STEP_DONE
  267. };
  268. // thumb2: used by : LDM
  269. static const AssemblyStep Steps_T2_LDM_ONE [] =
  270. {
  271. STEP_INDIR, STEP_REGLIST, 28, STEP_OPCODE, STEP_DONE
  272. };
  273. // thumb2: used by : STM
  274. static const AssemblyStep Steps_T2_STM_rsp_ONE [] =
  275. {
  276. STEP_REGLIST, 28, STEP_OPCODE, STEP_DONE
  277. };
  278. // used by : LDRRET (Thumb2)
  279. static const AssemblyStep Steps_T2_LDRRET [] =
  280. {
  281. STEP_NEXTOPN, STEP_BASED,
  282. STEP_T2_MEMIMM_POS12_NEG8, 16,
  283. STEP_OPCODE, STEP_DONE
  284. };
  285. // Thumb2 : MLS Rd, Rn, Rm, Ra -> dst, R12, src2, src1.
  286. static const AssemblyStep Steps_T2_mls_dnma [] =
  287. {
  288. // dst (Rd) R12 (Rn) src2 (Rm) src1 (Ra)
  289. STEP_REG, 24, STEP_R12, 0, STEP_NEXTOPN, STEP_REG, 16, STEP_NEXTOPN, STEP_REG, 28,
  290. STEP_OPCODE, STEP_DONE
  291. };
  292. // used by : MULA
  293. static const AssemblyStep Steps_T2_MULA_dnsm [] =
  294. {
  295. STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16,
  296. STEP_NEXTOPN, STEP_REG, 28, STEP_OPCODE, STEP_DONE
  297. };
  298. // Thumb2 : MUL rd, rn, rm
  299. static const AssemblyStep Steps_T2_ALU_dnm_no_sbit [] =
  300. {
  301. STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16, STEP_NOSBIT,
  302. STEP_OPCODE, STEP_DONE
  303. };
  304. // Thumb2 : SMULL/UMULL RdLo, RdHi, Rn, Rm -> dst, r12, src1, src1
  305. static const AssemblyStep Steps_T2_ALU_mull_no_sbit [] =
  306. {
  307. // RdLo RdHi 0000 Rm__ | 1111 1011 1000 Rn__
  308. // dst (RdLo) src1 (Rn) src2 (Rm)
  309. STEP_REG, 28, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16, STEP_R12, 24,
  310. STEP_NOSBIT, STEP_OPCODE, STEP_DONE
  311. };
  312. // Thumb2 : used by some ALU instructions (MVN, ...)
  313. // ALU rd, rn ,modified constant 12 bit
  314. static const AssemblyStep Steps_T2_ALU_dm_Shift_c [] =
  315. {
  316. STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 16, STEP_NEXTOPN, STEP_T2_CONST_SHIFT_TYPE, 20, STEP_NEXTOPN,
  317. STEP_CONSTANT, STEP_T2_SHIFT_IMM_5, STEP_SBIT, 4, STEP_OPCODE, STEP_DONE
  318. };
  319. // used by : NEG, MVN
  320. static const AssemblyStep Steps_T_Neg_Mvn_dm [] =
  321. {
  322. STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3, STEP_T1_SETS_CR0, STEP_OPCODE, STEP_DONE
  323. };
  324. static const AssemblyStep Steps_T_Ret_rr [] =
  325. {
  326. STEP_HREG, 0, STEP_HBIT, 7, STEP_NEXTOPN, STEP_HREG, 3, STEP_HBIT, 6,
  327. STEP_OPCODE, STEP_DONE
  328. };
  329. // used by : RET
  330. static const AssemblyStep Steps_T_IWRET_dm [] =
  331. {
  332. STEP_NEXTOPN, STEP_REG, 3, STEP_OPCODE, STEP_DONE
  333. };
  334. // used by : MOV,
  335. static const AssemblyStep Steps_T_ALU_rc [] =
  336. {
  337. STEP_REG, 8, STEP_NEXTOPN, STEP_CONSTANT, STEP_UIMM8, STEP_T1_SETS_CR0,
  338. STEP_OPCODE, STEP_DONE
  339. };
  340. // used by : MOV
  341. static const AssemblyStep Steps_T_MovHigh_rr [] =
  342. {
  343. STEP_HREG, 0, STEP_HBIT, 7, STEP_NEXTOPN, STEP_HREG, 3, STEP_HBIT, 6,
  344. STEP_OPCODE, STEP_DONE
  345. };
  346. // used by : STM
  347. static const AssemblyStep Steps_T_STM_rspx [] =
  348. {
  349. STEP_INDIR, STEP_REGLIST, STEP_OFFSET, STEP_OPCODE, STEP_DONE
  350. };
  351. // used by : STM
  352. static const AssemblyStep Steps_T_STM_rrx [] =
  353. {
  354. STEP_INDIR, STEP_REGLIST, STEP_UIMM8, STEP_BASEREG, 8, STEP_OPCODE, STEP_DONE
  355. };
  356. // used by : STM
  357. static const AssemblyStep Steps_T2_STM_rrx [] =
  358. {
  359. STEP_INDIR, STEP_REGLIST, STEP_T2_REGLIST, STEP_BASEREG, 0, STEP_OPCODE, STEP_DONE
  360. };
  361. // used by : LDR
  362. static const AssemblyStep Steps_T_LDRN_rcr [] =
  363. {
  364. STEP_REG, 0, STEP_NEXTOPN, STEP_BASED, STEP_BASEREG, 3,
  365. STEP_IMM, 6, STEP_FIXUP, STEP_LDRI, STEP_OPCODE, STEP_DONE
  366. };
  367. // used by : LDR
  368. static const AssemblyStep Steps_T_LDRN_rrr [] =
  369. {
  370. STEP_REG, 0, STEP_NEXTOPN, STEP_INDEXED, STEP_BASEREG, 3, STEP_INDEXREG, 6,
  371. STEP_LDR, STEP_OPCODE, STEP_DONE
  372. };
  373. // used by : LDR
  374. static const AssemblyStep Steps_T_LDRN_PC_or_SP [] =
  375. {
  376. STEP_REG, 8, STEP_NEXTOPN, STEP_INDIR, STEP_IMM_W8, STEP_OPCODE,
  377. STEP_DONE
  378. };
  379. // used by : LDR
  380. static const AssemblyStep Steps_T_LDRN_ri [] =
  381. {
  382. STEP_REG, 0, STEP_NEXTOPN, STEP_INDIR, STEP_IMM, 6, STEP_OPCODE,
  383. STEP_DONE
  384. };
  385. // Thumb2 LDR rxf, [rd, +#immediate12]
  386. // Thumb2 LDR rxf, [rd, -#immediate8]
  387. static const AssemblyStep Steps_T2_LDR_OFF [] =
  388. {
  389. STEP_REG, 28, STEP_NEXTOPN, STEP_BASED, STEP_BASEREG, 0,
  390. STEP_T2_MEMIMM_POS12_NEG8, 16,
  391. STEP_T2_MEM_TYPE, STEP_OPCODE, STEP_DONE
  392. };
  393. // Thumb2 LDR rxf, symbol
  394. static const AssemblyStep Steps_T2_LDR_Stack [] =
  395. {
  396. STEP_REG, 28, STEP_NEXTOPN, STEP_INDIR,
  397. STEP_T2_IMMSTACK_POS12_NEG8, 16, STEP_T2_MEM_TYPE,
  398. STEP_OPCODE, STEP_DONE
  399. };
  400. // Thumb2 LDR rxf, [rn, rm {LSL #<shift>}]
  401. static const AssemblyStep Steps_T2_LDR_RegIndir [] =
  402. {
  403. STEP_REG, 28, STEP_NEXTOPN, STEP_INDEXED, STEP_BASEREG, 0,
  404. STEP_INDEXREG, 16, STEP_T2_MEM_TYPE, STEP_SCALE_CONST, 20, STEP_OPCODE, STEP_DONE
  405. };
  406. // Thumb2 LEA
  407. static const AssemblyStep Steps_T2_LEA_rrd [] =
  408. {
  409. STEP_REG, 24, STEP_NEXTOPN, STEP_T2_STACKSYM_IMM_12, 0, STEP_OPCODE, STEP_DONE
  410. };
  411. // used by : LEA
  412. static const AssemblyStep Steps_T_LEA_rrd [] =
  413. {
  414. STEP_REG, 8, STEP_NEXTOPN, STEP_SYM, STEP_IMM_W8, STEP_OPCODE, STEP_DONE
  415. };
  416. // used by : LEA
  417. static const AssemblyStep Steps_T_LEA_rspd [] =
  418. {
  419. STEP_REG, 8, STEP_NEXTOPN, STEP_SYM, STEP_IMM_W8, STEP_OPCODE, STEP_DONE
  420. };
  421. // used by : MOV
  422. static const AssemblyStep Steps_T_ALU_dn [] =
  423. {
  424. STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3,
  425. STEP_OPCODE, STEP_DONE
  426. };
  427. // used by : STR
  428. static const AssemblyStep Steps_T_STRN_rcr [] =
  429. {
  430. STEP_BASED, STEP_BASEREG, 3, STEP_IMM, 6, STEP_STRI, STEP_NEXTOPN, STEP_REG, 0,
  431. STEP_OPCODE, STEP_DONE
  432. };
  433. // used by : STR
  434. static const AssemblyStep Steps_T_STRN_rcr_custom [] =
  435. {
  436. STEP_BASEREG, 3, STEP_IMM, 6, STEP_STRI, STEP_NEXTOPN, STEP_REG, 0,
  437. STEP_OPCODE, STEP_DONE
  438. };
  439. // used by : STRWI
  440. static const AssemblyStep Steps_T_STRN_rrr [] =
  441. {
  442. STEP_INDEXED, STEP_BASEREG, 3, STEP_INDEXREG, 6, STEP_NEXTOPN, STEP_REG,
  443. 0, STEP_STR, STEP_OPCODE, STEP_DONE
  444. };
  445. // used by : STRWI
  446. static const AssemblyStep Steps_T_STRN_ri [] =
  447. {
  448. STEP_INDIR, STEP_IMM, 6, STEP_NEXTOPN, STEP_REG, 0, STEP_OPCODE,
  449. STEP_DONE
  450. };
  451. // used by : STR (stack)
  452. static const AssemblyStep Steps_T_STRN_spcr [] =
  453. {
  454. STEP_INDIR, STEP_IMM_W8, STEP_NEXTOPN, STEP_REG, 8, STEP_OPCODE, STEP_DONE
  455. };
  456. // Thumb2 STR rxf, [rd, +#immediate12]
  457. // Thumb2 STR rxf, [rd, -#immediate8]
  458. static const AssemblyStep Steps_T2_STR_OFF [] =
  459. {
  460. STEP_BASED, STEP_BASEREG, 0,
  461. STEP_T2_MEMIMM_POS12_NEG8, 16, STEP_T2_MEM_TYPE,
  462. STEP_NEXTOPN, STEP_REG, 28,
  463. STEP_OPCODE, STEP_DONE
  464. };
  465. // Thumb2 STR rxf, [sp, #offset]
  466. static const AssemblyStep Steps_T2_STR_Stack [] =
  467. {
  468. STEP_INDIR, STEP_T2_IMMSTACK_POS12_NEG8, 16, STEP_T2_MEM_TYPE,
  469. STEP_NEXTOPN, STEP_REG, 28,
  470. STEP_OPCODE, STEP_DONE
  471. };
  472. // Thumb2 STR rxf, [rn, rm, LSL #<shift>]
  473. static const AssemblyStep Steps_T2_STR_RegIndir [] =
  474. {
  475. STEP_INDEXED, STEP_BASEREG, 0, STEP_INDEXREG, 16,
  476. STEP_SCALE_CONST, 20, STEP_T2_MEM_TYPE, STEP_NEXTOPN, STEP_REG, 28,
  477. STEP_OPCODE, STEP_DONE
  478. };
  479. // Thumb2 : used by : MOVW,
  480. static const AssemblyStep Steps_T2_ALU_r_imm16 [] =
  481. {
  482. STEP_REG, 24, STEP_NEXTOPN, STEP_CONSTANT, STEP_T2_IMM_16,
  483. STEP_OPCODE, STEP_DONE
  484. };
  485. // Thumb2 : used by : MOV_W, ...
  486. static const AssemblyStep Steps_T2_ALU_r_modc12 [] =
  487. {
  488. STEP_REG, 24, STEP_NEXTOPN, STEP_CONSTANT, STEP_MODCONST_12,
  489. STEP_OPCODE, STEP_DONE
  490. };
  491. // Thumb2 : used MVN
  492. // ALU rd, rm
  493. static const AssemblyStep Steps_T2_ALU_dm [] =
  494. {
  495. STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 16, STEP_SBIT, 4,
  496. STEP_OPCODE, STEP_DONE
  497. };
  498. // Thumb2 : used by some ALU instructions (ADD, ADC, ...)
  499. // ALU rd, rn ,modified constant 12 bit
  500. static const AssemblyStep Steps_T2_ALU_dn_modc12 [] =
  501. {
  502. STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN, STEP_CONSTANT,
  503. STEP_MODCONST_12, STEP_SBIT, 4, STEP_OPCODE, STEP_DONE
  504. };
  505. // used by : ASR
  506. static const AssemblyStep Steps_T_Shift_ds [] =
  507. {
  508. STEP_REG, 0, STEP_NEXTOPN, STEP_OPEQ, STEP_NEXTOPN, STEP_REG, 3, STEP_T1_SETS_CR0,
  509. STEP_OPCODE, STEP_DONE
  510. };
  511. // used by : ASR
  512. static const AssemblyStep Steps_T_Shift_dmc [] =
  513. {
  514. STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3, STEP_NEXTOPN, STEP_CONSTANT, STEP_T1_SETS_CR0,
  515. STEP_UIMM5, 6, STEP_OPCODE, STEP_DONE
  516. };
  517. static const AssemblyStep Steps_T2_Shift_dmc [] =
  518. {
  519. STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 16, STEP_NEXTOPN,
  520. STEP_CONSTANT, STEP_T2_SHIFT_IMM_5, STEP_SBIT, 4, STEP_OPCODE, STEP_DONE
  521. };
  522. static const AssemblyStep Steps_T2_ALU_dnm [] =
  523. {
  524. STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN,
  525. STEP_REG, 16, STEP_SBIT, 4,
  526. STEP_OPCODE, STEP_DONE
  527. };
  528. // Thumbs : TEQ rn, rn LSL#1 (aka, TIOFLW)
  529. static const AssemblyStep Steps_T2_ALU_nn [] =
  530. {
  531. STEP_REG, 0, STEP_REG, 16, STEP_OPCODE, STEP_DONE
  532. };
  533. // Thumb2 : TST rn, rm
  534. static const AssemblyStep Steps_T2_ALU_nm [] =
  535. {
  536. STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16,
  537. STEP_OPCODE, STEP_DONE
  538. };
  539. // Thumb2 : used by some ALU instructions (CMN, CMP, ...)
  540. // ALU rd, rn, constant shift
  541. static const AssemblyStep Steps_T2_ALU_nm_Shift_c [] =
  542. {
  543. STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16, STEP_NEXTOPN,
  544. STEP_T2_CONST_SHIFT_TYPE, 20, STEP_NEXTOPN, STEP_CONSTANT, STEP_T2_SHIFT_IMM_5,
  545. STEP_OPCODE, STEP_DONE
  546. };
  547. // Thumb2 : used by some ALU instructions (ADD, ADC, ...)
  548. // ALU rd, rn, rm, constant shift
  549. static const AssemblyStep Steps_T2_ALU_dnm_Shift_c [] =
  550. {
  551. STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 16,
  552. STEP_NEXTOPN, STEP_T2_CONST_SHIFT_TYPE, 20, STEP_NEXTOPN, STEP_CONSTANT, STEP_T2_SHIFT_IMM_5,
  553. STEP_SBIT, 4,
  554. STEP_OPCODE, STEP_DONE
  555. };
  556. static const AssemblyStep Steps_T2_ALU_dnn [] =
  557. {
  558. STEP_REG, 24, STEP_NEXTOPN, STEP_REG, 0, STEP_REG, 16,
  559. STEP_OPCODE, STEP_DONE
  560. };
  561. // Thumb2 : used by : MOVW
  562. static const AssemblyStep Steps_T2_MOVW_reloc [] =
  563. {
  564. STEP_REG, 24, STEP_NEXTOPN, STEP_MOVW_reloc,
  565. STEP_OPCODE, STEP_DONE
  566. };
  567. static const AssemblyStep Steps_T2_MOVT_reloc [] =
  568. {
  569. STEP_REG, 24, STEP_NEXTOPN, STEP_MOVT_reloc,
  570. STEP_OPCODE, STEP_DONE
  571. };
  572. // used by : TST, CMP, CMN
  573. static const AssemblyStep Steps_T_RR_ds [] =
  574. {
  575. STEP_REG, 0, STEP_NEXTOPN, STEP_REG, 3,
  576. STEP_OPCODE, STEP_DONE
  577. };
  578. static const AssemblyStep Steps_T_Dbg [] =
  579. {
  580. STEP_OPCODE, STEP_DONE,
  581. };
  582. static const AssemblyStep Steps_NOP [] =
  583. {
  584. STEP_OPCODE, STEP_DONE,
  585. };
  586. static const AssemblyStep Steps_DBL_Unary_dm [] =
  587. {
  588. STEP_DREG, 28, 6, STEP_NEXTOPN,
  589. STEP_DREG, 16, 21,
  590. STEP_OPCODE, STEP_DONE
  591. };
  592. static const AssemblyStep Steps_DBL_ALU_dnm [] =
  593. {
  594. STEP_DREG, 28, 6, STEP_NEXTOPN,
  595. STEP_DREG, 0, 23, STEP_NEXTOPN,
  596. STEP_DREG, 16, 21,
  597. STEP_OPCODE, STEP_DONE
  598. };
  599. static const AssemblyStep Steps_DBL_Cmp_dm [] =
  600. {
  601. STEP_DREG, 28, 6, STEP_NEXTOPN,
  602. STEP_DREG, 16, 21,
  603. STEP_OPCODE, STEP_DONE
  604. };
  605. static const AssemblyStep Steps_FLT_FMRS_flags [] =
  606. {
  607. STEP_OPCODE, STEP_DONE
  608. };
  609. static const AssemblyStep Steps_FLT_FMRSR_flags [] =
  610. {
  611. STEP_REG, 28,
  612. STEP_OPCODE, STEP_DONE
  613. };
  614. static const AssemblyStep Steps_A_LDRN_DBL_Am_rcr [] =
  615. {
  616. // Dn (dest of load)
  617. //
  618. STEP_DREG, 28, 6, STEP_NEXTOPN,
  619. // [Rn + #offset]
  620. //
  621. STEP_BASED, STEP_IMM_S8, STEP_BASEREG, 0,
  622. STEP_FIXUP, STEP_OPCODE, STEP_DONE
  623. };
  624. static const AssemblyStep Steps_A_LDRN_FLT_Am_rcr [] =
  625. {
  626. // Sn (dest of load)
  627. //
  628. STEP_SREG, 28, 06, STEP_NEXTOPN,
  629. // [Rn + #offset]
  630. //
  631. STEP_BASED, STEP_IMM_S8, STEP_BASEREG, 0,
  632. STEP_FIXUP, STEP_OPCODE, STEP_DONE
  633. };
  634. static const AssemblyStep Steps_A_DBL_STRN_Am_rcr [] =
  635. {
  636. // [Rn + #offset]
  637. //
  638. STEP_BASED, STEP_IMM_S8, STEP_BASEREG, 0, STEP_NEXTOPN,
  639. // Dn (src for store)
  640. //
  641. STEP_DREG, 28, 6,
  642. STEP_FIXUP, STEP_OPCODE, STEP_DONE
  643. };
  644. static const AssemblyStep Steps_A_FLT_STRN_Am_rcr [] =
  645. {
  646. // [Rn + #offset]
  647. //
  648. STEP_BASED, STEP_IMM_S8, STEP_BASEREG, 0, STEP_NEXTOPN,
  649. // Sn (src for store)
  650. //
  651. STEP_SREG, 28, 6,
  652. STEP_FIXUP, STEP_OPCODE, STEP_DONE
  653. };
  654. static const AssemblyStep Steps_FCVTDS_ds [] =
  655. {
  656. STEP_DREG, 28, 6, STEP_NEXTOPN,
  657. STEP_SREG, 16, 21,
  658. STEP_OPCODE, STEP_DONE
  659. };
  660. static const AssemblyStep Steps_FCVTSD_sd [] =
  661. {
  662. STEP_SREG, 28, 6, STEP_NEXTOPN,
  663. STEP_DREG, 16, 21,
  664. STEP_OPCODE, STEP_DONE
  665. };
  666. static const AssemblyStep Steps_FITOD_ds [] =
  667. {
  668. STEP_DREG, 28, 6, STEP_NEXTOPN,
  669. STEP_SREG, 16, 21,
  670. STEP_OPCODE, STEP_DONE
  671. };
  672. static const AssemblyStep Steps_FDTOI_sd [] =
  673. {
  674. STEP_SREG, 28, 6, STEP_NEXTOPN,
  675. STEP_DREG, 16, 21,
  676. STEP_OPCODE, STEP_DONE
  677. };
  678. static const AssemblyStep Steps_FLT_FMSR_sr [] =
  679. {
  680. STEP_SREG, 0, 23, STEP_NEXTOPN,
  681. STEP_REG, 28,
  682. STEP_OPCODE, STEP_DONE
  683. };
  684. static const AssemblyStep Steps_FLT_FMRS_rs [] =
  685. {
  686. STEP_REG, 28, STEP_NEXTOPN,
  687. STEP_SREG, 0, 23,
  688. STEP_OPCODE, STEP_DONE
  689. };
  690. static const AssemblyStep Steps_T2_PLD_offset [] =
  691. {
  692. STEP_BASED, STEP_BASEREG, 0,
  693. STEP_T2_MEMIMM_POS12_NEG8, 16,
  694. STEP_OPCODE, STEP_DONE
  695. };
  696. // Thumb2 PLD_W [rn, rm]
  697. static const AssemblyStep Steps_T2_PLD_RegIndir [] =
  698. {
  699. STEP_INDEXED, STEP_BASEREG, 0,
  700. STEP_INDEXREG, 16,
  701. STEP_OPCODE, STEP_DONE
  702. };
  703. static const AssemblyStep Steps_A_DBL_LDM[] =
  704. {
  705. STEP_BASED, STEP_AM5, STEP_BASEREG, 0, STEP_DREGLIST,
  706. STEP_FIXUP, STEP_OPCODE, STEP_DONE
  707. };
  708. static const AssemblyStep Steps_A_DBL_STM[] =
  709. {
  710. STEP_BASED, STEP_AM5, STEP_BASEREG, 0, STEP_DREGLIST,
  711. STEP_FIXUP, STEP_OPCODE, STEP_DONE
  712. };