hexcore-capstone 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +191 -0
  3. package/binding.gyp +168 -0
  4. package/deps/capstone/LEB128.h +38 -0
  5. package/deps/capstone/MCDisassembler.h +14 -0
  6. package/deps/capstone/MCFixedLenDisassembler.h +32 -0
  7. package/deps/capstone/MCInst.c +270 -0
  8. package/deps/capstone/MCInst.h +165 -0
  9. package/deps/capstone/MCInstrDesc.c +41 -0
  10. package/deps/capstone/MCInstrDesc.h +167 -0
  11. package/deps/capstone/MCRegisterInfo.c +151 -0
  12. package/deps/capstone/MCRegisterInfo.h +116 -0
  13. package/deps/capstone/Mapping.c +254 -0
  14. package/deps/capstone/Mapping.h +174 -0
  15. package/deps/capstone/MathExtras.h +442 -0
  16. package/deps/capstone/SStream.c +181 -0
  17. package/deps/capstone/SStream.h +40 -0
  18. package/deps/capstone/arch/AArch64/AArch64AddressingModes.h +945 -0
  19. package/deps/capstone/arch/AArch64/AArch64BaseInfo.c +77 -0
  20. package/deps/capstone/arch/AArch64/AArch64BaseInfo.h +585 -0
  21. package/deps/capstone/arch/AArch64/AArch64Disassembler.c +2280 -0
  22. package/deps/capstone/arch/AArch64/AArch64Disassembler.h +18 -0
  23. package/deps/capstone/arch/AArch64/AArch64GenAsmWriter.inc +26589 -0
  24. package/deps/capstone/arch/AArch64/AArch64GenDisassemblerTables.inc +27322 -0
  25. package/deps/capstone/arch/AArch64/AArch64GenInstrInfo.inc +13194 -0
  26. package/deps/capstone/arch/AArch64/AArch64GenRegisterInfo.inc +3814 -0
  27. package/deps/capstone/arch/AArch64/AArch64GenRegisterName.inc +714 -0
  28. package/deps/capstone/arch/AArch64/AArch64GenRegisterV.inc +673 -0
  29. package/deps/capstone/arch/AArch64/AArch64GenSubtargetInfo.inc +229 -0
  30. package/deps/capstone/arch/AArch64/AArch64GenSystemOperands.inc +2863 -0
  31. package/deps/capstone/arch/AArch64/AArch64GenSystemOperands_enum.inc +21 -0
  32. package/deps/capstone/arch/AArch64/AArch64InstPrinter.c +3029 -0
  33. package/deps/capstone/arch/AArch64/AArch64InstPrinter.h +28 -0
  34. package/deps/capstone/arch/AArch64/AArch64Mapping.c +883 -0
  35. package/deps/capstone/arch/AArch64/AArch64Mapping.h +43 -0
  36. package/deps/capstone/arch/AArch64/AArch64MappingInsn.inc +37790 -0
  37. package/deps/capstone/arch/AArch64/AArch64MappingInsnName.inc +1282 -0
  38. package/deps/capstone/arch/AArch64/AArch64MappingInsnOp.inc +26994 -0
  39. package/deps/capstone/arch/AArch64/AArch64Module.c +44 -0
  40. package/deps/capstone/arch/AArch64/AArch64Module.h +12 -0
  41. package/deps/capstone/arch/ARM/ARMAddressingModes.h +698 -0
  42. package/deps/capstone/arch/ARM/ARMBaseInfo.h +486 -0
  43. package/deps/capstone/arch/ARM/ARMDisassembler.c +5763 -0
  44. package/deps/capstone/arch/ARM/ARMDisassembler.h +18 -0
  45. package/deps/capstone/arch/ARM/ARMGenAsmWriter.inc +9545 -0
  46. package/deps/capstone/arch/ARM/ARMGenDisassemblerTables.inc +15185 -0
  47. package/deps/capstone/arch/ARM/ARMGenInstrInfo.inc +6632 -0
  48. package/deps/capstone/arch/ARM/ARMGenRegisterInfo.inc +2102 -0
  49. package/deps/capstone/arch/ARM/ARMGenRegisterName.inc +231 -0
  50. package/deps/capstone/arch/ARM/ARMGenRegisterName_digit.inc +231 -0
  51. package/deps/capstone/arch/ARM/ARMGenSubtargetInfo.inc +162 -0
  52. package/deps/capstone/arch/ARM/ARMGenSystemRegister.inc +270 -0
  53. package/deps/capstone/arch/ARM/ARMInstPrinter.c +3364 -0
  54. package/deps/capstone/arch/ARM/ARMInstPrinter.h +43 -0
  55. package/deps/capstone/arch/ARM/ARMMapping.c +551 -0
  56. package/deps/capstone/arch/ARM/ARMMapping.h +40 -0
  57. package/deps/capstone/arch/ARM/ARMMappingInsn.inc +18772 -0
  58. package/deps/capstone/arch/ARM/ARMMappingInsnName.inc +475 -0
  59. package/deps/capstone/arch/ARM/ARMMappingInsnOp.inc +10729 -0
  60. package/deps/capstone/arch/ARM/ARMModule.c +63 -0
  61. package/deps/capstone/arch/ARM/ARMModule.h +12 -0
  62. package/deps/capstone/arch/BPF/BPFConstants.h +88 -0
  63. package/deps/capstone/arch/BPF/BPFDisassembler.c +464 -0
  64. package/deps/capstone/arch/BPF/BPFDisassembler.h +27 -0
  65. package/deps/capstone/arch/BPF/BPFInstPrinter.c +285 -0
  66. package/deps/capstone/arch/BPF/BPFInstPrinter.h +16 -0
  67. package/deps/capstone/arch/BPF/BPFMapping.c +513 -0
  68. package/deps/capstone/arch/BPF/BPFMapping.h +21 -0
  69. package/deps/capstone/arch/BPF/BPFModule.c +34 -0
  70. package/deps/capstone/arch/BPF/BPFModule.h +12 -0
  71. package/deps/capstone/arch/EVM/EVMDisassembler.c +379 -0
  72. package/deps/capstone/arch/EVM/EVMDisassembler.h +12 -0
  73. package/deps/capstone/arch/EVM/EVMInstPrinter.c +20 -0
  74. package/deps/capstone/arch/EVM/EVMInstPrinter.h +17 -0
  75. package/deps/capstone/arch/EVM/EVMMapping.c +344 -0
  76. package/deps/capstone/arch/EVM/EVMMapping.h +8 -0
  77. package/deps/capstone/arch/EVM/EVMMappingInsn.inc +259 -0
  78. package/deps/capstone/arch/EVM/EVMModule.c +33 -0
  79. package/deps/capstone/arch/EVM/EVMModule.h +12 -0
  80. package/deps/capstone/arch/M680X/M680XDisassembler.c +2307 -0
  81. package/deps/capstone/arch/M680X/M680XDisassembler.h +17 -0
  82. package/deps/capstone/arch/M680X/M680XDisassemblerInternals.h +57 -0
  83. package/deps/capstone/arch/M680X/M680XInstPrinter.c +360 -0
  84. package/deps/capstone/arch/M680X/M680XInstPrinter.h +25 -0
  85. package/deps/capstone/arch/M680X/M680XModule.c +77 -0
  86. package/deps/capstone/arch/M680X/M680XModule.h +12 -0
  87. package/deps/capstone/arch/M680X/cpu12.inc +335 -0
  88. package/deps/capstone/arch/M680X/hcs08.inc +60 -0
  89. package/deps/capstone/arch/M680X/hd6301.inc +15 -0
  90. package/deps/capstone/arch/M680X/hd6309.inc +259 -0
  91. package/deps/capstone/arch/M680X/insn_props.inc +367 -0
  92. package/deps/capstone/arch/M680X/m6800.inc +277 -0
  93. package/deps/capstone/arch/M680X/m6801.inc +39 -0
  94. package/deps/capstone/arch/M680X/m6805.inc +277 -0
  95. package/deps/capstone/arch/M680X/m6808.inc +91 -0
  96. package/deps/capstone/arch/M680X/m6809.inc +352 -0
  97. package/deps/capstone/arch/M680X/m6811.inc +105 -0
  98. package/deps/capstone/arch/M68K/M68KDisassembler.c +3668 -0
  99. package/deps/capstone/arch/M68K/M68KDisassembler.h +30 -0
  100. package/deps/capstone/arch/M68K/M68KInstPrinter.c +387 -0
  101. package/deps/capstone/arch/M68K/M68KInstPrinter.h +21 -0
  102. package/deps/capstone/arch/M68K/M68KInstructionTable.inc +65540 -0
  103. package/deps/capstone/arch/M68K/M68KModule.c +42 -0
  104. package/deps/capstone/arch/M68K/M68KModule.h +12 -0
  105. package/deps/capstone/arch/MOS65XX/MOS65XXDisassembler.c +544 -0
  106. package/deps/capstone/arch/MOS65XX/MOS65XXDisassembler.h +22 -0
  107. package/deps/capstone/arch/MOS65XX/MOS65XXDisassemblerInternals.h +23 -0
  108. package/deps/capstone/arch/MOS65XX/MOS65XXModule.c +79 -0
  109. package/deps/capstone/arch/MOS65XX/MOS65XXModule.h +12 -0
  110. package/deps/capstone/arch/MOS65XX/instruction_info.inc +106 -0
  111. package/deps/capstone/arch/MOS65XX/m6502.inc +256 -0
  112. package/deps/capstone/arch/MOS65XX/m65816.inc +256 -0
  113. package/deps/capstone/arch/MOS65XX/m65c02.inc +256 -0
  114. package/deps/capstone/arch/MOS65XX/mw65c02.inc +256 -0
  115. package/deps/capstone/arch/Mips/MipsDisassembler.c +1794 -0
  116. package/deps/capstone/arch/Mips/MipsDisassembler.h +16 -0
  117. package/deps/capstone/arch/Mips/MipsGenAsmWriter.inc +5725 -0
  118. package/deps/capstone/arch/Mips/MipsGenDisassemblerTables.inc +6942 -0
  119. package/deps/capstone/arch/Mips/MipsGenInstrInfo.inc +1805 -0
  120. package/deps/capstone/arch/Mips/MipsGenRegisterInfo.inc +1679 -0
  121. package/deps/capstone/arch/Mips/MipsGenSubtargetInfo.inc +52 -0
  122. package/deps/capstone/arch/Mips/MipsInstPrinter.c +424 -0
  123. package/deps/capstone/arch/Mips/MipsInstPrinter.h +25 -0
  124. package/deps/capstone/arch/Mips/MipsMapping.c +1070 -0
  125. package/deps/capstone/arch/Mips/MipsMapping.h +25 -0
  126. package/deps/capstone/arch/Mips/MipsMappingInsn.inc +9315 -0
  127. package/deps/capstone/arch/Mips/MipsModule.c +52 -0
  128. package/deps/capstone/arch/Mips/MipsModule.h +12 -0
  129. package/deps/capstone/arch/PowerPC/PPCDisassembler.c +627 -0
  130. package/deps/capstone/arch/PowerPC/PPCDisassembler.h +17 -0
  131. package/deps/capstone/arch/PowerPC/PPCGenAsmWriter.inc +11451 -0
  132. package/deps/capstone/arch/PowerPC/PPCGenDisassemblerTables.inc +6886 -0
  133. package/deps/capstone/arch/PowerPC/PPCGenInstrInfo.inc +4772 -0
  134. package/deps/capstone/arch/PowerPC/PPCGenRegisterInfo.inc +1122 -0
  135. package/deps/capstone/arch/PowerPC/PPCGenRegisterName.inc +278 -0
  136. package/deps/capstone/arch/PowerPC/PPCGenSubtargetInfo.inc +90 -0
  137. package/deps/capstone/arch/PowerPC/PPCInstPrinter.c +1238 -0
  138. package/deps/capstone/arch/PowerPC/PPCInstPrinter.h +15 -0
  139. package/deps/capstone/arch/PowerPC/PPCMapping.c +570 -0
  140. package/deps/capstone/arch/PowerPC/PPCMapping.h +40 -0
  141. package/deps/capstone/arch/PowerPC/PPCMappingInsn.inc +13220 -0
  142. package/deps/capstone/arch/PowerPC/PPCMappingInsnName.inc +1731 -0
  143. package/deps/capstone/arch/PowerPC/PPCModule.c +45 -0
  144. package/deps/capstone/arch/PowerPC/PPCModule.h +12 -0
  145. package/deps/capstone/arch/PowerPC/PPCPredicates.h +62 -0
  146. package/deps/capstone/arch/RISCV/RISCVBaseInfo.h +106 -0
  147. package/deps/capstone/arch/RISCV/RISCVDisassembler.c +433 -0
  148. package/deps/capstone/arch/RISCV/RISCVDisassembler.h +18 -0
  149. package/deps/capstone/arch/RISCV/RISCVGenAsmWriter.inc +2651 -0
  150. package/deps/capstone/arch/RISCV/RISCVGenDisassemblerTables.inc +1776 -0
  151. package/deps/capstone/arch/RISCV/RISCVGenInsnNameMaps.inc +275 -0
  152. package/deps/capstone/arch/RISCV/RISCVGenInstrInfo.inc +470 -0
  153. package/deps/capstone/arch/RISCV/RISCVGenRegisterInfo.inc +426 -0
  154. package/deps/capstone/arch/RISCV/RISCVGenSubtargetInfo.inc +33 -0
  155. package/deps/capstone/arch/RISCV/RISCVInstPrinter.c +447 -0
  156. package/deps/capstone/arch/RISCV/RISCVInstPrinter.h +24 -0
  157. package/deps/capstone/arch/RISCV/RISCVMapping.c +366 -0
  158. package/deps/capstone/arch/RISCV/RISCVMapping.h +22 -0
  159. package/deps/capstone/arch/RISCV/RISCVMappingInsn.inc +1635 -0
  160. package/deps/capstone/arch/RISCV/RISCVModule.c +42 -0
  161. package/deps/capstone/arch/RISCV/RISCVModule.h +12 -0
  162. package/deps/capstone/arch/SH/SHDisassembler.c +2221 -0
  163. package/deps/capstone/arch/SH/SHDisassembler.h +19 -0
  164. package/deps/capstone/arch/SH/SHInsnTable.inc +66 -0
  165. package/deps/capstone/arch/SH/SHInstPrinter.c +438 -0
  166. package/deps/capstone/arch/SH/SHInstPrinter.h +23 -0
  167. package/deps/capstone/arch/SH/SHModule.c +39 -0
  168. package/deps/capstone/arch/SH/SHModule.h +12 -0
  169. package/deps/capstone/arch/SH/mktable.rb +390 -0
  170. package/deps/capstone/arch/Sparc/Sparc.h +63 -0
  171. package/deps/capstone/arch/Sparc/SparcDisassembler.c +500 -0
  172. package/deps/capstone/arch/Sparc/SparcDisassembler.h +17 -0
  173. package/deps/capstone/arch/Sparc/SparcGenAsmWriter.inc +5709 -0
  174. package/deps/capstone/arch/Sparc/SparcGenDisassemblerTables.inc +2028 -0
  175. package/deps/capstone/arch/Sparc/SparcGenInstrInfo.inc +514 -0
  176. package/deps/capstone/arch/Sparc/SparcGenRegisterInfo.inc +451 -0
  177. package/deps/capstone/arch/Sparc/SparcGenSubtargetInfo.inc +27 -0
  178. package/deps/capstone/arch/Sparc/SparcInstPrinter.c +446 -0
  179. package/deps/capstone/arch/Sparc/SparcInstPrinter.h +17 -0
  180. package/deps/capstone/arch/Sparc/SparcMapping.c +665 -0
  181. package/deps/capstone/arch/Sparc/SparcMapping.h +34 -0
  182. package/deps/capstone/arch/Sparc/SparcMappingInsn.inc +2643 -0
  183. package/deps/capstone/arch/Sparc/SparcModule.c +45 -0
  184. package/deps/capstone/arch/Sparc/SparcModule.h +12 -0
  185. package/deps/capstone/arch/SystemZ/SystemZDisassembler.c +484 -0
  186. package/deps/capstone/arch/SystemZ/SystemZDisassembler.h +17 -0
  187. package/deps/capstone/arch/SystemZ/SystemZGenAsmWriter.inc +11575 -0
  188. package/deps/capstone/arch/SystemZ/SystemZGenDisassemblerTables.inc +10262 -0
  189. package/deps/capstone/arch/SystemZ/SystemZGenInsnNameMaps.inc +2348 -0
  190. package/deps/capstone/arch/SystemZ/SystemZGenInstrInfo.inc +2820 -0
  191. package/deps/capstone/arch/SystemZ/SystemZGenRegisterInfo.inc +741 -0
  192. package/deps/capstone/arch/SystemZ/SystemZGenSubtargetInfo.inc +49 -0
  193. package/deps/capstone/arch/SystemZ/SystemZInstPrinter.c +433 -0
  194. package/deps/capstone/arch/SystemZ/SystemZInstPrinter.h +15 -0
  195. package/deps/capstone/arch/SystemZ/SystemZMCTargetDesc.c +195 -0
  196. package/deps/capstone/arch/SystemZ/SystemZMCTargetDesc.h +51 -0
  197. package/deps/capstone/arch/SystemZ/SystemZMapping.c +479 -0
  198. package/deps/capstone/arch/SystemZ/SystemZMapping.h +23 -0
  199. package/deps/capstone/arch/SystemZ/SystemZMappingInsn.inc +14175 -0
  200. package/deps/capstone/arch/SystemZ/SystemZModule.c +44 -0
  201. package/deps/capstone/arch/SystemZ/SystemZModule.h +12 -0
  202. package/deps/capstone/arch/TMS320C64x/TMS320C64xDisassembler.c +628 -0
  203. package/deps/capstone/arch/TMS320C64x/TMS320C64xDisassembler.h +19 -0
  204. package/deps/capstone/arch/TMS320C64x/TMS320C64xGenAsmWriter.inc +684 -0
  205. package/deps/capstone/arch/TMS320C64x/TMS320C64xGenDisassemblerTables.inc +1352 -0
  206. package/deps/capstone/arch/TMS320C64x/TMS320C64xGenInstrInfo.inc +298 -0
  207. package/deps/capstone/arch/TMS320C64x/TMS320C64xGenRegisterInfo.inc +277 -0
  208. package/deps/capstone/arch/TMS320C64x/TMS320C64xInstPrinter.c +572 -0
  209. package/deps/capstone/arch/TMS320C64x/TMS320C64xInstPrinter.h +15 -0
  210. package/deps/capstone/arch/TMS320C64x/TMS320C64xMapping.c +1926 -0
  211. package/deps/capstone/arch/TMS320C64x/TMS320C64xMapping.h +26 -0
  212. package/deps/capstone/arch/TMS320C64x/TMS320C64xModule.c +39 -0
  213. package/deps/capstone/arch/TMS320C64x/TMS320C64xModule.h +12 -0
  214. package/deps/capstone/arch/TriCore/TriCore.td +134 -0
  215. package/deps/capstone/arch/TriCore/TriCoreCallingConv.td +61 -0
  216. package/deps/capstone/arch/TriCore/TriCoreDisassembler.c +1655 -0
  217. package/deps/capstone/arch/TriCore/TriCoreDisassembler.h +18 -0
  218. package/deps/capstone/arch/TriCore/TriCoreGenAsmWriter.inc +3691 -0
  219. package/deps/capstone/arch/TriCore/TriCoreGenCSFeatureName.inc +22 -0
  220. package/deps/capstone/arch/TriCore/TriCoreGenCSMappingInsn.inc +8938 -0
  221. package/deps/capstone/arch/TriCore/TriCoreGenCSMappingInsnName.inc +404 -0
  222. package/deps/capstone/arch/TriCore/TriCoreGenCSMappingInsnOp.inc +7994 -0
  223. package/deps/capstone/arch/TriCore/TriCoreGenCSOpGroup.inc +32 -0
  224. package/deps/capstone/arch/TriCore/TriCoreGenDisassemblerTables.inc +4044 -0
  225. package/deps/capstone/arch/TriCore/TriCoreGenInstrInfo.inc +2693 -0
  226. package/deps/capstone/arch/TriCore/TriCoreGenRegisterInfo.inc +295 -0
  227. package/deps/capstone/arch/TriCore/TriCoreGenSubtargetInfo.inc +40 -0
  228. package/deps/capstone/arch/TriCore/TriCoreInstPrinter.c +488 -0
  229. package/deps/capstone/arch/TriCore/TriCoreInstrFormats.td +773 -0
  230. package/deps/capstone/arch/TriCore/TriCoreInstrInfo.td +1873 -0
  231. package/deps/capstone/arch/TriCore/TriCoreLinkage.h +21 -0
  232. package/deps/capstone/arch/TriCore/TriCoreMapping.c +241 -0
  233. package/deps/capstone/arch/TriCore/TriCoreMapping.h +32 -0
  234. package/deps/capstone/arch/TriCore/TriCoreModule.c +44 -0
  235. package/deps/capstone/arch/TriCore/TriCoreModule.h +11 -0
  236. package/deps/capstone/arch/TriCore/TriCoreRegisterInfo.td +153 -0
  237. package/deps/capstone/arch/WASM/WASMDisassembler.c +1009 -0
  238. package/deps/capstone/arch/WASM/WASMDisassembler.h +12 -0
  239. package/deps/capstone/arch/WASM/WASMInstPrinter.c +47 -0
  240. package/deps/capstone/arch/WASM/WASMInstPrinter.h +18 -0
  241. package/deps/capstone/arch/WASM/WASMMapping.c +333 -0
  242. package/deps/capstone/arch/WASM/WASMMapping.h +9 -0
  243. package/deps/capstone/arch/WASM/WASMModule.c +33 -0
  244. package/deps/capstone/arch/WASM/WASMModule.h +12 -0
  245. package/deps/capstone/arch/X86/X86ATTInstPrinter.c +997 -0
  246. package/deps/capstone/arch/X86/X86BaseInfo.h +50 -0
  247. package/deps/capstone/arch/X86/X86Disassembler.c +1033 -0
  248. package/deps/capstone/arch/X86/X86Disassembler.h +28 -0
  249. package/deps/capstone/arch/X86/X86DisassemblerDecoder.c +2358 -0
  250. package/deps/capstone/arch/X86/X86DisassemblerDecoder.h +725 -0
  251. package/deps/capstone/arch/X86/X86DisassemblerDecoderCommon.h +483 -0
  252. package/deps/capstone/arch/X86/X86GenAsmWriter.inc +49199 -0
  253. package/deps/capstone/arch/X86/X86GenAsmWriter1.inc +33196 -0
  254. package/deps/capstone/arch/X86/X86GenAsmWriter1_reduce.inc +2531 -0
  255. package/deps/capstone/arch/X86/X86GenAsmWriter_reduce.inc +2855 -0
  256. package/deps/capstone/arch/X86/X86GenDisassemblerTables.inc +112961 -0
  257. package/deps/capstone/arch/X86/X86GenDisassemblerTables2.inc +102151 -0
  258. package/deps/capstone/arch/X86/X86GenDisassemblerTables_reduce.inc +28047 -0
  259. package/deps/capstone/arch/X86/X86GenDisassemblerTables_reduce2.inc +18827 -0
  260. package/deps/capstone/arch/X86/X86GenInstrInfo.inc +15158 -0
  261. package/deps/capstone/arch/X86/X86GenInstrInfo_reduce.inc +1564 -0
  262. package/deps/capstone/arch/X86/X86GenRegisterInfo.inc +1549 -0
  263. package/deps/capstone/arch/X86/X86GenRegisterName.inc +292 -0
  264. package/deps/capstone/arch/X86/X86GenRegisterName1.inc +291 -0
  265. package/deps/capstone/arch/X86/X86ImmSize.inc +335 -0
  266. package/deps/capstone/arch/X86/X86InstPrinter.h +26 -0
  267. package/deps/capstone/arch/X86/X86InstPrinterCommon.c +116 -0
  268. package/deps/capstone/arch/X86/X86InstPrinterCommon.h +16 -0
  269. package/deps/capstone/arch/X86/X86IntelInstPrinter.c +1061 -0
  270. package/deps/capstone/arch/X86/X86Lookup16.inc +16874 -0
  271. package/deps/capstone/arch/X86/X86Lookup16_reduce.inc +2308 -0
  272. package/deps/capstone/arch/X86/X86Mapping.c +2266 -0
  273. package/deps/capstone/arch/X86/X86Mapping.h +96 -0
  274. package/deps/capstone/arch/X86/X86MappingInsn.inc +105977 -0
  275. package/deps/capstone/arch/X86/X86MappingInsnName.inc +1527 -0
  276. package/deps/capstone/arch/X86/X86MappingInsnName_reduce.inc +348 -0
  277. package/deps/capstone/arch/X86/X86MappingInsnOp.inc +75700 -0
  278. package/deps/capstone/arch/X86/X86MappingInsnOp_reduce.inc +7729 -0
  279. package/deps/capstone/arch/X86/X86MappingInsn_reduce.inc +10819 -0
  280. package/deps/capstone/arch/X86/X86MappingReg.inc +280 -0
  281. package/deps/capstone/arch/X86/X86Module.c +94 -0
  282. package/deps/capstone/arch/X86/X86Module.h +12 -0
  283. package/deps/capstone/arch/XCore/XCoreDisassembler.c +794 -0
  284. package/deps/capstone/arch/XCore/XCoreDisassembler.h +17 -0
  285. package/deps/capstone/arch/XCore/XCoreGenAsmWriter.inc +772 -0
  286. package/deps/capstone/arch/XCore/XCoreGenDisassemblerTables.inc +853 -0
  287. package/deps/capstone/arch/XCore/XCoreGenInstrInfo.inc +267 -0
  288. package/deps/capstone/arch/XCore/XCoreGenRegisterInfo.inc +110 -0
  289. package/deps/capstone/arch/XCore/XCoreInstPrinter.c +250 -0
  290. package/deps/capstone/arch/XCore/XCoreInstPrinter.h +18 -0
  291. package/deps/capstone/arch/XCore/XCoreMapping.c +297 -0
  292. package/deps/capstone/arch/XCore/XCoreMapping.h +26 -0
  293. package/deps/capstone/arch/XCore/XCoreMappingInsn.inc +1287 -0
  294. package/deps/capstone/arch/XCore/XCoreModule.c +41 -0
  295. package/deps/capstone/arch/XCore/XCoreModule.h +12 -0
  296. package/deps/capstone/cs.c +1664 -0
  297. package/deps/capstone/cs_priv.h +101 -0
  298. package/deps/capstone/cs_simple_types.h +886 -0
  299. package/deps/capstone/include/capstone/arm.h +991 -0
  300. package/deps/capstone/include/capstone/arm64.h +3159 -0
  301. package/deps/capstone/include/capstone/bpf.h +209 -0
  302. package/deps/capstone/include/capstone/capstone.h +875 -0
  303. package/deps/capstone/include/capstone/evm.h +188 -0
  304. package/deps/capstone/include/capstone/m680x.h +537 -0
  305. package/deps/capstone/include/capstone/m68k.h +613 -0
  306. package/deps/capstone/include/capstone/mips.h +956 -0
  307. package/deps/capstone/include/capstone/mos65xx.h +204 -0
  308. package/deps/capstone/include/capstone/platform.h +122 -0
  309. package/deps/capstone/include/capstone/ppc.h +2108 -0
  310. package/deps/capstone/include/capstone/riscv.h +531 -0
  311. package/deps/capstone/include/capstone/sh.h +465 -0
  312. package/deps/capstone/include/capstone/sparc.h +520 -0
  313. package/deps/capstone/include/capstone/systemz.h +2601 -0
  314. package/deps/capstone/include/capstone/tms320c64x.h +359 -0
  315. package/deps/capstone/include/capstone/tricore.h +567 -0
  316. package/deps/capstone/include/capstone/wasm.h +250 -0
  317. package/deps/capstone/include/capstone/x86.h +1986 -0
  318. package/deps/capstone/include/capstone/xcore.h +235 -0
  319. package/deps/capstone/include/platform.h +110 -0
  320. package/deps/capstone/include/windowsce/intrin.h +12 -0
  321. package/deps/capstone/include/windowsce/stdint.h +133 -0
  322. package/deps/capstone/utils.c +140 -0
  323. package/deps/capstone/utils.h +54 -0
  324. package/index.d.ts +448 -0
  325. package/index.js +64 -0
  326. package/index.mjs +25 -0
  327. package/package.json +82 -0
  328. package/prebuilds/win32-x64/hexcore-capstone.node +0 -0
  329. package/src/capstone_wrapper.cpp +910 -0
  330. package/src/capstone_wrapper.h +147 -0
  331. package/src/disasm_async_worker.h +215 -0
  332. package/src/main.cpp +145 -0
