test_arm_disassembler.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. /* This file is part of the dynarmic project.
  2. * Copyright (c) 2016 MerryMage
  3. * SPDX-License-Identifier: 0BSD
  4. */
  5. #include <catch2/catch_test_macros.hpp>
  6. #include "dynarmic/frontend/A32/disassembler/disassembler.h"
  7. using Dynarmic::A32::DisassembleArm;
  8. TEST_CASE("Disassemble branch instructions", "[arm][disassembler]") {
  9. REQUIRE(DisassembleArm(0xEAFFFFFE) == "b +#0");
  10. REQUIRE(DisassembleArm(0xEB000008) == "bl +#40");
  11. REQUIRE(DisassembleArm(0xFBFFFFFE) == "blx +#2");
  12. REQUIRE(DisassembleArm(0xFAFFFFFF) == "blx +#4");
  13. REQUIRE(DisassembleArm(0xFBE1E7FE) == "blx -#7888894");
  14. REQUIRE(DisassembleArm(0xE12FFF3D) == "blx sp");
  15. REQUIRE(DisassembleArm(0x312FFF13) == "bxcc r3");
  16. REQUIRE(DisassembleArm(0x012FFF29) == "bxjeq r9");
  17. }
  18. TEST_CASE("Disassemble data processing instructions", "[arm][disassembler]") {
  19. REQUIRE(DisassembleArm(0xE2A21004) == "adc r1, r2, #4");
  20. REQUIRE(DisassembleArm(0xE0A21143) == "adc r1, r2, r3, asr #2");
  21. REQUIRE(DisassembleArm(0xE0A21103) == "adc r1, r2, r3, lsl #2");
  22. REQUIRE(DisassembleArm(0xE0A21123) == "adc r1, r2, r3, lsr #2");
  23. REQUIRE(DisassembleArm(0xE0A21163) == "adc r1, r2, r3, ror #2");
  24. REQUIRE(DisassembleArm(0xE0A21003) == "adc r1, r2, r3");
  25. REQUIRE(DisassembleArm(0xE0A21063) == "adc r1, r2, r3, rrx");
  26. REQUIRE(DisassembleArm(0xE0A21453) == "adc r1, r2, r3, asr r4");
  27. REQUIRE(DisassembleArm(0xE0A21413) == "adc r1, r2, r3, lsl r4");
  28. REQUIRE(DisassembleArm(0xE0A21433) == "adc r1, r2, r3, lsr r4");
  29. REQUIRE(DisassembleArm(0xE0A21473) == "adc r1, r2, r3, ror r4");
  30. REQUIRE(DisassembleArm(0xE2B21004) == "adcs r1, r2, #4");
  31. REQUIRE(DisassembleArm(0xE0B21143) == "adcs r1, r2, r3, asr #2");
  32. REQUIRE(DisassembleArm(0xE0B21103) == "adcs r1, r2, r3, lsl #2");
  33. REQUIRE(DisassembleArm(0xE0B21123) == "adcs r1, r2, r3, lsr #2");
  34. REQUIRE(DisassembleArm(0xE0B21163) == "adcs r1, r2, r3, ror #2");
  35. REQUIRE(DisassembleArm(0xE0B21003) == "adcs r1, r2, r3");
  36. REQUIRE(DisassembleArm(0xE0B21063) == "adcs r1, r2, r3, rrx");
  37. REQUIRE(DisassembleArm(0xE0B21453) == "adcs r1, r2, r3, asr r4");
  38. REQUIRE(DisassembleArm(0xE0B21413) == "adcs r1, r2, r3, lsl r4");
  39. REQUIRE(DisassembleArm(0xE0B21433) == "adcs r1, r2, r3, lsr r4");
  40. REQUIRE(DisassembleArm(0xE0B21473) == "adcs r1, r2, r3, ror r4");
  41. REQUIRE(DisassembleArm(0xE2853004) == "add r3, r5, #4");
  42. REQUIRE(DisassembleArm(0xE0821143) == "add r1, r2, r3, asr #2");
  43. REQUIRE(DisassembleArm(0xE0821103) == "add r1, r2, r3, lsl #2");
  44. REQUIRE(DisassembleArm(0xE0821123) == "add r1, r2, r3, lsr #2");
  45. REQUIRE(DisassembleArm(0xE0821163) == "add r1, r2, r3, ror #2");
  46. REQUIRE(DisassembleArm(0xE0821003) == "add r1, r2, r3");
  47. REQUIRE(DisassembleArm(0xE0821453) == "add r1, r2, r3, asr r4");
  48. REQUIRE(DisassembleArm(0xE0821413) == "add r1, r2, r3, lsl r4");
  49. REQUIRE(DisassembleArm(0xE0821433) == "add r1, r2, r3, lsr r4");
  50. REQUIRE(DisassembleArm(0xE0821473) == "add r1, r2, r3, ror r4");
  51. REQUIRE(DisassembleArm(0xE0821063) == "add r1, r2, r3, rrx");
  52. REQUIRE(DisassembleArm(0xE2953004) == "adds r3, r5, #4");
  53. REQUIRE(DisassembleArm(0xE0921143) == "adds r1, r2, r3, asr #2");
  54. REQUIRE(DisassembleArm(0xE0921103) == "adds r1, r2, r3, lsl #2");
  55. REQUIRE(DisassembleArm(0xE0921123) == "adds r1, r2, r3, lsr #2");
  56. REQUIRE(DisassembleArm(0xE0921163) == "adds r1, r2, r3, ror #2");
  57. REQUIRE(DisassembleArm(0xE0921003) == "adds r1, r2, r3");
  58. REQUIRE(DisassembleArm(0xE0921063) == "adds r1, r2, r3, rrx");
  59. REQUIRE(DisassembleArm(0xE0921453) == "adds r1, r2, r3, asr r4");
  60. REQUIRE(DisassembleArm(0xE0921413) == "adds r1, r2, r3, lsl r4");
  61. REQUIRE(DisassembleArm(0xE0921433) == "adds r1, r2, r3, lsr r4");
  62. REQUIRE(DisassembleArm(0xE0921473) == "adds r1, r2, r3, ror r4");
  63. REQUIRE(DisassembleArm(0xE2021004) == "and r1, r2, #4");
  64. REQUIRE(DisassembleArm(0xE0021143) == "and r1, r2, r3, asr #2");
  65. REQUIRE(DisassembleArm(0xE0021103) == "and r1, r2, r3, lsl #2");
  66. REQUIRE(DisassembleArm(0xE0021123) == "and r1, r2, r3, lsr #2");
  67. REQUIRE(DisassembleArm(0xE0021163) == "and r1, r2, r3, ror #2");
  68. REQUIRE(DisassembleArm(0xE0021003) == "and r1, r2, r3");
  69. REQUIRE(DisassembleArm(0xE0021453) == "and r1, r2, r3, asr r4");
  70. REQUIRE(DisassembleArm(0xE0021413) == "and r1, r2, r3, lsl r4");
  71. REQUIRE(DisassembleArm(0xE0021433) == "and r1, r2, r3, lsr r4");
  72. REQUIRE(DisassembleArm(0xE0021473) == "and r1, r2, r3, ror r4");
  73. REQUIRE(DisassembleArm(0xE0021063) == "and r1, r2, r3, rrx");
  74. REQUIRE(DisassembleArm(0xE2121004) == "ands r1, r2, #4");
  75. REQUIRE(DisassembleArm(0xE0121143) == "ands r1, r2, r3, asr #2");
  76. REQUIRE(DisassembleArm(0xE0121103) == "ands r1, r2, r3, lsl #2");
  77. REQUIRE(DisassembleArm(0xE0121123) == "ands r1, r2, r3, lsr #2");
  78. REQUIRE(DisassembleArm(0xE0121163) == "ands r1, r2, r3, ror #2");
  79. REQUIRE(DisassembleArm(0xE0121003) == "ands r1, r2, r3");
  80. REQUIRE(DisassembleArm(0xE0121063) == "ands r1, r2, r3, rrx");
  81. REQUIRE(DisassembleArm(0xE0121453) == "ands r1, r2, r3, asr r4");
  82. REQUIRE(DisassembleArm(0xE0121413) == "ands r1, r2, r3, lsl r4");
  83. REQUIRE(DisassembleArm(0xE0121433) == "ands r1, r2, r3, lsr r4");
  84. REQUIRE(DisassembleArm(0xE0121473) == "ands r1, r2, r3, ror r4");
  85. REQUIRE(DisassembleArm(0xE3C21004) == "bic r1, r2, #4");
  86. REQUIRE(DisassembleArm(0xE1C21143) == "bic r1, r2, r3, asr #2");
  87. REQUIRE(DisassembleArm(0xE1C21103) == "bic r1, r2, r3, lsl #2");
  88. REQUIRE(DisassembleArm(0xE1C21123) == "bic r1, r2, r3, lsr #2");
  89. REQUIRE(DisassembleArm(0xE1C21163) == "bic r1, r2, r3, ror #2");
  90. REQUIRE(DisassembleArm(0xE1C21003) == "bic r1, r2, r3");
  91. REQUIRE(DisassembleArm(0xE1C21453) == "bic r1, r2, r3, asr r4");
  92. REQUIRE(DisassembleArm(0xE1C21413) == "bic r1, r2, r3, lsl r4");
  93. REQUIRE(DisassembleArm(0xE1C21433) == "bic r1, r2, r3, lsr r4");
  94. REQUIRE(DisassembleArm(0xE1C21473) == "bic r1, r2, r3, ror r4");
  95. REQUIRE(DisassembleArm(0xE1C21063) == "bic r1, r2, r3, rrx");
  96. REQUIRE(DisassembleArm(0xE3D21004) == "bics r1, r2, #4");
  97. REQUIRE(DisassembleArm(0xE1D21143) == "bics r1, r2, r3, asr #2");
  98. REQUIRE(DisassembleArm(0xE1D21103) == "bics r1, r2, r3, lsl #2");
  99. REQUIRE(DisassembleArm(0xE1D21123) == "bics r1, r2, r3, lsr #2");
  100. REQUIRE(DisassembleArm(0xE1D21163) == "bics r1, r2, r3, ror #2");
  101. REQUIRE(DisassembleArm(0xE1D21003) == "bics r1, r2, r3");
  102. REQUIRE(DisassembleArm(0xE1D21063) == "bics r1, r2, r3, rrx");
  103. REQUIRE(DisassembleArm(0xE1D21453) == "bics r1, r2, r3, asr r4");
  104. REQUIRE(DisassembleArm(0xE1D21413) == "bics r1, r2, r3, lsl r4");
  105. REQUIRE(DisassembleArm(0xE1D21433) == "bics r1, r2, r3, lsr r4");
  106. REQUIRE(DisassembleArm(0xE1D21473) == "bics r1, r2, r3, ror r4");
  107. REQUIRE(DisassembleArm(0xE3710004) == "cmn r1, #4");
  108. REQUIRE(DisassembleArm(0xE1710142) == "cmn r1, r2, asr #2");
  109. REQUIRE(DisassembleArm(0xE1710102) == "cmn r1, r2, lsl #2");
  110. REQUIRE(DisassembleArm(0xE1710122) == "cmn r1, r2, lsr #2");
  111. REQUIRE(DisassembleArm(0xE1710162) == "cmn r1, r2, ror #2");
  112. REQUIRE(DisassembleArm(0xE1710002) == "cmn r1, r2");
  113. REQUIRE(DisassembleArm(0xE1710062) == "cmn r1, r2, rrx");
  114. REQUIRE(DisassembleArm(0xE1710352) == "cmn r1, r2, asr r3");
  115. REQUIRE(DisassembleArm(0xE1710312) == "cmn r1, r2, lsl r3");
  116. REQUIRE(DisassembleArm(0xE1710332) == "cmn r1, r2, lsr r3");
  117. REQUIRE(DisassembleArm(0xE1710372) == "cmn r1, r2, ror r3");
  118. REQUIRE(DisassembleArm(0xE3510004) == "cmp r1, #4");
  119. REQUIRE(DisassembleArm(0xE1510142) == "cmp r1, r2, asr #2");
  120. REQUIRE(DisassembleArm(0xE1510102) == "cmp r1, r2, lsl #2");
  121. REQUIRE(DisassembleArm(0xE1510122) == "cmp r1, r2, lsr #2");
  122. REQUIRE(DisassembleArm(0xE1510162) == "cmp r1, r2, ror #2");
  123. REQUIRE(DisassembleArm(0xE1510002) == "cmp r1, r2");
  124. REQUIRE(DisassembleArm(0xE1510062) == "cmp r1, r2, rrx");
  125. REQUIRE(DisassembleArm(0xE1510352) == "cmp r1, r2, asr r3");
  126. REQUIRE(DisassembleArm(0xE1510312) == "cmp r1, r2, lsl r3");
  127. REQUIRE(DisassembleArm(0xE1510332) == "cmp r1, r2, lsr r3");
  128. REQUIRE(DisassembleArm(0xE1510372) == "cmp r1, r2, ror r3");
  129. REQUIRE(DisassembleArm(0xE2221004) == "eor r1, r2, #4");
  130. REQUIRE(DisassembleArm(0xE0221243) == "eor r1, r2, r3, asr #4");
  131. REQUIRE(DisassembleArm(0xE0221203) == "eor r1, r2, r3, lsl #4");
  132. REQUIRE(DisassembleArm(0xE0221223) == "eor r1, r2, r3, lsr #4");
  133. REQUIRE(DisassembleArm(0xE0221263) == "eor r1, r2, r3, ror #4");
  134. REQUIRE(DisassembleArm(0xE0221003) == "eor r1, r2, r3");
  135. REQUIRE(DisassembleArm(0xE0221453) == "eor r1, r2, r3, asr r4");
  136. REQUIRE(DisassembleArm(0xE0221413) == "eor r1, r2, r3, lsl r4");
  137. REQUIRE(DisassembleArm(0xE0221433) == "eor r1, r2, r3, lsr r4");
  138. REQUIRE(DisassembleArm(0xE0221473) == "eor r1, r2, r3, ror r4");
  139. REQUIRE(DisassembleArm(0xE0221063) == "eor r1, r2, r3, rrx");
  140. REQUIRE(DisassembleArm(0xE2321004) == "eors r1, r2, #4");
  141. REQUIRE(DisassembleArm(0xE0321243) == "eors r1, r2, r3, asr #4");
  142. REQUIRE(DisassembleArm(0xE0321203) == "eors r1, r2, r3, lsl #4");
  143. REQUIRE(DisassembleArm(0xE0321223) == "eors r1, r2, r3, lsr #4");
  144. REQUIRE(DisassembleArm(0xE0321263) == "eors r1, r2, r3, ror #4");
  145. REQUIRE(DisassembleArm(0xE0321003) == "eors r1, r2, r3");
  146. REQUIRE(DisassembleArm(0xE0321453) == "eors r1, r2, r3, asr r4");
  147. REQUIRE(DisassembleArm(0xE0321413) == "eors r1, r2, r3, lsl r4");
  148. REQUIRE(DisassembleArm(0xE0321433) == "eors r1, r2, r3, lsr r4");
  149. REQUIRE(DisassembleArm(0xE0321473) == "eors r1, r2, r3, ror r4");
  150. REQUIRE(DisassembleArm(0xE0321063) == "eors r1, r2, r3, rrx");
  151. REQUIRE(DisassembleArm(0xE3A010FF) == "mov r1, #255");
  152. REQUIRE(DisassembleArm(0xE1A01142) == "mov r1, r2, asr #2");
  153. REQUIRE(DisassembleArm(0xE1A01102) == "mov r1, r2, lsl #2");
  154. REQUIRE(DisassembleArm(0xE1A01122) == "mov r1, r2, lsr #2");
  155. REQUIRE(DisassembleArm(0xE1A01162) == "mov r1, r2, ror #2");
  156. REQUIRE(DisassembleArm(0xE1A01062) == "mov r1, r2, rrx");
  157. REQUIRE(DisassembleArm(0xE1A0E00F) == "mov lr, pc");
  158. REQUIRE(DisassembleArm(0xE3B010FF) == "movs r1, #255");
  159. REQUIRE(DisassembleArm(0xE1B0E00F) == "movs lr, pc");
  160. REQUIRE(DisassembleArm(0xE1B01142) == "movs r1, r2, asr #2");
  161. REQUIRE(DisassembleArm(0xE1B01102) == "movs r1, r2, lsl #2");
  162. REQUIRE(DisassembleArm(0xE1B01122) == "movs r1, r2, lsr #2");
  163. REQUIRE(DisassembleArm(0xE1B01162) == "movs r1, r2, ror #2");
  164. REQUIRE(DisassembleArm(0xE3E01004) == "mvn r1, #4");
  165. REQUIRE(DisassembleArm(0xE1E01142) == "mvn r1, r2, asr #2");
  166. REQUIRE(DisassembleArm(0xE1E01102) == "mvn r1, r2, lsl #2");
  167. REQUIRE(DisassembleArm(0xE1E01122) == "mvn r1, r2, lsr #2");
  168. REQUIRE(DisassembleArm(0xE1E01162) == "mvn r1, r2, ror #2");
  169. REQUIRE(DisassembleArm(0xE1E01062) == "mvn r1, r2, rrx");
  170. REQUIRE(DisassembleArm(0xE1E01002) == "mvn r1, r2");
  171. REQUIRE(DisassembleArm(0xE1E01352) == "mvn r1, r2, asr r3");
  172. REQUIRE(DisassembleArm(0xE1E01312) == "mvn r1, r2, lsl r3");
  173. REQUIRE(DisassembleArm(0xE1E01332) == "mvn r1, r2, lsr r3");
  174. REQUIRE(DisassembleArm(0xE1E01372) == "mvn r1, r2, ror r3");
  175. REQUIRE(DisassembleArm(0xE3F01004) == "mvns r1, #4");
  176. REQUIRE(DisassembleArm(0xE1F01142) == "mvns r1, r2, asr #2");
  177. REQUIRE(DisassembleArm(0xE1F01102) == "mvns r1, r2, lsl #2");
  178. REQUIRE(DisassembleArm(0xE1F01122) == "mvns r1, r2, lsr #2");
  179. REQUIRE(DisassembleArm(0xE1F01162) == "mvns r1, r2, ror #2");
  180. REQUIRE(DisassembleArm(0xE1F01062) == "mvns r1, r2, rrx");
  181. REQUIRE(DisassembleArm(0xE1F01002) == "mvns r1, r2");
  182. REQUIRE(DisassembleArm(0xE1F01352) == "mvns r1, r2, asr r3");
  183. REQUIRE(DisassembleArm(0xE1F01312) == "mvns r1, r2, lsl r3");
  184. REQUIRE(DisassembleArm(0xE1F01332) == "mvns r1, r2, lsr r3");
  185. REQUIRE(DisassembleArm(0xE1F01372) == "mvns r1, r2, ror r3");
  186. REQUIRE(DisassembleArm(0xE3821004) == "orr r1, r2, #4");
  187. REQUIRE(DisassembleArm(0xE1821143) == "orr r1, r2, r3, asr #2");
  188. REQUIRE(DisassembleArm(0xE1821103) == "orr r1, r2, r3, lsl #2");
  189. REQUIRE(DisassembleArm(0xE1821123) == "orr r1, r2, r3, lsr #2");
  190. REQUIRE(DisassembleArm(0xE1821163) == "orr r1, r2, r3, ror #2");
  191. REQUIRE(DisassembleArm(0xE1821063) == "orr r1, r2, r3, rrx");
  192. REQUIRE(DisassembleArm(0xE1821003) == "orr r1, r2, r3");
  193. REQUIRE(DisassembleArm(0xE1821453) == "orr r1, r2, r3, asr r4");
  194. REQUIRE(DisassembleArm(0xE1821413) == "orr r1, r2, r3, lsl r4");
  195. REQUIRE(DisassembleArm(0xE1821433) == "orr r1, r2, r3, lsr r4");
  196. REQUIRE(DisassembleArm(0xE1821473) == "orr r1, r2, r3, ror r4");
  197. REQUIRE(DisassembleArm(0xE3921004) == "orrs r1, r2, #4");
  198. REQUIRE(DisassembleArm(0xE1921143) == "orrs r1, r2, r3, asr #2");
  199. REQUIRE(DisassembleArm(0xE1921103) == "orrs r1, r2, r3, lsl #2");
  200. REQUIRE(DisassembleArm(0xE1921123) == "orrs r1, r2, r3, lsr #2");
  201. REQUIRE(DisassembleArm(0xE1921163) == "orrs r1, r2, r3, ror #2");
  202. REQUIRE(DisassembleArm(0xE1921063) == "orrs r1, r2, r3, rrx");
  203. REQUIRE(DisassembleArm(0xE1921003) == "orrs r1, r2, r3");
  204. REQUIRE(DisassembleArm(0xE1921453) == "orrs r1, r2, r3, asr r4");
  205. REQUIRE(DisassembleArm(0xE1921413) == "orrs r1, r2, r3, lsl r4");
  206. REQUIRE(DisassembleArm(0xE1921433) == "orrs r1, r2, r3, lsr r4");
  207. REQUIRE(DisassembleArm(0xE1921473) == "orrs r1, r2, r3, ror r4");
  208. REQUIRE(DisassembleArm(0xE2621004) == "rsb r1, r2, #4");
  209. REQUIRE(DisassembleArm(0xE0621143) == "rsb r1, r2, r3, asr #2");
  210. REQUIRE(DisassembleArm(0xE0621103) == "rsb r1, r2, r3, lsl #2");
  211. REQUIRE(DisassembleArm(0xE0621123) == "rsb r1, r2, r3, lsr #2");
  212. REQUIRE(DisassembleArm(0xE0621163) == "rsb r1, r2, r3, ror #2");
  213. REQUIRE(DisassembleArm(0xE0621063) == "rsb r1, r2, r3, rrx");
  214. REQUIRE(DisassembleArm(0xE0621003) == "rsb r1, r2, r3");
  215. REQUIRE(DisassembleArm(0xE0621453) == "rsb r1, r2, r3, asr r4");
  216. REQUIRE(DisassembleArm(0xE0621413) == "rsb r1, r2, r3, lsl r4");
  217. REQUIRE(DisassembleArm(0xE0621433) == "rsb r1, r2, r3, lsr r4");
  218. REQUIRE(DisassembleArm(0xE0621473) == "rsb r1, r2, r3, ror r4");
  219. REQUIRE(DisassembleArm(0xE2721004) == "rsbs r1, r2, #4");
  220. REQUIRE(DisassembleArm(0xE0721143) == "rsbs r1, r2, r3, asr #2");
  221. REQUIRE(DisassembleArm(0xE0721103) == "rsbs r1, r2, r3, lsl #2");
  222. REQUIRE(DisassembleArm(0xE0721123) == "rsbs r1, r2, r3, lsr #2");
  223. REQUIRE(DisassembleArm(0xE0721163) == "rsbs r1, r2, r3, ror #2");
  224. REQUIRE(DisassembleArm(0xE0721063) == "rsbs r1, r2, r3, rrx");
  225. REQUIRE(DisassembleArm(0xE0721003) == "rsbs r1, r2, r3");
  226. REQUIRE(DisassembleArm(0xE0721453) == "rsbs r1, r2, r3, asr r4");
  227. REQUIRE(DisassembleArm(0xE0721413) == "rsbs r1, r2, r3, lsl r4");
  228. REQUIRE(DisassembleArm(0xE0721433) == "rsbs r1, r2, r3, lsr r4");
  229. REQUIRE(DisassembleArm(0xE0721473) == "rsbs r1, r2, r3, ror r4");
  230. REQUIRE(DisassembleArm(0xE2E21004) == "rsc r1, r2, #4");
  231. REQUIRE(DisassembleArm(0xE0E21143) == "rsc r1, r2, r3, asr #2");
  232. REQUIRE(DisassembleArm(0xE0E21103) == "rsc r1, r2, r3, lsl #2");
  233. REQUIRE(DisassembleArm(0xE0E21123) == "rsc r1, r2, r3, lsr #2");
  234. REQUIRE(DisassembleArm(0xE0E21163) == "rsc r1, r2, r3, ror #2");
  235. REQUIRE(DisassembleArm(0xE0E21063) == "rsc r1, r2, r3, rrx");
  236. REQUIRE(DisassembleArm(0xE0E21003) == "rsc r1, r2, r3");
  237. REQUIRE(DisassembleArm(0xE0E21453) == "rsc r1, r2, r3, asr r4");
  238. REQUIRE(DisassembleArm(0xE0E21413) == "rsc r1, r2, r3, lsl r4");
  239. REQUIRE(DisassembleArm(0xE0E21433) == "rsc r1, r2, r3, lsr r4");
  240. REQUIRE(DisassembleArm(0xE0E21473) == "rsc r1, r2, r3, ror r4");
  241. REQUIRE(DisassembleArm(0xE2F21004) == "rscs r1, r2, #4");
  242. REQUIRE(DisassembleArm(0xE0F21143) == "rscs r1, r2, r3, asr #2");
  243. REQUIRE(DisassembleArm(0xE0F21103) == "rscs r1, r2, r3, lsl #2");
  244. REQUIRE(DisassembleArm(0xE0F21123) == "rscs r1, r2, r3, lsr #2");
  245. REQUIRE(DisassembleArm(0xE0F21163) == "rscs r1, r2, r3, ror #2");
  246. REQUIRE(DisassembleArm(0xE0F21063) == "rscs r1, r2, r3, rrx");
  247. REQUIRE(DisassembleArm(0xE0F21003) == "rscs r1, r2, r3");
  248. REQUIRE(DisassembleArm(0xE0F21453) == "rscs r1, r2, r3, asr r4");
  249. REQUIRE(DisassembleArm(0xE0F21413) == "rscs r1, r2, r3, lsl r4");
  250. REQUIRE(DisassembleArm(0xE0F21433) == "rscs r1, r2, r3, lsr r4");
  251. REQUIRE(DisassembleArm(0xE0F21473) == "rscs r1, r2, r3, ror r4");
  252. REQUIRE(DisassembleArm(0xE2C21004) == "sbc r1, r2, #4");
  253. REQUIRE(DisassembleArm(0xE0C21143) == "sbc r1, r2, r3, asr #2");
  254. REQUIRE(DisassembleArm(0xE0C21103) == "sbc r1, r2, r3, lsl #2");
  255. REQUIRE(DisassembleArm(0xE0C21123) == "sbc r1, r2, r3, lsr #2");
  256. REQUIRE(DisassembleArm(0xE0C21163) == "sbc r1, r2, r3, ror #2");
  257. REQUIRE(DisassembleArm(0xE0C21063) == "sbc r1, r2, r3, rrx");
  258. REQUIRE(DisassembleArm(0xE0C21003) == "sbc r1, r2, r3");
  259. REQUIRE(DisassembleArm(0xE0C21453) == "sbc r1, r2, r3, asr r4");
  260. REQUIRE(DisassembleArm(0xE0C21413) == "sbc r1, r2, r3, lsl r4");
  261. REQUIRE(DisassembleArm(0xE0C21433) == "sbc r1, r2, r3, lsr r4");
  262. REQUIRE(DisassembleArm(0xE0C21473) == "sbc r1, r2, r3, ror r4");
  263. REQUIRE(DisassembleArm(0xE2D21004) == "sbcs r1, r2, #4");
  264. REQUIRE(DisassembleArm(0xE0D21143) == "sbcs r1, r2, r3, asr #2");
  265. REQUIRE(DisassembleArm(0xE0D21103) == "sbcs r1, r2, r3, lsl #2");
  266. REQUIRE(DisassembleArm(0xE0D21123) == "sbcs r1, r2, r3, lsr #2");
  267. REQUIRE(DisassembleArm(0xE0D21163) == "sbcs r1, r2, r3, ror #2");
  268. REQUIRE(DisassembleArm(0xE0D21063) == "sbcs r1, r2, r3, rrx");
  269. REQUIRE(DisassembleArm(0xE0D21003) == "sbcs r1, r2, r3");
  270. REQUIRE(DisassembleArm(0xE0D21453) == "sbcs r1, r2, r3, asr r4");
  271. REQUIRE(DisassembleArm(0xE0D21413) == "sbcs r1, r2, r3, lsl r4");
  272. REQUIRE(DisassembleArm(0xE0D21433) == "sbcs r1, r2, r3, lsr r4");
  273. REQUIRE(DisassembleArm(0xE0D21473) == "sbcs r1, r2, r3, ror r4");
  274. REQUIRE(DisassembleArm(0xE3310004) == "teq r1, #4");
  275. REQUIRE(DisassembleArm(0xE1310142) == "teq r1, r2, asr #2");
  276. REQUIRE(DisassembleArm(0xE1310102) == "teq r1, r2, lsl #2");
  277. REQUIRE(DisassembleArm(0xE1310122) == "teq r1, r2, lsr #2");
  278. REQUIRE(DisassembleArm(0xE1310162) == "teq r1, r2, ror #2");
  279. REQUIRE(DisassembleArm(0xE1310002) == "teq r1, r2");
  280. REQUIRE(DisassembleArm(0xE1310062) == "teq r1, r2, rrx");
  281. REQUIRE(DisassembleArm(0xE1310352) == "teq r1, r2, asr r3");
  282. REQUIRE(DisassembleArm(0xE1310312) == "teq r1, r2, lsl r3");
  283. REQUIRE(DisassembleArm(0xE1310332) == "teq r1, r2, lsr r3");
  284. REQUIRE(DisassembleArm(0xE1310372) == "teq r1, r2, ror r3");
  285. REQUIRE(DisassembleArm(0xE3110004) == "tst r1, #4");
  286. REQUIRE(DisassembleArm(0xE1110142) == "tst r1, r2, asr #2");
  287. REQUIRE(DisassembleArm(0xE1110102) == "tst r1, r2, lsl #2");
  288. REQUIRE(DisassembleArm(0xE1110122) == "tst r1, r2, lsr #2");
  289. REQUIRE(DisassembleArm(0xE1110162) == "tst r1, r2, ror #2");
  290. REQUIRE(DisassembleArm(0xE1110002) == "tst r1, r2");
  291. REQUIRE(DisassembleArm(0xE1110062) == "tst r1, r2, rrx");
  292. REQUIRE(DisassembleArm(0xE1110352) == "tst r1, r2, asr r3");
  293. REQUIRE(DisassembleArm(0xE1110312) == "tst r1, r2, lsl r3");
  294. REQUIRE(DisassembleArm(0xE1110332) == "tst r1, r2, lsr r3");
  295. REQUIRE(DisassembleArm(0xE1110372) == "tst r1, r2, ror r3");
  296. }
  297. TEST_CASE("Disassemble half-word multiply and multiply accumulate instructions", "[arm][disassembler]") {
  298. REQUIRE(DisassembleArm(0xE1003281) == "smlabb r0, r1, r2, r3");
  299. REQUIRE(DisassembleArm(0xE10032C1) == "smlabt r0, r1, r2, r3");
  300. REQUIRE(DisassembleArm(0xE10032A1) == "smlatb r0, r1, r2, r3");
  301. REQUIRE(DisassembleArm(0xE10032E1) == "smlatt r0, r1, r2, r3");
  302. REQUIRE(DisassembleArm(0xE1203281) == "smlawb r0, r1, r2, r3");
  303. REQUIRE(DisassembleArm(0xE12032C1) == "smlawt r0, r1, r2, r3");
  304. REQUIRE(DisassembleArm(0xE12002A1) == "smulwb r0, r1, r2");
  305. REQUIRE(DisassembleArm(0xE12002E1) == "smulwt r0, r1, r2");
  306. REQUIRE(DisassembleArm(0xE1410382) == "smlalbb r0, r1, r2, r3");
  307. REQUIRE(DisassembleArm(0xE14103C2) == "smlalbt r0, r1, r2, r3");
  308. REQUIRE(DisassembleArm(0xE14103A2) == "smlaltb r0, r1, r2, r3");
  309. REQUIRE(DisassembleArm(0xE14103E2) == "smlaltt r0, r1, r2, r3");
  310. REQUIRE(DisassembleArm(0xE1600281) == "smulbb r0, r1, r2");
  311. REQUIRE(DisassembleArm(0xE16002C1) == "smulbt r0, r1, r2");
  312. REQUIRE(DisassembleArm(0xE16002A1) == "smultb r0, r1, r2");
  313. REQUIRE(DisassembleArm(0xE16002E1) == "smultt r0, r1, r2");
  314. }
  315. TEST_CASE("Disassemble multiply and multiply accumulate instructions", "[arm][disassembler]") {
  316. REQUIRE(DisassembleArm(0xE0214392) == "mla r1, r2, r3, r4");
  317. REQUIRE(DisassembleArm(0xE0314392) == "mlas r1, r2, r3, r4");
  318. REQUIRE(DisassembleArm(0xE0010392) == "mul r1, r2, r3");
  319. REQUIRE(DisassembleArm(0xE0110392) == "muls r1, r2, r3");
  320. // TODO: MLS should be here whenever it's supported.
  321. REQUIRE(DisassembleArm(0xE0E21493) == "smlal r1, r2, r3, r4");
  322. REQUIRE(DisassembleArm(0xE0F21493) == "smlals r1, r2, r3, r4");
  323. REQUIRE(DisassembleArm(0xE0C21493) == "smull r1, r2, r3, r4");
  324. REQUIRE(DisassembleArm(0xE0D21493) == "smulls r1, r2, r3, r4");
  325. REQUIRE(DisassembleArm(0xE0421493) == "umaal r1, r2, r3, r4");
  326. REQUIRE(DisassembleArm(0xE0A21493) == "umlal r1, r2, r3, r4");
  327. REQUIRE(DisassembleArm(0xE0B21493) == "umlals r1, r2, r3, r4");
  328. REQUIRE(DisassembleArm(0xE0821493) == "umull r1, r2, r3, r4");
  329. REQUIRE(DisassembleArm(0xE0921493) == "umulls r1, r2, r3, r4");
  330. }
  331. TEST_CASE("Disassemble synchronization primitive instructions", "[arm][disassembler]") {
  332. REQUIRE(DisassembleArm(0xE1921F9F) == "ldrex r1, [r2]");
  333. REQUIRE(DisassembleArm(0xE1D21F9F) == "ldrexb r1, [r2]");
  334. REQUIRE(DisassembleArm(0xE1B31F9F) == "ldrexd r1, r2, [r3]");
  335. REQUIRE(DisassembleArm(0xE1F21F9F) == "ldrexh r1, [r2]");
  336. REQUIRE(DisassembleArm(0xE1831F92) == "strex r1, r2, [r3]");
  337. REQUIRE(DisassembleArm(0xE1C31F92) == "strexb r1, r2, [r3]");
  338. REQUIRE(DisassembleArm(0xE1A41F92) == "strexd r1, r2, r3, [r4]");
  339. REQUIRE(DisassembleArm(0xE1E31F92) == "strexh r1, r2, [r3]");
  340. REQUIRE(DisassembleArm(0xE1031092) == "swp r1, r2, [r3]");
  341. REQUIRE(DisassembleArm(0xE1431092) == "swpb r1, r2, [r3]");
  342. }
  343. TEST_CASE("Disassemble load / store multiple instructions", "[arm][disassembler]") {
  344. REQUIRE(DisassembleArm(0xE92D500F) == "stmdb sp!, {r0, r1, r2, r3, r12, lr}");
  345. }