arm_dyncom_dec.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. /* Copyright (C)
  2. * 2012 - Michael.Kang blackfin.kang@gmail.com
  3. * This program is free software; you can redistribute it and/or
  4. * modify it under the terms of the GNU General Public License
  5. * as published by the Free Software Foundation; either version 2
  6. * of the License, or (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program; if not, write to the Free Software
  15. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  16. *
  17. */
  18. /**
  19. * @file arm_dyncom_dec.cpp
  20. * @brief Some common utility for arm decoder
  21. * @author Michael.Kang blackfin.kang@gmail.com
  22. * @version 7849
  23. * @date 2012-03-15
  24. */
  25. #include "core/arm/skyeye_common/arm_regformat.h"
  26. #include "core/arm/skyeye_common/armdefs.h"
  27. #include "core/arm/dyncom/arm_dyncom_dec.h"
  28. const ISEITEM arm_instruction[] = {
  29. {"vmla", 4, ARMVFP2, 23, 27, 0x1C, 20, 21, 0x0, 9, 11, 0x5, 4, 4, 0},
  30. {"vmls", 7, ARMVFP2, 28, 31, 0xF, 25, 27, 0x1, 23, 23, 1, 11, 11, 0, 8, 9, 0x2, 6, 6, 1, 4, 4, 0},
  31. {"vnmla", 4, ARMVFP2, 23, 27, 0x1C, 20, 21, 0x1, 9, 11, 0x5, 4, 4, 0},
  32. {"vnmla", 5, ARMVFP2, 23, 27, 0x1C, 20, 21, 0x2, 9, 11, 0x5, 6, 6, 1, 4, 4, 0},
  33. {"vnmls", 5, ARMVFP2, 23, 27, 0x1C, 20, 21, 0x1, 9, 11, 0x5, 6, 6, 0, 4, 4, 0},
  34. {"vnmul", 5, ARMVFP2, 23, 27, 0x1C, 20, 21, 0x2, 9, 11, 0x5, 6, 6, 1, 4, 4, 0},
  35. {"vmul", 5, ARMVFP2, 23, 27, 0x1C, 20, 21, 0x2, 9, 11, 0x5, 6, 6, 0, 4, 4, 0},
  36. {"vadd", 5, ARMVFP2, 23, 27, 0x1C, 20, 21, 0x3, 9, 11, 0x5, 6, 6, 0, 4, 4, 0},
  37. {"vsub", 5, ARMVFP2, 23, 27, 0x1C, 20, 21, 0x3, 9, 11, 0x5, 6, 6, 1, 4, 4, 0},
  38. {"vdiv", 5, ARMVFP2, 23, 27, 0x1D, 20, 21, 0x0, 9, 11, 0x5, 6, 6, 0, 4, 4, 0},
  39. {"vmov(i)", 4, ARMVFP3, 23, 27, 0x1D, 20, 21, 0x3, 9, 11, 0x5, 4, 7, 0},
  40. {"vmov(r)", 5, ARMVFP3, 23, 27, 0x1D, 16, 21, 0x30, 9, 11, 0x5, 6, 7, 1, 4, 4, 0},
  41. {"vabs", 5, ARMVFP2, 23, 27, 0x1D, 16, 21, 0x30, 9, 11, 0x5, 6, 7, 3, 4, 4, 0},
  42. {"vneg", 5, ARMVFP2, 23, 27, 0x1D, 17, 21, 0x18, 9, 11, 0x5, 6, 7, 1, 4, 4, 0},
  43. {"vsqrt", 5, ARMVFP2, 23, 27, 0x1D, 16, 21, 0x31, 9, 11, 0x5, 6, 7, 3, 4, 4, 0},
  44. {"vcmp", 5, ARMVFP2, 23, 27, 0x1D, 16, 21, 0x34, 9, 11, 0x5, 6, 6, 1, 4, 4, 0},
  45. {"vcmp2", 5, ARMVFP2, 23, 27, 0x1D, 16, 21, 0x35, 9, 11, 0x5, 0, 6, 0x40},
  46. {"vcvt(bds)", 5, ARMVFP2, 23, 27, 0x1D, 16, 21, 0x37, 9, 11, 0x5, 6, 7, 3, 4, 4, 0},
  47. {"vcvt(bff)", 6, ARMVFP3, 23, 27, 0x1D, 19, 21, 0x7, 17, 17, 0x1, 9, 11,5, 6, 6, 1},
  48. {"vcvt(bfi)", 5, ARMVFP2, 23, 27, 0x1D, 19, 21, 0x7, 9, 11, 0x5, 6, 6, 1, 4, 4, 0},
  49. {"vmovbrs", 3, ARMVFP2, 21, 27, 0x70, 8, 11, 0xA, 0, 6, 0x10},
  50. {"vmsr", 2, ARMVFP2, 20, 27, 0xEE, 0, 11, 0xA10},
  51. {"vmovbrc", 4, ARMVFP2, 23, 27, 0x1C, 20, 20, 0x0, 8, 11, 0xB, 0,4,0x10},
  52. {"vmrs", 2, ARMVFP2, 20, 27, 0xEF, 0, 11, 0xA10},
  53. {"vmovbcr", 4, ARMVFP2, 24, 27, 0xE, 20, 20, 1, 8, 11, 0xB, 0,4,0x10},
  54. {"vmovbrrss", 3, ARMVFP2, 21, 27, 0x62, 8, 11, 0xA, 4, 4, 1},
  55. {"vmovbrrd", 3, ARMVFP2, 21, 27, 0x62, 6, 11, 0x2C, 4, 4, 1},
  56. {"vstr", 3, ARMVFP2, 24, 27, 0xD, 20, 21, 0, 9, 11,5},
  57. {"vpush", 3, ARMVFP2, 23, 27, 0x1A, 16, 21, 0x2D, 9, 11,5},
  58. {"vstm", 3, ARMVFP2, 25, 27, 0x6, 20, 20, 0, 9, 11,5},
  59. {"vpop", 3, ARMVFP2, 23, 27, 0x19, 16, 21, 0x3D, 9, 11,5},
  60. {"vldr", 3, ARMVFP2, 24, 27, 0xD, 20, 21, 1, 9, 11,5},
  61. {"vldm", 3, ARMVFP2, 25, 27, 0x6, 20, 20, 1, 9, 11,5},
  62. {"srs" , 4 , 6 , 25, 31, 0x0000007c, 22, 22, 0x00000001, 16, 20, 0x0000000d, 8, 11, 0x00000005},
  63. {"rfe" , 4 , 6 , 25, 31, 0x0000007c, 22, 22, 0x00000000, 20, 20, 0x00000001, 8, 11, 0x0000000a},
  64. {"bkpt" , 2 , 3 , 20, 31, 0x00000e12, 4, 7, 0x00000007},
  65. {"blx" , 1 , 3 , 25, 31, 0x0000007d},
  66. {"cps" , 3 , 6 , 20, 31, 0x00000f10, 16, 16, 0x00000000, 5, 5, 0x00000000},
  67. {"pld" , 4 , 4 , 26, 31, 0x0000003d, 24, 24, 0x00000001, 20, 22, 0x00000005, 12, 15, 0x0000000f},
  68. {"setend" , 2 , 6 , 16, 31, 0x0000f101, 4, 7, 0x00000000},
  69. {"clrex" , 1 , 6 , 0, 31, 0xf57ff01f},
  70. {"rev16" , 2 , 6 , 16, 27, 0x000006bf, 4, 11, 0x000000fb},
  71. {"usad8" , 3 , 6 , 20, 27, 0x00000078, 12, 15, 0x0000000f, 4, 7, 0x00000001},
  72. {"sxtb" , 2 , 6 , 16, 27, 0x000006af, 4, 7, 0x00000007},
  73. {"uxtb" , 2 , 6 , 16, 27, 0x000006ef, 4, 7, 0x00000007},
  74. {"sxth" , 2 , 6 , 16, 27, 0x000006bf, 4, 7, 0x00000007},
  75. {"sxtb16" , 2 , 6 , 16, 27, 0x0000068f, 4, 7, 0x00000007},
  76. {"uxth" , 2 , 6 , 16, 27, 0x000006ff, 4, 7, 0x00000007},
  77. {"uxtb16" , 2 , 6 , 16, 27, 0x000006cf, 4, 7, 0x00000007},
  78. {"cpy" , 2 , 6 , 20, 27, 0x0000001a, 4, 11, 0x00000000},
  79. {"uxtab" , 2 , 6 , 20, 27, 0x0000006e, 4, 9, 0x00000007},
  80. {"ssub8" , 2 , 6 , 20, 27, 0x00000061, 4, 7, 0x0000000f},
  81. {"shsub8" , 2 , 6 , 20, 27, 0x00000063, 4, 7, 0x0000000f},
  82. {"ssubaddx" , 2 , 6 , 20, 27, 0x00000061, 4, 7, 0x00000005},
  83. {"strex" , 2 , 6 , 20, 27, 0x00000018, 4, 7, 0x00000009},
  84. {"strexb" , 2 , 7 , 20, 27, 0x0000001c, 4, 7, 0x00000009},
  85. {"swp" , 2 , 0 , 20, 27, 0x00000010, 4, 7, 0x00000009},
  86. {"swpb" , 2 , 0 , 20, 27, 0x00000014, 4, 7, 0x00000009},
  87. {"ssub16" , 2 , 6 , 20, 27, 0x00000061, 4, 7, 0x00000007},
  88. {"ssat16" , 2 , 6 , 20, 27, 0x0000006a, 4, 7, 0x00000003},
  89. {"shsubaddx" , 2 , 6 , 20, 27, 0x00000063, 4, 7, 0x00000005},
  90. {"qsubaddx" , 2 , 6 , 20, 27, 0x00000062, 4, 7, 0x00000005},
  91. {"shaddsubx" , 2 , 6 , 20, 27, 0x00000063, 4, 7, 0x00000003},
  92. {"shadd8" , 2 , 6 , 20, 27, 0x00000063, 4, 7, 0x00000009},
  93. {"shadd16" , 2 , 6 , 20, 27, 0x00000063, 4, 7, 0x00000001},
  94. {"sel" , 2 , 6 , 20, 27, 0x00000068, 4, 7, 0x0000000b},
  95. {"saddsubx" , 2 , 6 , 20, 27, 0x00000061, 4, 7, 0x00000003},
  96. {"sadd8" , 2 , 6 , 20, 27, 0x00000061, 4, 7, 0x00000009},
  97. {"sadd16" , 2 , 6 , 20, 27, 0x00000061, 4, 7, 0x00000001},
  98. {"shsub16" , 2 , 6 , 20, 27, 0x00000063, 4, 7, 0x00000007},
  99. {"umaal" , 2 , 6 , 20, 27, 0x00000004, 4, 7, 0x00000009},
  100. {"uxtab16" , 2 , 6 , 20, 27, 0x0000006c, 4, 7, 0x00000007},
  101. {"usubaddx" , 2 , 6 , 20, 27, 0x00000065, 4, 7, 0x00000005},
  102. {"usub8" , 2 , 6 , 20, 27, 0x00000065, 4, 7, 0x0000000f},
  103. {"usub16" , 2 , 6 , 20, 27, 0x00000065, 4, 7, 0x00000007},
  104. {"usat16" , 2 , 6 , 20, 27, 0x0000006e, 4, 7, 0x00000003},
  105. {"usada8" , 2 , 6 , 20, 27, 0x00000078, 4, 7, 0x00000001},
  106. {"uqsubaddx" , 2 , 6 , 20, 27, 0x00000066, 4, 7, 0x00000005},
  107. {"uqsub8" , 2 , 6 , 20, 27, 0x00000066, 4, 7, 0x0000000f},
  108. {"uqsub16" , 2 , 6 , 20, 27, 0x00000066, 4, 7, 0x00000007},
  109. {"uqaddsubx" , 2 , 6 , 20, 27, 0x00000066, 4, 7, 0x00000003},
  110. {"uqadd8" , 2 , 6 , 20, 27, 0x00000066, 4, 7, 0x00000009},
  111. {"uqadd16" , 2 , 6 , 20, 27, 0x00000066, 4, 7, 0x00000001},
  112. {"sxtab" , 2 , 6 , 20, 27, 0x0000006a, 4, 7, 0x00000007},
  113. {"uhsubaddx" , 2 , 6 , 20, 27, 0x00000067, 4, 7, 0x00000005},
  114. {"uhsub8" , 2 , 6 , 20, 27, 0x00000067, 4, 7, 0x0000000f},
  115. {"uhsub16" , 2 , 6 , 20, 27, 0x00000067, 4, 7, 0x00000007},
  116. {"uhaddsubx" , 2 , 6 , 20, 27, 0x00000067, 4, 7, 0x00000003},
  117. {"uhadd8" , 2 , 6 , 20, 27, 0x00000067, 4, 7, 0x00000009},
  118. {"uhadd16" , 2 , 6 , 20, 27, 0x00000067, 4, 7, 0x00000001},
  119. {"uaddsubx" , 2 , 6 , 20, 27, 0x00000065, 4, 7, 0x00000003},
  120. {"uadd8" , 2 , 6 , 20, 27, 0x00000065, 4, 7, 0x00000009},
  121. {"uadd16" , 2 , 6 , 20, 27, 0x00000065, 4, 7, 0x00000001},
  122. {"sxtah" , 2 , 6 , 20, 27, 0x0000006b, 4, 7, 0x00000007},
  123. {"sxtab16" , 2 , 6 , 20, 27, 0x00000068, 4, 7, 0x00000007},
  124. {"qadd8" , 2 , 6 , 20, 27, 0x00000062, 4, 7, 0x00000009},
  125. {"bxj" , 2 , 5 , 20, 27, 0x00000012, 4, 7, 0x00000002},
  126. {"clz" , 2 , 3 , 20, 27, 0x00000016, 4, 7, 0x00000001},
  127. {"uxtah" , 2 , 6 , 20, 27, 0x0000006f, 4, 7, 0x00000007},
  128. {"bx" , 2 , 2 , 20, 27, 0x00000012, 4, 7, 0x00000001},
  129. {"rev" , 2 , 6 , 20, 27, 0x0000006b, 4, 7, 0x00000003},
  130. {"blx" , 2 , 3 , 20, 27, 0x00000012, 4, 7, 0x00000003},
  131. {"revsh" , 2 , 6 , 20, 27, 0x0000006f, 4, 7, 0x0000000b},
  132. {"qadd" , 2 , 4 , 20, 27, 0x00000010, 4, 7, 0x00000005},
  133. {"qadd16" , 2 , 6 , 20, 27, 0x00000062, 4, 7, 0x00000001},
  134. {"qaddsubx" , 2 , 6 , 20, 27, 0x00000062, 4, 7, 0x00000003},
  135. {"ldrex" , 2 , 0 , 20, 27, 0x00000019, 4, 7, 0x00000009},
  136. {"qdadd" , 2 , 4 , 20, 27, 0x00000014, 4, 7, 0x00000005},
  137. {"qdsub" , 2 , 4 , 20, 27, 0x00000016, 4, 7, 0x00000005},
  138. {"qsub" , 2 , 4 , 20, 27, 0x00000012, 4, 7, 0x00000005},
  139. {"ldrexb" , 2 , 7 , 20, 27, 0x0000001d, 4, 7, 0x00000009},
  140. {"qsub8" , 2 , 6 , 20, 27, 0x00000062, 4, 7, 0x0000000f},
  141. {"qsub16" , 2 , 6 , 20, 27, 0x00000062, 4, 7, 0x00000007},
  142. {"smuad" , 4 , 6 , 20, 27, 0x00000070, 12, 15, 0x0000000f, 6, 7, 0x00000000, 4, 4, 0x00000001},
  143. {"smmul" , 4 , 6 , 20, 27, 0x00000075, 12, 15, 0x0000000f, 6, 7, 0x00000000, 4, 4, 0x00000001},
  144. {"smusd" , 4 , 6 , 20, 27, 0x00000070, 12, 15, 0x0000000f, 6, 7, 0x00000001, 4, 4, 0x00000001},
  145. {"smlsd" , 3 , 6 , 20, 27, 0x00000070, 6, 7, 0x00000001, 4, 4, 0x00000001},
  146. {"smlsld" , 3 , 6 , 20, 27, 0x00000074, 6, 7, 0x00000001, 4, 4, 0x00000001},
  147. {"smmla" , 3 , 6 , 20, 27, 0x00000075, 6, 7, 0x00000000, 4, 4, 0x00000001},
  148. {"smmls" , 3 , 6 , 20, 27, 0x00000075, 6, 7, 0x00000003, 4, 4, 0x00000001},
  149. {"smlald" , 3 , 6 , 20, 27, 0x00000074, 6, 7, 0x00000000, 4, 4, 0x00000001},
  150. {"smlad" , 3 , 6 , 20, 27, 0x00000070, 6, 7, 0x00000000, 4, 4, 0x00000001},
  151. {"smlaw" , 3 , 4 , 20, 27, 0x00000012, 7, 7, 0x00000001, 4, 5, 0x00000000},
  152. {"smulw" , 3 , 4 , 20, 27, 0x00000012, 7, 7, 0x00000001, 4, 5, 0x00000002},
  153. {"pkhtb" , 2 , 6 , 20, 27, 0x00000068, 4, 6, 0x00000005},
  154. {"pkhbt" , 2 , 6 , 20, 27, 0x00000068, 4, 6, 0x00000001},
  155. {"smul" , 3 , 4 , 20, 27, 0x00000016, 7, 7, 0x00000001, 4, 4, 0x00000000},
  156. {"smlalxy" , 3 , 4 , 20, 27, 0x00000014, 7, 7, 0x00000001, 4, 4, 0x00000000},
  157. // {"smlal" , 2 , 4 , 21, 27, 0x00000007, 4, 7, 0x00000009},
  158. {"smla" , 3 , 4 , 20, 27, 0x00000010, 7, 7, 0x00000001, 4, 4, 0x00000000},
  159. {"mcrr" , 1 , 6 , 20, 27, 0x000000c4},
  160. {"mrrc" , 1 , 6 , 20, 27, 0x000000c5},
  161. {"cmp" , 2 , 0 , 26, 27, 0x00000000, 20, 24, 0x00000015},
  162. {"tst" , 2 , 0 , 26, 27, 0x00000000, 20, 24, 0x00000011},
  163. {"teq" , 2 , 0 , 26, 27, 0x00000000, 20, 24, 0x00000013},
  164. {"cmn" , 2 , 0 , 26, 27, 0x00000000, 20, 24, 0x00000017},
  165. {"smull" , 2 , 0 , 21, 27, 0x00000006, 4, 7, 0x00000009},
  166. {"umull" , 2 , 0 , 21, 27, 0x00000004, 4, 7, 0x00000009},
  167. {"umlal" , 2 , 0 , 21, 27, 0x00000005, 4, 7, 0x00000009},
  168. {"smlal" , 2 , 0 , 21, 27, 0x00000007, 4, 7, 0x00000009},
  169. {"mul" , 2 , 0 , 21, 27, 0x00000000, 4, 7, 0x00000009},
  170. {"mla" , 2 , 0 , 21, 27, 0x00000001, 4, 7, 0x00000009},
  171. {"ssat" , 2 , 6 , 21, 27, 0x00000035, 4, 5, 0x00000001},
  172. {"usat" , 2 , 6 , 21, 27, 0x00000037, 4, 5, 0x00000001},
  173. {"mrs" , 4 , 0 , 23, 27, 0x00000002, 20, 21, 0x00000000, 16, 19, 0x0000000f, 0, 11, 0x00000000},
  174. {"msr" , 3 , 0 , 23, 27, 0x00000002, 20, 21, 0x00000002, 4, 7, 0x00000000},
  175. {"and" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x00000000},
  176. {"bic" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x0000000e},
  177. {"ldm" , 3 , 0 , 25, 27, 0x00000004, 20, 22, 0x00000005, 15, 15, 0x00000000},
  178. {"eor" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x00000001},
  179. {"add" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x00000004},
  180. {"rsb" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x00000003},
  181. {"rsc" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x00000007},
  182. {"sbc" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x00000006},
  183. {"adc" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x00000005},
  184. {"sub" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x00000002},
  185. {"orr" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x0000000c},
  186. {"mvn" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x0000000f},
  187. {"mov" , 2 , 0 , 26, 27, 0x00000000, 21, 24, 0x0000000d},
  188. {"stm" , 2 , 0 , 25, 27, 0x00000004, 20, 22, 0x00000004},
  189. {"ldm" , 4 , 0 , 25, 27, 0x00000004, 22, 22, 0x00000001, 20, 20, 0x00000001, 15, 15, 0x00000001},
  190. {"ldrsh" , 3 , 2 , 25, 27, 0x00000000, 20, 20, 0x00000001, 4, 7, 0x0000000f},
  191. {"stm" , 3 , 0 , 25, 27, 0x00000004, 22, 22, 0x00000000, 20, 20, 0x00000000},
  192. {"ldm" , 3 , 0 , 25, 27, 0x00000004, 22, 22, 0x00000000, 20, 20, 0x00000001},
  193. {"ldrsb" , 3 , 2 , 25, 27, 0x00000000, 20, 20, 0x00000001, 4, 7, 0x0000000d},
  194. {"strd" , 3 , 4 , 25, 27, 0x00000000, 20, 20, 0x00000000, 4, 7, 0x0000000f},
  195. {"ldrh" , 3 , 0 , 25, 27, 0x00000000, 20, 20, 0x00000001, 4, 7, 0x0000000b},
  196. {"strh" , 3 , 0 , 25, 27, 0x00000000, 20, 20, 0x00000000, 4, 7, 0x0000000b},
  197. {"ldrd" , 3 , 4 , 25, 27, 0x00000000, 20, 20, 0x00000000, 4, 7, 0x0000000d},
  198. {"strt" , 3 , 0 , 26, 27, 0x00000001, 24, 24, 0x00000000, 20, 22, 0x00000002},
  199. {"strbt" , 3 , 0 , 26, 27, 0x00000001, 24, 24, 0x00000000, 20, 22, 0x00000006},
  200. {"ldrbt" , 3 , 0 , 26, 27, 0x00000001, 24, 24, 0x00000000, 20, 22, 0x00000007},
  201. {"ldrt" , 3 , 0 , 26, 27, 0x00000001, 24, 24, 0x00000000, 20, 22, 0x00000003},
  202. {"mrc" , 3 , 6 , 24, 27, 0x0000000e, 20, 20, 0x00000001, 4, 4, 0x00000001},
  203. {"mcr" , 3 , 0 , 24, 27, 0x0000000e, 20, 20, 0x00000000, 4, 4, 0x00000001},
  204. {"msr" , 2 , 0 , 23, 27, 0x00000006, 20, 21, 0x00000002},
  205. {"ldrb" , 3 , 0 , 26, 27, 0x00000001, 22, 22, 0x00000001, 20, 20, 0x00000001},
  206. {"strb" , 3 , 0 , 26, 27, 0x00000001, 22, 22, 0x00000001, 20, 20, 0x00000000},
  207. {"ldr" , 4 , 0 , 28, 31, 0x0000000e, 26, 27, 0x00000001, 22, 22, 0x00000000, 20, 20, 0x00000001},
  208. {"ldrcond" , 3 , 0 , 26, 27, 0x00000001, 22, 22, 0x00000000, 20, 20, 0x00000001},
  209. {"str" , 3 , 0 , 26, 27, 0x00000001, 22, 22, 0x00000000, 20, 20, 0x00000000},
  210. {"cdp" , 2 , 0 , 24, 27, 0x0000000e, 4, 4, 0x00000000},
  211. {"stc" , 2 , 0 , 25, 27, 0x00000006, 20, 20, 0x00000000},
  212. {"ldc" , 2 , 0 , 25, 27, 0x00000006, 20, 20, 0x00000001},
  213. {"swi" , 1 , 0 , 24, 27, 0x0000000f},
  214. {"bbl" , 1 , 0 , 25, 27, 0x00000005},
  215. };
  216. const ISEITEM arm_exclusion_code[] = {
  217. {"vmla", 0, ARMVFP2, 0},
  218. {"vmls", 0, ARMVFP2, 0},
  219. {"vnmla", 0, ARMVFP2, 0},
  220. {"vnmla", 0, ARMVFP2, 0},
  221. {"vnmls", 0, ARMVFP2, 0},
  222. {"vnmul", 0, ARMVFP2, 0},
  223. {"vmul", 0, ARMVFP2, 0},
  224. {"vadd", 0, ARMVFP2, 0},
  225. {"vsub", 0, ARMVFP2, 0},
  226. {"vdiv", 0, ARMVFP2, 0},
  227. {"vmov(i)", 0, ARMVFP3, 0},
  228. {"vmov(r)", 0, ARMVFP3, 0},
  229. {"vabs", 0, ARMVFP2, 0},
  230. {"vneg", 0, ARMVFP2, 0},
  231. {"vsqrt", 0, ARMVFP2, 0},
  232. {"vcmp", 0, ARMVFP2, 0},
  233. {"vcmp2", 0, ARMVFP2, 0},
  234. {"vcvt(bff)", 0, ARMVFP3, 4, 4, 1},
  235. {"vcvt(bds)", 0, ARMVFP2, 0},
  236. {"vcvt(bfi)", 0, ARMVFP2, 0},
  237. {"vmovbrs", 0, ARMVFP2, 0},
  238. {"vmsr", 0, ARMVFP2, 0},
  239. {"vmovbrc", 0, ARMVFP2, 0},
  240. {"vmrs", 0, ARMVFP2, 0},
  241. {"vmovbcr", 0, ARMVFP2, 0},
  242. {"vmovbrrss", 0, ARMVFP2, 0},
  243. {"vmovbrrd", 0, ARMVFP2, 0},
  244. {"vstr", 0, ARMVFP2, 0},
  245. {"vpush", 0, ARMVFP2, 0},
  246. {"vstm", 0, ARMVFP2, 0},
  247. {"vpop", 0, ARMVFP2, 0},
  248. {"vldr", 0, ARMVFP2, 0},
  249. {"vldm", 0, ARMVFP2, 0},
  250. {"srs" , 0 , 6 , 0},
  251. {"rfe" , 0 , 6 , 0},
  252. {"bkpt" , 0 , 3 , 0},
  253. {"blx" , 0 , 3 , 0},
  254. {"cps" , 0 , 6 , 0},
  255. {"pld" , 0 , 4 , 0},
  256. {"setend" , 0 , 6 , 0},
  257. {"clrex" , 0 , 6 , 0},
  258. {"rev16" , 0 , 6 , 0},
  259. {"usad8" , 0 , 6 , 0},
  260. {"sxtb" , 0 , 6 , 0},
  261. {"uxtb" , 0 , 6 , 0},
  262. {"sxth" , 0 , 6 , 0},
  263. {"sxtb16" , 0 , 6 , 0},
  264. {"uxth" , 0 , 6 , 0},
  265. {"uxtb16" , 0 , 6 , 0},
  266. {"cpy" , 0 , 6 , 0},
  267. {"uxtab" , 0 , 6 , 0},
  268. {"ssub8" , 0 , 6 , 0},
  269. {"shsub8" , 0 , 6 , 0},
  270. {"ssubaddx" , 0 , 6 , 0},
  271. {"strex" , 0 , 6 , 0},
  272. {"strexb" , 0 , 7 , 0},
  273. {"swp" , 0 , 0 , 0},
  274. {"swpb" , 0 , 0 , 0},
  275. {"ssub16" , 0 , 6 , 0},
  276. {"ssat16" , 0 , 6 , 0},
  277. {"shsubaddx" , 0 , 6 , 0},
  278. {"qsubaddx" , 0 , 6 , 0},
  279. {"shaddsubx" , 0 , 6 , 0},
  280. {"shadd8" , 0 , 6 , 0},
  281. {"shadd16" , 0 , 6 , 0},
  282. {"sel" , 0 , 6 , 0},
  283. {"saddsubx" , 0 , 6 , 0},
  284. {"sadd8" , 0 , 6 , 0},
  285. {"sadd16" , 0 , 6 , 0},
  286. {"shsub16" , 0 , 6 , 0},
  287. {"umaal" , 0 , 6 , 0},
  288. {"uxtab16" , 0 , 6 , 0},
  289. {"usubaddx" , 0 , 6 , 0},
  290. {"usub8" , 0 , 6 , 0},
  291. {"usub16" , 0 , 6 , 0},
  292. {"usat16" , 0 , 6 , 0},
  293. {"usada8" , 0 , 6 , 0},
  294. {"uqsubaddx" , 0 , 6 , 0},
  295. {"uqsub8" , 0 , 6 , 0},
  296. {"uqsub16" , 0 , 6 , 0},
  297. {"uqaddsubx" , 0 , 6 , 0},
  298. {"uqadd8" , 0 , 6 , 0},
  299. {"uqadd16" , 0 , 6 , 0},
  300. {"sxtab" , 0 , 6 , 0},
  301. {"uhsubaddx" , 0 , 6 , 0},
  302. {"uhsub8" , 0 , 6 , 0},
  303. {"uhsub16" , 0 , 6 , 0},
  304. {"uhaddsubx" , 0 , 6 , 0},
  305. {"uhadd8" , 0 , 6 , 0},
  306. {"uhadd16" , 0 , 6 , 0},
  307. {"uaddsubx" , 0 , 6 , 0},
  308. {"uadd8" , 0 , 6 , 0},
  309. {"uadd16" , 0 , 6 , 0},
  310. {"sxtah" , 0 , 6 , 0},
  311. {"sxtab16" , 0 , 6 , 0},
  312. {"qadd8" , 0 , 6 , 0},
  313. {"bxj" , 0 , 5 , 0},
  314. {"clz" , 0 , 3 , 0},
  315. {"uxtah" , 0 , 6 , 0},
  316. {"bx" , 0 , 2 , 0},
  317. {"rev" , 0 , 6 , 0},
  318. {"blx" , 0 , 3 , 0},
  319. {"revsh" , 0 , 6 , 0},
  320. {"qadd" , 0 , 4 , 0},
  321. {"qadd16" , 0 , 6 , 0},
  322. {"qaddsubx" , 0 , 6 , 0},
  323. {"ldrex" , 0 , 0 , 0},
  324. {"qdadd" , 0 , 4 , 0},
  325. {"qdsub" , 0 , 4 , 0},
  326. {"qsub" , 0 , 4 , 0},
  327. {"ldrexb" , 0 , 7 , 0},
  328. {"qsub8" , 0 , 6 , 0},
  329. {"qsub16" , 0 , 6 , 0},
  330. {"smuad" , 0 , 6 , 0},
  331. {"smmul" , 0 , 6 , 0},
  332. {"smusd" , 0 , 6 , 0},
  333. {"smlsd" , 0 , 6 , 0},
  334. {"smlsld" , 0 , 6 , 0},
  335. {"smmla" , 0 , 6 , 0},
  336. {"smmls" , 0 , 6 , 0},
  337. {"smlald" , 0 , 6 , 0},
  338. {"smlad" , 0 , 6 , 0},
  339. {"smlaw" , 0 , 4 , 0},
  340. {"smulw" , 0 , 4 , 0},
  341. {"pkhtb" , 0 , 6 , 0},
  342. {"pkhbt" , 0 , 6 , 0},
  343. {"smul" , 0 , 4 , 0},
  344. {"smlal" , 0 , 4 , 0},
  345. {"smla" , 0 , 4 , 0},
  346. {"mcrr" , 0 , 6 , 0},
  347. {"mrrc" , 0 , 6 , 0},
  348. {"cmp" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  349. {"tst" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  350. {"teq" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  351. {"cmn" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  352. {"smull" , 0 , 0 , 0},
  353. {"umull" , 0 , 0 , 0},
  354. {"umlal" , 0 , 0 , 0},
  355. {"smlal" , 0 , 0 , 0},
  356. {"mul" , 0 , 0 , 0},
  357. {"mla" , 0 , 0 , 0},
  358. {"ssat" , 0 , 6 , 0},
  359. {"usat" , 0 , 6 , 0},
  360. {"mrs" , 0 , 0 , 0},
  361. {"msr" , 0 , 0 , 0},
  362. {"and" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  363. {"bic" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  364. {"ldm" , 0 , 0 , 0},
  365. {"eor" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  366. {"add" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  367. {"rsb" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  368. {"rsc" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  369. {"sbc" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  370. {"adc" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  371. {"sub" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  372. {"orr" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  373. {"mvn" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  374. {"mov" , 3 , 0 , 4, 4, 0x00000001, 7, 7, 0x00000001, 25, 25, 0x00000000},
  375. {"stm" , 0 , 0 , 0},
  376. {"ldm" , 0 , 0 , 0},
  377. {"ldrsh" , 0 , 2 , 0},
  378. {"stm" , 0 , 0 , 0},
  379. {"ldm" , 0 , 0 , 0},
  380. {"ldrsb" , 0 , 2 , 0},
  381. {"strd" , 0 , 4 , 0},
  382. {"ldrh" , 0 , 0 , 0},
  383. {"strh" , 0 , 0 , 0},
  384. {"ldrd" , 0 , 4 , 0},
  385. {"strt" , 0 , 0 , 0},
  386. {"strbt" , 0 , 0 , 0},
  387. {"ldrbt" , 0 , 0 , 0},
  388. {"ldrt" , 0 , 0 , 0},
  389. {"mrc" , 0 , 6 , 0},
  390. {"mcr" , 0 , 0 , 0},
  391. {"msr" , 0 , 0 , 0},
  392. {"ldrb" , 0 , 0 , 0},
  393. {"strb" , 0 , 0 , 0},
  394. {"ldr" , 0 , 0 , 0},
  395. {"ldrcond" , 1 , 0 , 28, 31, 0x0000000e},
  396. {"str" , 0 , 0 , 0},
  397. {"cdp" , 0 , 0 , 0},
  398. {"stc" , 0 , 0 , 0},
  399. {"ldc" , 0 , 0 , 0},
  400. {"swi" , 0 , 0 , 0},
  401. {"bbl" , 0 , 0 , 0},
  402. {"bl_1_thumb", 0, INVALID, 0},/* should be table[-4] */
  403. {"bl_2_thumb", 0, INVALID, 0}, /* should be located at the end of the table[-3] */
  404. {"blx_1_thumb", 0, INVALID, 0}, /* should be located at table[-2] */
  405. {"invalid", 0, INVALID, 0}
  406. };
  407. int decode_arm_instr(uint32_t instr, int32_t *idx)
  408. {
  409. int n = 0;
  410. int base = 0;
  411. int ret = DECODE_FAILURE;
  412. int i = 0;
  413. int instr_slots = sizeof(arm_instruction)/sizeof(ISEITEM);
  414. for (i = 0; i < instr_slots; i++)
  415. {
  416. // ret = DECODE_SUCCESS;
  417. n = arm_instruction[i].attribute_value;
  418. base = 0;
  419. while (n) {
  420. if (arm_instruction[i].content[base + 1] == 31 && arm_instruction[i].content[base] == 0) {
  421. /* clrex */
  422. if (instr != arm_instruction[i].content[base + 2]) {
  423. break;
  424. }
  425. } else if (BITS(arm_instruction[i].content[base], arm_instruction[i].content[base + 1]) != arm_instruction[i].content[base + 2]) {
  426. break;
  427. }
  428. base += 3;
  429. n --;
  430. }
  431. //All conditions is satisfied.
  432. if (n == 0)
  433. ret = DECODE_SUCCESS;
  434. if (ret == DECODE_SUCCESS) {
  435. n = arm_exclusion_code[i].attribute_value;
  436. if (n != 0) {
  437. base = 0;
  438. while (n) {
  439. if (BITS(arm_exclusion_code[i].content[base], arm_exclusion_code[i].content[base + 1]) != arm_exclusion_code[i].content[base + 2]) {
  440. break; }
  441. base += 3;
  442. n --;
  443. }
  444. //All conditions is satisfied.
  445. if (n == 0)
  446. ret = DECODE_FAILURE;
  447. }
  448. }
  449. if (ret == DECODE_SUCCESS) {
  450. *idx = i;
  451. return ret;
  452. }
  453. }
  454. return ret;
  455. }