ARMEncode.h 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282
  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. //
  7. // Contains constants and tables used by the encoder.
  8. //
  9. #include "AssemblyStep.h"
  10. // THUMB2 specific decl
  11. typedef unsigned int ENCODE_32;
  12. // THUMB1 specific decl.
  13. typedef unsigned short ENCODE_16;
  14. typedef unsigned char ENCODE_8;
  15. #define MaxCondBranchOffset ((1 << 20) - 2)
  16. #define RETURN_REG RegR0
  17. #define FIRST_INT_ARG_REG RegR0
  18. #define LAST_INT_ARG_REG RegR3
  19. #define NUM_INT_ARG_REGS\
  20. ((LAST_INT_ARG_REG - FIRST_INT_ARG_REG) + 1)
  21. #define FIRST_CALLEE_SAVED_GP_REG RegR4
  22. #define LAST_CALLEE_SAVED_GP_REG RegR10
  23. #define SCRATCH_REG RegR12
  24. #define ALT_LOCALS_PTR RegR7
  25. #define EH_STACK_SAVE_REG RegR6
  26. #define SP_ALLOC_SCRATCH_REG RegR4
  27. #define CATCH_OBJ_REG RegR1
  28. #define RETURN_DBL_REG RegD0
  29. #define FIRST_CALLEE_SAVED_DBL_REG RegD8
  30. #define LAST_CALLEE_SAVED_DBL_REG RegD15
  31. #define FIRST_CALLEE_SAVED_DBL_REG_NUM 8
  32. #define LAST_CALLEE_SAVED_DBL_REG_NUM 15
  33. #define CALLEE_SAVED_DOUBLE_REG_COUNT 8
  34. // See comment in LowerEntryInstr: even in a global function, we'll home r0 and r1
  35. #define MIN_HOMED_PARAM_REGS 2
  36. // THUMB Specific
  37. #define MAX_INT_REGISTERS_LOW 8
  38. #define LOW_INT_REGISTERS_MASK 0x7
  39. #define FRAME_REG RegR11
  40. #define DMOVE 0x0001
  41. #define DLOAD 0x0002
  42. #define DSTORE 0x0003
  43. #define DMASK 0x0007
  44. #define DHALFORSB 0x0020 // halfword or signed byte
  45. #define DCONDEXE 0x0040 // safe for conditional execution
  46. #define DSUPDATE 0x0100
  47. #define DSSUB 0x0200
  48. #define DSPOST 0x0400
  49. #define DSBIT 0x0800
  50. #define DQBR 0x1000 // Qualcomm buggy branch instructions see macro SOFTWARE_FIXFOR_HARDWARE_BUGWIN8_502326
  51. #define D____ (0)
  52. #define D___C (DCONDEXE)
  53. #define DQ__C (DQBR | DCONDEXE)
  54. #define D__SC (DSBIT)
  55. #define DM___ (DMOVE)
  56. #define DM__C (DMOVE | DCONDEXE)
  57. #define DL___ (DLOAD)
  58. #define DL__C (DLOAD | DCONDEXE)
  59. #define DLH__ (DLOAD | DHALFORSB)
  60. #define DLH_C (DLOAD | DHALFORSB | DCONDEXE)
  61. #define DS___ (DSTORE)
  62. #define DS__C (DSTORE | DCONDEXE)
  63. #define DSH__ (DSTORE | DHALFORSB)
  64. #define DSH_C (DSTORE | DHALFORSB | DCONDEXE)
  65. #define DLUP_C (DLOAD | DSUPDATE | DSPOST)
  66. #define DLUPQC (DLOAD | DSUPDATE | DSPOST | DQBR)
  67. #define DSUS_C (DSTORE | DSUPDATE | DSSUB)
  68. #define ISMOVE(o) ((EncoderMD::GetOpdope(o) & DMASK) == DMOVE)
  69. #define ISLOAD(o) ((EncoderMD::GetOpdope(o) & DMASK) == DLOAD)
  70. #define ISSTORE(o) ((EncoderMD::GetOpdope(o) & DMASK) == DSTORE)
  71. #define ISSHIFTERUPDATE(o) ((EncoderMD::GetOpdope(o) & DSUPDATE) != 0)
  72. #define ISSHIFTERSUB(o) ((EncoderMD::GetOpdope(o) & DSSUB) != 0)
  73. #define ISSHIFTERPOST(o) ((EncoderMD::GetOpdope(o) & DSPOST) != 0)
  74. #define SETS_SBIT(o) ((EncoderMD::GetOpdope(o) & DSBIT) != 0)
  75. #define ISQBUGGYBR(o) ((EncoderMD::GetOpdope(o) & DQBR) != 0)
  76. static const uint32 Opdope[] =
  77. {
  78. #define MACRO(name, jnLayout, attrib, byte2, form, opbyte, dope, ...) dope,
  79. #include "MdOpcodes.h"
  80. #undef MACRO
  81. };
  82. static const BYTE RegEncode[] =
  83. {
  84. #define REGDAT(Name, Listing, Encoding, ...) Encoding,
  85. #include "RegList.h"
  86. #undef REGDAT
  87. };
  88. #define REGBIT(reg) (1 << RegEncode[reg])
  89. #define TESTREGBIT(mask, reg) (((mask) & REGBIT(reg)) != 0)
  90. #define SETREGBIT(mask, reg) ((mask) |= REGBIT(reg))
  91. #define CLEARREGBIT(mask, reg) ((mask) &= ~REGBIT(reg))
  92. #define ZEROREGMASK(mask) ((mask) = 0)
  93. #define REGMASKEMPTY(mask) ((mask) == 0)
  94. #define CO_UIMMED8(intConst) ((intConst) & 0xff) // 8 bit unsigned immediate
  95. // Used by GenerateInstrs
  96. #define CASE_OPCODES_ALWAYS_THUMB2 \
  97. case Js::OpCode::ADDW: \
  98. case Js::OpCode::LDRRET: \
  99. case Js::OpCode::MLS: \
  100. case Js::OpCode::MOVT: \
  101. case Js::OpCode::MOVW: \
  102. case Js::OpCode::MOV_W: \
  103. case Js::OpCode::NOP_W: \
  104. case Js::OpCode::SDIV: \
  105. case Js::OpCode::SUBW: \
  106. case Js::OpCode::TIOFLW: \
  107. case Js::OpCode::CLRSIGN: \
  108. case Js::OpCode::SBCMPLNT: \
  109. case Js::OpCode::PLD: \
  110. case Js::OpCode::CLZ:
  111. #define CASE_OPCODES_NEVER_THUMB2 \
  112. case Js::OpCode::DEBUGBREAK: \
  113. case Js::OpCode::NOP: \
  114. case Js::OpCode::BLX: \
  115. case Js::OpCode::BX: \
  116. case Js::OpCode::RET:
  117. #define IS_LOWREG(RegNum) (RegNum < RegR8)
  118. #define IS_CONST_00000007(x) (((x) & ~0x00000007) == 0)
  119. #define IS_CONST_0000001F(x) (((x) & ~0x0000001f) == 0)
  120. #define IS_CONST_0000007F(x) (((x) & ~0x0000007f) == 0)
  121. #define IS_CONST_000000FF(x) (((x) & ~0x000000ff) == 0)
  122. #define IS_CONST_000003FF(x) (((x) & ~0x000003ff) == 0)
  123. #define IS_CONST_00000FFF(x) (((x) & ~0x00000fff) == 0)
  124. #define IS_CONST_0000FFFF(x) (((x) & ~0x0000ffff) == 0)
  125. #define IS_CONST_000FFFFF(x) (((x) & ~0x000fffff) == 0)
  126. #define IS_CONST_007FFFFF(x) (((x) & ~0x007fffff) == 0)
  127. #define IS_CONST_NEG_8(x) (((x) & ~0x0000007f) == ~0x0000007f)
  128. #define IS_CONST_NEG_12(x) (((x) & ~0x000007ff) == ~0x000007ff)
  129. #define IS_CONST_NEG_21(x) (((x) & ~0x000fffff) == ~0x000fffff)
  130. #define IS_CONST_NEG_24(x) (((x) & ~0x007fffff) == ~0x007fffff)
  131. #define IS_CONST_INT8(x) (IS_CONST_0000007F(x) || IS_CONST_NEG_8(x))
  132. #define IS_CONST_INT12(x) (IS_CONST_00000FFF(x) || IS_CONST_NEG_12(x))
  133. #define IS_CONST_INT21(x) (IS_CONST_000FFFFF(x) || IS_CONST_NEG_21(x))
  134. #define IS_CONST_INT24(x) (IS_CONST_007FFFFF(x) || IS_CONST_NEG_24(x))
  135. #define IS_CONST_UINT3(x) IS_CONST_00000007(x)
  136. #define IS_CONST_UINT5(x) IS_CONST_0000001F(x)
  137. #define IS_CONST_UINT7(x) IS_CONST_0000007F(x)
  138. #define IS_CONST_UINT8(x) IS_CONST_000000FF(x)
  139. #define IS_CONST_UINT10(x) IS_CONST_000003FF(x)
  140. #define IS_CONST_UINT12(x) IS_CONST_00000FFF(x)
  141. #define IS_CONST_UINT16(x) IS_CONST_0000FFFF(x)
  142. typedef struct _FormTable
  143. {
  144. int form;
  145. ENCODE_32 inst;
  146. const AssemblyStep * steps;
  147. } FormTable;
  148. #define FDST(_form) (FORM_ ## _form)
  149. #define FSET(_form, _bits) (FORM_ ## _form << _bits)
  150. #define FSRC(_form,_opnum) (FORM_ ## _form << ((_opnum) * FORM_BITS_PER_OPN))
  151. #define FDST2(_form,_opnum) (FORM_ ## _form << ((_opnum) * FORM_BITS_PER_OPN))
  152. #define FTHUMB2 (FORM_ ## THUMB2 << 28)
  153. #define FTHUMB (FORM_ ## THUMB << 28)
  154. #define THUMB2_THUMB1_FORM(FTP,IFORM) \
  155. ( (FTP) == (((IFORM) & 0x0FFFFFFF) | FTHUMB))
  156. // NOTE if we end up with a form with more than six operands the IFORM
  157. // encoding needs to be reworked. (runs out of bits)
  158. typedef enum tagIFORM
  159. {
  160. IFORM_A = 1, // This is used in mdtupdat.h, and must be IFORM type
  161. // CONSIDER: we seem to have some collisions here
  162. // (is there a way to cleanup this? we'd need more than 16 values)
  163. FORM_REG = 1,
  164. FORM_SREG = 2, // VFP single precision register
  165. FORM_DREG = 3, // VFP double precision register
  166. FORM_XREG = 7,
  167. FORM_WREG = 8, // maps to "wR"
  168. FORM_WCREG = 9, // maps to "wC"
  169. FORM_CONST = 4,
  170. FORM_INDIR = 5,
  171. FORM_LABEL = 6,
  172. FORM_CODE = 7,
  173. FORM_PC = 6,
  174. FORM_SP = 7,
  175. FORM_CC = 10,
  176. FORM_HREG = 2,
  177. FORM_ACC = 3,
  178. FORM_SR = 5,
  179. FORM_NREG = 11, // NEON 64bit register
  180. FORM_QREG = 12, // NEON 128bit register
  181. FORM_THUMB = 2,
  182. FORM_THUMB2 = 8,
  183. FORM_ARM = 4,
  184. FORM_BITS_PER_OPN = 4,
  185. FORM__________ = 0,
  186. FORM_2________ = FTHUMB2,
  187. FORM_T________ = FTHUMB,
  188. FORM_Trrc_____ = FTHUMB | FDST(REG) | FSRC(REG,1) | FSRC(CONST,2),
  189. FORM_Trc______ = FTHUMB | FDST(REG) | FSRC(CONST, 1),
  190. FORM_TrcC_____ = FTHUMB | FDST(REG) | FSRC(CONST, 1) | FSRC(CC,2),
  191. FORM_Trrr_____ = FTHUMB | FDST(REG) | FSRC(REG,1) | FSRC(REG,2),
  192. FORM_Trr______ = FTHUMB | FDST(REG) | FSRC(REG,1),
  193. FORM_TrC_____ = FTHUMB | FDST(REG) | FSRC(CC,1),
  194. FORM_TrrC_____ = FTHUMB | FDST(REG) | FSRC(REG,1) | FSRC(CC,2),
  195. FORM_Tr_______ = FTHUMB | FDST(REG),
  196. FORM_T_r______ = FTHUMB | FSRC(REG,1),
  197. FORM_T_rc_____ = FTHUMB | FSRC(REG,1) | FSRC(CONST, 2),
  198. FORM_T_rr_____ = FTHUMB | FSRC(REG,1) | FSRC(REG,2),
  199. FORM_Thr______ = FTHUMB | FSET(REG,28) | FSRC(REG,1),
  200. FORM_Th_r_____ = FTHUMB | FSET(REG,28) | FDST(REG),
  201. FORM_Th_rr____ = FTHUMB | FSET(REG,28) | FSRC(REG,1) | FSRC(REG,2),
  202. FORM_T_spr____ = FTHUMB | FSRC(SP,1) | FSRC(REG,2),
  203. FORM_Th_spr___ = FTHUMB | FSET(REG,28) | FSRC(SP,1) | FSRC(REG,2),
  204. // Thumb2
  205. FORM_2rrrcc___ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(CONST,3) | FSRC(CONST,4),
  206. FORM_2rrrccC__ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(CONST,3) | FSRC(CONST,4) | FSRC(CC,5),
  207. FORM_2rrc_____ = FTHUMB2 | FDST(REG) | FSRC(REG, 1) | FSRC(CONST, 2),
  208. FORM_2rrr_____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2),
  209. FORM_2rrrc____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(CONST, 3),
  210. FORM_2rc______ = FTHUMB2 | FDST(REG) | FSRC(CONST, 1),
  211. FORM_2rcc_____ = FTHUMB2 | FDST(REG) | FSRC(CONST, 1) | FSRC(CONST, 2),
  212. FORM_2rrcc____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(CONST, 2) | FSRC(CONST, 3),
  213. FORM_2rrcC____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(CONST, 2) | FSRC(CC, 3),
  214. FORM_2rr______ = FTHUMB2 | FDST(REG) | FSRC(REG,1),
  215. FORM_2ipcc____ = FTHUMB2 | FDST(INDIR) | FSRC(PC,1) | FSRC(CONST,2),
  216. FORM_2ispc____ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(CONST,2),
  217. FORM_2risp____ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(SP,2),
  218. FORM_2rrC_____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(CC,2),
  219. FORM_ThrC_____ = FTHUMB | FSET(REG,28) | FDST(REG) | FSRC(CC,1),
  220. FORM_ThrrC____ = FTHUMB | FSET(REG,28) | FDST(REG) | FSRC(REG,1) | FSRC(CC,2),
  221. FORM_TrhrC____ = FTHUMB | FDST(REG) | FSET(REG,28) |FSRC(REG,1) | FSRC(CC,2),
  222. FORM_ThrhrC___ = FTHUMB | FDST(REG) | FSET(REG,28) |FSRC(REG,1) | FSRC(CC,2),
  223. FORM_Tspsp____ = FTHUMB | FDST(SP) | FSRC(SP,1),
  224. FORM_2irr_____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(REG,2),
  225. FORM_2ircrr___ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(CONST,2) | FSRC(REG,3) | FSRC(REG,4),
  226. FORM_2ispcrr__ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(CONST,2) | FSRC(REG,3) | FSRC(REG,4),
  227. // MOVW with relocation
  228. FORM_2rlsp____ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1) | FSRC(SP,2),
  229. FORM_2re______ = FTHUMB2 | FDST(REG) | FSRC(CODE,1),
  230. FORM_2rl______ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1),
  231. // MOVW with PAIR relocation
  232. FORM_2rlspc___ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1) | FSRC(SP,2) | FSRC(CONST, 3),
  233. // MOVT with relocation
  234. FORM_2rlspr___ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1) | FSRC(SP,2) | FSRC(REG,3),
  235. FORM_2rer_____ = FTHUMB2 | FDST(REG) | FSRC(CODE,1) | FSRC(REG,2),
  236. FORM_2rlr_____ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1) | FSRC(REG,2),
  237. FORM_2rlsprc__ = FTHUMB2 | FDST(REG) | FSRC(LABEL,1) | FSRC(SP,2) | FSRC(REG,3) | FSRC(CONST, 4),
  238. //ADD
  239. FORM_Trpcc____ = FTHUMB | FDST(REG) | FSRC(PC,1) | FSRC(CONST,2),
  240. FORM_Trspc____ = FTHUMB | FDST(REG) | FSRC(SP,1) | FSRC(CONST,2),
  241. FORM_2rspc____ = FTHUMB2 | FDST(REG) | FSRC(SP,1) | FSRC(CONST,2),
  242. FORM_2sprc____ = FTHUMB2 | FDST(SP) | FSRC(REG,1) | FSRC(CONST,2),
  243. FORM_Tsphr____ = FTHUMB | FDST(SP) | FSET(REG, 28) | FSRC(REG,1),
  244. FORM_Trpc_____ = FTHUMB | FDST(REG) | FSRC(PC,1),
  245. //ADD, MOVH
  246. FORM_Trsp_____ = FTHUMB | FDST(REG) | FSRC(SP,1),
  247. FORM_Thrsp____ = FTHUMB | FSET(REG,28) |FDST(REG) | FSRC(SP,1),
  248. // ADD, SUB sp,sp,#imm
  249. FORM_2spspc___ = FTHUMB2 | FDST(SP) | FSRC(SP,1) | FSRC(CONST,2),
  250. FORM_2rrrC____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(CC,3),
  251. FORM_Tspspc___ = FTHUMB | FDST(SP) | FSRC(SP,1) | FSRC(CONST,2),
  252. FORM_Tspspr___ = FTHUMB | FDST(SP) | FSRC(SP,1) | FSRC(REG,2),
  253. FORM_Tspsphr__ = FTHUMB | FDST(SP) | FSET(REG, 28) | FSRC(SP,1) | FSRC(REG,2),
  254. FORM_Tpcpcr___ = FTHUMB | FDST(PC) | FSRC(PC,1) | FSRC(REG,2),
  255. //CMP
  256. FORM_2_r______ = FTHUMB2 | FSRC(REG,1),
  257. FORM_2_rr_____ = FTHUMB2 | FSRC(REG,1) |FSRC(REG,2),
  258. FORM_2_rc_____ = FTHUMB2 | FSRC(REG,1) |FSRC(CONST,2),
  259. //TBB, TBH
  260. FORM_2_irr____ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3),
  261. FORM_2_irrc___ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(CONST,4),
  262. FORM_2_ipcr___ = FTHUMB2 | FSRC(INDIR,1) | FSRC(PC,2) | FSRC(REG,3),
  263. FORM_2_ipcrc__ = FTHUMB2 | FSRC(INDIR,1) | FSRC(PC,2) | FSRC(REG,3) | FSRC(CONST,4),
  264. //PLD
  265. FORM_2_irc____ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(CONST,3),
  266. //B,BL,BCALL,BBL
  267. FORM_2l_______ = FTHUMB2 | FSRC(LABEL,1),
  268. FORM_2lC______ = FTHUMB2 | FSRC(LABEL,1) | FSRC(CC,2),
  269. FORM_2e_______ = FTHUMB2 | FSRC(CODE,1),
  270. FORM_Tl_______ = FTHUMB | FSRC(LABEL,1),
  271. FORM_TlC______ = FTHUMB | FSRC(LABEL,1) | FSRC(CC,2),
  272. FORM_Te_______ = FTHUMB | FSRC(CODE,1),
  273. //MULL, UMULL
  274. FORM_2rrrr____ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3),
  275. //SMLAL, UMLAL
  276. FORM_2rrrrr___ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(REG,4),
  277. //LDRRET
  278. FORM_2pcispc__ = FTHUMB2 | FDST(PC) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(CONST,3),
  279. //LDR
  280. FORM_2rirc____ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(CONST,3),
  281. FORM_2rispc___ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(CONST,3),
  282. FORM_2ripcc___ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(PC,2) | FSRC(CONST,3),
  283. FORM_2rirr____ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3),
  284. FORM_2rispr___ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(REG,3),
  285. FORM_2rirrc___ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(CONST,4),
  286. FORM_Trirc____ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(CONST,3),
  287. FORM_Trirr____ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3),
  288. FORM_Tripcc___ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(PC,2) | FSRC(CONST,3),
  289. FORM_Trispc___ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(CONST,3),
  290. //LDR SYM
  291. FORM_2ri______ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1),
  292. FORM_2ripc____ = FTHUMB2 | FDST(REG) | FSRC(INDIR,1) | FSRC(PC,2),
  293. FORM_Tri______ = FTHUMB | FDST(REG) | FSRC(INDIR,1),
  294. FORM_Trisp____ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(SP,2),
  295. FORM_Tripc____ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(PC,2),
  296. //STR
  297. FORM_2ircr____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(CONST,2) | FSRC(REG,3),
  298. FORM_2ispcr___ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(CONST,2) | FSRC(REG,3),
  299. FORM_2irrr____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3),
  300. FORM_2irrrc___ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(CONST,4),
  301. FORM_2isprr___ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(REG,2) | FSRC(REG,3),
  302. FORM_2ispr____ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(REG,2),
  303. FORM_2ir______ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1),
  304. FORM_2irsp____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(SP,2),
  305. FORM_Tircr____ = FTHUMB | FSRC(INDIR,0) | FSRC(REG,1) | FSRC(CONST,2) | FSRC(REG,3),
  306. FORM_Tirrr____ = FTHUMB | FDST(INDIR) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3),
  307. FORM_Tispcr___ = FTHUMB | FDST(INDIR) | FSRC(SP,1) | FSRC(CONST,2) | FSRC(REG,3),
  308. FORM_Tir______ = FTHUMB | FDST(INDIR) | FSRC(REG,1),
  309. FORM_Tispr____ = FTHUMB | FDST(INDIR) | FSRC(SP,1) | FSRC(REG,2),
  310. FORM_Tipcr____ = FTHUMB | FDST(INDIR) | FSRC(PC,1) | FSRC(REG,2),
  311. FORM_Tirsp____ = FTHUMB | FDST(INDIR) | FSRC(REG,1) | FSRC(SP,2),
  312. //STM/LDM
  313. FORM_Tispc____ = FTHUMB | FDST(INDIR) | FSRC(SP,1) | FSRC(CONST,2),
  314. FORM_Tirc_____ = FTHUMB | FDST(INDIR) | FSRC(REG,1) | FSRC(CONST,2),
  315. FORM_2pirc____ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(CONST,3),
  316. FORM_2pirr____ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3),
  317. FORM_2pirrc___ = FTHUMB2 | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(CONST,4),
  318. FORM_2irc_____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(CONST,2),
  319. //LDMRET
  320. FORM_Tspispc__ = FTHUMB | FDST(SP) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(CONST,3),
  321. //MOVH
  322. FORM_Tspr_____ = FTHUMB | FDST(SP) | FSRC(REG,1),
  323. FORM_Thrr_____ = FTHUMB | FSET(REG,28) | FDST(REG) | FSRC(REG,1),
  324. FORM_2sphr____ = FTHUMB2 | FSET(REG,28) |FDST(SP) | FSRC(REG,1),
  325. FORM_2hrpc____ = FTHUMB2 | FSET(REG,28) | FDST(REG) | FSRC(PC,1),
  326. FORM_2rpc_____ = FTHUMB2 | FDST(REG) | FSRC(PC,1),
  327. //LDM
  328. FORM_Tric_____ = FTHUMB | FDST(REG) | FSRC(INDIR,1) | FSRC(CONST,1),
  329. FORM_Ticr_____ = FTHUMB | FDST(INDIR) | FSRC(CONST,1) | FSRC(REG,2),
  330. // CBZ
  331. FORM_2lr______ = FTHUMB2 | FSRC(LABEL,1) | FSRC(REG,2),
  332. FORM_2er______ = FTHUMB2 | FSRC(CODE,1) | FSRC(REG,2),
  333. //LEA
  334. FORM_Trl______ = FTHUMB | FDST(REG) | FSRC(LABEL,1),
  335. FORM_Trlsp____ = FTHUMB | FDST(REG) | FSRC(LABEL,1) | FSRC(SP,2),
  336. FORM_Tspl_____ = FTHUMB | FDST(SP) | FSRC(LABEL,1),
  337. //RET pc, r
  338. FORM_Tpchr____ = FTHUMB | FDST(PC) | FSET(REG,28) | FSRC(REG,1),
  339. FORM_Tpcr_____ = FTHUMB | FDST(PC) | FSRC(REG,1),
  340. FORM_Tpcriw___ = FTHUMB | FDST(PC) | FSRC(REG,1) | FSRC(REG,2),
  341. FORM_Tpchriw__ = FTHUMB | FDST(PC) | FSET(REG,28) | FSRC(REG,1) | FSRC(REG,2),
  342. //DCD
  343. FORM_Tlsp_____ = FTHUMB | FSRC(LABEL,1) | FSRC(SP,2),
  344. FORM_Tc_______ = FTHUMB | FSRC(CONST,1),
  345. FORM_2r_______ = FTHUMB2 | FDST(REG),
  346. FORM_2c_______ = FTHUMB2 | FSRC(CONST,1),
  347. FORM_Tcll_____ = FTHUMB | FSRC(CONST,1) | FSRC(LABEL,2) | FSRC(LABEL,3),
  348. FORM_Tcee_____ = FTHUMB | FSRC(CONST,1) | FSRC(CODE,2) | FSRC(CODE,3),
  349. FORM_2rrcrc___ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(CONST,2) | FSRC(REG,3) | FSRC(CONST,4),
  350. FORM_2rrrrcrc_ = FTHUMB2 | FDST(REG) | FSRC(REG,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(CONST,4) | FSRC(REG,5) | FSRC(CONST,6),
  351. // MRS, MSR
  352. FORM_2rsrc____ = FTHUMB2 | FDST(REG) | FSRC(SR,1) | FSRC(CONST, 2),
  353. FORM_2srrcc___ = FTHUMB2 | FDST(SR) | FSRC(REG,1) | FSRC(CONST, 2) | FSRC(CONST, 3),
  354. // MCRR, MRRC
  355. FORM_2cprr____ = FTHUMB2 | FSRC(CONST,1) | FSRC(REG,2) | FSRC(REG,3),
  356. FORM_2rcp_____ = FTHUMB2 | FDST(REG) | FSRC(CONST,1),
  357. // MAR, MRA
  358. FORM_2acprr___ = FTHUMB2 | FDST(ACC) | FSRC(CONST,1) | FSRC(REG,2) | FSRC(REG,3),
  359. FORM_2rcpa____ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(ACC,2),
  360. // MCR, MRC
  361. FORM_2crcccc__ = FTHUMB2 | FSRC(CONST,1) | FSRC(REG,2) | FSRC(CONST, 3) | FSRC(CONST,4) | FSRC(CONST,5) | FSRC(CONST,6),
  362. FORM_2rccccc__ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(CONST, 2) | FSRC(CONST,3) | FSRC(CONST,4) | FSRC(CONST,5),
  363. // WLDR
  364. FORM_2rcr_____ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(REG,2),
  365. FORM_2rcrr____ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(REG,2) | FSRC(REG,3),
  366. FORM_2rcrrr___ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(REG,4),
  367. FORM_2rcrrrr__ = FTHUMB2 | FDST(REG) | FSRC(CONST,1) | FSRC(REG,2) | FSRC(REG,3) | FSRC(REG,4) | FSRC(REG,5),
  368. //FLOAT Forms
  369. FORM_2dd______ = FTHUMB2 | FDST(DREG) | FSRC(DREG,1),
  370. FORM_2ddd_____ = FTHUMB2 | FDST(DREG) | FSRC(DREG,1) | FSRC(DREG,2),
  371. FORM_2_dd_____ = FTHUMB2 | FSRC(DREG,1) | FSRC(DREG,2),
  372. FORM_2dr______ = FTHUMB2 | FDST(DREG) | FSRC(REG,1),
  373. FORM_2rd______ = FTHUMB2 | FDST(REG) | FSRC(DREG,1),
  374. FORM_2dirc____ = FTHUMB2 | FDST(DREG) | FSRC(INDIR,1) | FSRC(REG,2) | FSRC(CONST,3),
  375. FORM_2disp____ = FTHUMB2 | FDST(DREG) | FSRC(INDIR,1) | FSRC(SP,2),
  376. FORM_2dispc___ = FTHUMB2 | FDST(DREG) | FSRC(INDIR,1) | FSRC(SP,2) | FSRC(CONST,3),
  377. FORM_2ircd____ = FTHUMB2 | FDST(INDIR) | FSRC(REG,1) | FSRC(CONST,2) | FSRC(DREG,3),
  378. FORM_2ispd____ = FTHUMB2 | FDST(INDIR) | FSRC(SP,1) | FSRC(DREG,2),
  379. FORM_NOMORE = -1
  380. }IFORM;
  381. #define FT(_form, _inst, _steps) { FORM_ ## _form, _inst, _steps }
  382. static const FormTable Forms_ADD [] =
  383. {
  384. FT (2rrc_____, 0x0000F100, Steps_T2_ALU_dn_modc12),
  385. FT (2rrrcc___, 0x0000EB00, Steps_T2_ALU_dnm_Shift_c),
  386. FT (2rrrccC__, 0x0000EB40, Steps_T2_ALU_dnm_Shift_c),
  387. FT (2rrr_____, 0x0000EB00, Steps_T2_ALU_dnm),
  388. FT (2rrcC____, 0x0000F140, Steps_T2_ALU_dn_modc12),
  389. FT (2rrrC____, 0x0000EB40, Steps_T2_ALU_dnm),
  390. FT (2rrC_____, 0x0000EB40, Steps_T2_ALU_ddm),
  391. // Thumb2 and Thumb1 ADD(4)
  392. FT (ThrC_____, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
  393. FT (TrhrC____, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
  394. FT (ThrrC____, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
  395. FT (ThrhrC___, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
  396. FT (Trrc_____, 0x1c00, Steps_T_Add_Sub_dnc), // ADD rd, rn #<3_bit_immd>
  397. FT (Trc______, 0x3000, Steps_T_Add_Sub_ddc), // ADD rd, #<8_bit_immd>
  398. FT (Tr_______, 0x1800, Steps_T_Add_Sub_dnm), // ADD rd, rd, rm
  399. FT (Trr______, 0x1800, Steps_T_Add_Sub_dnm), // ADD rd, rd, rm
  400. FT (Trrr_____, 0x1800, Steps_T_Add_Sub_dnm), // ADD rd, rn, rm
  401. FT (Tpcpcr___, 0x4400, Steps_T_Add_High_dm), // ADD pc, rm, h1,h2
  402. FT (Tspspr___, 0x4400, Steps_T_Add_High_dm), // ADD sp, rm, h1,h2
  403. FT (Tspsphr__, 0x4400, Steps_T_Add_High_dm), // ADD sp, rm, h1,h2
  404. FT (Thrr_____, 0x4400, Steps_T_Add_High_dm), // ADD rd, rm, h1,h2
  405. FT (Thrsp____, 0x4400, Steps_T_Add_High_dm), // ADD rd, sp, h1
  406. FT (Trpc_____, 0x4400, Steps_T_Add_High_dm), // ADD rd, rm, h1, h2
  407. FT (Trsp_____, 0x4400, Steps_T_Add_High_dm), // ADD rd, rm, h1, h2
  408. FT (Tpchr____, 0x4400, Steps_T_Add_High_dm), // ADD rd, rm, h1, h2
  409. FT (Trpcc____, 0xa000, Steps_T_Add_SP_or_PC), // ADD rd, PC, #<8_bit_immd>
  410. FT (Trspc____, 0xa800, Steps_T_Add_SP_or_PC), // ADD rd, SP, #<8_bit_immd>
  411. FT (Tspspc___, 0xb000, Steps_T_Add_Sub_SP), // ADD SP, SP, #<7_bit_immd>
  412. FT (TrC_____, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
  413. FT (TrrC_____, 0x4140, Steps_T_ALU_dm), // ADC rd, rd, rm
  414. FT (NOMORE, 0x0, 0),
  415. };
  416. static const FormTable Forms_ADDW [] =
  417. {
  418. FT (2rrc_____, 0x0000F200, Steps_T2_ALU_dn_imm12),
  419. FT (2rspc____, 0x0000F200, Steps_T2_ALU_dn_imm12),
  420. FT (2spspc___, 0x0000F200, Steps_T2_ALU_dn_imm12),
  421. FT (2sprc____, 0x0000F200, Steps_T2_ALU_dn_imm12),
  422. FT (NOMORE, 0x0, 0),
  423. };
  424. static const FormTable Forms_ASR [] =
  425. {
  426. FT (2rrc_____, 0x0020ea4f, Steps_T2_Shift_dmc),
  427. FT (2rrr_____, 0xF000FA40, Steps_T2_ALU_dnm),
  428. FT (Trc______, 0x1000, Steps_T_Shift_dmc),
  429. FT (Trrc_____, 0x1000, Steps_T_Shift_dmc),
  430. FT (Trr______, 0x4100, Steps_T_Shift_ds),
  431. FT (Tr_______, 0x4100, Steps_T_Shift_ds),
  432. FT (NOMORE, 0x0, 0),
  433. };
  434. static const FormTable Forms_BX [] =
  435. {
  436. FT (Tr_______, 0x4700, Steps_T_BX),
  437. FT (T_r______, 0x4700, Steps_T_BX),
  438. FT (Thr______, 0x4700, Steps_T_BX),
  439. FT (NOMORE, 0x0, 0),
  440. };
  441. static const FormTable Forms_B [] =
  442. {
  443. FT (2l_______, 0x9000F000, Steps_T2_BranchUncond),
  444. // FT (2l_______, 0x9000F000, Steps_T2_Branch),
  445. // FT (2lC______, 0x8000F000, Steps_T2_Branch),
  446. // FT (Tl_______, 0xe000, Steps_T_Branch),
  447. // FT (TlC______, 0xd000, Steps_T_Branch),
  448. FT (NOMORE, 0x0, 0),
  449. };
  450. // B<C> explicit ///////////////////////////////////
  451. static const FormTable Forms_BEQ [] =
  452. {
  453. //FT (2l_______, 0x9000F000, Steps_T2_Branch),
  454. FT (2l_______, 0x8000F000, Steps_T2_BranchCond),
  455. //FT (Tl_______, 0xe000, Steps_T_Branch),
  456. //FT (TlC______, 0xd000, Steps_T_Branch),
  457. FT (NOMORE, 0x0, 0),
  458. };
  459. static const FormTable Forms_BNE [] =
  460. {
  461. FT (2l_______, 0x8000F040, Steps_T2_BranchCond),
  462. FT (NOMORE, 0x0, 0),
  463. };
  464. static const FormTable Forms_BLT [] =
  465. {
  466. FT (2l_______, 0x8000F2C0, Steps_T2_BranchCond),
  467. FT (NOMORE, 0x0, 0),
  468. };
  469. static const FormTable Forms_BGT [] =
  470. {
  471. FT (2l_______, 0x8000F300, Steps_T2_BranchCond),
  472. FT (NOMORE, 0x0, 0),
  473. };
  474. static const FormTable Forms_BLE [] =
  475. {
  476. FT (2l_______, 0x8000F340, Steps_T2_BranchCond),
  477. FT (NOMORE, 0x0, 0),
  478. };
  479. static const FormTable Forms_BGE [] =
  480. {
  481. FT (2l_______, 0x8000F280, Steps_T2_BranchCond),
  482. FT (NOMORE, 0x0, 0),
  483. };
  484. static const FormTable Forms_BCS [] =
  485. {
  486. FT (2l_______, 0x8000F080, Steps_T2_BranchCond),
  487. FT (NOMORE, 0x0, 0),
  488. };
  489. static const FormTable Forms_BCC [] =
  490. {
  491. FT (2l_______, 0x8000F0C0, Steps_T2_BranchCond),
  492. FT (NOMORE, 0x0, 0),
  493. };
  494. static const FormTable Forms_BHI [] =
  495. {
  496. FT (2l_______, 0x8000F200, Steps_T2_BranchCond),
  497. FT (NOMORE, 0x0, 0),
  498. };
  499. static const FormTable Forms_BLS [] =
  500. {
  501. FT (2l_______, 0x8000F240, Steps_T2_BranchCond),
  502. FT (NOMORE, 0x0, 0),
  503. };
  504. static const FormTable Forms_BMI [] =
  505. {
  506. FT (2l_______, 0x8000F100, Steps_T2_BranchCond),
  507. FT (NOMORE, 0x0, 0),
  508. };
  509. static const FormTable Forms_BPL [] =
  510. {
  511. FT (2l_______, 0x8000F140, Steps_T2_BranchCond),
  512. FT (NOMORE, 0x0, 0),
  513. };
  514. static const FormTable Forms_BVS [] =
  515. {
  516. FT (2l_______, 0x8000F180, Steps_T2_BranchCond),
  517. FT (NOMORE, 0x0, 0),
  518. };
  519. static const FormTable Forms_BVC [] =
  520. {
  521. FT (2l_______, 0x8000F1C0, Steps_T2_BranchCond),
  522. FT (NOMORE, 0x0, 0),
  523. };
  524. // End B<C> explicit ///////////////////////////////////
  525. static const FormTable Forms_BL [] =
  526. {
  527. FT (2e_______, 0xF800F000, Steps_T2_BL),
  528. FT (Tl_______, 0xf800f000, Steps_T_BL),
  529. FT (Te_______, 0xf800f000, Steps_T_BL),
  530. FT (NOMORE, 0x0, 0),
  531. };
  532. static const FormTable Forms_BLX [] =
  533. {
  534. FT (2e_______, 0xE800F000, Steps_T2_BLX),
  535. FT (Te_______, 0xf400e400, Steps_T_BLX),
  536. FT (T_r______, 0x4780, Steps_T_BX),
  537. FT (Tr_______, 0x4780, Steps_T_BX), //same src, dst
  538. FT (Thr______, 0x4780, Steps_T_BX),
  539. FT (Th_r_____, 0x4780, Steps_T_BX),
  540. FT (NOMORE, 0x0, 0),
  541. };
  542. static const FormTable Forms_CMP [] =
  543. {
  544. FT (2_rc_____, 0x0F00F1B0, Steps_T2_n_modc12),
  545. FT (2_rr_____, 0x0F00EBB0, Steps_T2_ALU_nm),
  546. //FT (2rrcc____, 0x0F00EBB0, Steps_T2_ALU_nm_Shift_c),
  547. FT (T_rc_____, 0x2800, Steps_T_RR_dc),
  548. FT (T_rr_____, 0x4280, Steps_T_RR_ds),
  549. FT (T_r______, 0x4280, Steps_T_RR_ds),
  550. FT (Th_rr____, 0x4500, Steps_T_HRR_ds),
  551. FT (T_spr____, 0x4500, Steps_T_HRR_ds),
  552. FT (Th_spr___, 0x4500, Steps_T_HRR_ds),
  553. FT (NOMORE, 0x0, 0),
  554. };
  555. static const FormTable Forms_CMP_ASR31 [] =
  556. {
  557. // CMP.W Rn, Rm, ASR #31
  558. // T3 .im3 1111 i2ty Rm__ 1110 1011 1011 Rn__, ty = 10, im3:i2 = 31
  559. // -> .111 1111 1110 Rm__ 1110 1011 1011 Rn__
  560. FT (2_rr_____, 0x7FE0EBB0, Steps_T2_ALU_nm),
  561. FT (NOMORE, 0x0, 0),
  562. };
  563. static const FormTable Forms_CLZ [] =
  564. {
  565. FT(2rr______, 0xF080FAB0, Steps_T2_ALU_dnn),
  566. FT (NOMORE, 0x0, 0),
  567. };
  568. static const FormTable Forms_CMN [] =
  569. {
  570. FT (2_rc_____, 0x0F00F110, Steps_T2_n_modc12),
  571. FT (2_rr_____, 0x0F00EB10, Steps_T2_ALU_nm),
  572. //FT (2rrcc____, 0x0F00EB10, Steps_T2_ALU_nm_Shift_c),
  573. FT (T_rr_____, 0x42c0, Steps_T_RR_ds),
  574. FT (T_r______, 0x42c0, Steps_T_RR_ds),
  575. FT (NOMORE, 0x0, 0),
  576. };
  577. static const FormTable Forms_EOR [] =
  578. {
  579. FT (2rrc_____, 0x0000F080, Steps_T2_ALU_dn_modc12),
  580. FT (2rrrcc___, 0x0000EA80, Steps_T2_ALU_dnm_Shift_c),
  581. FT (2rrr_____, 0x0000EA80, Steps_T2_ALU_dnm),
  582. FT (2rr______, 0x0000EA80, Steps_T2_ALU_dnm),
  583. FT (Trr______, 0x4040, Steps_T_ALU_dm),
  584. FT (Tr_______, 0x4040, Steps_T_ALU_dm),
  585. FT (NOMORE, 0x0, 0),
  586. };
  587. static const FormTable Forms_EOR_ASR31 [] =
  588. {
  589. // EOR.W Rd, Rn, Rm, ASR #31
  590. // T2 0im3 Rd__ i2ty Rm__ 1110 1010 100S Rn__, ty = 10, im3:i2=31=11111
  591. // -> 0111 0000 1110 Rm__ 1110 1010 1000 Rn__
  592. FT (2rrr_____, 0x70E0EA80, Steps_T2_ALU_dnm),
  593. FT (NOMORE, 0x0, 0),
  594. };
  595. static const FormTable Forms_CLRSIGN [] =
  596. {
  597. FT (2rr______, 0x70E0EA80, Steps_T2_ALU_dnn),
  598. FT (NOMORE, 0x0, 0),
  599. };
  600. static const FormTable Forms_LDM [] =
  601. {
  602. FT (2ipcc____, 0x0000E810, Steps_T2_LDM),
  603. FT (2irc_____, 0x0000E810, Steps_T2_LDM),
  604. FT (2ispc____, 0x0000E810, Steps_T2_LDM),
  605. FT (2rispc___, 0x0B04F85D, Steps_T2_LDM_ONE),
  606. FT (Tispc____, 0xbc00, Steps_T_LDM_rspx),
  607. FT (Tirc_____, 0xc800, Steps_T_LDM_rrx),
  608. FT (NOMORE, 0x0, 0),
  609. };
  610. static const FormTable Forms_LDIMM [] =
  611. {
  612. FT (Trc______, 0x2000, Steps_T_ALU_rc),
  613. FT (NOMORE, 0x0, 0),
  614. };
  615. static const FormTable Forms_LEA [] =
  616. {
  617. // Treat this as a Thumb2 add: r = ADDW sp,offset
  618. FT (2risp____, 0x0000F200, Steps_T2_LEA_rrd),
  619. // FT (Trl______, 0xa800, Steps_T_LEA_rrd),
  620. // FT (Trlsp____, 0xa800, Steps_T_LEA_rspd),
  621. // FT (Tspl_____, 0xa800, Steps_T_LEA_rspd),
  622. FT (NOMORE, 0x0, 0),
  623. };
  624. static const FormTable Forms_STM [] =
  625. {
  626. FT (2ispc____, 0x0000E800, Steps_T2_STM_rrx),
  627. FT (2irc_____, 0x0000E800, Steps_T2_STM_rrx),
  628. FT (2ispcr___, 0x0D04F84D, Steps_T2_STM_rsp_ONE),
  629. FT (Tispc____, 0xb400, Steps_T_STM_rspx),
  630. FT (Tirc_____, 0xc000, Steps_T_STM_rrx),
  631. FT (Tric_____, 0xc000, Steps_T_STM_rrx),
  632. FT (NOMORE, 0x0, 0),
  633. };
  634. static const FormTable Forms_LDRN [] =
  635. {
  636. FT (Trirc____, 0x0000, Steps_T_LDRN_rcr), //LDR rd, [rn, #5_bit_off]
  637. FT (Trirr____, 0x0000, Steps_T_LDRN_rrr), //LDR rd, [rn, rm]
  638. FT (Tripcc___, 0x4800, Steps_T_LDRN_PC_or_SP), //LDR rd, [PC, #8_bit_off]
  639. FT (Trispc___, 0x9800, Steps_T_LDRN_PC_or_SP), //LDR rd, [SP, #8_bit_off]
  640. FT (Trisp____, 0x9800, Steps_T_LDRN_PC_or_SP), //LDR rd, [rn, #5_bit_off]
  641. FT (Tripc____, 0x4800, Steps_T_LDRN_PC_or_SP), //LDR rd, [PC, #8_bit_off]
  642. FT (Tri______, 0x6838, Steps_T_LDRN_ri), //LDR rd, [rn, #5_bit_off]
  643. FT (NOMORE, 0x0, 0),
  644. };
  645. // Thumb2 LDR.W
  646. static const FormTable Forms_LDR_W [] =
  647. {
  648. FT (2rirc____, 0x0000F810, Steps_T2_LDR_OFF),
  649. FT (2risp____, 0x0000F810, Steps_T2_LDR_Stack),
  650. FT (2ripc____, 0x0100F810, Steps_T2_LDR_Stack),
  651. FT (2ri______, 0x0000F810, Steps_T2_LDR_Stack),
  652. FT (2rispc___, 0x0000F810, Steps_T2_LDR_OFF),
  653. FT (2ripcc___, 0x0000F810, Steps_T2_LDR_OFF),
  654. FT (2rispr___, 0x0000F810, Steps_T2_LDR_RegIndir),
  655. FT (2rirr____, 0x0000F810, Steps_T2_LDR_RegIndir),
  656. FT (2rirrc___, 0x0000F810, Steps_T2_LDR_RegIndir),
  657. FT (NOMORE, 0x0, 0),
  658. };
  659. static const FormTable Forms_LDRRET [] =
  660. {
  661. FT (2pcispc__, 0xf000f85d, Steps_T2_LDRRET), // LDR PC, [SP], #imm
  662. FT (NOMORE, 0x0, 0),
  663. };
  664. static const FormTable Forms_MOV [] =
  665. {
  666. FT (Trc______, 0x2000, Steps_T_ALU_rc),
  667. FT (Trr______, 0x4600, Steps_T_MovHigh_rr),
  668. FT (Tr_______, 0x4600, Steps_T_MovHigh_rr),
  669. FT (Thrsp____, 0x4600, Steps_T_MovHigh_rr),
  670. FT (Tsphr____, 0x4600, Steps_T_MovHigh_rr),
  671. FT (Th_r_____, 0x4600, Steps_T_MovHigh_rr),
  672. FT (Trsp_____, 0x4600, Steps_T_MovHigh_rr),
  673. FT (Tpchr____, 0x4600, Steps_T_MovHigh_rr),
  674. FT (Thrr_____, 0x4600, Steps_T_MovHigh_rr),
  675. FT (Tspr_____, 0x4600, Steps_T_MovHigh_rr),
  676. FT (Tspsp____, 0x4600, Steps_T_MovHigh_rr),
  677. FT (NOMORE, 0x0, 0),
  678. };
  679. static const FormTable Forms_MOV_W [] =
  680. {
  681. FT (2rc______, 0x0000F04F, Steps_T2_ALU_r_modc12),
  682. FT (2rr______, 0x0000EA4F, Steps_T2_ALU_dm),
  683. FT (NOMORE, 0x0, 0),
  684. };
  685. static const FormTable Forms_MOVW [] =
  686. {
  687. FT (2rc______, 0x0000F240, Steps_T2_ALU_r_imm16),
  688. FT (2rl______, 0x0000F240, Steps_T2_MOVW_reloc),
  689. FT (NOMORE, 0x0, 0),
  690. };
  691. // Thumb2 & ARMv7
  692. static const FormTable Forms_MOVT [] =
  693. {
  694. //UTC - FT (2rrc_____, 0x0000F2C0, Steps_T2_ALU_r_imm16),
  695. FT (2rc______, 0x0000F2C0, Steps_T2_ALU_r_imm16),
  696. FT (2rl______, 0x0000F2C0, Steps_T2_MOVT_reloc),
  697. FT (NOMORE, 0x0, 0),
  698. };
  699. static const FormTable Forms_RET [] =
  700. {
  701. FT (Tpcr_____, 0x4600, Steps_T_Ret_rr),
  702. FT (Tpchr____, 0x4600, Steps_T_Ret_rr),
  703. FT (Tpcriw___, 0x4700, Steps_T_IWRET_dm),
  704. FT (Tpchriw__, 0x4700, Steps_T_IWRET_dm),
  705. FT (NOMORE, 0x0, 0),
  706. };
  707. // initializing it similar to SDIV. won't be used as we split REM into SDIV and MLS
  708. static const FormTable Forms_REM [] =
  709. {
  710. FT (2rrr_____, 0xF0F0FB90, Steps_T2_ALU_dnm_no_sbit),
  711. FT (NOMORE, 0x0, 0),
  712. };
  713. // Thumb2 SUBW rd, rn #<12_bit_immediate>
  714. static const FormTable Forms_SUBW [] =
  715. {
  716. FT (2rrc_____, 0x0000F2A0, Steps_T2_ALU_dn_imm12),
  717. FT (2rspc____, 0x0000F2A0, Steps_T2_ALU_dn_imm12),
  718. FT (2spspc___, 0x0000F2A0, Steps_T2_ALU_dn_imm12),
  719. FT (NOMORE, 0x0, 0),
  720. };
  721. static const FormTable Forms_SUB [] =
  722. {
  723. FT (2rrc_____, 0x0000F1A0, Steps_T2_ALU_dn_modc12),
  724. //FT (2rrcc____, 0x0000EBA0, Steps_T2_ALU_ddm_Shift_c), //3rd operand Shifter operand not supported yet
  725. //FT (2rrrcc___, 0x0000EBA0, Steps_T2_ALU_dnm_Shift_c),
  726. //FT (2rrrccC__, 0x0000EB60, Steps_T2_ALU_dnm_Shift_c),
  727. FT (2rrr_____, 0x0000EBA0, Steps_T2_ALU_dnm),
  728. FT (2rrrC____, 0x0000EB60, Steps_T2_ALU_dnm), // SBC
  729. FT (2rrcC____, 0x0000F160, Steps_T2_ALU_dn_modc12), // SBC
  730. FT (Trrc_____, 0x1e00, Steps_T_Add_Sub_dnc), // SUB rd, rn #<3_bit_immd>
  731. FT (Trc______, 0x3800, Steps_T_Add_Sub_ddc), // SUB rd, #<8_bit_immd>
  732. FT (Tr_______, 0x1a00, Steps_T_Add_Sub_dnm), // ADD rd, rd, rm
  733. FT (Trr______, 0x1a00, Steps_T_Add_Sub_dnm), // SUB rd, rd, rm
  734. FT (Trrr_____, 0x1a00, Steps_T_Add_Sub_dnm), // SUB rd, rn, rm
  735. FT (Tspspc___, 0xb080, Steps_T_Add_Sub_SP), // SUB SP, SP, #<7_bit_immd>
  736. FT (TrrC_____, 0x4180, Steps_T_ALU_dm), // SBC
  737. FT (NOMORE, 0x0, 0),
  738. };
  739. static const FormTable Forms_SBCMPLNT [] =
  740. {
  741. FT (2rrr_____, 0x70E0EBA0, Steps_T2_ALU_dnm),
  742. FT (NOMORE, 0x0, 0),
  743. };
  744. static const FormTable Forms_STRN[] =
  745. {
  746. FT (Tircr____, 0x0000, Steps_T_STRN_rcr), // STR rd, [rn, #off]
  747. FT (Tirrr____, 0x0000, Steps_T_STRN_rrr), // STR rd, [rn, rm]
  748. FT (Tir______, 0x6038, Steps_T_STRN_ri), // STR rd, [rn, #8_bit_off]
  749. FT (Tispr____, 0x9000, Steps_T_STRN_spcr), // STR rd, [SP, #8_bit_off]
  750. FT (Tispcr___, 0x9000, Steps_T_STRN_spcr), // STR rd, [SP, #8_bit_off]
  751. FT (Tipcr____, 0x6000, Steps_T_STRN_spcr), // STR rd, [PC, #8_bit_off]
  752. FT (Tirsp____, 0x9000, Steps_T_STRN_spcr), // STR rd, [SP, #8_bit_off]
  753. FT (NOMORE, 0x0, 0),
  754. };
  755. static const FormTable Forms_STR_W [] =
  756. {
  757. FT (2ircr____, 0x0000F800, Steps_T2_STR_OFF),
  758. FT (2ispcr___, 0x0000F800, Steps_T2_STR_OFF),
  759. FT (2ispr____, 0x0000F800, Steps_T2_STR_Stack),
  760. FT (2irrr____, 0x0000F800, Steps_T2_STR_RegIndir),
  761. FT (2isprr___, 0x0000F800, Steps_T2_STR_RegIndir),
  762. FT (2irrrc___, 0x0000F800, Steps_T2_STR_RegIndir),
  763. FT (2ir______, 0x0000F800, Steps_T2_STR_Stack),
  764. FT (2irsp____, 0x0000F800, Steps_T2_STR_Stack),
  765. FT (NOMORE, 0x0, 0),
  766. };
  767. static const FormTable Forms_AND [] =
  768. {
  769. FT (2rrc_____, 0x0000F000, Steps_T2_ALU_dn_modc12),
  770. FT (2rrr_____, 0x0000EA00, Steps_T2_ALU_dnm),
  771. /*
  772. FT (2rrrcc___, 0x0000EA00, Steps_T2_ALU_dnm_Shift_c),
  773. FT (2rr______, 0x0000EA00, Steps_T2_ALU_dnm),
  774. */
  775. FT (Trr______, 0x4000, Steps_T_ALU_dm),
  776. FT (Tr_______, 0x4000, Steps_T_ALU_dm),
  777. FT (NOMORE, 0x0, 0),
  778. };
  779. static const FormTable Forms_LSL [] =
  780. {
  781. FT (2rrc_____, 0x0000ea4f, Steps_T2_Shift_dmc),
  782. FT (2rrr_____, 0xF000FA00, Steps_T2_ALU_dnm),
  783. FT (Trc______, 0x0000, Steps_T_Shift_dmc),
  784. FT (Trrc_____, 0x0000, Steps_T_Shift_dmc),
  785. FT (Trr______, 0x4080, Steps_T_Shift_ds),
  786. FT (Tr_______, 0x4080, Steps_T_Shift_ds),
  787. FT (NOMORE, 0x0, 0),
  788. };
  789. static const FormTable Forms_LSR [] =
  790. {
  791. FT (2rrc_____, 0x0010ea4f, Steps_T2_Shift_dmc),
  792. FT (2rrr_____, 0xF000FA20, Steps_T2_ALU_dnm),
  793. FT (Trc______, 0x0800, Steps_T_Shift_dmc),
  794. FT (Trrc_____, 0x0800, Steps_T_Shift_dmc),
  795. FT (Trr______, 0x40c0, Steps_T_Shift_ds),
  796. FT (Tr_______, 0x40c0, Steps_T_Shift_ds),
  797. FT (NOMORE, 0x0, 0),
  798. };
  799. static const FormTable Forms_MUL [] =
  800. {
  801. FT (2rrrr____, 0x0000FB00, Steps_T2_MULA_dnsm),
  802. FT (2rrr_____, 0xF000FB00, Steps_T2_ALU_dnm_no_sbit),
  803. FT (2rr______, 0xF000FB00, Steps_T2_ALU_dnm_no_sbit),
  804. FT (Trr______, 0x4340, Steps_T_ALU_dm),
  805. FT (NOMORE, 0x0, 0),
  806. };
  807. static const FormTable Forms_SMLAL [] =
  808. {
  809. // SMLAL RdLo, RdHi, Rn, Rm. We always use r12 as RdHi, as we don't currently support instructions with 4 operands.
  810. // RdLo RdHi 0000 Rm__ | 1111 1011 1100 Rn__
  811. FT (2rrr_____, 0x0000FBC0, Steps_T2_ALU_mull_no_sbit),
  812. FT (NOMORE, 0x0, 0),
  813. };
  814. static const FormTable Forms_SMULL [] =
  815. {
  816. // SMULL<c> RdLo, RdHi, Rn, Rm. We always use r12 as RdHi, as we don't currently support instructions with 4 operands.
  817. // RdLo RdHi 0000 Rm__ | 1111 1011 1000 Rn__
  818. FT (2rrr_____, 0x0000FB80, Steps_T2_ALU_mull_no_sbit),
  819. FT (NOMORE, 0x0, 0),
  820. };
  821. static const FormTable Forms_MLS [] =
  822. {
  823. FT (2rrr_____, 0x0010FB00, Steps_T2_mls_dnma),
  824. FT (NOMORE, 0x0, 0),
  825. };
  826. static const FormTable Forms_MVN [] =
  827. {
  828. FT (2rc______, 0x0000F06F, Steps_T2_ALU_r_modc12),
  829. FT (2rrcc____, 0x0000EA6F, Steps_T2_ALU_dm_Shift_c),
  830. FT (2rr______, 0x0000EA6F, Steps_T2_ALU_dm),
  831. FT (Tr_______, 0x43c0, Steps_T_Neg_Mvn_dm),
  832. FT (Trr______, 0x43c0, Steps_T_Neg_Mvn_dm),
  833. FT (NOMORE, 0x0, 0),
  834. };
  835. static const FormTable Forms_ORR [] =
  836. {
  837. FT (2rrc_____, 0x0000F040, Steps_T2_ALU_dn_modc12),
  838. FT (2rrrcc___, 0x0000EA40, Steps_T2_ALU_dnm_Shift_c),
  839. FT (2rrr_____, 0x0000EA40, Steps_T2_ALU_dnm),
  840. FT (2rr______, 0x0000EA40, Steps_T2_ALU_dnm),
  841. FT (Trr______, 0x4300, Steps_T_ALU_dm),
  842. FT (Tr_______, 0x4300, Steps_T_ALU_dm),
  843. FT (NOMORE, 0x0, 0),
  844. };
  845. static const FormTable Forms_RSB [] =
  846. {
  847. FT (2rrc_____, 0x0000F1C0, Steps_T2_ALU_dn_modc12),
  848. FT (2rrrcc___, 0x0000EBC0, Steps_T2_ALU_dnm_Shift_c),
  849. FT (2rrr_____, 0x0000EBC0, Steps_T2_ALU_dnm),
  850. FT (Tr_______, 0x4240, Steps_T_Neg_Mvn_dm),
  851. FT (Trr______, 0x4240, Steps_T_Neg_Mvn_dm),
  852. FT (NOMORE, 0x0, 0),
  853. };
  854. static const FormTable Forms_SDIV [] =
  855. {
  856. FT (2rrr_____, 0xF0F0FB90, Steps_T2_ALU_dnm_no_sbit),
  857. FT (NOMORE, 0x0, 0),
  858. };
  859. static const FormTable Forms_TST [] =
  860. {
  861. FT (2_rr_____, 0x0F00EA10, Steps_T2_ALU_nm),
  862. FT (2_rc_____, 0x0F00F010, Steps_T2_n_modc12),
  863. FT (2rrcc____, 0x0F00EA10, Steps_T2_ALU_nm_Shift_c),
  864. FT (T_rr_____, 0x4200, Steps_T_RR_ds),
  865. FT (T_r______, 0x4200, Steps_T_RR_ds),
  866. FT (NOMORE, 0x0, 0),
  867. };
  868. static const FormTable Forms_TIOFLW [] =
  869. {
  870. FT (2_r______, 0x0F40EA90, Steps_T2_ALU_nn),
  871. FT (NOMORE, 0x0, 0),
  872. };
  873. static const FormTable Forms_DBGBRK [] =
  874. {
  875. FT (T________, 0xdefe, Steps_T_Dbg),
  876. FT (NOMORE, 0x0, 0),
  877. };
  878. static const FormTable Forms_NOP [] =
  879. {
  880. FT (T________, 0x046c0, Steps_NOP),
  881. FT (NOMORE, 0x0, 0),
  882. };
  883. static const FormTable Forms_NOP_W [] =
  884. {
  885. FT (2________, 0x8000F3AF, Steps_NOP),
  886. FT (NOMORE, 0x0, 0),
  887. };
  888. static const FormTable Forms_VABS [] =
  889. {
  890. FT (2dd______, 0x0bc0eeb0, Steps_DBL_Unary_dm),
  891. FT (NOMORE, 0x0, 0),
  892. };
  893. static const FormTable Forms_VSQRT [] =
  894. {
  895. // VSQRT.F64 <Dd>, <Dm>
  896. // s = sz = double precision
  897. // D = register selector for dest = sz ? D:Vd : Vd:D
  898. // M = register selector for src = sz ? M:Vm : Vm:M
  899. // T1/A1 Vd__ 101s 11M0 Vm__ | 1110 1110 1D11 0001 (flipped low and hi 2 bytes from as it's in the manual)
  900. // -> 0000 1011 1100 0000 | 1110 1110 1011 0001
  901. // Note: using 2dd form as for Thumb2, although the manual says there is only T1/A1 form --
  902. // the instr is essentially same as in Thumb2 (4 bytes).
  903. FT (2dd______, 0x0bc0eeb1, Steps_DBL_Unary_dm),
  904. FT (NOMORE, 0x0, 0),
  905. };
  906. static const FormTable Forms_VADDF64 [] =
  907. {
  908. FT (2ddd_____, 0x0b00ee30, Steps_DBL_ALU_dnm),
  909. FT (NOMORE, 0x0, 0),
  910. };
  911. static const FormTable Forms_VSUBF64 [] =
  912. {
  913. FT (2ddd_____, 0x0b40ee30, Steps_DBL_ALU_dnm),
  914. FT (NOMORE, 0x0, 0),
  915. };
  916. static const FormTable Forms_VMULF64 [] =
  917. {
  918. FT (2ddd_____, 0x0b00ee20, Steps_DBL_ALU_dnm),
  919. FT (NOMORE, 0x0, 0),
  920. };
  921. static const FormTable Forms_VDIVF64 [] =
  922. {
  923. FT (2ddd_____, 0x0b00ee80, Steps_DBL_ALU_dnm),
  924. FT (NOMORE, 0x0, 0),
  925. };
  926. static const FormTable Forms_VCMPF64 [] =
  927. {
  928. FT (2_dd_____, 0x0b40eeb4, Steps_DBL_Cmp_dm),
  929. FT (NOMORE, 0x0, 0),
  930. };
  931. // This always moves FPSCR to ARM Status register.
  932. // APSR_nzcv is encoded as Rt = ’1111’, and the instruction transfers the FPSCR N, Z, C, and
  933. // V flags to the APSR N, Z, C, and V flags.
  934. static const FormTable Forms_VMRS [] =
  935. {
  936. FT (2________, 0xfa10eef1, Steps_FLT_FMRS_flags),
  937. FT (NOMORE, 0x0, 0),
  938. };
  939. static const FormTable Forms_VMRSR [] =
  940. {
  941. FT (2r_______, 0x0a10eef1, Steps_FLT_FMRSR_flags),
  942. FT (NOMORE, 0x0, 0),
  943. };
  944. static const FormTable Forms_VMSR [] =
  945. {
  946. FT (2_r______, 0x0a10eee1, Steps_FLT_FMRSR_flags),
  947. FT (NOMORE, 0x0, 0),
  948. };
  949. static const FormTable Forms_VNEGF64 [] =
  950. {
  951. FT (2dd______, 0x0b40eeb1, Steps_DBL_Unary_dm),
  952. FT (NOMORE, 0x0, 0),
  953. };
  954. static const FormTable Forms_VLDR [] =
  955. {
  956. FT (2dirc____, 0x0b00ec10, Steps_A_LDRN_DBL_Am_rcr), //VLDR rd,[rn,#off]
  957. FT (2disp____, 0x0b00ec10, Steps_A_LDRN_DBL_Am_rcr), //VLDR rd,[SP,#off]
  958. FT (NOMORE, 0x0, 0),
  959. };
  960. static const FormTable Forms_VLDR32 [] =
  961. {
  962. FT (2dirc____, 0x0a00ec10, Steps_A_LDRN_FLT_Am_rcr), //FLDS rd,[rn,#off]
  963. FT (2disp____, 0x0a00ec10, Steps_A_LDRN_FLT_Am_rcr), //FLDS rd,[SP,#off]
  964. FT (NOMORE, 0x0, 0),
  965. };
  966. // used by floating point STRs
  967. static const FormTable Forms_VSTR[] =
  968. {
  969. FT (2ircd____, 0x0b00ec00, Steps_A_DBL_STRN_Am_rcr), //VSTR dd, [rn, #off]
  970. FT (2ispd____, 0x0b00ec00, Steps_A_DBL_STRN_Am_rcr), //VSTR dd, [SP, #off]
  971. FT (NOMORE, 0x0, 0),
  972. };
  973. // used by floating point STRs
  974. static const FormTable Forms_VSTR32[] =
  975. {
  976. FT (2ircd____, 0x0a00ec00, Steps_A_FLT_STRN_Am_rcr), //FSTS sd, [rn, #off]
  977. FT (2ispd____, 0x0a00ec00, Steps_A_FLT_STRN_Am_rcr), //FSTS sd, [SP, #off]
  978. FT (NOMORE, 0x0, 0),
  979. };
  980. static const FormTable Forms_VMOV[] =
  981. {
  982. FT (2dd______, 0x0b40eeb0, Steps_DBL_Unary_dm),
  983. FT (NOMORE, 0x0, 0),
  984. };
  985. // This moves data between ARM core registers & VFP registers.
  986. static const FormTable Forms_VMOVARMVFP[] =
  987. {
  988. FT (2dr______, 0x0a10ee00, Steps_FLT_FMSR_sr),
  989. FT (2rd______, 0x0a10ee10, Steps_FLT_FMRS_rs),
  990. FT (NOMORE, 0x0, 0),
  991. };
  992. static const FormTable Forms_VCVTF64F32 [] =
  993. {
  994. FT (2dd______, 0x0ac0eeb7, Steps_FCVTDS_ds),
  995. FT (NOMORE, 0x0, 0),
  996. };
  997. static const FormTable Forms_VCVTF32F64 [] =
  998. {
  999. FT (2dd______, 0x0bc0eeb7, Steps_FCVTSD_sd),
  1000. FT (NOMORE, 0x0, 0),
  1001. };
  1002. static const FormTable Forms_VCVTF64S32 [] =
  1003. {
  1004. FT (2dd______, 0x0bc0eeb8, Steps_FITOD_ds),
  1005. FT (NOMORE, 0x0, 0),
  1006. };
  1007. static const FormTable Forms_VCVTF64U32 [] =
  1008. {
  1009. FT (2dd______, 0x0b40eeb8, Steps_FITOD_ds),
  1010. FT (NOMORE, 0x0, 0),
  1011. };
  1012. static const FormTable Forms_VCVTS32F64 [] =
  1013. {
  1014. FT (2dd______, 0x0bc0eebd, Steps_FDTOI_sd),
  1015. FT (NOMORE, 0x0, 0),
  1016. };
  1017. static const FormTable Forms_VCVTRS32F64 [] =
  1018. {
  1019. FT (2dd______, 0x0b40eebd, Steps_FDTOI_sd),
  1020. FT (NOMORE, 0x0, 0),
  1021. };
  1022. static const FormTable Forms_PLD [] =
  1023. {
  1024. FT (2_irc____, 0xF000F810, Steps_T2_PLD_offset),
  1025. FT (2_irr____, 0xF000F810, Steps_T2_PLD_RegIndir),
  1026. FT (NOMORE, 0x0, 0),
  1027. } ;
  1028. // used by floating point LDMs
  1029. static const FormTable Forms_VPOP[] =
  1030. {
  1031. FT (2irc_____, 0x0b00ec10, Steps_A_DBL_LDM), //FLDMD rn, {dreg list}
  1032. FT (2ispc____, 0x0b00ec10, Steps_A_DBL_LDM), //FLDMD SP, {dreg list}
  1033. FT (2rirc____, 0x0b00ec10, Steps_A_DBL_LDM), //FLDMD rn, {single register}
  1034. FT (2rispc___, 0x0b00ec10, Steps_A_DBL_LDM), //FLDMD SP, {single register}
  1035. FT (NOMORE, 0x0, 0),
  1036. };
  1037. // used by floating point STMs
  1038. static const FormTable Forms_VPUSH[] =
  1039. {
  1040. FT (2irc_____, 0x0b00ec00, Steps_A_DBL_STM), //FSTMD rn, {dreg list}
  1041. FT (2ispc____, 0x0b00ec00, Steps_A_DBL_STM), //FSTMD SP, {dreg list}
  1042. FT (2ircr____, 0x0b00ec00, Steps_A_DBL_STM), //FSTMD rn, {single register}
  1043. FT (2ispcr___, 0x0b00ec00, Steps_A_DBL_STM), //FSTMD SP, {single register}
  1044. FT (NOMORE, 0x0, 0),
  1045. };
  1046. static const FormTable Forms_BIC [] =
  1047. {
  1048. FT (2rrc_____, 0x0000F020, Steps_T2_ALU_dn_modc12),
  1049. FT (2rrrcc___, 0x0000EA20, Steps_T2_ALU_dnm_Shift_c),
  1050. FT (2rrr_____, 0x0000EA20, Steps_T2_ALU_dnm),
  1051. FT (2rr______, 0x0000EA20, Steps_T2_ALU_dnm),
  1052. FT (Trr______, 0x4380, Steps_T_ALU_dm),
  1053. FT (Tr_______, 0x4380, Steps_T_ALU_dm),
  1054. FT (NOMORE, 0x0, 0),
  1055. };