@@ -0,0 +1,2280 @@
1
+ //===- AArch64Disassembler.cpp - Disassembler for AArch64 ISA -------------===//
2
+ //
3
+ // The LLVM Compiler Infrastructure
4
+ //
5
+ // This file is distributed under the University of Illinois Open Source
6
+ // License. See LICENSE.TXT for details.
7
+ //
8
+ //===----------------------------------------------------------------------===//
9
+ //
10
+ // This file contains the functions necessary to decode AArch64 instruction
11
+ // bitpatterns into MCInsts (with the help of TableGenerated information from
12
+ // the instruction definitions).
13
+ //
14
+ //===----------------------------------------------------------------------===//
15
+
16
+ /* Capstone Disassembly Engine */
17
+ /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */
18
+
19
+ #ifdef CAPSTONE_HAS_ARM64
20
+
21
+ #include <stdio.h> // DEBUG
22
+ #include <stdlib.h>
23
+
24
+ #include "../../cs_priv.h"
25
+ #include "../../utils.h"
26
+
27
+ #include "AArch64Disassembler.h"
28
+
29
+ #include "../../MCDisassembler.h"
30
+ #include "../../MCFixedLenDisassembler.h"
31
+ #include "../../MCInst.h"
32
+ #include "../../MCInstrDesc.h"
33
+ #include "../../MCRegisterInfo.h"
34
+
35
+ #include "AArch64AddressingModes.h"
36
+ #include "AArch64BaseInfo.h"
37
+
38
+ // Forward declare these because the autogenerated code will reference them.
39
+ // Definitions are further down.
40
+ static DecodeStatus DecodeFPR128RegisterClass(MCInst *Inst,
41
+ unsigned RegNo, uint64_t Address, const void *Decoder);
42
+ static DecodeStatus DecodeFPR64RegisterClass(MCInst *Inst, unsigned RegNo,
43
+ uint64_t Address, const void *Decoder);
44
+ static DecodeStatus DecodeFPR32RegisterClass(MCInst *Inst, unsigned RegNo,
45
+ uint64_t Address, const void *Decoder);
46
+ static DecodeStatus DecodeFPR16RegisterClass(MCInst *Inst, unsigned RegNo,
47
+ uint64_t Address, const void *Decoder);
48
+ static DecodeStatus DecodeFPR8RegisterClass(MCInst *Inst, unsigned RegNo,
49
+ uint64_t Address, const void *Decoder);
50
+ static DecodeStatus DecodeGPR64RegisterClass(MCInst *Inst, unsigned RegNo,
51
+ uint64_t Address, const void *Decoder);
52
+ static DecodeStatus DecodeGPR64x8ClassRegisterClass(MCInst *Inst, unsigned RegNo,
53
+ uint64_t Address, const void *Decoder);
54
+ static DecodeStatus DecodeGPR64spRegisterClass(MCInst *Inst,
55
+ unsigned RegNo, uint64_t Address, const void *Decoder);
56
+ static DecodeStatus DecodeMatrixIndexGPR32_12_15RegisterClass(MCInst *Inst,
57
+ unsigned RegNo, uint64_t Address, const void *Decoder);
58
+ static DecodeStatus DecodeGPR32RegisterClass(MCInst *Inst, unsigned RegNo,
59
+ uint64_t Address, const void *Decoder);
60
+ static DecodeStatus DecodeGPR32spRegisterClass(MCInst *Inst,
61
+ unsigned RegNo, uint64_t Address, const void *Decoder);
62
+ static DecodeStatus DecodeQQRegisterClass(MCInst *Inst, unsigned RegNo,
63
+ uint64_t Address, const void *Decoder);
64
+ static DecodeStatus DecodeQQQRegisterClass(MCInst *Inst, unsigned RegNo,
65
+ uint64_t Address, const void *Decoder);
66
+ static DecodeStatus DecodeQQQQRegisterClass(MCInst *Inst, unsigned RegNo,
67
+ uint64_t Address, const void *Decoder);
68
+ static DecodeStatus DecodeDDRegisterClass(MCInst *Inst, unsigned RegNo,
69
+ uint64_t Address, const void *Decoder);
70
+ static DecodeStatus DecodeDDDRegisterClass(MCInst *Inst, unsigned RegNo,
71
+ uint64_t Address, const void *Decoder);
72
+ static DecodeStatus DecodeDDDDRegisterClass(MCInst *Inst, unsigned RegNo,
73
+ uint64_t Address, const void *Decoder);
74
+ static DecodeStatus DecodeZPRRegisterClass(MCInst *Inst, unsigned RegNo,
75
+ uint64_t Address, const void *Decoder);
76
+ static DecodeStatus DecodeZPR_4bRegisterClass(MCInst *Inst, unsigned RegNo,
77
+ uint64_t Address, const void *Decoder);
78
+ static DecodeStatus DecodeZPR_3bRegisterClass(MCInst *Inst, unsigned RegNo,
79
+ uint64_t Address, const void *Decoder);
80
+ static DecodeStatus DecodeZPR2RegisterClass(MCInst *Inst, unsigned RegNo,
81
+ uint64_t Address, const void *Decoder);
82
+ static DecodeStatus DecodeZPR3RegisterClass(MCInst *Inst, unsigned RegNo,
83
+ uint64_t Address, const void *Decoder);
84
+ static DecodeStatus DecodeZPR4RegisterClass(MCInst *Inst, unsigned RegNo,
85
+ uint64_t Address, const void *Decoder);
86
+ static DecodeStatus DecodeMatrixTile(MCInst *Inst, unsigned RegNo,
87
+ uint64_t Address, const void *Decoder, unsigned NumBitsForTile);
88
+ static DecodeStatus DecodeMatrixTileListRegisterClass(MCInst *Inst,
89
+ unsigned RegMask, uint64_t Address, const void *Decoder);
90
+ static DecodeStatus DecodePPRRegisterClass(MCInst *Inst, unsigned RegNo,
91
+ uint64_t Address, const void *Decoder);
92
+ static DecodeStatus DecodePPR_3bRegisterClass(MCInst *Inst, unsigned RegNo,
93
+ uint64_t Address, const void *Decoder);
94
+ static DecodeStatus DecodeFixedPointScaleImm32(MCInst *Inst, unsigned Imm,
95
+ uint64_t Address, const void *Decoder);
96
+ static DecodeStatus DecodeFixedPointScaleImm64(MCInst *Inst, unsigned Imm,
97
+ uint64_t Address, const void *Decoder);
98
+ static DecodeStatus DecodePCRelLabel19(MCInst *Inst, unsigned Imm,
99
+ uint64_t Address, const void *Decoder);
100
+ static DecodeStatus DecodeMemExtend(MCInst *Inst, unsigned Imm,
101
+ uint64_t Address, const void *Decoder);
102
+ static DecodeStatus DecodeMRSSystemRegister(MCInst *Inst, unsigned Imm,
103
+ uint64_t Address, const void *Decoder);
104
+ static DecodeStatus DecodeMSRSystemRegister(MCInst *Inst, unsigned Imm,
105
+ uint64_t Address, const void *Decoder);
106
+ static DecodeStatus DecodeMoveImmInstruction(MCInst *Inst, uint32_t insn,
107
+ uint64_t Address, const void *Decoder);
108
+ static DecodeStatus DecodeUnsignedLdStInstruction(MCInst *Inst,
109
+ uint32_t insn, uint64_t Address, const void *Decoder);
110
+ static DecodeStatus DecodeSignedLdStInstruction(MCInst *Inst,
111
+ uint32_t insn, uint64_t Address, const void *Decoder);
112
+ static DecodeStatus DecodeExclusiveLdStInstruction(MCInst *Inst,
113
+ uint32_t insn, uint64_t Address, const void *Decoder);
114
+ static DecodeStatus DecodePairLdStInstruction(MCInst *Inst, uint32_t insn,
115
+ uint64_t Address, const void *Decoder);
116
+ static DecodeStatus DecodeAuthLoadInstruction(MCInst *Inst, uint32_t insn,
117
+ uint64_t Address, const void *Decoder);
118
+ static DecodeStatus DecodeAddSubERegInstruction(MCInst *Inst,
119
+ uint32_t insn, uint64_t Address, const void *Decoder);
120
+ static DecodeStatus DecodeLogicalImmInstruction(MCInst *Inst,
121
+ uint32_t insn, uint64_t Address, const void *Decoder);
122
+ static DecodeStatus DecodeModImmInstruction(MCInst *Inst, uint32_t insn,
123
+ uint64_t Address, const void *Decoder);
124
+ static DecodeStatus DecodeModImmTiedInstruction(MCInst *Inst,
125
+ uint32_t insn, uint64_t Address, const void *Decoder);
126
+ static DecodeStatus DecodeAdrInstruction(MCInst *Inst, uint32_t insn,
127
+ uint64_t Address, const void *Decoder);
128
+ static DecodeStatus DecodeAddSubImmShift(MCInst *Inst, uint32_t insn,
129
+ uint64_t Address, const void *Decoder);
130
+ static DecodeStatus DecodeUnconditionalBranch(MCInst *Inst, uint32_t insn,
131
+ uint64_t Address, const void *Decoder);
132
+ static DecodeStatus DecodeSystemPStateInstruction(MCInst *Inst,
133
+ uint32_t insn, uint64_t Address, const void *Decoder);
134
+ static DecodeStatus DecodeTestAndBranch(MCInst *Inst, uint32_t insn,
135
+ uint64_t Address, const void *Decoder);
136
+ static DecodeStatus DecodeFMOVLaneInstruction(MCInst *Inst, unsigned Insn,
137
+ uint64_t Address, const void *Decoder);
138
+ static DecodeStatus DecodeVecShiftR64Imm(MCInst *Inst, unsigned Imm,
139
+ uint64_t Addr, const void *Decoder);
140
+ static DecodeStatus DecodeVecShiftR64ImmNarrow(MCInst *Inst, unsigned Imm,
141
+ uint64_t Addr, const void *Decoder);
142
+ static DecodeStatus DecodeVecShiftR32Imm(MCInst *Inst, unsigned Imm,
143
+ uint64_t Addr, const void *Decoder);
144
+ static DecodeStatus DecodeVecShiftR32ImmNarrow(MCInst *Inst, unsigned Imm,
145
+ uint64_t Addr, const void *Decoder);
146
+ static DecodeStatus DecodeVecShiftR16Imm(MCInst *Inst, unsigned Imm,
147
+ uint64_t Addr, const void *Decoder);
148
+ static DecodeStatus DecodeVecShiftR16ImmNarrow(MCInst *Inst, unsigned Imm,
149
+ uint64_t Addr, const void *Decoder);
150
+ static DecodeStatus DecodeVecShiftR8Imm(MCInst *Inst, unsigned Imm,
151
+ uint64_t Addr, const void *Decoder);
152
+ static DecodeStatus DecodeVecShiftL64Imm(MCInst *Inst, unsigned Imm,
153
+ uint64_t Addr, const void *Decoder);
154
+ static DecodeStatus DecodeVecShiftL32Imm(MCInst *Inst, unsigned Imm,
155
+ uint64_t Addr, const void *Decoder);
156
+ static DecodeStatus DecodeVecShiftL16Imm(MCInst *Inst, unsigned Imm,
157
+ uint64_t Addr, const void *Decoder);
158
+ static DecodeStatus DecodeVecShiftL8Imm(MCInst *Inst, unsigned Imm,
159
+ uint64_t Addr, const void *Decoder);
160
+ static DecodeStatus DecodeWSeqPairsClassRegisterClass(MCInst *Inst,
161
+ unsigned RegNo, uint64_t Addr, const void *Decoder);
162
+ static DecodeStatus DecodeXSeqPairsClassRegisterClass(MCInst *Inst,
163
+ unsigned RegNo, uint64_t Addr, const void *Decoder);
164
+ static DecodeStatus DecodeSVELogicalImmInstruction(MCInst *Inst, uint32_t insn,
165
+ uint64_t Address, const void *Decoder);
166
+ static DecodeStatus DecodeSImm(MCInst *Inst, uint64_t Imm, uint64_t Address,
167
+ const void *Decoder, int Bits);
168
+ static DecodeStatus DecodeImm8OptLsl(MCInst *Inst, unsigned Imm, uint64_t Addr,
169
+ const void *Decoder, int ElementWidth);
170
+ static DecodeStatus DecodeSVEIncDecImm(MCInst *Inst, unsigned Imm,
171
+ uint64_t Addr, const void *Decoder);
172
+ static DecodeStatus DecodeThreeAddrSRegInstruction(MCInst *Inst,
173
+ uint32_t insn, uint64_t Addr, const void *Decoder);
174
+ static DecodeStatus DecodeGPR64commonRegisterClass(MCInst *Inst, unsigned RegNo,
175
+ uint64_t Addr, const void *Decoder);
176
+ static DecodeStatus DecodeFPR128_loRegisterClass(MCInst *Inst, unsigned RegNo,
177
+ uint64_t Addr, const void *Decoder);
178
+ static DecodeStatus DecodeSVCROp(MCInst *Inst, unsigned Imm, uint64_t Address,
179
+ const void *Decoder);
180
+ static DecodeStatus DecodeCPYMemOpInstruction(MCInst *Inst, uint32_t insn,
181
+ uint64_t Addr, const void *Decoder);
182
+ static DecodeStatus DecodeSETMemOpInstruction(MCInst *Inst, uint32_t insn,
183
+ uint64_t Addr, const void *Decoder);
184
+
185
+
186
+ static bool Check(DecodeStatus *Out, DecodeStatus In)
187
+ {
188
+ switch (In) {
189
+ default: // never reach
190
+ return true;
191
+
192
+ case MCDisassembler_Success:
193
+ // Out stays the same.
194
+ return true;
195
+
196
+ case MCDisassembler_SoftFail:
197
+ *Out = In;
198
+ return true;
199
+
200
+ case MCDisassembler_Fail:
201
+ *Out = In;
202
+ return false;
203
+ }
204
+ // llvm_unreachable("Invalid DecodeStatus!");
205
+ }
206
+
207
+ // Hacky: enable all features for disassembler
208
+ uint64_t AArch64_getFeatureBits(int feature)
209
+ {
210
+ // enable all features
211
+ return (uint64_t)-1;
212
+ }
213
+
214
+ #define GET_SUBTARGETINFO_ENUM
215
+ #include "AArch64GenSubtargetInfo.inc"
216
+
217
+ #include "AArch64GenDisassemblerTables.inc"
218
+
219
+ #define GET_INSTRINFO_ENUM
220
+ #include "AArch64GenInstrInfo.inc"
221
+
222
+ #define GET_REGINFO_ENUM
223
+ #define GET_REGINFO_MC_DESC
224
+ #include "AArch64GenRegisterInfo.inc"
225
+
226
+ #define Success MCDisassembler_Success
227
+ #define Fail MCDisassembler_Fail
228
+ #define SoftFail MCDisassembler_SoftFail
229
+
230
+ static DecodeStatus _getInstruction(cs_struct *ud, MCInst *MI,
231
+ const uint8_t *code, size_t code_len,
232
+ uint16_t *Size,
233
+ uint64_t Address, MCRegisterInfo *MRI)
234
+ {
235
+ uint32_t insn;
236
+ DecodeStatus result;
237
+ size_t i;
238
+
239
+ if (code_len < 4) {
240
+ // not enough data
241
+ *Size = 0;
242
+ return MCDisassembler_Fail;
243
+ }
244
+
245
+ if (MI->flat_insn->detail) {
246
+ memset(MI->flat_insn->detail, 0, offsetof(cs_detail, arm64)+sizeof(cs_arm64));
247
+ for (i = 0; i < ARR_SIZE(MI->flat_insn->detail->arm64.operands); i++)
248
+ MI->flat_insn->detail->arm64.operands[i].vector_index = -1;
249
+ }
250
+
251
+ if (MODE_IS_BIG_ENDIAN(ud->mode))
252
+ insn = (code[3] << 0) | (code[2] << 8) |
253
+ (code[1] << 16) | ((uint32_t) code[0] << 24);
254
+ else
255
+ insn = ((uint32_t) code[3] << 24) | (code[2] << 16) |
256
+ (code[1] << 8) | (code[0] << 0);
257
+
258
+ // Calling the auto-generated decoder function.
259
+ result = decodeInstruction_4(DecoderTable32, MI, insn, Address);
260
+ // If Decoding fails initially, try Fallback table.
261
+ if(result == MCDisassembler_Fail){
262
+ result = decodeInstruction_4(DecoderTableFallback32, MI, insn, Address);
263
+ }
264
+
265
+ // Init new MCOperand to be used in switch below.
266
+ // Kind RegVal set inside a case when needed.
267
+ MCOperand op_storage;
268
+ MCOperand *Op = &op_storage;
269
+ switch (MCInst_getOpcode(MI)) {
270
+ default:
271
+ break;
272
+ // For Scalable Matrix Extension (SME) instructions that have an implicit
273
+ // operand for the accumulator (ZA) which isn't encoded, manually insert
274
+ // operand.
275
+ case AArch64_LDR_ZA:
276
+ case AArch64_STR_ZA: {
277
+ Op->Kind = kRegister;
278
+ Op->RegVal = AArch64_ZA;
279
+ MCInst_insert0(MI, 0, Op);
280
+ // Spill and fill instructions have a single immediate used for both the
281
+ // vector select offset and optional memory offset. Replicate the decoded
282
+ // immediate.
283
+ MCOperand *Imm4Op = MCInst_getOperand(MI, 2);
284
+ // assert(MCOperand_isImm(Imm4Op) && "Unexpected operand type!");
285
+ MCInst_addOperand2(MI, Imm4Op);
286
+ break;
287
+ }
288
+ case AArch64_LD1_MXIPXX_H_B:
289
+ case AArch64_LD1_MXIPXX_V_B:
290
+ case AArch64_ST1_MXIPXX_H_B:
291
+ case AArch64_ST1_MXIPXX_V_B:
292
+ case AArch64_INSERT_MXIPZ_H_B:
293
+ case AArch64_INSERT_MXIPZ_V_B:
294
+ // e.g.
295
+ // MOVA ZA0<HV>.B[<Ws>, <imm>], <Pg>/M, <Zn>.B
296
+ // ^ insert implicit 8-bit element tile
297
+ Op->Kind = kRegister;
298
+ Op->RegVal = AArch64_ZAB0;
299
+ MCInst_insert0(MI, 0, Op);
300
+ break;
301
+ case AArch64_EXTRACT_ZPMXI_H_B:
302
+ case AArch64_EXTRACT_ZPMXI_V_B:
303
+ // MOVA <Zd>.B, <Pg>/M, ZA0<HV>.B[<Ws>, <imm>]
304
+ // ^ insert implicit 8-bit element tile
305
+ Op->Kind = kRegister;
306
+ Op->RegVal = AArch64_ZAB0;
307
+ MCInst_insert0(MI, 2, Op);
308
+ break;
309
+ case AArch64_LD1_MXIPXX_H_Q:
310
+ case AArch64_LD1_MXIPXX_V_Q:
311
+ case AArch64_ST1_MXIPXX_H_Q:
312
+ case AArch64_ST1_MXIPXX_V_Q:
313
+ // 128-bit load/store have implicit zero vector index.
314
+ Op->Kind = kImmediate;
315
+ Op->ImmVal = 0;
316
+ MCInst_insert0(MI, 2, Op);
317
+ break;
318
+ // 128-bit mova have implicit zero vector index.
319
+ case AArch64_INSERT_MXIPZ_H_Q:
320
+ case AArch64_INSERT_MXIPZ_V_Q:
321
+ Op->Kind = kImmediate;
322
+ Op->ImmVal = 0;
323
+ MCInst_insert0(MI, 2, Op);
324
+ break;
325
+ case AArch64_EXTRACT_ZPMXI_H_Q:
326
+ case AArch64_EXTRACT_ZPMXI_V_Q:
327
+ Op->Kind = kImmediate;
328
+ Op->ImmVal = 0;
329
+ MCInst_addOperand2(MI, Op);
330
+ break;
331
+ case AArch64_SMOVvi8to32_idx0:
332
+ case AArch64_SMOVvi8to64_idx0:
333
+ case AArch64_SMOVvi16to32_idx0:
334
+ case AArch64_SMOVvi16to64_idx0:
335
+ case AArch64_SMOVvi32to64_idx0:
336
+ case AArch64_UMOVvi8_idx0:
337
+ case AArch64_UMOVvi16_idx0:
338
+ case AArch64_UMOVvi32_idx0:
339
+ case AArch64_UMOVvi64_idx0:
340
+ Op->Kind = kImmediate;
341
+ Op->ImmVal = 0;
342
+ MCInst_addOperand2(MI, Op);
343
+ break;
344
+ }
345
+
346
+ if (result != MCDisassembler_Fail) {
347
+ *Size = 4;
348
+
349
+ return result;
350
+ }
351
+
352
+ // invalid code
353
+ MCInst_clear(MI);
354
+ *Size = 0;
355
+
356
+ return MCDisassembler_Fail;
357
+ }
358
+
359
+ bool AArch64_getInstruction(csh ud, const uint8_t *code, size_t code_len,
360
+ MCInst *instr, uint16_t *size, uint64_t address, void *info)
361
+ {
362
+ DecodeStatus status = _getInstruction((cs_struct *)ud, instr,
363
+ code, code_len,
364
+ size,
365
+ address, (MCRegisterInfo *)info);
366
+
367
+ return status == MCDisassembler_Success;
368
+ }
369
+
370
+ static const unsigned FPR128DecoderTable[] = {
371
+ AArch64_Q0, AArch64_Q1, AArch64_Q2, AArch64_Q3, AArch64_Q4,
372
+ AArch64_Q5, AArch64_Q6, AArch64_Q7, AArch64_Q8, AArch64_Q9,
373
+ AArch64_Q10, AArch64_Q11, AArch64_Q12, AArch64_Q13, AArch64_Q14,
374
+ AArch64_Q15, AArch64_Q16, AArch64_Q17, AArch64_Q18, AArch64_Q19,
375
+ AArch64_Q20, AArch64_Q21, AArch64_Q22, AArch64_Q23, AArch64_Q24,
376
+ AArch64_Q25, AArch64_Q26, AArch64_Q27, AArch64_Q28, AArch64_Q29,
377
+ AArch64_Q30, AArch64_Q31
378
+ };
379
+
380
+ static DecodeStatus DecodeFPR128RegisterClass(MCInst *Inst, unsigned RegNo,
381
+ uint64_t Addr, const void *Decoder)
382
+ {
383
+ unsigned Register;
384
+
385
+ if (RegNo > 31)
386
+ return Fail;
387
+
388
+ Register = FPR128DecoderTable[RegNo];
389
+ MCOperand_CreateReg0(Inst, Register);
390
+
391
+ return Success;
392
+ }
393
+
394
+ static DecodeStatus DecodeFPR128_loRegisterClass(MCInst *Inst, unsigned RegNo,
395
+ uint64_t Addr, const void *Decoder)
396
+ {
397
+ if (RegNo > 15)
398
+ return Fail;
399
+
400
+ return DecodeFPR128RegisterClass(Inst, RegNo, Addr, Decoder);
401
+ }
402
+
403
+ static const unsigned FPR64DecoderTable[] = {
404
+ AArch64_D0, AArch64_D1, AArch64_D2, AArch64_D3, AArch64_D4,
405
+ AArch64_D5, AArch64_D6, AArch64_D7, AArch64_D8, AArch64_D9,
406
+ AArch64_D10, AArch64_D11, AArch64_D12, AArch64_D13, AArch64_D14,
407
+ AArch64_D15, AArch64_D16, AArch64_D17, AArch64_D18, AArch64_D19,
408
+ AArch64_D20, AArch64_D21, AArch64_D22, AArch64_D23, AArch64_D24,
409
+ AArch64_D25, AArch64_D26, AArch64_D27, AArch64_D28, AArch64_D29,
410
+ AArch64_D30, AArch64_D31
411
+ };
412
+
413
+ static DecodeStatus DecodeFPR64RegisterClass(MCInst *Inst, unsigned RegNo,
414
+ uint64_t Addr, const void *Decoder)
415
+ {
416
+ unsigned Register;
417
+
418
+ if (RegNo > 31)
419
+ return Fail;
420
+
421
+ Register = FPR64DecoderTable[RegNo];
422
+ MCOperand_CreateReg0(Inst, Register);
423
+
424
+ return Success;
425
+ }
426
+
427
+ static const unsigned FPR32DecoderTable[] = {
428
+ AArch64_S0, AArch64_S1, AArch64_S2, AArch64_S3, AArch64_S4,
429
+ AArch64_S5, AArch64_S6, AArch64_S7, AArch64_S8, AArch64_S9,
430
+ AArch64_S10, AArch64_S11, AArch64_S12, AArch64_S13, AArch64_S14,
431
+ AArch64_S15, AArch64_S16, AArch64_S17, AArch64_S18, AArch64_S19,
432
+ AArch64_S20, AArch64_S21, AArch64_S22, AArch64_S23, AArch64_S24,
433
+ AArch64_S25, AArch64_S26, AArch64_S27, AArch64_S28, AArch64_S29,
434
+ AArch64_S30, AArch64_S31
435
+ };
436
+
437
+ static DecodeStatus DecodeFPR32RegisterClass(MCInst *Inst, unsigned RegNo,
438
+ uint64_t Addr, const void *Decoder)
439
+ {
440
+ unsigned Register;
441
+
442
+ if (RegNo > 31)
443
+ return Fail;
444
+
445
+ Register = FPR32DecoderTable[RegNo];
446
+ MCOperand_CreateReg0(Inst, Register);
447
+
448
+ return Success;
449
+ }
450
+
451
+ static const unsigned FPR16DecoderTable[] = {
452
+ AArch64_H0, AArch64_H1, AArch64_H2, AArch64_H3, AArch64_H4,
453
+ AArch64_H5, AArch64_H6, AArch64_H7, AArch64_H8, AArch64_H9,
454
+ AArch64_H10, AArch64_H11, AArch64_H12, AArch64_H13, AArch64_H14,
455
+ AArch64_H15, AArch64_H16, AArch64_H17, AArch64_H18, AArch64_H19,
456
+ AArch64_H20, AArch64_H21, AArch64_H22, AArch64_H23, AArch64_H24,
457
+ AArch64_H25, AArch64_H26, AArch64_H27, AArch64_H28, AArch64_H29,
458
+ AArch64_H30, AArch64_H31
459
+ };
460
+
461
+ static DecodeStatus DecodeFPR16RegisterClass(MCInst *Inst, unsigned RegNo,
462
+ uint64_t Addr, const void *Decoder)
463
+ {
464
+ unsigned Register;
465
+
466
+ if (RegNo > 31)
467
+ return Fail;
468
+
469
+ Register = FPR16DecoderTable[RegNo];
470
+ MCOperand_CreateReg0(Inst, Register);
471
+
472
+ return Success;
473
+ }
474
+
475
+ static const unsigned FPR8DecoderTable[] = {
476
+ AArch64_B0, AArch64_B1, AArch64_B2, AArch64_B3, AArch64_B4,
477
+ AArch64_B5, AArch64_B6, AArch64_B7, AArch64_B8, AArch64_B9,
478
+ AArch64_B10, AArch64_B11, AArch64_B12, AArch64_B13, AArch64_B14,
479
+ AArch64_B15, AArch64_B16, AArch64_B17, AArch64_B18, AArch64_B19,
480
+ AArch64_B20, AArch64_B21, AArch64_B22, AArch64_B23, AArch64_B24,
481
+ AArch64_B25, AArch64_B26, AArch64_B27, AArch64_B28, AArch64_B29,
482
+ AArch64_B30, AArch64_B31
483
+ };
484
+
485
+ static DecodeStatus DecodeFPR8RegisterClass(MCInst *Inst, unsigned RegNo,
486
+ uint64_t Addr, const void *Decoder)
487
+ {
488
+ unsigned Register;
489
+
490
+ if (RegNo > 31)
491
+ return Fail;
492
+
493
+ Register = FPR8DecoderTable[RegNo];
494
+ MCOperand_CreateReg0(Inst, Register);
495
+
496
+ return Success;
497
+ }
498
+
499
+ static const unsigned GPR64DecoderTable[] = {
500
+ AArch64_X0, AArch64_X1, AArch64_X2, AArch64_X3, AArch64_X4,
501
+ AArch64_X5, AArch64_X6, AArch64_X7, AArch64_X8, AArch64_X9,
502
+ AArch64_X10, AArch64_X11, AArch64_X12, AArch64_X13, AArch64_X14,
503
+ AArch64_X15, AArch64_X16, AArch64_X17, AArch64_X18, AArch64_X19,
504
+ AArch64_X20, AArch64_X21, AArch64_X22, AArch64_X23, AArch64_X24,
505
+ AArch64_X25, AArch64_X26, AArch64_X27, AArch64_X28, AArch64_FP,
506
+ AArch64_LR, AArch64_XZR
507
+ };
508
+
509
+ static DecodeStatus DecodeGPR64commonRegisterClass(MCInst *Inst, unsigned RegNo,
510
+ uint64_t Addr, const void *Decoder)
511
+ {
512
+ unsigned Register;
513
+
514
+ if (RegNo > 30)
515
+ return Fail;
516
+
517
+ Register = GPR64DecoderTable[RegNo];
518
+ MCOperand_CreateReg0(Inst, Register);
519
+
520
+ return Success;
521
+ }
522
+
523
+ static DecodeStatus DecodeGPR64RegisterClass(MCInst *Inst, unsigned RegNo,
524
+ uint64_t Addr, const void *Decoder)
525
+ {
526
+ unsigned Register;
527
+
528
+ if (RegNo > 31)
529
+ return Fail;
530
+
531
+ Register = GPR64DecoderTable[RegNo];
532
+ MCOperand_CreateReg0(Inst, Register);
533
+
534
+ return Success;
535
+ }
536
+
537
+ static const unsigned GPR64x8DecoderTable[] = {
538
+ AArch64_X0_X1_X2_X3_X4_X5_X6_X7, AArch64_X2_X3_X4_X5_X6_X7_X8_X9,
539
+ AArch64_X4_X5_X6_X7_X8_X9_X10_X11, AArch64_X6_X7_X8_X9_X10_X11_X12_X13,
540
+ AArch64_X8_X9_X10_X11_X12_X13_X14_X15, AArch64_X10_X11_X12_X13_X14_X15_X16_X17,
541
+ AArch64_X12_X13_X14_X15_X16_X17_X18_X19, AArch64_X14_X15_X16_X17_X18_X19_X20_X21,
542
+ AArch64_X16_X17_X18_X19_X20_X21_X22_X23, AArch64_X18_X19_X20_X21_X22_X23_X24_X25,
543
+ AArch64_X20_X21_X22_X23_X24_X25_X26_X27, AArch64_X22_X23_X24_X25_X26_X27_X28_FP
544
+ };
545
+
546
+ static DecodeStatus DecodeGPR64x8ClassRegisterClass(MCInst *Inst, unsigned RegNo,
547
+ uint64_t Address, const void *Decoder)
548
+ {
549
+ if (RegNo > 22)
550
+ return Fail;
551
+ if (RegNo & 1)
552
+ return Fail;
553
+
554
+ unsigned Register = GPR64x8DecoderTable[RegNo >> 1];
555
+ MCOperand_CreateReg0(Inst, Register);
556
+
557
+ return Success;
558
+ }
559
+
560
+ static DecodeStatus DecodeGPR64spRegisterClass(MCInst *Inst, unsigned RegNo,
561
+ uint64_t Addr, const void *Decoder)
562
+ {
563
+ unsigned Register;
564
+
565
+ if (RegNo > 31)
566
+ return Fail;
567
+
568
+ Register = GPR64DecoderTable[RegNo];
569
+ if (Register == AArch64_XZR)
570
+ Register = AArch64_SP;
571
+
572
+ MCOperand_CreateReg0(Inst, Register);
573
+
574
+ return Success;
575
+ }
576
+
577
+
578
+ static const unsigned MatrixIndexGPR32_12_15DecoderTable[] = {
579
+ AArch64_W12, AArch64_W13, AArch64_W14, AArch64_W15
580
+ };
581
+
582
+ static DecodeStatus DecodeMatrixIndexGPR32_12_15RegisterClass(MCInst *Inst,
583
+ unsigned RegNo, uint64_t Addr, const void *Decoder)
584
+ {
585
+ unsigned Register;
586
+
587
+ if (RegNo > 3)
588
+ return Fail;
589
+
590
+ Register = MatrixIndexGPR32_12_15DecoderTable[RegNo];
591
+ MCOperand_CreateReg0(Inst, Register);
592
+
593
+ return Success;
594
+ }
595
+
596
+ static const unsigned GPR32DecoderTable[] = {
597
+ AArch64_W0, AArch64_W1, AArch64_W2, AArch64_W3, AArch64_W4,
598
+ AArch64_W5, AArch64_W6, AArch64_W7, AArch64_W8, AArch64_W9,
599
+ AArch64_W10, AArch64_W11, AArch64_W12, AArch64_W13, AArch64_W14,
600
+ AArch64_W15, AArch64_W16, AArch64_W17, AArch64_W18, AArch64_W19,
601
+ AArch64_W20, AArch64_W21, AArch64_W22, AArch64_W23, AArch64_W24,
602
+ AArch64_W25, AArch64_W26, AArch64_W27, AArch64_W28, AArch64_W29,
603
+ AArch64_W30, AArch64_WZR
604
+ };
605
+
606
+ static DecodeStatus DecodeGPR32RegisterClass(MCInst *Inst, unsigned RegNo,
607
+ uint64_t Addr, const void *Decoder)
608
+ {
609
+ unsigned Register;
610
+
611
+ if (RegNo > 31)
612
+ return Fail;
613
+
614
+ Register = GPR32DecoderTable[RegNo];
615
+ MCOperand_CreateReg0(Inst, Register);
616
+
617
+ return Success;
618
+ }
619
+
620
+ static DecodeStatus DecodeGPR32spRegisterClass(MCInst *Inst, unsigned RegNo,
621
+ uint64_t Addr, const void *Decoder)
622
+ {
623
+ unsigned Register;
624
+
625
+ if (RegNo > 31)
626
+ return Fail;
627
+
628
+ Register = GPR32DecoderTable[RegNo];
629
+ if (Register == AArch64_WZR)
630
+ Register = AArch64_WSP;
631
+
632
+ MCOperand_CreateReg0(Inst, Register);
633
+
634
+ return Success;
635
+ }
636
+
637
+ static const unsigned ZPRDecoderTable[] = {
638
+ AArch64_Z0, AArch64_Z1, AArch64_Z2, AArch64_Z3,
639
+ AArch64_Z4, AArch64_Z5, AArch64_Z6, AArch64_Z7,
640
+ AArch64_Z8, AArch64_Z9, AArch64_Z10, AArch64_Z11,
641
+ AArch64_Z12, AArch64_Z13, AArch64_Z14, AArch64_Z15,
642
+ AArch64_Z16, AArch64_Z17, AArch64_Z18, AArch64_Z19,
643
+ AArch64_Z20, AArch64_Z21, AArch64_Z22, AArch64_Z23,
644
+ AArch64_Z24, AArch64_Z25, AArch64_Z26, AArch64_Z27,
645
+ AArch64_Z28, AArch64_Z29, AArch64_Z30, AArch64_Z31
646
+ };
647
+
648
+ static DecodeStatus DecodeZPRRegisterClass(MCInst *Inst, unsigned RegNo,
649
+ uint64_t Address, const void *Decoder)
650
+ {
651
+ unsigned Register;
652
+
653
+ if (RegNo > 31)
654
+ return Fail;
655
+
656
+ Register = ZPRDecoderTable[RegNo];
657
+ MCOperand_CreateReg0(Inst, Register);
658
+
659
+ return Success;
660
+ }
661
+
662
+ static DecodeStatus DecodeZPR_4bRegisterClass(MCInst *Inst, unsigned RegNo,
663
+ uint64_t Address, const void *Decoder)
664
+ {
665
+ if (RegNo > 15)
666
+ return Fail;
667
+
668
+ return DecodeZPRRegisterClass(Inst, RegNo, Address, Decoder);
669
+ }
670
+
671
+ static DecodeStatus DecodeZPR_3bRegisterClass(MCInst *Inst, unsigned RegNo,
672
+ uint64_t Address, const void *Decoder)
673
+ {
674
+ if (RegNo > 7)
675
+ return Fail;
676
+
677
+ return DecodeZPRRegisterClass(Inst, RegNo, Address, Decoder);
678
+ }
679
+
680
+ static const unsigned ZZDecoderTable[] = {
681
+ AArch64_Z0_Z1, AArch64_Z1_Z2, AArch64_Z2_Z3, AArch64_Z3_Z4,
682
+ AArch64_Z4_Z5, AArch64_Z5_Z6, AArch64_Z6_Z7, AArch64_Z7_Z8,
683
+ AArch64_Z8_Z9, AArch64_Z9_Z10, AArch64_Z10_Z11, AArch64_Z11_Z12,
684
+ AArch64_Z12_Z13, AArch64_Z13_Z14, AArch64_Z14_Z15, AArch64_Z15_Z16,
685
+ AArch64_Z16_Z17, AArch64_Z17_Z18, AArch64_Z18_Z19, AArch64_Z19_Z20,
686
+ AArch64_Z20_Z21, AArch64_Z21_Z22, AArch64_Z22_Z23, AArch64_Z23_Z24,
687
+ AArch64_Z24_Z25, AArch64_Z25_Z26, AArch64_Z26_Z27, AArch64_Z27_Z28,
688
+ AArch64_Z28_Z29, AArch64_Z29_Z30, AArch64_Z30_Z31, AArch64_Z31_Z0
689
+ };
690
+
691
+ static DecodeStatus DecodeZPR2RegisterClass(MCInst *Inst, unsigned RegNo,
692
+ uint64_t Address, const void *Decoder)
693
+ {
694
+ unsigned Register;
695
+
696
+ if (RegNo > 31)
697
+ return Fail;
698
+
699
+ Register = ZZDecoderTable[RegNo];
700
+ MCOperand_CreateReg0(Inst, Register);
701
+
702
+ return Success;
703
+ }
704
+
705
+ static const unsigned ZZZDecoderTable[] = {
706
+ AArch64_Z0_Z1_Z2, AArch64_Z1_Z2_Z3, AArch64_Z2_Z3_Z4,
707
+ AArch64_Z3_Z4_Z5, AArch64_Z4_Z5_Z6, AArch64_Z5_Z6_Z7,
708
+ AArch64_Z6_Z7_Z8, AArch64_Z7_Z8_Z9, AArch64_Z8_Z9_Z10,
709
+ AArch64_Z9_Z10_Z11, AArch64_Z10_Z11_Z12, AArch64_Z11_Z12_Z13,
710
+ AArch64_Z12_Z13_Z14, AArch64_Z13_Z14_Z15, AArch64_Z14_Z15_Z16,
711
+ AArch64_Z15_Z16_Z17, AArch64_Z16_Z17_Z18, AArch64_Z17_Z18_Z19,
712
+ AArch64_Z18_Z19_Z20, AArch64_Z19_Z20_Z21, AArch64_Z20_Z21_Z22,
713
+ AArch64_Z21_Z22_Z23, AArch64_Z22_Z23_Z24, AArch64_Z23_Z24_Z25,
714
+ AArch64_Z24_Z25_Z26, AArch64_Z25_Z26_Z27, AArch64_Z26_Z27_Z28,
715
+ AArch64_Z27_Z28_Z29, AArch64_Z28_Z29_Z30, AArch64_Z29_Z30_Z31,
716
+ AArch64_Z30_Z31_Z0, AArch64_Z31_Z0_Z1
717
+ };
718
+
719
+ static DecodeStatus DecodeZPR3RegisterClass(MCInst *Inst, unsigned RegNo,
720
+ uint64_t Address, const void *Decoder)
721
+ {
722
+ unsigned Register;
723
+
724
+ if (RegNo > 31)
725
+ return Fail;
726
+
727
+ Register = ZZZDecoderTable[RegNo];
728
+ MCOperand_CreateReg0(Inst, Register);
729
+
730
+ return Success;
731
+ }
732
+
733
+ static const unsigned ZZZZDecoderTable[] = {
734
+ AArch64_Z0_Z1_Z2_Z3, AArch64_Z1_Z2_Z3_Z4, AArch64_Z2_Z3_Z4_Z5,
735
+ AArch64_Z3_Z4_Z5_Z6, AArch64_Z4_Z5_Z6_Z7, AArch64_Z5_Z6_Z7_Z8,
736
+ AArch64_Z6_Z7_Z8_Z9, AArch64_Z7_Z8_Z9_Z10, AArch64_Z8_Z9_Z10_Z11,
737
+ AArch64_Z9_Z10_Z11_Z12, AArch64_Z10_Z11_Z12_Z13, AArch64_Z11_Z12_Z13_Z14,
738
+ AArch64_Z12_Z13_Z14_Z15, AArch64_Z13_Z14_Z15_Z16, AArch64_Z14_Z15_Z16_Z17,
739
+ AArch64_Z15_Z16_Z17_Z18, AArch64_Z16_Z17_Z18_Z19, AArch64_Z17_Z18_Z19_Z20,
740
+ AArch64_Z18_Z19_Z20_Z21, AArch64_Z19_Z20_Z21_Z22, AArch64_Z20_Z21_Z22_Z23,
741
+ AArch64_Z21_Z22_Z23_Z24, AArch64_Z22_Z23_Z24_Z25, AArch64_Z23_Z24_Z25_Z26,
742
+ AArch64_Z24_Z25_Z26_Z27, AArch64_Z25_Z26_Z27_Z28, AArch64_Z26_Z27_Z28_Z29,
743
+ AArch64_Z27_Z28_Z29_Z30, AArch64_Z28_Z29_Z30_Z31, AArch64_Z29_Z30_Z31_Z0,
744
+ AArch64_Z30_Z31_Z0_Z1, AArch64_Z31_Z0_Z1_Z2
745
+ };
746
+
747
+ static DecodeStatus DecodeZPR4RegisterClass(MCInst *Inst, unsigned RegNo,
748
+ uint64_t Address, const void *Decoder)
749
+ {
750
+ unsigned Register;
751
+
752
+ if (RegNo > 31)
753
+ return Fail;
754
+
755
+ Register = ZZZZDecoderTable[RegNo];
756
+ MCOperand_CreateReg0(Inst, Register);
757
+
758
+ return Success;
759
+ }
760
+
761
+ static DecodeStatus DecodeMatrixTileListRegisterClass(MCInst *Inst,
762
+ unsigned RegMask, uint64_t Address, const void *Decoder) {
763
+ if (RegMask > 0xFF)
764
+ return Fail;
765
+
766
+ MCOperand_CreateImm0(Inst, RegMask);
767
+ return Success;
768
+ }
769
+
770
+ static const unsigned MatrixZATileDecoderTable[] = {
771
+ AArch64_ZAB0,
772
+ AArch64_ZAH0, AArch64_ZAH1,
773
+ AArch64_ZAS0, AArch64_ZAS1, AArch64_ZAS2, AArch64_ZAS3,
774
+ AArch64_ZAD0, AArch64_ZAD1, AArch64_ZAD2, AArch64_ZAD3,
775
+ AArch64_ZAD4, AArch64_ZAD5, AArch64_ZAD6, AArch64_ZAD7,
776
+ AArch64_ZAQ0, AArch64_ZAQ1, AArch64_ZAQ2, AArch64_ZAQ3,
777
+ AArch64_ZAQ4, AArch64_ZAQ5, AArch64_ZAQ6, AArch64_ZAQ7,
778
+ AArch64_ZAQ8, AArch64_ZAQ9, AArch64_ZAQ10, AArch64_ZAQ11,
779
+ AArch64_ZAQ12, AArch64_ZAQ13, AArch64_ZAQ14, AArch64_ZAQ15
780
+ };
781
+
782
+ static DecodeStatus DecodeMatrixTile(MCInst *Inst, unsigned RegNo,
783
+ uint64_t Address, const void *Decoder, unsigned NumBitsForTile) {
784
+ unsigned LastReg = (1 << NumBitsForTile) - 1;
785
+ if (RegNo > LastReg)
786
+ return Fail;
787
+
788
+ // Convert original 2D indexes into 1D table index
789
+ unsigned index = 0;
790
+ switch (NumBitsForTile)
791
+ {
792
+ case 0:
793
+ // Only a single Byte tile at beginning of list so index = 0
794
+ break;
795
+ case 1:
796
+ index = 1 + RegNo;
797
+ break;
798
+ case 2:
799
+ index = 3 + RegNo;
800
+ break;
801
+ case 3:
802
+ index = 7 + RegNo;
803
+ break;
804
+ case 4:
805
+ index = 15 + RegNo;
806
+ break;
807
+ default:
808
+ break;
809
+ }
810
+
811
+ MCOperand_CreateReg0(Inst, MatrixZATileDecoderTable[index]);
812
+ return Success;
813
+ }
814
+
815
+
816
+ static const unsigned PPRDecoderTable[] = {
817
+ AArch64_P0, AArch64_P1, AArch64_P2, AArch64_P3,
818
+ AArch64_P4, AArch64_P5, AArch64_P6, AArch64_P7,
819
+ AArch64_P8, AArch64_P9, AArch64_P10, AArch64_P11,
820
+ AArch64_P12, AArch64_P13, AArch64_P14, AArch64_P15
821
+ };
822
+
823
+ static DecodeStatus DecodePPRRegisterClass(MCInst *Inst, unsigned RegNo,
824
+ uint64_t Addr, const void *Decoder)
825
+ {
826
+ unsigned Register;
827
+
828
+ if (RegNo > 15)
829
+ return Fail;
830
+
831
+ Register = PPRDecoderTable[RegNo];
832
+ MCOperand_CreateReg0(Inst, Register);
833
+
834
+ return Success;
835
+ }
836
+
837
+ static DecodeStatus DecodePPR_3bRegisterClass(MCInst *Inst, unsigned RegNo,
838
+ uint64_t Addr, const void *Decoder)
839
+ {
840
+ if (RegNo > 7)
841
+ return Fail;
842
+
843
+ // Just reuse the PPR decode table
844
+ return DecodePPRRegisterClass(Inst, RegNo, Addr, Decoder);
845
+ }
846
+
847
+ static const unsigned VectorDecoderTable[] = {
848
+ AArch64_Q0, AArch64_Q1, AArch64_Q2, AArch64_Q3, AArch64_Q4,
849
+ AArch64_Q5, AArch64_Q6, AArch64_Q7, AArch64_Q8, AArch64_Q9,
850
+ AArch64_Q10, AArch64_Q11, AArch64_Q12, AArch64_Q13, AArch64_Q14,
851
+ AArch64_Q15, AArch64_Q16, AArch64_Q17, AArch64_Q18, AArch64_Q19,
852
+ AArch64_Q20, AArch64_Q21, AArch64_Q22, AArch64_Q23, AArch64_Q24,
853
+ AArch64_Q25, AArch64_Q26, AArch64_Q27, AArch64_Q28, AArch64_Q29,
854
+ AArch64_Q30, AArch64_Q31
855
+ };
856
+
857
+ static DecodeStatus DecodeVectorRegisterClass(MCInst *Inst, unsigned RegNo,
858
+ uint64_t Addr, const void *Decoder)
859
+ {
860
+ unsigned Register;
861
+
862
+ if (RegNo > 31)
863
+ return Fail;
864
+
865
+ Register = VectorDecoderTable[RegNo];
866
+ MCOperand_CreateReg0(Inst, Register);
867
+
868
+ return Success;
869
+ }
870
+
871
+ static const unsigned QQDecoderTable[] = {
872
+ AArch64_Q0_Q1, AArch64_Q1_Q2, AArch64_Q2_Q3, AArch64_Q3_Q4,
873
+ AArch64_Q4_Q5, AArch64_Q5_Q6, AArch64_Q6_Q7, AArch64_Q7_Q8,
874
+ AArch64_Q8_Q9, AArch64_Q9_Q10, AArch64_Q10_Q11, AArch64_Q11_Q12,
875
+ AArch64_Q12_Q13, AArch64_Q13_Q14, AArch64_Q14_Q15, AArch64_Q15_Q16,
876
+ AArch64_Q16_Q17, AArch64_Q17_Q18, AArch64_Q18_Q19, AArch64_Q19_Q20,
877
+ AArch64_Q20_Q21, AArch64_Q21_Q22, AArch64_Q22_Q23, AArch64_Q23_Q24,
878
+ AArch64_Q24_Q25, AArch64_Q25_Q26, AArch64_Q26_Q27, AArch64_Q27_Q28,
879
+ AArch64_Q28_Q29, AArch64_Q29_Q30, AArch64_Q30_Q31, AArch64_Q31_Q0
880
+ };
881
+
882
+ static DecodeStatus DecodeQQRegisterClass(MCInst *Inst, unsigned RegNo,
883
+ uint64_t Addr, const void *Decoder)
884
+ {
885
+ unsigned Register;
886
+
887
+ if (RegNo > 31)
888
+ return Fail;
889
+
890
+ Register = QQDecoderTable[RegNo];
891
+ MCOperand_CreateReg0(Inst, Register);
892
+
893
+ return Success;
894
+ }
895
+
896
+ static const unsigned QQQDecoderTable[] = {
897
+ AArch64_Q0_Q1_Q2, AArch64_Q1_Q2_Q3, AArch64_Q2_Q3_Q4,
898
+ AArch64_Q3_Q4_Q5, AArch64_Q4_Q5_Q6, AArch64_Q5_Q6_Q7,
899
+ AArch64_Q6_Q7_Q8, AArch64_Q7_Q8_Q9, AArch64_Q8_Q9_Q10,
900
+ AArch64_Q9_Q10_Q11, AArch64_Q10_Q11_Q12, AArch64_Q11_Q12_Q13,
901
+ AArch64_Q12_Q13_Q14, AArch64_Q13_Q14_Q15, AArch64_Q14_Q15_Q16,
902
+ AArch64_Q15_Q16_Q17, AArch64_Q16_Q17_Q18, AArch64_Q17_Q18_Q19,
903
+ AArch64_Q18_Q19_Q20, AArch64_Q19_Q20_Q21, AArch64_Q20_Q21_Q22,
904
+ AArch64_Q21_Q22_Q23, AArch64_Q22_Q23_Q24, AArch64_Q23_Q24_Q25,
905
+ AArch64_Q24_Q25_Q26, AArch64_Q25_Q26_Q27, AArch64_Q26_Q27_Q28,
906
+ AArch64_Q27_Q28_Q29, AArch64_Q28_Q29_Q30, AArch64_Q29_Q30_Q31,
907
+ AArch64_Q30_Q31_Q0, AArch64_Q31_Q0_Q1
908
+ };
909
+
910
+ static DecodeStatus DecodeQQQRegisterClass(MCInst *Inst, unsigned RegNo,
911
+ uint64_t Addr, const void *Decoder)
912
+ {
913
+ unsigned Register;
914
+
915
+ if (RegNo > 31)
916
+ return Fail;
917
+
918
+ Register = QQQDecoderTable[RegNo];
919
+ MCOperand_CreateReg0(Inst, Register);
920
+
921
+ return Success;
922
+ }
923
+
924
+ static const unsigned QQQQDecoderTable[] = {
925
+ AArch64_Q0_Q1_Q2_Q3, AArch64_Q1_Q2_Q3_Q4, AArch64_Q2_Q3_Q4_Q5,
926
+ AArch64_Q3_Q4_Q5_Q6, AArch64_Q4_Q5_Q6_Q7, AArch64_Q5_Q6_Q7_Q8,
927
+ AArch64_Q6_Q7_Q8_Q9, AArch64_Q7_Q8_Q9_Q10, AArch64_Q8_Q9_Q10_Q11,
928
+ AArch64_Q9_Q10_Q11_Q12, AArch64_Q10_Q11_Q12_Q13, AArch64_Q11_Q12_Q13_Q14,
929
+ AArch64_Q12_Q13_Q14_Q15, AArch64_Q13_Q14_Q15_Q16, AArch64_Q14_Q15_Q16_Q17,
930
+ AArch64_Q15_Q16_Q17_Q18, AArch64_Q16_Q17_Q18_Q19, AArch64_Q17_Q18_Q19_Q20,
931
+ AArch64_Q18_Q19_Q20_Q21, AArch64_Q19_Q20_Q21_Q22, AArch64_Q20_Q21_Q22_Q23,
932
+ AArch64_Q21_Q22_Q23_Q24, AArch64_Q22_Q23_Q24_Q25, AArch64_Q23_Q24_Q25_Q26,
933
+ AArch64_Q24_Q25_Q26_Q27, AArch64_Q25_Q26_Q27_Q28, AArch64_Q26_Q27_Q28_Q29,
934
+ AArch64_Q27_Q28_Q29_Q30, AArch64_Q28_Q29_Q30_Q31, AArch64_Q29_Q30_Q31_Q0,
935
+ AArch64_Q30_Q31_Q0_Q1, AArch64_Q31_Q0_Q1_Q2
936
+ };
937
+
938
+ static DecodeStatus DecodeQQQQRegisterClass(MCInst *Inst, unsigned RegNo,
939
+ uint64_t Addr, const void *Decoder)
940
+ {
941
+ unsigned Register;
942
+
943
+ if (RegNo > 31)
944
+ return Fail;
945
+
946
+ Register = QQQQDecoderTable[RegNo];
947
+ MCOperand_CreateReg0(Inst, Register);
948
+
949
+ return Success;
950
+ }
951
+
952
+ static const unsigned DDDecoderTable[] = {
953
+ AArch64_D0_D1, AArch64_D1_D2, AArch64_D2_D3, AArch64_D3_D4,
954
+ AArch64_D4_D5, AArch64_D5_D6, AArch64_D6_D7, AArch64_D7_D8,
955
+ AArch64_D8_D9, AArch64_D9_D10, AArch64_D10_D11, AArch64_D11_D12,
956
+ AArch64_D12_D13, AArch64_D13_D14, AArch64_D14_D15, AArch64_D15_D16,
957
+ AArch64_D16_D17, AArch64_D17_D18, AArch64_D18_D19, AArch64_D19_D20,
958
+ AArch64_D20_D21, AArch64_D21_D22, AArch64_D22_D23, AArch64_D23_D24,
959
+ AArch64_D24_D25, AArch64_D25_D26, AArch64_D26_D27, AArch64_D27_D28,
960
+ AArch64_D28_D29, AArch64_D29_D30, AArch64_D30_D31, AArch64_D31_D0
961
+ };
962
+
963
+ static DecodeStatus DecodeDDRegisterClass(MCInst *Inst, unsigned RegNo,
964
+ uint64_t Addr, const void *Decoder)
965
+ {
966
+ unsigned Register;
967
+
968
+ if (RegNo > 31)
969
+ return Fail;
970
+
971
+ Register = DDDecoderTable[RegNo];
972
+ MCOperand_CreateReg0(Inst, Register);
973
+
974
+ return Success;
975
+ }
976
+
977
+ static const unsigned DDDDecoderTable[] = {
978
+ AArch64_D0_D1_D2, AArch64_D1_D2_D3, AArch64_D2_D3_D4,
979
+ AArch64_D3_D4_D5, AArch64_D4_D5_D6, AArch64_D5_D6_D7,
980
+ AArch64_D6_D7_D8, AArch64_D7_D8_D9, AArch64_D8_D9_D10,
981
+ AArch64_D9_D10_D11, AArch64_D10_D11_D12, AArch64_D11_D12_D13,
982
+ AArch64_D12_D13_D14, AArch64_D13_D14_D15, AArch64_D14_D15_D16,
983
+ AArch64_D15_D16_D17, AArch64_D16_D17_D18, AArch64_D17_D18_D19,
984
+ AArch64_D18_D19_D20, AArch64_D19_D20_D21, AArch64_D20_D21_D22,
985
+ AArch64_D21_D22_D23, AArch64_D22_D23_D24, AArch64_D23_D24_D25,
986
+ AArch64_D24_D25_D26, AArch64_D25_D26_D27, AArch64_D26_D27_D28,
987
+ AArch64_D27_D28_D29, AArch64_D28_D29_D30, AArch64_D29_D30_D31,
988
+ AArch64_D30_D31_D0, AArch64_D31_D0_D1
989
+ };
990
+
991
+ static DecodeStatus DecodeDDDRegisterClass(MCInst *Inst, unsigned RegNo,
992
+ uint64_t Addr, const void *Decoder)
993
+ {
994
+ unsigned Register;
995
+
996
+ if (RegNo > 31)
997
+ return Fail;
998
+
999
+ Register = DDDDecoderTable[RegNo];
1000
+ MCOperand_CreateReg0(Inst, Register);
1001
+
1002
+ return Success;
1003
+ }
1004
+
1005
+ static const unsigned DDDDDecoderTable[] = {
1006
+ AArch64_D0_D1_D2_D3, AArch64_D1_D2_D3_D4, AArch64_D2_D3_D4_D5,
1007
+ AArch64_D3_D4_D5_D6, AArch64_D4_D5_D6_D7, AArch64_D5_D6_D7_D8,
1008
+ AArch64_D6_D7_D8_D9, AArch64_D7_D8_D9_D10, AArch64_D8_D9_D10_D11,
1009
+ AArch64_D9_D10_D11_D12, AArch64_D10_D11_D12_D13, AArch64_D11_D12_D13_D14,
1010
+ AArch64_D12_D13_D14_D15, AArch64_D13_D14_D15_D16, AArch64_D14_D15_D16_D17,
1011
+ AArch64_D15_D16_D17_D18, AArch64_D16_D17_D18_D19, AArch64_D17_D18_D19_D20,
1012
+ AArch64_D18_D19_D20_D21, AArch64_D19_D20_D21_D22, AArch64_D20_D21_D22_D23,
1013
+ AArch64_D21_D22_D23_D24, AArch64_D22_D23_D24_D25, AArch64_D23_D24_D25_D26,
1014
+ AArch64_D24_D25_D26_D27, AArch64_D25_D26_D27_D28, AArch64_D26_D27_D28_D29,
1015
+ AArch64_D27_D28_D29_D30, AArch64_D28_D29_D30_D31, AArch64_D29_D30_D31_D0,
1016
+ AArch64_D30_D31_D0_D1, AArch64_D31_D0_D1_D2
1017
+ };
1018
+
1019
+ static DecodeStatus DecodeDDDDRegisterClass(MCInst *Inst, unsigned RegNo,
1020
+ uint64_t Addr, const void *Decoder)
1021
+ {
1022
+ unsigned Register;
1023
+
1024
+ if (RegNo > 31)
1025
+ return Fail;
1026
+
1027
+ Register = DDDDDecoderTable[RegNo];
1028
+ MCOperand_CreateReg0(Inst, Register);
1029
+
1030
+ return Success;
1031
+ }
1032
+
1033
+ static DecodeStatus DecodeFixedPointScaleImm32(MCInst *Inst, unsigned Imm,
1034
+ uint64_t Addr, const void *Decoder)
1035
+ {
1036
+ // scale{5} is asserted as 1 in tblgen.
1037
+ Imm |= 0x20;
1038
+ MCOperand_CreateImm0(Inst, 64 - Imm);
1039
+
1040
+ return Success;
1041
+ }
1042
+
1043
+ static DecodeStatus DecodeFixedPointScaleImm64(MCInst *Inst, unsigned Imm,
1044
+ uint64_t Addr, const void *Decoder)
1045
+ {
1046
+ MCOperand_CreateImm0(Inst, 64 - Imm);
1047
+
1048
+ return Success;
1049
+ }
1050
+
1051
+ static DecodeStatus DecodePCRelLabel19(MCInst *Inst, unsigned Imm,
1052
+ uint64_t Addr, const void *Decoder)
1053
+ {
1054
+ int64_t ImmVal = Imm;
1055
+
1056
+ // Sign-extend 19-bit immediate.
1057
+ if (ImmVal & (1 << (19 - 1)))
1058
+ ImmVal |= ~((1LL << 19) - 1);
1059
+
1060
+ MCOperand_CreateImm0(Inst, ImmVal);
1061
+
1062
+ return Success;
1063
+ }
1064
+
1065
+ static DecodeStatus DecodeMemExtend(MCInst *Inst, unsigned Imm,
1066
+ uint64_t Address, const void *Decoder)
1067
+ {
1068
+ MCOperand_CreateImm0(Inst, (Imm >> 1) & 1);
1069
+ MCOperand_CreateImm0(Inst, Imm & 1);
1070
+
1071
+ return Success;
1072
+ }
1073
+
1074
+ static DecodeStatus DecodeMRSSystemRegister(MCInst *Inst, unsigned Imm,
1075
+ uint64_t Address, const void *Decoder)
1076
+ {
1077
+ MCOperand_CreateImm0(Inst, Imm);
1078
+
1079
+ // Every system register in the encoding space is valid with the syntax
1080
+ // S<op0>_<op1>_<Cn>_<Cm>_<op2>, so decoding system registers always succeeds.
1081
+ return Success;
1082
+ }
1083
+
1084
+ static DecodeStatus DecodeMSRSystemRegister(MCInst *Inst, unsigned Imm,
1085
+ uint64_t Address, const void *Decoder)
1086
+ {
1087
+ MCOperand_CreateImm0(Inst, Imm);
1088
+
1089
+ return Success;
1090
+ }
1091
+
1092
+ static DecodeStatus DecodeFMOVLaneInstruction(MCInst *Inst, unsigned Insn,
1093
+ uint64_t Address, const void *Decoder)
1094
+ {
1095
+ // This decoder exists to add the dummy Lane operand to the MCInst, which must
1096
+ // be 1 in assembly but has no other real manifestation.
1097
+ unsigned Rd = fieldFromInstruction_4(Insn, 0, 5);
1098
+ unsigned Rn = fieldFromInstruction_4(Insn, 5, 5);
1099
+ unsigned IsToVec = fieldFromInstruction_4(Insn, 16, 1);
1100
+
1101
+ if (IsToVec) {
1102
+ DecodeFPR128RegisterClass(Inst, Rd, Address, Decoder);
1103
+ DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
1104
+ } else {
1105
+ DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
1106
+ DecodeFPR128RegisterClass(Inst, Rn, Address, Decoder);
1107
+ }
1108
+
1109
+ // Add the lane
1110
+ MCOperand_CreateImm0(Inst, 1);
1111
+
1112
+ return Success;
1113
+ }
1114
+
1115
+ static DecodeStatus DecodeVecShiftRImm(MCInst *Inst, unsigned Imm,
1116
+ unsigned Add)
1117
+ {
1118
+ MCOperand_CreateImm0(Inst, Add - Imm);
1119
+
1120
+ return Success;
1121
+ }
1122
+
1123
+ static DecodeStatus DecodeVecShiftLImm(MCInst *Inst, unsigned Imm,
1124
+ unsigned Add)
1125
+ {
1126
+ MCOperand_CreateImm0(Inst, (Imm + Add) & (Add - 1));
1127
+
1128
+ return Success;
1129
+ }
1130
+
1131
+ static DecodeStatus DecodeVecShiftR64Imm(MCInst *Inst, unsigned Imm,
1132
+ uint64_t Addr, const void *Decoder)
1133
+ {
1134
+ return DecodeVecShiftRImm(Inst, Imm, 64);
1135
+ }
1136
+
1137
+ static DecodeStatus DecodeVecShiftR64ImmNarrow(MCInst *Inst, unsigned Imm,
1138
+ uint64_t Addr, const void *Decoder)
1139
+ {
1140
+ return DecodeVecShiftRImm(Inst, Imm | 0x20, 64);
1141
+ }
1142
+
1143
+ static DecodeStatus DecodeVecShiftR32Imm(MCInst *Inst, unsigned Imm,
1144
+ uint64_t Addr, const void *Decoder)
1145
+ {
1146
+ return DecodeVecShiftRImm(Inst, Imm, 32);
1147
+ }
1148
+
1149
+ static DecodeStatus DecodeVecShiftR32ImmNarrow(MCInst *Inst, unsigned Imm,
1150
+ uint64_t Addr, const void *Decoder)
1151
+ {
1152
+ return DecodeVecShiftRImm(Inst, Imm | 0x10, 32);
1153
+ }
1154
+
1155
+ static DecodeStatus DecodeVecShiftR16Imm(MCInst *Inst, unsigned Imm,
1156
+ uint64_t Addr, const void *Decoder)
1157
+ {
1158
+ return DecodeVecShiftRImm(Inst, Imm, 16);
1159
+ }
1160
+
1161
+ static DecodeStatus DecodeVecShiftR16ImmNarrow(MCInst *Inst, unsigned Imm,
1162
+ uint64_t Addr, const void *Decoder)
1163
+ {
1164
+ return DecodeVecShiftRImm(Inst, Imm | 0x8, 16);
1165
+ }
1166
+
1167
+ static DecodeStatus DecodeVecShiftR8Imm(MCInst *Inst, unsigned Imm,
1168
+ uint64_t Addr, const void *Decoder)
1169
+ {
1170
+ return DecodeVecShiftRImm(Inst, Imm, 8);
1171
+ }
1172
+
1173
+ static DecodeStatus DecodeVecShiftL64Imm(MCInst *Inst, unsigned Imm,
1174
+ uint64_t Addr, const void *Decoder)
1175
+ {
1176
+ return DecodeVecShiftLImm(Inst, Imm, 64);
1177
+ }
1178
+
1179
+ static DecodeStatus DecodeVecShiftL32Imm(MCInst *Inst, unsigned Imm,
1180
+ uint64_t Addr, const void *Decoder)
1181
+ {
1182
+ return DecodeVecShiftLImm(Inst, Imm, 32);
1183
+ }
1184
+
1185
+ static DecodeStatus DecodeVecShiftL16Imm(MCInst *Inst, unsigned Imm,
1186
+ uint64_t Addr, const void *Decoder)
1187
+ {
1188
+ return DecodeVecShiftLImm(Inst, Imm, 16);
1189
+ }
1190
+
1191
+ static DecodeStatus DecodeVecShiftL8Imm(MCInst *Inst, unsigned Imm,
1192
+ uint64_t Addr, const void *Decoder)
1193
+ {
1194
+ return DecodeVecShiftLImm(Inst, Imm, 8);
1195
+ }
1196
+
1197
+ static DecodeStatus DecodeThreeAddrSRegInstruction(MCInst *Inst,
1198
+ uint32_t insn, uint64_t Addr, const void *Decoder)
1199
+ {
1200
+ unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1201
+ unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1202
+ unsigned Rm = fieldFromInstruction_4(insn, 16, 5);
1203
+ unsigned shiftHi = fieldFromInstruction_4(insn, 22, 2);
1204
+ unsigned shiftLo = fieldFromInstruction_4(insn, 10, 6);
1205
+ unsigned shift = (shiftHi << 6) | shiftLo;
1206
+
1207
+ switch (MCInst_getOpcode(Inst)) {
1208
+ default:
1209
+ return Fail;
1210
+
1211
+ case AArch64_ADDWrs:
1212
+ case AArch64_ADDSWrs:
1213
+ case AArch64_SUBWrs:
1214
+ case AArch64_SUBSWrs:
1215
+ // if shift == '11' then ReservedValue()
1216
+ if (shiftHi == 0x3)
1217
+ return Fail;
1218
+ // Deliberate fallthrough
1219
+
1220
+ case AArch64_ANDWrs:
1221
+ case AArch64_ANDSWrs:
1222
+ case AArch64_BICWrs:
1223
+ case AArch64_BICSWrs:
1224
+ case AArch64_ORRWrs:
1225
+ case AArch64_ORNWrs:
1226
+ case AArch64_EORWrs:
1227
+ case AArch64_EONWrs: {
1228
+ // if sf == '0' and imm6<5> == '1' then ReservedValue()
1229
+ if (shiftLo >> 5 == 1)
1230
+ return Fail;
1231
+
1232
+ DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1233
+ DecodeGPR32RegisterClass(Inst, Rn, Addr, Decoder);
1234
+ DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1235
+ break;
1236
+ }
1237
+
1238
+ case AArch64_ADDXrs:
1239
+ case AArch64_ADDSXrs:
1240
+ case AArch64_SUBXrs:
1241
+ case AArch64_SUBSXrs:
1242
+ // if shift == '11' then ReservedValue()
1243
+ if (shiftHi == 0x3)
1244
+ return Fail;
1245
+ // Deliberate fallthrough
1246
+
1247
+ case AArch64_ANDXrs:
1248
+ case AArch64_ANDSXrs:
1249
+ case AArch64_BICXrs:
1250
+ case AArch64_BICSXrs:
1251
+ case AArch64_ORRXrs:
1252
+ case AArch64_ORNXrs:
1253
+ case AArch64_EORXrs:
1254
+ case AArch64_EONXrs:
1255
+ DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1256
+ DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
1257
+ DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1258
+ break;
1259
+ }
1260
+
1261
+ MCOperand_CreateImm0(Inst, shift);
1262
+
1263
+ return Success;
1264
+ }
1265
+
1266
+ static DecodeStatus DecodeMoveImmInstruction(MCInst *Inst, uint32_t insn,
1267
+ uint64_t Addr, const void *Decoder)
1268
+ {
1269
+ unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1270
+ unsigned imm = fieldFromInstruction_4(insn, 5, 16);
1271
+ unsigned shift = fieldFromInstruction_4(insn, 21, 2);
1272
+
1273
+ shift <<= 4;
1274
+
1275
+ switch (MCInst_getOpcode(Inst)) {
1276
+ default:
1277
+ return Fail;
1278
+
1279
+ case AArch64_MOVZWi:
1280
+ case AArch64_MOVNWi:
1281
+ case AArch64_MOVKWi:
1282
+ if (shift & (1U << 5))
1283
+ return Fail;
1284
+ DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1285
+ break;
1286
+
1287
+ case AArch64_MOVZXi:
1288
+ case AArch64_MOVNXi:
1289
+ case AArch64_MOVKXi:
1290
+ DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1291
+ break;
1292
+ }
1293
+
1294
+ if (MCInst_getOpcode(Inst) == AArch64_MOVKWi ||
1295
+ MCInst_getOpcode(Inst) == AArch64_MOVKXi)
1296
+ MCInst_addOperand2(Inst, MCInst_getOperand(Inst, 0));
1297
+
1298
+ MCOperand_CreateImm0(Inst, imm);
1299
+ MCOperand_CreateImm0(Inst, shift);
1300
+
1301
+ return Success;
1302
+ }
1303
+
1304
+ static DecodeStatus DecodeUnsignedLdStInstruction(MCInst *Inst,
1305
+ uint32_t insn, uint64_t Addr, const void *Decoder)
1306
+ {
1307
+ unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
1308
+ unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1309
+ unsigned offset = fieldFromInstruction_4(insn, 10, 12);
1310
+
1311
+ switch (MCInst_getOpcode(Inst)) {
1312
+ default:
1313
+ return Fail;
1314
+
1315
+ case AArch64_PRFMui:
1316
+ // Rt is an immediate in prefetch.
1317
+ MCOperand_CreateImm0(Inst, Rt);
1318
+ break;
1319
+
1320
+ case AArch64_STRBBui:
1321
+ case AArch64_LDRBBui:
1322
+ case AArch64_LDRSBWui:
1323
+ case AArch64_STRHHui:
1324
+ case AArch64_LDRHHui:
1325
+ case AArch64_LDRSHWui:
1326
+ case AArch64_STRWui:
1327
+ case AArch64_LDRWui:
1328
+ DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1329
+ break;
1330
+
1331
+ case AArch64_LDRSBXui:
1332
+ case AArch64_LDRSHXui:
1333
+ case AArch64_LDRSWui:
1334
+ case AArch64_STRXui:
1335
+ case AArch64_LDRXui:
1336
+ DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1337
+ break;
1338
+
1339
+ case AArch64_LDRQui:
1340
+ case AArch64_STRQui:
1341
+ DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1342
+ break;
1343
+
1344
+ case AArch64_LDRDui:
1345
+ case AArch64_STRDui:
1346
+ DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1347
+ break;
1348
+
1349
+ case AArch64_LDRSui:
1350
+ case AArch64_STRSui:
1351
+ DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1352
+ break;
1353
+
1354
+ case AArch64_LDRHui:
1355
+ case AArch64_STRHui:
1356
+ DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
1357
+ break;
1358
+
1359
+ case AArch64_LDRBui:
1360
+ case AArch64_STRBui:
1361
+ DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
1362
+ break;
1363
+ }
1364
+
1365
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1366
+
1367
+ //if (!Dis->tryAddingSymbolicOperand(Inst, offset, Addr, Fail, 0, 4))
1368
+ MCOperand_CreateImm0(Inst, offset);
1369
+
1370
+ return Success;
1371
+ }
1372
+
1373
+ static DecodeStatus DecodeSignedLdStInstruction(MCInst *Inst,
1374
+ uint32_t insn, uint64_t Addr, const void *Decoder)
1375
+ {
1376
+ bool IsLoad, IsIndexed, IsFP;
1377
+ unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
1378
+ unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1379
+ int64_t offset = fieldFromInstruction_4(insn, 12, 9);
1380
+
1381
+ // offset is a 9-bit signed immediate, so sign extend it to
1382
+ // fill the unsigned.
1383
+ if (offset & (1 << (9 - 1)))
1384
+ offset |= ~((1LL << 9) - 1);
1385
+
1386
+ // First operand is always the writeback to the address register, if needed.
1387
+ switch (MCInst_getOpcode(Inst)) {
1388
+ default:
1389
+ break;
1390
+
1391
+ case AArch64_LDRSBWpre:
1392
+ case AArch64_LDRSHWpre:
1393
+ case AArch64_STRBBpre:
1394
+ case AArch64_LDRBBpre:
1395
+ case AArch64_STRHHpre:
1396
+ case AArch64_LDRHHpre:
1397
+ case AArch64_STRWpre:
1398
+ case AArch64_LDRWpre:
1399
+ case AArch64_LDRSBWpost:
1400
+ case AArch64_LDRSHWpost:
1401
+ case AArch64_STRBBpost:
1402
+ case AArch64_LDRBBpost:
1403
+ case AArch64_STRHHpost:
1404
+ case AArch64_LDRHHpost:
1405
+ case AArch64_STRWpost:
1406
+ case AArch64_LDRWpost:
1407
+ case AArch64_LDRSBXpre:
1408
+ case AArch64_LDRSHXpre:
1409
+ case AArch64_STRXpre:
1410
+ case AArch64_LDRSWpre:
1411
+ case AArch64_LDRXpre:
1412
+ case AArch64_LDRSBXpost:
1413
+ case AArch64_LDRSHXpost:
1414
+ case AArch64_STRXpost:
1415
+ case AArch64_LDRSWpost:
1416
+ case AArch64_LDRXpost:
1417
+ case AArch64_LDRQpre:
1418
+ case AArch64_STRQpre:
1419
+ case AArch64_LDRQpost:
1420
+ case AArch64_STRQpost:
1421
+ case AArch64_LDRDpre:
1422
+ case AArch64_STRDpre:
1423
+ case AArch64_LDRDpost:
1424
+ case AArch64_STRDpost:
1425
+ case AArch64_LDRSpre:
1426
+ case AArch64_STRSpre:
1427
+ case AArch64_LDRSpost:
1428
+ case AArch64_STRSpost:
1429
+ case AArch64_LDRHpre:
1430
+ case AArch64_STRHpre:
1431
+ case AArch64_LDRHpost:
1432
+ case AArch64_STRHpost:
1433
+ case AArch64_LDRBpre:
1434
+ case AArch64_STRBpre:
1435
+ case AArch64_LDRBpost:
1436
+ case AArch64_STRBpost:
1437
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1438
+ break;
1439
+ }
1440
+
1441
+ switch (MCInst_getOpcode(Inst)) {
1442
+ default:
1443
+ return Fail;
1444
+
1445
+ case AArch64_PRFUMi:
1446
+ // Rt is an immediate in prefetch.
1447
+ MCOperand_CreateImm0(Inst, Rt);
1448
+ break;
1449
+
1450
+ case AArch64_STURBBi:
1451
+ case AArch64_LDURBBi:
1452
+ case AArch64_LDURSBWi:
1453
+ case AArch64_STURHHi:
1454
+ case AArch64_LDURHHi:
1455
+ case AArch64_LDURSHWi:
1456
+ case AArch64_STURWi:
1457
+ case AArch64_LDURWi:
1458
+ case AArch64_LDTRSBWi:
1459
+ case AArch64_LDTRSHWi:
1460
+ case AArch64_STTRWi:
1461
+ case AArch64_LDTRWi:
1462
+ case AArch64_STTRHi:
1463
+ case AArch64_LDTRHi:
1464
+ case AArch64_LDTRBi:
1465
+ case AArch64_STTRBi:
1466
+ case AArch64_LDRSBWpre:
1467
+ case AArch64_LDRSHWpre:
1468
+ case AArch64_STRBBpre:
1469
+ case AArch64_LDRBBpre:
1470
+ case AArch64_STRHHpre:
1471
+ case AArch64_LDRHHpre:
1472
+ case AArch64_STRWpre:
1473
+ case AArch64_LDRWpre:
1474
+ case AArch64_LDRSBWpost:
1475
+ case AArch64_LDRSHWpost:
1476
+ case AArch64_STRBBpost:
1477
+ case AArch64_LDRBBpost:
1478
+ case AArch64_STRHHpost:
1479
+ case AArch64_LDRHHpost:
1480
+ case AArch64_STRWpost:
1481
+ case AArch64_LDRWpost:
1482
+ case AArch64_STLURBi:
1483
+ case AArch64_STLURHi:
1484
+ case AArch64_STLURWi:
1485
+ case AArch64_LDAPURBi:
1486
+ case AArch64_LDAPURSBWi:
1487
+ case AArch64_LDAPURHi:
1488
+ case AArch64_LDAPURSHWi:
1489
+ case AArch64_LDAPURi:
1490
+ DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1491
+ break;
1492
+
1493
+ case AArch64_LDURSBXi:
1494
+ case AArch64_LDURSHXi:
1495
+ case AArch64_LDURSWi:
1496
+ case AArch64_STURXi:
1497
+ case AArch64_LDURXi:
1498
+ case AArch64_LDTRSBXi:
1499
+ case AArch64_LDTRSHXi:
1500
+ case AArch64_LDTRSWi:
1501
+ case AArch64_STTRXi:
1502
+ case AArch64_LDTRXi:
1503
+ case AArch64_LDRSBXpre:
1504
+ case AArch64_LDRSHXpre:
1505
+ case AArch64_STRXpre:
1506
+ case AArch64_LDRSWpre:
1507
+ case AArch64_LDRXpre:
1508
+ case AArch64_LDRSBXpost:
1509
+ case AArch64_LDRSHXpost:
1510
+ case AArch64_STRXpost:
1511
+ case AArch64_LDRSWpost:
1512
+ case AArch64_LDRXpost:
1513
+ case AArch64_LDAPURSWi:
1514
+ case AArch64_LDAPURSHXi:
1515
+ case AArch64_LDAPURSBXi:
1516
+ case AArch64_STLURXi:
1517
+ case AArch64_LDAPURXi:
1518
+ DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1519
+ break;
1520
+
1521
+ case AArch64_LDURQi:
1522
+ case AArch64_STURQi:
1523
+ case AArch64_LDRQpre:
1524
+ case AArch64_STRQpre:
1525
+ case AArch64_LDRQpost:
1526
+ case AArch64_STRQpost:
1527
+ DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1528
+ break;
1529
+
1530
+ case AArch64_LDURDi:
1531
+ case AArch64_STURDi:
1532
+ case AArch64_LDRDpre:
1533
+ case AArch64_STRDpre:
1534
+ case AArch64_LDRDpost:
1535
+ case AArch64_STRDpost:
1536
+ DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1537
+ break;
1538
+
1539
+ case AArch64_LDURSi:
1540
+ case AArch64_STURSi:
1541
+ case AArch64_LDRSpre:
1542
+ case AArch64_STRSpre:
1543
+ case AArch64_LDRSpost:
1544
+ case AArch64_STRSpost:
1545
+ DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1546
+ break;
1547
+
1548
+ case AArch64_LDURHi:
1549
+ case AArch64_STURHi:
1550
+ case AArch64_LDRHpre:
1551
+ case AArch64_STRHpre:
1552
+ case AArch64_LDRHpost:
1553
+ case AArch64_STRHpost:
1554
+ DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
1555
+ break;
1556
+
1557
+ case AArch64_LDURBi:
1558
+ case AArch64_STURBi:
1559
+ case AArch64_LDRBpre:
1560
+ case AArch64_STRBpre:
1561
+ case AArch64_LDRBpost:
1562
+ case AArch64_STRBpost:
1563
+ DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
1564
+ break;
1565
+ }
1566
+
1567
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1568
+ MCOperand_CreateImm0(Inst, offset);
1569
+
1570
+ IsLoad = fieldFromInstruction_4(insn, 22, 1) != 0;
1571
+ IsIndexed = fieldFromInstruction_4(insn, 10, 2) != 0;
1572
+ IsFP = fieldFromInstruction_4(insn, 26, 1) != 0;
1573
+
1574
+ // Cannot write back to a transfer register (but xzr != sp).
1575
+ if (IsLoad && IsIndexed && !IsFP && Rn != 31 && Rt == Rn)
1576
+ return SoftFail;
1577
+
1578
+ return Success;
1579
+ }
1580
+
1581
+ static DecodeStatus DecodeExclusiveLdStInstruction(MCInst *Inst,
1582
+ uint32_t insn, uint64_t Addr, const void *Decoder)
1583
+ {
1584
+ unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
1585
+ unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1586
+ unsigned Rt2 = fieldFromInstruction_4(insn, 10, 5);
1587
+ unsigned Rs = fieldFromInstruction_4(insn, 16, 5);
1588
+ unsigned Opcode = MCInst_getOpcode(Inst);
1589
+
1590
+ switch (Opcode) {
1591
+ default:
1592
+ return Fail;
1593
+
1594
+ case AArch64_STLXRW:
1595
+ case AArch64_STLXRB:
1596
+ case AArch64_STLXRH:
1597
+ case AArch64_STXRW:
1598
+ case AArch64_STXRB:
1599
+ case AArch64_STXRH:
1600
+ DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1601
+ // FALLTHROUGH
1602
+ case AArch64_LDARW:
1603
+ case AArch64_LDARB:
1604
+ case AArch64_LDARH:
1605
+ case AArch64_LDAXRW:
1606
+ case AArch64_LDAXRB:
1607
+ case AArch64_LDAXRH:
1608
+ case AArch64_LDXRW:
1609
+ case AArch64_LDXRB:
1610
+ case AArch64_LDXRH:
1611
+ case AArch64_STLRW:
1612
+ case AArch64_STLRB:
1613
+ case AArch64_STLRH:
1614
+ case AArch64_STLLRW:
1615
+ case AArch64_STLLRB:
1616
+ case AArch64_STLLRH:
1617
+ case AArch64_LDLARW:
1618
+ case AArch64_LDLARB:
1619
+ case AArch64_LDLARH:
1620
+ DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1621
+ break;
1622
+
1623
+ case AArch64_STLXRX:
1624
+ case AArch64_STXRX:
1625
+ DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1626
+ // FALLTHROUGH
1627
+ case AArch64_LDARX:
1628
+ case AArch64_LDAXRX:
1629
+ case AArch64_LDXRX:
1630
+ case AArch64_STLRX:
1631
+ case AArch64_LDLARX:
1632
+ case AArch64_STLLRX:
1633
+ DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1634
+ break;
1635
+
1636
+ case AArch64_STLXPW:
1637
+ case AArch64_STXPW:
1638
+ DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1639
+ // FALLTHROUGH
1640
+ case AArch64_LDAXPW:
1641
+ case AArch64_LDXPW:
1642
+ DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1643
+ DecodeGPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1644
+ break;
1645
+
1646
+ case AArch64_STLXPX:
1647
+ case AArch64_STXPX:
1648
+ DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1649
+ // FALLTHROUGH
1650
+ case AArch64_LDAXPX:
1651
+ case AArch64_LDXPX:
1652
+ DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1653
+ DecodeGPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1654
+ break;
1655
+ }
1656
+
1657
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1658
+
1659
+ // You shouldn't load to the same register twice in an instruction...
1660
+ if ((Opcode == AArch64_LDAXPW || Opcode == AArch64_LDXPW ||
1661
+ Opcode == AArch64_LDAXPX || Opcode == AArch64_LDXPX) &&
1662
+ Rt == Rt2)
1663
+ return SoftFail;
1664
+
1665
+ return Success;
1666
+ }
1667
+
1668
+ static DecodeStatus DecodePairLdStInstruction(MCInst *Inst, uint32_t insn,
1669
+ uint64_t Addr, const void *Decoder)
1670
+ {
1671
+ unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
1672
+ unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1673
+ unsigned Rt2 = fieldFromInstruction_4(insn, 10, 5);
1674
+ int32_t offset = fieldFromInstruction_4(insn, 15, 7);
1675
+ bool IsLoad = fieldFromInstruction_4(insn, 22, 1) != 0;
1676
+ unsigned Opcode = MCInst_getOpcode(Inst);
1677
+ bool NeedsDisjointWritebackTransfer = false;
1678
+
1679
+ // offset is a 7-bit signed immediate, so sign extend it to
1680
+ // fill the unsigned.
1681
+ if (offset & (1 << (7 - 1)))
1682
+ offset |= ~((1LL << 7) - 1);
1683
+
1684
+ // First operand is always writeback of base register.
1685
+ switch (Opcode) {
1686
+ default:
1687
+ break;
1688
+
1689
+ case AArch64_LDPXpost:
1690
+ case AArch64_STPXpost:
1691
+ case AArch64_LDPSWpost:
1692
+ case AArch64_LDPXpre:
1693
+ case AArch64_STPXpre:
1694
+ case AArch64_LDPSWpre:
1695
+ case AArch64_LDPWpost:
1696
+ case AArch64_STPWpost:
1697
+ case AArch64_LDPWpre:
1698
+ case AArch64_STPWpre:
1699
+ case AArch64_LDPQpost:
1700
+ case AArch64_STPQpost:
1701
+ case AArch64_LDPQpre:
1702
+ case AArch64_STPQpre:
1703
+ case AArch64_LDPDpost:
1704
+ case AArch64_STPDpost:
1705
+ case AArch64_LDPDpre:
1706
+ case AArch64_STPDpre:
1707
+ case AArch64_LDPSpost:
1708
+ case AArch64_STPSpost:
1709
+ case AArch64_LDPSpre:
1710
+ case AArch64_STPSpre:
1711
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1712
+ break;
1713
+ }
1714
+
1715
+ switch (Opcode) {
1716
+ default:
1717
+ return Fail;
1718
+
1719
+ case AArch64_LDPXpost:
1720
+ case AArch64_STPXpost:
1721
+ case AArch64_LDPSWpost:
1722
+ case AArch64_LDPXpre:
1723
+ case AArch64_STPXpre:
1724
+ case AArch64_LDPSWpre:
1725
+ NeedsDisjointWritebackTransfer = true;
1726
+ // Fallthrough
1727
+ case AArch64_LDNPXi:
1728
+ case AArch64_STNPXi:
1729
+ case AArch64_LDPXi:
1730
+ case AArch64_STPXi:
1731
+ case AArch64_LDPSWi:
1732
+ DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1733
+ DecodeGPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1734
+ break;
1735
+
1736
+ case AArch64_LDPWpost:
1737
+ case AArch64_STPWpost:
1738
+ case AArch64_LDPWpre:
1739
+ case AArch64_STPWpre:
1740
+ NeedsDisjointWritebackTransfer = true;
1741
+ // Fallthrough
1742
+ case AArch64_LDNPWi:
1743
+ case AArch64_STNPWi:
1744
+ case AArch64_LDPWi:
1745
+ case AArch64_STPWi:
1746
+ DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1747
+ DecodeGPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1748
+ break;
1749
+
1750
+ case AArch64_LDNPQi:
1751
+ case AArch64_STNPQi:
1752
+ case AArch64_LDPQpost:
1753
+ case AArch64_STPQpost:
1754
+ case AArch64_LDPQi:
1755
+ case AArch64_STPQi:
1756
+ case AArch64_LDPQpre:
1757
+ case AArch64_STPQpre:
1758
+ DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1759
+ DecodeFPR128RegisterClass(Inst, Rt2, Addr, Decoder);
1760
+ break;
1761
+
1762
+ case AArch64_LDNPDi:
1763
+ case AArch64_STNPDi:
1764
+ case AArch64_LDPDpost:
1765
+ case AArch64_STPDpost:
1766
+ case AArch64_LDPDi:
1767
+ case AArch64_STPDi:
1768
+ case AArch64_LDPDpre:
1769
+ case AArch64_STPDpre:
1770
+ DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1771
+ DecodeFPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1772
+ break;
1773
+
1774
+ case AArch64_LDNPSi:
1775
+ case AArch64_STNPSi:
1776
+ case AArch64_LDPSpost:
1777
+ case AArch64_STPSpost:
1778
+ case AArch64_LDPSi:
1779
+ case AArch64_STPSi:
1780
+ case AArch64_LDPSpre:
1781
+ case AArch64_STPSpre:
1782
+ DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1783
+ DecodeFPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1784
+ break;
1785
+ }
1786
+
1787
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1788
+ MCOperand_CreateImm0(Inst, offset);
1789
+
1790
+ // You shouldn't load to the same register twice in an instruction...
1791
+ if (IsLoad && Rt == Rt2)
1792
+ return SoftFail;
1793
+
1794
+ // ... or do any operation that writes-back to a transfer register. But note
1795
+ // that "stp xzr, xzr, [sp], #4" is fine because xzr and sp are different.
1796
+ if (NeedsDisjointWritebackTransfer && Rn != 31 && (Rt == Rn || Rt2 == Rn))
1797
+ return SoftFail;
1798
+
1799
+ return Success;
1800
+ }
1801
+
1802
+ static DecodeStatus DecodeAuthLoadInstruction(MCInst *Inst, uint32_t insn,
1803
+ uint64_t Addr, const void *Decoder)
1804
+ {
1805
+ unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
1806
+ unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1807
+ uint64_t offset = fieldFromInstruction_4(insn, 22, 1) << 9 |
1808
+ fieldFromInstruction_4(insn, 12, 9);
1809
+ unsigned writeback = fieldFromInstruction_4(insn, 11, 1);
1810
+
1811
+ switch (MCInst_getOpcode(Inst)) {
1812
+ default:
1813
+ return Fail;
1814
+ case AArch64_LDRAAwriteback:
1815
+ case AArch64_LDRABwriteback:
1816
+ DecodeGPR64spRegisterClass(Inst, Rn /* writeback register */, Addr,
1817
+ Decoder);
1818
+ break;
1819
+ case AArch64_LDRAAindexed:
1820
+ case AArch64_LDRABindexed:
1821
+ break;
1822
+ }
1823
+
1824
+ DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1825
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1826
+ DecodeSImm(Inst, offset, Addr, Decoder, 10);
1827
+
1828
+ if (writeback && Rt == Rn && Rn != 31) {
1829
+ return SoftFail;
1830
+ }
1831
+
1832
+ return Success;
1833
+ }
1834
+
1835
+ static DecodeStatus DecodeAddSubERegInstruction(MCInst *Inst,
1836
+ uint32_t insn, uint64_t Addr, const void *Decoder)
1837
+ {
1838
+ unsigned Rd, Rn, Rm;
1839
+ unsigned extend = fieldFromInstruction_4(insn, 10, 6);
1840
+ unsigned shift = extend & 0x7;
1841
+
1842
+ if (shift > 4)
1843
+ return Fail;
1844
+
1845
+ Rd = fieldFromInstruction_4(insn, 0, 5);
1846
+ Rn = fieldFromInstruction_4(insn, 5, 5);
1847
+ Rm = fieldFromInstruction_4(insn, 16, 5);
1848
+
1849
+ switch (MCInst_getOpcode(Inst)) {
1850
+ default:
1851
+ return Fail;
1852
+
1853
+ case AArch64_ADDWrx:
1854
+ case AArch64_SUBWrx:
1855
+ DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1856
+ DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1857
+ DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1858
+ break;
1859
+
1860
+ case AArch64_ADDSWrx:
1861
+ case AArch64_SUBSWrx:
1862
+ DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1863
+ DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1864
+ DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1865
+ break;
1866
+
1867
+ case AArch64_ADDXrx:
1868
+ case AArch64_SUBXrx:
1869
+ DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1870
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1871
+ DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1872
+ break;
1873
+
1874
+ case AArch64_ADDSXrx:
1875
+ case AArch64_SUBSXrx:
1876
+ DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1877
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1878
+ DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1879
+ break;
1880
+
1881
+ case AArch64_ADDXrx64:
1882
+ case AArch64_SUBXrx64:
1883
+ DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1884
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1885
+ DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1886
+ break;
1887
+
1888
+ case AArch64_SUBSXrx64:
1889
+ case AArch64_ADDSXrx64:
1890
+ DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1891
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1892
+ DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1893
+ break;
1894
+ }
1895
+
1896
+ MCOperand_CreateImm0(Inst, extend);
1897
+
1898
+ return Success;
1899
+ }
1900
+
1901
+ static DecodeStatus DecodeLogicalImmInstruction(MCInst *Inst,
1902
+ uint32_t insn, uint64_t Addr, const void *Decoder)
1903
+ {
1904
+ unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1905
+ unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1906
+ unsigned Datasize = fieldFromInstruction_4(insn, 31, 1);
1907
+ unsigned imm;
1908
+
1909
+ if (Datasize) {
1910
+ if (MCInst_getOpcode(Inst) == AArch64_ANDSXri)
1911
+ DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1912
+ else
1913
+ DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1914
+
1915
+ DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
1916
+
1917
+ imm = fieldFromInstruction_4(insn, 10, 13);
1918
+ if (!AArch64_AM_isValidDecodeLogicalImmediate(imm, 64))
1919
+ return Fail;
1920
+ } else {
1921
+ if (MCInst_getOpcode(Inst) == AArch64_ANDSWri)
1922
+ DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1923
+ else
1924
+ DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1925
+
1926
+ DecodeGPR32RegisterClass(Inst, Rn, Addr, Decoder);
1927
+
1928
+ imm = fieldFromInstruction_4(insn, 10, 12);
1929
+ if (!AArch64_AM_isValidDecodeLogicalImmediate(imm, 32))
1930
+ return Fail;
1931
+ }
1932
+
1933
+ MCOperand_CreateImm0(Inst, imm);
1934
+
1935
+ return Success;
1936
+ }
1937
+
1938
+ static DecodeStatus DecodeModImmInstruction(MCInst *Inst, uint32_t insn,
1939
+ uint64_t Addr, const void *Decoder)
1940
+ {
1941
+ unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1942
+ unsigned cmode = fieldFromInstruction_4(insn, 12, 4);
1943
+ unsigned imm = fieldFromInstruction_4(insn, 16, 3) << 5;
1944
+ imm |= fieldFromInstruction_4(insn, 5, 5);
1945
+
1946
+ if (MCInst_getOpcode(Inst) == AArch64_MOVID)
1947
+ DecodeFPR64RegisterClass(Inst, Rd, Addr, Decoder);
1948
+ else
1949
+ DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1950
+
1951
+ MCOperand_CreateImm0(Inst, imm);
1952
+
1953
+ switch (MCInst_getOpcode(Inst)) {
1954
+ default:
1955
+ break;
1956
+
1957
+ case AArch64_MOVIv4i16:
1958
+ case AArch64_MOVIv8i16:
1959
+ case AArch64_MVNIv4i16:
1960
+ case AArch64_MVNIv8i16:
1961
+ case AArch64_MOVIv2i32:
1962
+ case AArch64_MOVIv4i32:
1963
+ case AArch64_MVNIv2i32:
1964
+ case AArch64_MVNIv4i32:
1965
+ MCOperand_CreateImm0(Inst, (cmode & 6) << 2);
1966
+ break;
1967
+
1968
+ case AArch64_MOVIv2s_msl:
1969
+ case AArch64_MOVIv4s_msl:
1970
+ case AArch64_MVNIv2s_msl:
1971
+ case AArch64_MVNIv4s_msl:
1972
+ MCOperand_CreateImm0(Inst, cmode & 1 ? 0x110 : 0x108);
1973
+ break;
1974
+ }
1975
+
1976
+ return Success;
1977
+ }
1978
+
1979
+ static DecodeStatus DecodeModImmTiedInstruction(MCInst *Inst,
1980
+ uint32_t insn, uint64_t Addr, const void *Decoder)
1981
+ {
1982
+ unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1983
+ unsigned cmode = fieldFromInstruction_4(insn, 12, 4);
1984
+ unsigned imm = fieldFromInstruction_4(insn, 16, 3) << 5;
1985
+ imm |= fieldFromInstruction_4(insn, 5, 5);
1986
+
1987
+ // Tied operands added twice.
1988
+ DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1989
+ DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1990
+
1991
+ MCOperand_CreateImm0(Inst, imm);
1992
+ MCOperand_CreateImm0(Inst, (cmode & 6) << 2);
1993
+
1994
+ return Success;
1995
+ }
1996
+
1997
+ static DecodeStatus DecodeAdrInstruction(MCInst *Inst, uint32_t insn,
1998
+ uint64_t Addr, const void *Decoder)
1999
+ {
2000
+ unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
2001
+ int64_t imm = fieldFromInstruction_4(insn, 5, 19) << 2;
2002
+ imm |= fieldFromInstruction_4(insn, 29, 2);
2003
+
2004
+ // Sign-extend the 21-bit immediate.
2005
+ if (imm & (1 << (21 - 1)))
2006
+ imm |= ~((1LL << 21) - 1);
2007
+
2008
+ DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
2009
+ //if (!Dis->tryAddingSymbolicOperand(Inst, imm, Addr, Fail, 0, 4))
2010
+ MCOperand_CreateImm0(Inst, imm);
2011
+
2012
+ return Success;
2013
+ }
2014
+
2015
+ static DecodeStatus DecodeAddSubImmShift(MCInst *Inst, uint32_t insn,
2016
+ uint64_t Addr, const void *Decoder)
2017
+ {
2018
+ unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
2019
+ unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
2020
+ unsigned Imm = fieldFromInstruction_4(insn, 10, 14);
2021
+ unsigned S = fieldFromInstruction_4(insn, 29, 1);
2022
+ unsigned Datasize = fieldFromInstruction_4(insn, 31, 1);
2023
+
2024
+ unsigned ShifterVal = (Imm >> 12) & 3;
2025
+ unsigned ImmVal = Imm & 0xFFF;
2026
+ // const AArch64Disassembler *Dis =
2027
+ // static_cast<const AArch64Disassembler *>(Decoder);
2028
+
2029
+ if (ShifterVal != 0 && ShifterVal != 1)
2030
+ return Fail;
2031
+
2032
+ if (Datasize) {
2033
+ if (Rd == 31 && !S)
2034
+ DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
2035
+ else
2036
+ DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
2037
+ DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
2038
+ } else {
2039
+ if (Rd == 31 && !S)
2040
+ DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
2041
+ else
2042
+ DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
2043
+ DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
2044
+ }
2045
+
2046
+ // if (!Dis->tryAddingSymbolicOperand(Inst, Imm, Addr, Fail, 0, 4))
2047
+ MCOperand_CreateImm0(Inst, ImmVal);
2048
+
2049
+ MCOperand_CreateImm0(Inst, (12 * ShifterVal));
2050
+ return Success;
2051
+ }
2052
+
2053
+ static DecodeStatus DecodeUnconditionalBranch(MCInst *Inst, uint32_t insn,
2054
+ uint64_t Addr, const void *Decoder)
2055
+ {
2056
+ int64_t imm = fieldFromInstruction_4(insn, 0, 26);
2057
+
2058
+ // Sign-extend the 26-bit immediate.
2059
+ if (imm & (1 << (26 - 1)))
2060
+ imm |= ~((1LL << 26) - 1);
2061
+
2062
+ // if (!Dis->tryAddingSymbolicOperand(Inst, imm << 2, Addr, true, 0, 4))
2063
+ MCOperand_CreateImm0(Inst, imm);
2064
+
2065
+ return Success;
2066
+ }
2067
+
2068
+ static DecodeStatus DecodeSystemPStateInstruction(MCInst *Inst,
2069
+ uint32_t insn, uint64_t Addr, const void *Decoder)
2070
+ {
2071
+ uint32_t op1 = fieldFromInstruction_4(insn, 16, 3);
2072
+ uint32_t op2 = fieldFromInstruction_4(insn, 5, 3);
2073
+ uint32_t crm = fieldFromInstruction_4(insn, 8, 4);
2074
+ uint32_t pstate_field = (op1 << 3) | op2;
2075
+
2076
+ if ((pstate_field == AArch64PState_PAN ||
2077
+ pstate_field == AArch64PState_UAO) && crm > 1)
2078
+ return Fail;
2079
+
2080
+ MCOperand_CreateImm0(Inst, pstate_field);
2081
+ MCOperand_CreateImm0(Inst, crm);
2082
+
2083
+ if (lookupPStateByEncoding(pstate_field))
2084
+ return Success;
2085
+
2086
+ return Fail;
2087
+ }
2088
+
2089
+ static DecodeStatus DecodeTestAndBranch(MCInst *Inst, uint32_t insn,
2090
+ uint64_t Addr, const void *Decoder)
2091
+ {
2092
+ uint32_t Rt = fieldFromInstruction_4(insn, 0, 5);
2093
+ uint32_t bit = fieldFromInstruction_4(insn, 31, 1) << 5;
2094
+ uint64_t dst = fieldFromInstruction_4(insn, 5, 14);
2095
+
2096
+ bit |= fieldFromInstruction_4(insn, 19, 5);
2097
+
2098
+ // Sign-extend 14-bit immediate.
2099
+ if (dst & (1 << (14 - 1)))
2100
+ dst |= ~((1LL << 14) - 1);
2101
+
2102
+ if (fieldFromInstruction_4(insn, 31, 1) == 0)
2103
+ DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
2104
+ else
2105
+ DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
2106
+
2107
+ MCOperand_CreateImm0(Inst, bit);
2108
+
2109
+ //if (!Dis->tryAddingSymbolicOperand(Inst, dst << 2, Addr, true, 0, 4))
2110
+ MCOperand_CreateImm0(Inst, dst);
2111
+
2112
+ return Success;
2113
+ }
2114
+
2115
+ static DecodeStatus DecodeGPRSeqPairsClassRegisterClass(MCInst *Inst,
2116
+ unsigned RegClassID, unsigned RegNo, uint64_t Addr, const void *Decoder)
2117
+ {
2118
+ unsigned Register;
2119
+
2120
+ // Register number must be even (see CASP instruction)
2121
+ if (RegNo & 0x1)
2122
+ return Fail;
2123
+
2124
+ Register = AArch64MCRegisterClasses[RegClassID].RegsBegin[RegNo / 2];
2125
+ MCOperand_CreateReg0(Inst, Register);
2126
+
2127
+ return Success;
2128
+ }
2129
+
2130
+ static DecodeStatus DecodeWSeqPairsClassRegisterClass(MCInst *Inst,
2131
+ unsigned RegNo, uint64_t Addr, const void *Decoder)
2132
+ {
2133
+ return DecodeGPRSeqPairsClassRegisterClass(Inst,
2134
+ AArch64_WSeqPairsClassRegClassID, RegNo, Addr, Decoder);
2135
+ }
2136
+
2137
+ static DecodeStatus DecodeXSeqPairsClassRegisterClass(MCInst *Inst,
2138
+ unsigned RegNo, uint64_t Addr, const void *Decoder)
2139
+ {
2140
+ return DecodeGPRSeqPairsClassRegisterClass(Inst,
2141
+ AArch64_XSeqPairsClassRegClassID, RegNo, Addr, Decoder);
2142
+ }
2143
+
2144
+ static DecodeStatus DecodeSVELogicalImmInstruction(MCInst *Inst, uint32_t insn,
2145
+ uint64_t Addr, const void *Decoder)
2146
+ {
2147
+ unsigned Zdn = fieldFromInstruction_4(insn, 0, 5);
2148
+ unsigned imm = fieldFromInstruction_4(insn, 5, 13);
2149
+
2150
+ if (!AArch64_AM_isValidDecodeLogicalImmediate(imm, 64))
2151
+ return Fail;
2152
+
2153
+ // The same (tied) operand is added twice to the instruction.
2154
+ DecodeZPRRegisterClass(Inst, Zdn, Addr, Decoder);
2155
+ if (MCInst_getOpcode(Inst) != AArch64_DUPM_ZI)
2156
+ DecodeZPRRegisterClass(Inst, Zdn, Addr, Decoder);
2157
+
2158
+ MCOperand_CreateImm0(Inst, imm);
2159
+
2160
+ return Success;
2161
+ }
2162
+
2163
+ static DecodeStatus DecodeSImm(MCInst *Inst, uint64_t Imm, uint64_t Address,
2164
+ const void *Decoder, int Bits)
2165
+ {
2166
+ if (Imm & ~((1LL << Bits) - 1))
2167
+ return Fail;
2168
+
2169
+ // Imm is a signed immediate, so sign extend it.
2170
+ if (Imm & (1 << (Bits - 1)))
2171
+ Imm |= ~((1LL << Bits) - 1);
2172
+
2173
+ MCOperand_CreateImm0(Inst, Imm);
2174
+
2175
+ return Success;
2176
+ }
2177
+
2178
+ // Decode 8-bit signed/unsigned immediate for a given element width.
2179
+ static DecodeStatus DecodeImm8OptLsl(MCInst *Inst, unsigned Imm, uint64_t Addr,
2180
+ const void *Decoder, int ElementWidth)
2181
+ {
2182
+ unsigned Val = (uint8_t)Imm;
2183
+ unsigned Shift = (Imm & 0x100) ? 8 : 0;
2184
+
2185
+ if (ElementWidth == 8 && Shift)
2186
+ return Fail;
2187
+
2188
+ MCOperand_CreateImm0(Inst, Val);
2189
+ MCOperand_CreateImm0(Inst, Shift);
2190
+
2191
+ return Success;
2192
+ }
2193
+
2194
+ // Decode uimm4 ranged from 1-16.
2195
+ static DecodeStatus DecodeSVEIncDecImm(MCInst *Inst, unsigned Imm,
2196
+ uint64_t Addr, const void *Decoder)
2197
+ {
2198
+ MCOperand_CreateImm0(Inst, Imm + 1);
2199
+
2200
+ return Success;
2201
+ }
2202
+
2203
+ static DecodeStatus DecodeSVCROp(MCInst *Inst, unsigned Imm, uint64_t Address,
2204
+ const void *Decoder) {
2205
+ if (lookupSVCRByEncoding(Imm)) {
2206
+ MCOperand_CreateImm0(Inst, Imm);
2207
+ return Success;
2208
+ }
2209
+ return Fail;
2210
+ }
2211
+
2212
+ static DecodeStatus DecodeCPYMemOpInstruction(MCInst *Inst, uint32_t insn,
2213
+ uint64_t Addr, const void *Decoder) {
2214
+ unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
2215
+ unsigned Rs = fieldFromInstruction_4(insn, 16, 5);
2216
+ unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
2217
+
2218
+ // None of the registers may alias: if they do, then the instruction is not
2219
+ // merely unpredictable but actually entirely unallocated.
2220
+ if (Rd == Rs || Rs == Rn || Rd == Rn)
2221
+ return Fail;
2222
+
2223
+ // All three register operands are written back, so they all appear
2224
+ // twice in the operand list, once as outputs and once as inputs.
2225
+ if (!DecodeGPR64commonRegisterClass(Inst, Rd, Addr, Decoder) ||
2226
+ !DecodeGPR64commonRegisterClass(Inst, Rs, Addr, Decoder) ||
2227
+ !DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder) ||
2228
+ !DecodeGPR64commonRegisterClass(Inst, Rd, Addr, Decoder) ||
2229
+ !DecodeGPR64commonRegisterClass(Inst, Rs, Addr, Decoder) ||
2230
+ !DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder))
2231
+ return Fail;
2232
+
2233
+ return Success;
2234
+ }
2235
+
2236
+ static DecodeStatus DecodeSETMemOpInstruction(MCInst *Inst, uint32_t insn,
2237
+ uint64_t Addr, const void *Decoder) {
2238
+ unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
2239
+ unsigned Rm = fieldFromInstruction_4(insn, 16, 5);
2240
+ unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
2241
+
2242
+ // None of the registers may alias: if they do, then the instruction is not
2243
+ // merely unpredictable but actually entirely unallocated.
2244
+ if (Rd == Rm || Rm == Rn || Rd == Rn)
2245
+ return Fail;
2246
+
2247
+ // Rd and Rn (not Rm) register operands are written back, so they appear
2248
+ // twice in the operand list, once as outputs and once as inputs.
2249
+ if (!DecodeGPR64commonRegisterClass(Inst, Rd, Addr, Decoder) ||
2250
+ !DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder) ||
2251
+ !DecodeGPR64commonRegisterClass(Inst, Rd, Addr, Decoder) ||
2252
+ !DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder) ||
2253
+ !DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder))
2254
+ return Fail;
2255
+
2256
+ return Success;
2257
+ }
2258
+
2259
+ void AArch64_init(MCRegisterInfo *MRI)
2260
+ {
2261
+ /*
2262
+ InitMCRegisterInfo(AArch64RegDesc, 661,
2263
+ RA, PC,
2264
+ AArch64MCRegisterClasses, 100,
2265
+ AArch64RegUnitRoots, 115, AArch64RegDiffLists,
2266
+ AArch64LaneMaskLists, AArch64RegStrings, AArch64RegClassStrings,
2267
+ AArch64SubRegIdxLists, 100,
2268
+ AArch64SubRegIdxRanges, AArch64RegEncodingTable);
2269
+ */
2270
+
2271
+ MCRegisterInfo_InitMCRegisterInfo(MRI, AArch64RegDesc, 674,
2272
+ 0, 0,
2273
+ AArch64MCRegisterClasses, 202,
2274
+ 0, 0, AArch64RegDiffLists,
2275
+ 0,
2276
+ AArch64SubRegIdxLists, 100,
2277
+ 0);
2278
+ }
2279
+
2280
+ #endif