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,3029 @@
1
+ //==-- AArch64InstPrinter.cpp - Convert AArch64 MCInst to assembly syntax --==//
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 class prints an AArch64 MCInst to a .s file.
11
+ //
12
+ //===----------------------------------------------------------------------===//
13
+
14
+ /* Capstone Disassembly Engine */
15
+ /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2016 */
16
+
17
+ #ifdef CAPSTONE_HAS_ARM64
18
+
19
+ #include <capstone/platform.h>
20
+ #include <stdio.h>
21
+ #include <stdlib.h>
22
+
23
+ #include "AArch64InstPrinter.h"
24
+ #include "AArch64Disassembler.h"
25
+ #include "AArch64BaseInfo.h"
26
+ #include "../../utils.h"
27
+ #include "../../MCInst.h"
28
+ #include "../../SStream.h"
29
+ #include "../../MCRegisterInfo.h"
30
+ #include "../../MathExtras.h"
31
+
32
+ #include "AArch64Mapping.h"
33
+ #include "AArch64AddressingModes.h"
34
+
35
+ #define GET_REGINFO_ENUM
36
+ #include "AArch64GenRegisterInfo.inc"
37
+
38
+ #define GET_INSTRINFO_ENUM
39
+ #include "AArch64GenInstrInfo.inc"
40
+
41
+ #include "AArch64GenSubtargetInfo.inc"
42
+
43
+
44
+ static const char *getRegisterName(unsigned RegNo, unsigned AltIdx);
45
+ static void printOperand(MCInst *MI, unsigned OpNum, SStream *O);
46
+ static bool printSysAlias(MCInst *MI, SStream *O);
47
+ static char *printAliasInstr(MCInst *MI, SStream *OS, MCRegisterInfo *MRI);
48
+ static void printInstruction(MCInst *MI, SStream *O);
49
+ static void printShifter(MCInst *MI, unsigned OpNum, SStream *O);
50
+ static void printCustomAliasOperand(MCInst *MI, uint64_t Address, unsigned OpIdx,
51
+ unsigned PrintMethodIdx, SStream *OS);
52
+
53
+
54
+ static cs_ac_type get_op_access(cs_struct *h, unsigned int id, unsigned int index)
55
+ {
56
+ #ifndef CAPSTONE_DIET
57
+ const uint8_t *arr = AArch64_get_op_access(h, id);
58
+
59
+ if (arr[index] == CS_AC_IGNORE)
60
+ return 0;
61
+
62
+ return arr[index];
63
+ #else
64
+ return 0;
65
+ #endif
66
+ }
67
+
68
+ static void op_addImm(MCInst *MI, int v)
69
+ {
70
+ if (MI->csh->detail) {
71
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
72
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = v;
73
+ MI->flat_insn->detail->arm64.op_count++;
74
+ }
75
+ }
76
+
77
+ static void set_sme_index(MCInst *MI, bool status)
78
+ {
79
+ // Doing SME Index operand
80
+ MI->csh->doing_SME_Index = status;
81
+
82
+ if (MI->csh->detail != CS_OPT_ON)
83
+ return;
84
+
85
+ if (status) {
86
+ unsigned prevOpNum = MI->flat_insn->detail->arm64.op_count - 1;
87
+ unsigned Reg = MCOperand_getReg(MCInst_getOperand(MI, prevOpNum));
88
+ // Replace previous SME register operand with an OP_SME_INDEX operand
89
+ MI->flat_insn->detail->arm64.operands[prevOpNum].type = ARM64_OP_SME_INDEX;
90
+ MI->flat_insn->detail->arm64.operands[prevOpNum].sme_index.reg = Reg;
91
+ MI->flat_insn->detail->arm64.operands[prevOpNum].sme_index.base = ARM64_REG_INVALID;
92
+ MI->flat_insn->detail->arm64.operands[prevOpNum].sme_index.disp = 0;
93
+ }
94
+ }
95
+
96
+ static void set_mem_access(MCInst *MI, bool status)
97
+ {
98
+ // If status == false, check if this is meant for SME_index
99
+ if(!status && MI->csh->doing_SME_Index) {
100
+ MI->csh->doing_SME_Index = status;
101
+ return;
102
+ }
103
+
104
+ // Doing Memory Operation
105
+ MI->csh->doing_mem = status;
106
+
107
+
108
+ if (MI->csh->detail != CS_OPT_ON)
109
+ return;
110
+
111
+ if (status) {
112
+ #ifndef CAPSTONE_DIET
113
+ uint8_t access;
114
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
115
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
116
+ MI->ac_idx++;
117
+ #endif
118
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_MEM;
119
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.base = ARM64_REG_INVALID;
120
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.index = ARM64_REG_INVALID;
121
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.disp = 0;
122
+ } else {
123
+ // done, create the next operand slot
124
+ MI->flat_insn->detail->arm64.op_count++;
125
+ }
126
+ }
127
+
128
+ void AArch64_printInst(MCInst *MI, SStream *O, void *Info)
129
+ {
130
+ // Check for special encodings and print the canonical alias instead.
131
+ unsigned Opcode = MCInst_getOpcode(MI);
132
+ int LSB, Width;
133
+ char *mnem;
134
+
135
+ // printf(">>> opcode = %u\n", MCInst_getOpcode(MI));
136
+
137
+ if (Opcode == AArch64_SYSxt && printSysAlias(MI, O))
138
+ return;
139
+
140
+ // SBFM/UBFM should print to a nicer aliased form if possible.
141
+ if (Opcode == AArch64_SBFMXri || Opcode == AArch64_SBFMWri ||
142
+ Opcode == AArch64_UBFMXri || Opcode == AArch64_UBFMWri) {
143
+ bool IsSigned = (Opcode == AArch64_SBFMXri || Opcode == AArch64_SBFMWri);
144
+ bool Is64Bit = (Opcode == AArch64_SBFMXri || Opcode == AArch64_UBFMXri);
145
+
146
+ MCOperand *Op0 = MCInst_getOperand(MI, 0);
147
+ MCOperand *Op1 = MCInst_getOperand(MI, 1);
148
+ MCOperand *Op2 = MCInst_getOperand(MI, 2);
149
+ MCOperand *Op3 = MCInst_getOperand(MI, 3);
150
+
151
+ if (MCOperand_isImm(Op2) && MCOperand_getImm(Op2) == 0 && MCOperand_isImm(Op3)) {
152
+ const char *AsmMnemonic = NULL;
153
+
154
+ switch (MCOperand_getImm(Op3)) {
155
+ default:
156
+ break;
157
+
158
+ case 7:
159
+ if (IsSigned)
160
+ AsmMnemonic = "sxtb";
161
+ else if (!Is64Bit)
162
+ AsmMnemonic = "uxtb";
163
+ break;
164
+
165
+ case 15:
166
+ if (IsSigned)
167
+ AsmMnemonic = "sxth";
168
+ else if (!Is64Bit)
169
+ AsmMnemonic = "uxth";
170
+ break;
171
+
172
+ case 31:
173
+ // *xtw is only valid for signed 64-bit operations.
174
+ if (Is64Bit && IsSigned)
175
+ AsmMnemonic = "sxtw";
176
+ break;
177
+ }
178
+
179
+ if (AsmMnemonic) {
180
+ SStream_concat(O, "%s\t%s, %s", AsmMnemonic,
181
+ getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
182
+ getRegisterName(getWRegFromXReg(MCOperand_getReg(Op1)), AArch64_NoRegAltName));
183
+
184
+ if (MI->csh->detail) {
185
+ #ifndef CAPSTONE_DIET
186
+ uint8_t access;
187
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
188
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
189
+ MI->ac_idx++;
190
+ #endif
191
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
192
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
193
+ MI->flat_insn->detail->arm64.op_count++;
194
+ #ifndef CAPSTONE_DIET
195
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
196
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
197
+ MI->ac_idx++;
198
+ #endif
199
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
200
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = getWRegFromXReg(MCOperand_getReg(Op1));
201
+ MI->flat_insn->detail->arm64.op_count++;
202
+ }
203
+
204
+ MCInst_setOpcodePub(MI, AArch64_map_insn(AsmMnemonic));
205
+
206
+ return;
207
+ }
208
+ }
209
+
210
+ // All immediate shifts are aliases, implemented using the Bitfield
211
+ // instruction. In all cases the immediate shift amount shift must be in
212
+ // the range 0 to (reg.size -1).
213
+ if (MCOperand_isImm(Op2) && MCOperand_isImm(Op3)) {
214
+ const char *AsmMnemonic = NULL;
215
+ int shift = 0;
216
+ int immr = (int)MCOperand_getImm(Op2);
217
+ int imms = (int)MCOperand_getImm(Op3);
218
+
219
+ if (Opcode == AArch64_UBFMWri && imms != 0x1F && ((imms + 1) == immr)) {
220
+ AsmMnemonic = "lsl";
221
+ shift = 31 - imms;
222
+ } else if (Opcode == AArch64_UBFMXri && imms != 0x3f &&
223
+ ((imms + 1 == immr))) {
224
+ AsmMnemonic = "lsl";
225
+ shift = 63 - imms;
226
+ } else if (Opcode == AArch64_UBFMWri && imms == 0x1f) {
227
+ AsmMnemonic = "lsr";
228
+ shift = immr;
229
+ } else if (Opcode == AArch64_UBFMXri && imms == 0x3f) {
230
+ AsmMnemonic = "lsr";
231
+ shift = immr;
232
+ } else if (Opcode == AArch64_SBFMWri && imms == 0x1f) {
233
+ AsmMnemonic = "asr";
234
+ shift = immr;
235
+ } else if (Opcode == AArch64_SBFMXri && imms == 0x3f) {
236
+ AsmMnemonic = "asr";
237
+ shift = immr;
238
+ }
239
+
240
+ if (AsmMnemonic) {
241
+ SStream_concat(O, "%s\t%s, %s, ", AsmMnemonic,
242
+ getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
243
+ getRegisterName(MCOperand_getReg(Op1), AArch64_NoRegAltName));
244
+
245
+ printInt32Bang(O, shift);
246
+
247
+ MCInst_setOpcodePub(MI, AArch64_map_insn(AsmMnemonic));
248
+
249
+ if (MI->csh->detail) {
250
+ #ifndef CAPSTONE_DIET
251
+ uint8_t access;
252
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
253
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
254
+ MI->ac_idx++;
255
+ #endif
256
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
257
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
258
+ MI->flat_insn->detail->arm64.op_count++;
259
+ #ifndef CAPSTONE_DIET
260
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
261
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
262
+ MI->ac_idx++;
263
+ #endif
264
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
265
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op1);
266
+ MI->flat_insn->detail->arm64.op_count++;
267
+ #ifndef CAPSTONE_DIET
268
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
269
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
270
+ MI->ac_idx++;
271
+ #endif
272
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
273
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = shift;
274
+ MI->flat_insn->detail->arm64.op_count++;
275
+ }
276
+
277
+ return;
278
+ }
279
+ }
280
+
281
+ // SBFIZ/UBFIZ aliases
282
+ if (MCOperand_getImm(Op2) > MCOperand_getImm(Op3)) {
283
+ SStream_concat(O, "%s\t%s, %s, ", (IsSigned ? "sbfiz" : "ubfiz"),
284
+ getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
285
+ getRegisterName(MCOperand_getReg(Op1), AArch64_NoRegAltName));
286
+
287
+ printInt32Bang(O, (int)((Is64Bit ? 64 : 32) - MCOperand_getImm(Op2)));
288
+
289
+ SStream_concat0(O, ", ");
290
+
291
+ printInt32Bang(O, (int)MCOperand_getImm(Op3) + 1);
292
+
293
+ MCInst_setOpcodePub(MI, AArch64_map_insn(IsSigned ? "sbfiz" : "ubfiz"));
294
+
295
+ if (MI->csh->detail) {
296
+ #ifndef CAPSTONE_DIET
297
+ uint8_t access;
298
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
299
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
300
+ MI->ac_idx++;
301
+ #endif
302
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
303
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
304
+ MI->flat_insn->detail->arm64.op_count++;
305
+ #ifndef CAPSTONE_DIET
306
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
307
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
308
+ MI->ac_idx++;
309
+ #endif
310
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
311
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op1);
312
+ MI->flat_insn->detail->arm64.op_count++;
313
+ #ifndef CAPSTONE_DIET
314
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
315
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
316
+ MI->ac_idx++;
317
+ #endif
318
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
319
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = (Is64Bit ? 64 : 32) - (int)MCOperand_getImm(Op2);
320
+ MI->flat_insn->detail->arm64.op_count++;
321
+ #ifndef CAPSTONE_DIET
322
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
323
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
324
+ MI->ac_idx++;
325
+ #endif
326
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
327
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op3) + 1;
328
+ MI->flat_insn->detail->arm64.op_count++;
329
+ }
330
+
331
+ return;
332
+ }
333
+
334
+ // Otherwise SBFX/UBFX is the preferred form
335
+ SStream_concat(O, "%s\t%s, %s, ", (IsSigned ? "sbfx" : "ubfx"),
336
+ getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
337
+ getRegisterName(MCOperand_getReg(Op1), AArch64_NoRegAltName));
338
+
339
+ printInt32Bang(O, (int)MCOperand_getImm(Op2));
340
+ SStream_concat0(O, ", ");
341
+ printInt32Bang(O, (int)MCOperand_getImm(Op3) - (int)MCOperand_getImm(Op2) + 1);
342
+
343
+ MCInst_setOpcodePub(MI, AArch64_map_insn(IsSigned ? "sbfx" : "ubfx"));
344
+
345
+ if (MI->csh->detail) {
346
+ #ifndef CAPSTONE_DIET
347
+ uint8_t access;
348
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
349
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
350
+ MI->ac_idx++;
351
+ #endif
352
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
353
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
354
+ MI->flat_insn->detail->arm64.op_count++;
355
+ #ifndef CAPSTONE_DIET
356
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
357
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
358
+ MI->ac_idx++;
359
+ #endif
360
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
361
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op1);
362
+ MI->flat_insn->detail->arm64.op_count++;
363
+ #ifndef CAPSTONE_DIET
364
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
365
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
366
+ MI->ac_idx++;
367
+ #endif
368
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
369
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op2);
370
+ MI->flat_insn->detail->arm64.op_count++;
371
+ #ifndef CAPSTONE_DIET
372
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
373
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
374
+ MI->ac_idx++;
375
+ #endif
376
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
377
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op3) - MCOperand_getImm(Op2) + 1;
378
+ MI->flat_insn->detail->arm64.op_count++;
379
+ }
380
+
381
+ return;
382
+ }
383
+
384
+ if (Opcode == AArch64_BFMXri || Opcode == AArch64_BFMWri) {
385
+ MCOperand *Op0 = MCInst_getOperand(MI, 0); // Op1 == Op0
386
+ MCOperand *Op2 = MCInst_getOperand(MI, 2);
387
+ int ImmR = (int)MCOperand_getImm(MCInst_getOperand(MI, 3));
388
+ int ImmS = (int)MCOperand_getImm(MCInst_getOperand(MI, 4));
389
+
390
+ if ((MCOperand_getReg(Op2) == AArch64_WZR || MCOperand_getReg(Op2) == AArch64_XZR) &&
391
+ (ImmR == 0 || ImmS < ImmR)) {
392
+ // BFC takes precedence over its entire range, sligtly differently to BFI.
393
+ int BitWidth = Opcode == AArch64_BFMXri ? 64 : 32;
394
+ int LSB = (BitWidth - ImmR) % BitWidth;
395
+ int Width = ImmS + 1;
396
+
397
+ SStream_concat(O, "bfc\t%s, ",
398
+ getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName));
399
+
400
+ printInt32Bang(O, LSB);
401
+ SStream_concat0(O, ", ");
402
+ printInt32Bang(O, Width);
403
+ MCInst_setOpcodePub(MI, AArch64_map_insn("bfc"));
404
+
405
+ if (MI->csh->detail) {
406
+ #ifndef CAPSTONE_DIET
407
+ uint8_t access;
408
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
409
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
410
+ MI->ac_idx++;
411
+ #endif
412
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
413
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
414
+ MI->flat_insn->detail->arm64.op_count++;
415
+
416
+ #ifndef CAPSTONE_DIET
417
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
418
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
419
+ MI->ac_idx++;
420
+ #endif
421
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
422
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = LSB;
423
+ MI->flat_insn->detail->arm64.op_count++;
424
+ #ifndef CAPSTONE_DIET
425
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
426
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
427
+ MI->ac_idx++;
428
+ #endif
429
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
430
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Width;
431
+ MI->flat_insn->detail->arm64.op_count++;
432
+ }
433
+
434
+ return;
435
+ } else if (ImmS < ImmR) {
436
+ // BFI alias
437
+ int BitWidth = Opcode == AArch64_BFMXri ? 64 : 32;
438
+ LSB = (BitWidth - ImmR) % BitWidth;
439
+ Width = ImmS + 1;
440
+
441
+ SStream_concat(O, "bfi\t%s, %s, ",
442
+ getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
443
+ getRegisterName(MCOperand_getReg(Op2), AArch64_NoRegAltName));
444
+
445
+ printInt32Bang(O, LSB);
446
+ SStream_concat0(O, ", ");
447
+ printInt32Bang(O, Width);
448
+
449
+ MCInst_setOpcodePub(MI, AArch64_map_insn("bfi"));
450
+
451
+ if (MI->csh->detail) {
452
+ #ifndef CAPSTONE_DIET
453
+ uint8_t access;
454
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
455
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
456
+ MI->ac_idx++;
457
+ #endif
458
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
459
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
460
+ MI->flat_insn->detail->arm64.op_count++;
461
+ #ifndef CAPSTONE_DIET
462
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
463
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
464
+ MI->ac_idx++;
465
+ #endif
466
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
467
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op2);
468
+ MI->flat_insn->detail->arm64.op_count++;
469
+ #ifndef CAPSTONE_DIET
470
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
471
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
472
+ MI->ac_idx++;
473
+ #endif
474
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
475
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = LSB;
476
+ MI->flat_insn->detail->arm64.op_count++;
477
+ #ifndef CAPSTONE_DIET
478
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
479
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
480
+ MI->ac_idx++;
481
+ #endif
482
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
483
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Width;
484
+ MI->flat_insn->detail->arm64.op_count++;
485
+ }
486
+
487
+ return;
488
+ }
489
+
490
+ LSB = ImmR;
491
+ Width = ImmS - ImmR + 1;
492
+ // Otherwise BFXIL the preferred form
493
+ SStream_concat(O, "bfxil\t%s, %s, ",
494
+ getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
495
+ getRegisterName(MCOperand_getReg(Op2), AArch64_NoRegAltName));
496
+
497
+ printInt32Bang(O, LSB);
498
+ SStream_concat0(O, ", ");
499
+ printInt32Bang(O, Width);
500
+
501
+ MCInst_setOpcodePub(MI, AArch64_map_insn("bfxil"));
502
+
503
+ if (MI->csh->detail) {
504
+ #ifndef CAPSTONE_DIET
505
+ uint8_t access;
506
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
507
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
508
+ MI->ac_idx++;
509
+ #endif
510
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
511
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
512
+ MI->flat_insn->detail->arm64.op_count++;
513
+ #ifndef CAPSTONE_DIET
514
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
515
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
516
+ MI->ac_idx++;
517
+ #endif
518
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
519
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op2);
520
+ MI->flat_insn->detail->arm64.op_count++;
521
+ #ifndef CAPSTONE_DIET
522
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
523
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
524
+ MI->ac_idx++;
525
+ #endif
526
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
527
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = LSB;
528
+ MI->flat_insn->detail->arm64.op_count++;
529
+ #ifndef CAPSTONE_DIET
530
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
531
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
532
+ MI->ac_idx++;
533
+ #endif
534
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
535
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Width;
536
+ MI->flat_insn->detail->arm64.op_count++;
537
+ }
538
+
539
+ return;
540
+ }
541
+
542
+ // MOVZ, MOVN and "ORR wzr, #imm" instructions are aliases for MOV, but their
543
+ // domains overlap so they need to be prioritized. The chain is "MOVZ lsl #0 >
544
+ // MOVZ lsl #N > MOVN lsl #0 > MOVN lsl #N > ORR". The highest instruction
545
+ // that can represent the move is the MOV alias, and the rest get printed
546
+ // normally.
547
+ if ((Opcode == AArch64_MOVZXi || Opcode == AArch64_MOVZWi) &&
548
+ MCOperand_isImm(MCInst_getOperand(MI, 1)) && MCOperand_isImm(MCInst_getOperand(MI, 2))) {
549
+ int RegWidth = Opcode == AArch64_MOVZXi ? 64 : 32;
550
+ int Shift = MCOperand_getImm(MCInst_getOperand(MI, 2));
551
+ uint64_t Value = (uint64_t)MCOperand_getImm(MCInst_getOperand(MI, 1)) << Shift;
552
+
553
+ if (isMOVZMovAlias(Value, Shift,
554
+ Opcode == AArch64_MOVZXi ? 64 : 32)) {
555
+ SStream_concat(O, "mov\t%s, ", getRegisterName(MCOperand_getReg(MCInst_getOperand(MI, 0)), AArch64_NoRegAltName));
556
+
557
+ printInt64Bang(O, SignExtend64(Value, RegWidth));
558
+
559
+ if (MI->csh->detail) {
560
+ #ifndef CAPSTONE_DIET
561
+ uint8_t access;
562
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
563
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
564
+ MI->ac_idx++;
565
+ #endif
566
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
567
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(MCInst_getOperand(MI, 0));
568
+ MI->flat_insn->detail->arm64.op_count++;
569
+
570
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
571
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = SignExtend64(Value, RegWidth);
572
+ MI->flat_insn->detail->arm64.op_count++;
573
+ }
574
+
575
+ MCInst_setOpcodePub(MI, AArch64_map_insn("mov"));
576
+
577
+ return;
578
+ }
579
+ }
580
+
581
+ if ((Opcode == AArch64_MOVNXi || Opcode == AArch64_MOVNWi) &&
582
+ MCOperand_isImm(MCInst_getOperand(MI, 1)) && MCOperand_isImm(MCInst_getOperand(MI, 2))) {
583
+ int RegWidth = Opcode == AArch64_MOVNXi ? 64 : 32;
584
+ int Shift = MCOperand_getImm(MCInst_getOperand(MI, 2));
585
+ uint64_t Value = ~((uint64_t)MCOperand_getImm(MCInst_getOperand(MI, 1)) << Shift);
586
+
587
+ if (RegWidth == 32)
588
+ Value = Value & 0xffffffff;
589
+
590
+ if (AArch64_AM_isMOVNMovAlias(Value, Shift, RegWidth)) {
591
+ SStream_concat(O, "mov\t%s, ", getRegisterName(MCOperand_getReg(MCInst_getOperand(MI, 0)), AArch64_NoRegAltName));
592
+
593
+ printInt64Bang(O, SignExtend64(Value, RegWidth));
594
+
595
+ if (MI->csh->detail) {
596
+ #ifndef CAPSTONE_DIET
597
+ uint8_t access;
598
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
599
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
600
+ MI->ac_idx++;
601
+ #endif
602
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
603
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(MCInst_getOperand(MI, 0));
604
+ MI->flat_insn->detail->arm64.op_count++;
605
+
606
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
607
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = SignExtend64(Value, RegWidth);
608
+ MI->flat_insn->detail->arm64.op_count++;
609
+ }
610
+
611
+ MCInst_setOpcodePub(MI, AArch64_map_insn("mov"));
612
+
613
+ return;
614
+ }
615
+ }
616
+
617
+ if ((Opcode == AArch64_ORRXri || Opcode == AArch64_ORRWri) &&
618
+ (MCOperand_getReg(MCInst_getOperand(MI, 1)) == AArch64_XZR ||
619
+ MCOperand_getReg(MCInst_getOperand(MI, 1)) == AArch64_WZR) &&
620
+ MCOperand_isImm(MCInst_getOperand(MI, 2))) {
621
+ int RegWidth = Opcode == AArch64_ORRXri ? 64 : 32;
622
+ uint64_t Value = AArch64_AM_decodeLogicalImmediate(
623
+ MCOperand_getImm(MCInst_getOperand(MI, 2)), RegWidth);
624
+ SStream_concat(O, "mov\t%s, ", getRegisterName(MCOperand_getReg(MCInst_getOperand(MI, 0)), AArch64_NoRegAltName));
625
+
626
+ printInt64Bang(O, SignExtend64(Value, RegWidth));
627
+
628
+ if (MI->csh->detail) {
629
+ #ifndef CAPSTONE_DIET
630
+ uint8_t access;
631
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
632
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
633
+ MI->ac_idx++;
634
+ #endif
635
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
636
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(MCInst_getOperand(MI, 0));
637
+ MI->flat_insn->detail->arm64.op_count++;
638
+
639
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
640
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = SignExtend64(Value, RegWidth);
641
+ MI->flat_insn->detail->arm64.op_count++;
642
+ }
643
+
644
+ MCInst_setOpcodePub(MI, AArch64_map_insn("mov"));
645
+
646
+ return;
647
+ }
648
+
649
+ // Instruction TSB is specified as a one operand instruction, but 'csync' is
650
+ // not encoded, so for printing it is treated as a special case here:
651
+ if (Opcode == AArch64_TSB) {
652
+ SStream_concat0(O, "tsb\tcsync");
653
+ MCInst_setOpcodePub(MI, AArch64_map_insn("tsb"));
654
+ return;
655
+ }
656
+
657
+ MI->MRI = Info;
658
+
659
+ mnem = printAliasInstr(MI, O, (MCRegisterInfo *)Info);
660
+ if (mnem) {
661
+ MCInst_setOpcodePub(MI, AArch64_map_insn(mnem));
662
+ cs_mem_free(mnem);
663
+
664
+ switch(MCInst_getOpcode(MI)) {
665
+ default: break;
666
+ case AArch64_LD1i8_POST:
667
+ arm64_op_addImm(MI, 1);
668
+ break;
669
+ case AArch64_LD1i16_POST:
670
+ arm64_op_addImm(MI, 2);
671
+ break;
672
+ case AArch64_LD1i32_POST:
673
+ arm64_op_addImm(MI, 4);
674
+ break;
675
+ case AArch64_LD1Onev1d_POST:
676
+ case AArch64_LD1Onev2s_POST:
677
+ case AArch64_LD1Onev4h_POST:
678
+ case AArch64_LD1Onev8b_POST:
679
+ case AArch64_LD1i64_POST:
680
+ arm64_op_addImm(MI, 8);
681
+ break;
682
+ case AArch64_LD1Onev16b_POST:
683
+ case AArch64_LD1Onev2d_POST:
684
+ case AArch64_LD1Onev4s_POST:
685
+ case AArch64_LD1Onev8h_POST:
686
+ case AArch64_LD1Twov1d_POST:
687
+ case AArch64_LD1Twov2s_POST:
688
+ case AArch64_LD1Twov4h_POST:
689
+ case AArch64_LD1Twov8b_POST:
690
+ arm64_op_addImm(MI, 16);
691
+ break;
692
+ case AArch64_LD1Threev1d_POST:
693
+ case AArch64_LD1Threev2s_POST:
694
+ case AArch64_LD1Threev4h_POST:
695
+ case AArch64_LD1Threev8b_POST:
696
+ arm64_op_addImm(MI, 24);
697
+ break;
698
+ case AArch64_LD1Fourv1d_POST:
699
+ case AArch64_LD1Fourv2s_POST:
700
+ case AArch64_LD1Fourv4h_POST:
701
+ case AArch64_LD1Fourv8b_POST:
702
+ case AArch64_LD1Twov16b_POST:
703
+ case AArch64_LD1Twov2d_POST:
704
+ case AArch64_LD1Twov4s_POST:
705
+ case AArch64_LD1Twov8h_POST:
706
+ arm64_op_addImm(MI, 32);
707
+ break;
708
+ case AArch64_LD1Threev16b_POST:
709
+ case AArch64_LD1Threev2d_POST:
710
+ case AArch64_LD1Threev4s_POST:
711
+ case AArch64_LD1Threev8h_POST:
712
+ arm64_op_addImm(MI, 48);
713
+ break;
714
+ case AArch64_LD1Fourv16b_POST:
715
+ case AArch64_LD1Fourv2d_POST:
716
+ case AArch64_LD1Fourv4s_POST:
717
+ case AArch64_LD1Fourv8h_POST:
718
+ arm64_op_addImm(MI, 64);
719
+ break;
720
+ case AArch64_UMOVvi64:
721
+ arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_1D);
722
+ break;
723
+ case AArch64_UMOVvi32:
724
+ arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_1S);
725
+ break;
726
+ case AArch64_INSvi8gpr:
727
+ case AArch64_DUP_ZI_B:
728
+ case AArch64_CPY_ZPmI_B:
729
+ case AArch64_CPY_ZPzI_B:
730
+ case AArch64_CPY_ZPmV_B:
731
+ case AArch64_CPY_ZPmR_B:
732
+ case AArch64_DUP_ZR_B:
733
+ if (MI->csh->detail) {
734
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1B;
735
+ }
736
+ break;
737
+ case AArch64_INSvi16gpr:
738
+ case AArch64_DUP_ZI_H:
739
+ case AArch64_CPY_ZPmI_H:
740
+ case AArch64_CPY_ZPzI_H:
741
+ case AArch64_CPY_ZPmV_H:
742
+ case AArch64_CPY_ZPmR_H:
743
+ case AArch64_DUP_ZR_H:
744
+ case AArch64_FCPY_ZPmI_H:
745
+ case AArch64_FDUP_ZI_H:
746
+ if (MI->csh->detail) {
747
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1H;
748
+ }
749
+ break;
750
+ case AArch64_INSvi32gpr:
751
+ case AArch64_DUP_ZI_S:
752
+ case AArch64_CPY_ZPmI_S:
753
+ case AArch64_CPY_ZPzI_S:
754
+ case AArch64_CPY_ZPmV_S:
755
+ case AArch64_CPY_ZPmR_S:
756
+ case AArch64_DUP_ZR_S:
757
+ case AArch64_FCPY_ZPmI_S:
758
+ case AArch64_FDUP_ZI_S:
759
+ if (MI->csh->detail) {
760
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1S;
761
+ }
762
+ break;
763
+ case AArch64_INSvi64gpr:
764
+ case AArch64_DUP_ZI_D:
765
+ case AArch64_CPY_ZPmI_D:
766
+ case AArch64_CPY_ZPzI_D:
767
+ case AArch64_CPY_ZPmV_D:
768
+ case AArch64_CPY_ZPmR_D:
769
+ case AArch64_DUP_ZR_D:
770
+ case AArch64_FCPY_ZPmI_D:
771
+ case AArch64_FDUP_ZI_D:
772
+ if (MI->csh->detail) {
773
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1D;
774
+ }
775
+ break;
776
+ case AArch64_INSvi8lane:
777
+ case AArch64_ORR_PPzPP:
778
+ case AArch64_ORRS_PPzPP:
779
+ if (MI->csh->detail) {
780
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1B;
781
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_1B;
782
+ }
783
+ break;
784
+ case AArch64_INSvi16lane:
785
+ if (MI->csh->detail) {
786
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1H;
787
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_1H;
788
+ }
789
+ break;
790
+ case AArch64_INSvi32lane:
791
+ if (MI->csh->detail) {
792
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1S;
793
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_1S;
794
+ }
795
+ break;
796
+ case AArch64_INSvi64lane:
797
+ case AArch64_ORR_ZZZ:
798
+ if (MI->csh->detail) {
799
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1D;
800
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_1D;
801
+ }
802
+ break;
803
+ case AArch64_ORRv16i8:
804
+ case AArch64_NOTv16i8:
805
+ if (MI->csh->detail) {
806
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_16B;
807
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_16B;
808
+ }
809
+ break;
810
+ case AArch64_ORRv8i8:
811
+ case AArch64_NOTv8i8:
812
+ if (MI->csh->detail) {
813
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_8B;
814
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_8B;
815
+ }
816
+ break;
817
+ case AArch64_AND_PPzPP:
818
+ case AArch64_ANDS_PPzPP:
819
+ case AArch64_EOR_PPzPP:
820
+ case AArch64_EORS_PPzPP:
821
+ case AArch64_SEL_PPPP:
822
+ case AArch64_SEL_ZPZZ_B:
823
+ if (MI->csh->detail) {
824
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1B;
825
+ MI->flat_insn->detail->arm64.operands[2].vas = ARM64_VAS_1B;
826
+ }
827
+ break;
828
+ case AArch64_SEL_ZPZZ_D:
829
+ if (MI->csh->detail) {
830
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1D;
831
+ MI->flat_insn->detail->arm64.operands[2].vas = ARM64_VAS_1D;
832
+ }
833
+ break;
834
+ case AArch64_SEL_ZPZZ_H:
835
+ if (MI->csh->detail) {
836
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1H;
837
+ MI->flat_insn->detail->arm64.operands[2].vas = ARM64_VAS_1H;
838
+ }
839
+ break;
840
+ case AArch64_SEL_ZPZZ_S:
841
+ if (MI->csh->detail) {
842
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1S;
843
+ MI->flat_insn->detail->arm64.operands[2].vas = ARM64_VAS_1S;
844
+ }
845
+ break;
846
+ case AArch64_DUP_ZZI_B:
847
+ if (MI->csh->detail) {
848
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1B;
849
+ if (MI->flat_insn->detail->arm64.op_count == 1) {
850
+ arm64_op_addReg(MI, ARM64_REG_B0 + MCOperand_getReg(MCInst_getOperand(MI, 1)) - ARM64_REG_Z0);
851
+ } else {
852
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_1B;
853
+ }
854
+ }
855
+ break;
856
+ case AArch64_DUP_ZZI_D:
857
+ if (MI->csh->detail) {
858
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1D;
859
+ if (MI->flat_insn->detail->arm64.op_count == 1) {
860
+ arm64_op_addReg(MI, ARM64_REG_D0 + MCOperand_getReg(MCInst_getOperand(MI, 1)) - ARM64_REG_Z0);
861
+ } else {
862
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_1D;
863
+ }
864
+ }
865
+ break;
866
+ case AArch64_DUP_ZZI_H:
867
+ if (MI->csh->detail) {
868
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1H;
869
+ if (MI->flat_insn->detail->arm64.op_count == 1) {
870
+ arm64_op_addReg(MI, ARM64_REG_H0 + MCOperand_getReg(MCInst_getOperand(MI, 1)) - ARM64_REG_Z0);
871
+ } else {
872
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_1H;
873
+ }
874
+ }
875
+ break;
876
+ case AArch64_DUP_ZZI_Q:
877
+ if (MI->csh->detail) {
878
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1Q;
879
+ if (MI->flat_insn->detail->arm64.op_count == 1) {
880
+ arm64_op_addReg(MI, ARM64_REG_Q0 + MCOperand_getReg(MCInst_getOperand(MI, 1)) - ARM64_REG_Z0);
881
+ } else {
882
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_1Q;
883
+ }
884
+ }
885
+ break;
886
+ case AArch64_DUP_ZZI_S:
887
+ if (MI->csh->detail) {
888
+ MI->flat_insn->detail->arm64.operands[0].vas = ARM64_VAS_1S;
889
+ if (MI->flat_insn->detail->arm64.op_count == 1) {
890
+ arm64_op_addReg(MI, ARM64_REG_S0 + MCOperand_getReg(MCInst_getOperand(MI, 1)) - ARM64_REG_Z0);
891
+ } else {
892
+ MI->flat_insn->detail->arm64.operands[1].vas = ARM64_VAS_1S;
893
+ }
894
+ }
895
+ break;
896
+ // Hacky detail filling of SMSTART and SMSTOP alias'
897
+ case AArch64_MSRpstatesvcrImm1:{
898
+ if(MI->csh->detail){
899
+ MI->flat_insn->detail->arm64.op_count = 2;
900
+ #ifndef CAPSTONE_DIET
901
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
902
+ MI->ac_idx++;
903
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
904
+ MI->ac_idx++;
905
+ #endif
906
+ MI->flat_insn->detail->arm64.operands[0].type = ARM64_OP_SVCR;
907
+ MI->flat_insn->detail->arm64.operands[0].sys = (unsigned)ARM64_SYSREG_SVCR;
908
+ MI->flat_insn->detail->arm64.operands[0].svcr = lookupSVCRByEncoding(MCOperand_getImm(MCInst_getOperand(MI, 0)))->Encoding;
909
+ MI->flat_insn->detail->arm64.operands[1].type = ARM64_OP_IMM;
910
+ MI->flat_insn->detail->arm64.operands[1].imm = MCOperand_getImm(MCInst_getOperand(MI, 1));
911
+ }
912
+ break;
913
+ }
914
+ }
915
+ } else {
916
+ printInstruction(MI, O);
917
+ }
918
+ }
919
+
920
+ static bool printSysAlias(MCInst *MI, SStream *O)
921
+ {
922
+ // unsigned Opcode = MCInst_getOpcode(MI);
923
+ //assert(Opcode == AArch64_SYSxt && "Invalid opcode for SYS alias!");
924
+
925
+ const char *Ins;
926
+ uint16_t Encoding;
927
+ bool NeedsReg;
928
+ char Name[64];
929
+ MCOperand *Op1 = MCInst_getOperand(MI, 0);
930
+ MCOperand *Cn = MCInst_getOperand(MI, 1);
931
+ MCOperand *Cm = MCInst_getOperand(MI, 2);
932
+ MCOperand *Op2 = MCInst_getOperand(MI, 3);
933
+
934
+ unsigned Op1Val = (unsigned)MCOperand_getImm(Op1);
935
+ unsigned CnVal = (unsigned)MCOperand_getImm(Cn);
936
+ unsigned CmVal = (unsigned)MCOperand_getImm(Cm);
937
+ unsigned Op2Val = (unsigned)MCOperand_getImm(Op2);
938
+
939
+ Encoding = Op2Val;
940
+ Encoding |= CmVal << 3;
941
+ Encoding |= CnVal << 7;
942
+ Encoding |= Op1Val << 11;
943
+
944
+ if (CnVal == 7) {
945
+ switch (CmVal) {
946
+ default:
947
+ return false;
948
+
949
+ // IC aliases
950
+ case 1: case 5: {
951
+ const IC *IC = lookupICByEncoding(Encoding);
952
+ // if (!IC || !IC->haveFeatures(STI.getFeatureBits()))
953
+ if (!IC)
954
+ return false;
955
+
956
+ NeedsReg = IC->NeedsReg;
957
+ Ins = "ic";
958
+ strncpy(Name, IC->Name, sizeof(Name) - 1);
959
+ }
960
+ break;
961
+
962
+ // DC aliases
963
+ case 4: case 6: case 10: case 11: case 12: case 14: {
964
+ const DC *DC = lookupDCByEncoding(Encoding);
965
+ // if (!DC || !DC->haveFeatures(STI.getFeatureBits()))
966
+ if (!DC)
967
+ return false;
968
+
969
+ NeedsReg = true;
970
+ Ins = "dc";
971
+ strncpy(Name, DC->Name, sizeof(Name) - 1);
972
+ }
973
+ break;
974
+
975
+ // AT aliases
976
+ case 8: case 9: {
977
+ const AT *AT = lookupATByEncoding(Encoding);
978
+ // if (!AT || !AT->haveFeatures(STI.getFeatureBits()))
979
+ if (!AT)
980
+ return false;
981
+
982
+ NeedsReg = true;
983
+ Ins = "at";
984
+ strncpy(Name, AT->Name, sizeof(Name) - 1);
985
+ }
986
+ break;
987
+ }
988
+ } else if (CnVal == 8) {
989
+ // TLBI aliases
990
+ const TLBI *TLBI = lookupTLBIByEncoding(Encoding);
991
+ // if (!TLBI || !TLBI->haveFeatures(STI.getFeatureBits()))
992
+ if (!TLBI)
993
+ return false;
994
+
995
+ NeedsReg = TLBI->NeedsReg;
996
+ Ins = "tlbi";
997
+ strncpy(Name, TLBI->Name, sizeof(Name) - 1);
998
+ } else
999
+ return false;
1000
+
1001
+ SStream_concat(O, "%s\t%s", Ins, Name);
1002
+
1003
+ if (NeedsReg) {
1004
+ SStream_concat(O, ", %s", getRegisterName(MCOperand_getReg(MCInst_getOperand(MI, 4)), AArch64_NoRegAltName));
1005
+ }
1006
+
1007
+ MCInst_setOpcodePub(MI, AArch64_map_insn(Ins));
1008
+
1009
+ if (MI->csh->detail) {
1010
+ #if 0
1011
+ #ifndef CAPSTONE_DIET
1012
+ uint8_t access;
1013
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1014
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1015
+ MI->ac_idx++;
1016
+ #endif
1017
+ #endif
1018
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_SYS;
1019
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].sys = AArch64_map_sys_op(Name);
1020
+ MI->flat_insn->detail->arm64.op_count++;
1021
+
1022
+ if (NeedsReg) {
1023
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1024
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(MCInst_getOperand(MI, 4));
1025
+ MI->flat_insn->detail->arm64.op_count++;
1026
+ }
1027
+ }
1028
+
1029
+ return true;
1030
+ }
1031
+
1032
+ static void printOperand(MCInst *MI, unsigned OpNum, SStream *O)
1033
+ {
1034
+ MCOperand *Op = MCInst_getOperand(MI, OpNum);
1035
+
1036
+ if (MCOperand_isReg(Op)) {
1037
+ unsigned Reg = MCOperand_getReg(Op);
1038
+
1039
+ SStream_concat0(O, getRegisterName(Reg, AArch64_NoRegAltName));
1040
+
1041
+ if (MI->csh->detail) {
1042
+ if (MI->csh->doing_mem) {
1043
+ if (MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.base == ARM64_REG_INVALID) {
1044
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.base = Reg;
1045
+ }
1046
+ else if (MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.index == ARM64_REG_INVALID) {
1047
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.index = Reg;
1048
+ }
1049
+ } else if (MI->csh->doing_SME_Index) {
1050
+ // Access op_count-1 as We want to add info to previous operand, not create a new one
1051
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count-1].sme_index.base = Reg;
1052
+ } else {
1053
+ #ifndef CAPSTONE_DIET
1054
+ uint8_t access;
1055
+
1056
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1057
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1058
+ MI->ac_idx++;
1059
+ #endif
1060
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1061
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
1062
+ MI->flat_insn->detail->arm64.op_count++;
1063
+ }
1064
+ }
1065
+ } else if (MCOperand_isImm(Op)) {
1066
+ int64_t imm = MCOperand_getImm(Op);
1067
+
1068
+ if (MI->Opcode == AArch64_ADR) {
1069
+ imm += MI->address;
1070
+ printUInt64Bang(O, imm);
1071
+ } else {
1072
+ if (MI->csh->doing_mem) {
1073
+ if (MI->csh->imm_unsigned) {
1074
+ printUInt64Bang(O, imm);
1075
+ } else {
1076
+ printInt64Bang(O, imm);
1077
+ }
1078
+ } else
1079
+ printUInt64Bang(O, imm);
1080
+ }
1081
+
1082
+ if (MI->csh->detail) {
1083
+ if (MI->csh->doing_mem) {
1084
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.disp = (int32_t)imm;
1085
+ } else if (MI->csh->doing_SME_Index) {
1086
+ // Access op_count-1 as We want to add info to previous operand, not create a new one
1087
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count-1].sme_index.disp = (int32_t)imm;
1088
+ } else {
1089
+ #ifndef CAPSTONE_DIET
1090
+ uint8_t access;
1091
+
1092
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1093
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1094
+ #endif
1095
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1096
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = imm;
1097
+ MI->flat_insn->detail->arm64.op_count++;
1098
+ }
1099
+ }
1100
+ }
1101
+ }
1102
+
1103
+ static void printImm(MCInst *MI, unsigned OpNum, SStream *O)
1104
+ {
1105
+ MCOperand *Op = MCInst_getOperand(MI, OpNum);
1106
+ printUInt64Bang(O, MCOperand_getImm(Op));
1107
+
1108
+ if (MI->csh->detail) {
1109
+ #ifndef CAPSTONE_DIET
1110
+ uint8_t access;
1111
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1112
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1113
+ MI->ac_idx++;
1114
+ #endif
1115
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1116
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op);
1117
+ MI->flat_insn->detail->arm64.op_count++;
1118
+ }
1119
+ }
1120
+
1121
+ static void printImmHex(MCInst *MI, unsigned OpNum, SStream *O)
1122
+ {
1123
+ MCOperand *Op = MCInst_getOperand(MI, OpNum);
1124
+ printUInt64Bang(O, MCOperand_getImm(Op));
1125
+
1126
+ if (MI->csh->detail) {
1127
+ #ifndef CAPSTONE_DIET
1128
+ uint8_t access;
1129
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1130
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1131
+ MI->ac_idx++;
1132
+ #endif
1133
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1134
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op);
1135
+ MI->flat_insn->detail->arm64.op_count++;
1136
+ }
1137
+ }
1138
+
1139
+ static void printSImm(MCInst *MI, unsigned OpNo, SStream *O, int Size) {
1140
+ MCOperand *Op = MCInst_getOperand(MI, OpNo);
1141
+ if (Size == 8)
1142
+ printInt64Bang(O, (signed char) MCOperand_getImm(Op));
1143
+ else if (Size == 16)
1144
+ printInt64Bang(O, (signed short) MCOperand_getImm(Op));
1145
+ else
1146
+ printInt64Bang(O, MCOperand_getImm(Op));
1147
+
1148
+ if (MI->csh->detail) {
1149
+ #ifndef CAPSTONE_DIET
1150
+ uint8_t access;
1151
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1152
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1153
+ MI->ac_idx++;
1154
+ #endif
1155
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1156
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op);
1157
+ MI->flat_insn->detail->arm64.op_count++;
1158
+ }
1159
+ }
1160
+
1161
+ static void printPostIncOperand(MCInst *MI, unsigned OpNum, SStream *O,
1162
+ unsigned Imm)
1163
+ {
1164
+ MCOperand *Op = MCInst_getOperand(MI, OpNum);
1165
+
1166
+ if (MCOperand_isReg(Op)) {
1167
+ unsigned Reg = MCOperand_getReg(Op);
1168
+ if (Reg == AArch64_XZR) {
1169
+ printInt32Bang(O, Imm);
1170
+
1171
+ if (MI->csh->detail) {
1172
+ #ifndef CAPSTONE_DIET
1173
+ uint8_t access;
1174
+
1175
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1176
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1177
+ MI->ac_idx++;
1178
+ #endif
1179
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1180
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Imm;
1181
+ MI->flat_insn->detail->arm64.op_count++;
1182
+ }
1183
+ } else {
1184
+ SStream_concat0(O, getRegisterName(Reg, AArch64_NoRegAltName));
1185
+
1186
+ if (MI->csh->detail) {
1187
+ #ifndef CAPSTONE_DIET
1188
+ uint8_t access;
1189
+
1190
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1191
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1192
+ MI->ac_idx++;
1193
+ #endif
1194
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1195
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
1196
+ MI->flat_insn->detail->arm64.op_count++;
1197
+ }
1198
+ }
1199
+ }
1200
+ //llvm_unreachable("unknown operand kind in printPostIncOperand64");
1201
+ }
1202
+
1203
+ static void printVRegOperand(MCInst *MI, unsigned OpNum, SStream *O)
1204
+ {
1205
+ MCOperand *Op = MCInst_getOperand(MI, OpNum);
1206
+ //assert(Op.isReg() && "Non-register vreg operand!");
1207
+ unsigned Reg = MCOperand_getReg(Op);
1208
+
1209
+ SStream_concat0(O, getRegisterName(Reg, AArch64_vreg));
1210
+
1211
+ if (MI->csh->detail) {
1212
+ #ifndef CAPSTONE_DIET
1213
+ uint8_t access;
1214
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1215
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1216
+ MI->ac_idx++;
1217
+ #endif
1218
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1219
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = AArch64_map_vregister(Reg);
1220
+ MI->flat_insn->detail->arm64.op_count++;
1221
+ }
1222
+ }
1223
+
1224
+ static void printSysCROperand(MCInst *MI, unsigned OpNum, SStream *O)
1225
+ {
1226
+ MCOperand *Op = MCInst_getOperand(MI, OpNum);
1227
+ //assert(Op.isImm() && "System instruction C[nm] operands must be immediates!");
1228
+ SStream_concat(O, "c%u", MCOperand_getImm(Op));
1229
+
1230
+ if (MI->csh->detail) {
1231
+ #ifndef CAPSTONE_DIET
1232
+ uint8_t access;
1233
+
1234
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1235
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1236
+ MI->ac_idx++;
1237
+ #endif
1238
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_CIMM;
1239
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op);
1240
+ MI->flat_insn->detail->arm64.op_count++;
1241
+ }
1242
+ }
1243
+
1244
+ static void printAddSubImm(MCInst *MI, unsigned OpNum, SStream *O)
1245
+ {
1246
+ MCOperand *MO = MCInst_getOperand(MI, OpNum);
1247
+ if (MCOperand_isImm(MO)) {
1248
+ unsigned Val = (MCOperand_getImm(MO) & 0xfff);
1249
+ //assert(Val == MO.getImm() && "Add/sub immediate out of range!");
1250
+ unsigned Shift = AArch64_AM_getShiftValue((int)MCOperand_getImm(MCInst_getOperand(MI, OpNum + 1)));
1251
+
1252
+ printInt32Bang(O, Val);
1253
+
1254
+ if (MI->csh->detail) {
1255
+ #ifndef CAPSTONE_DIET
1256
+ uint8_t access;
1257
+
1258
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1259
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1260
+ MI->ac_idx++;
1261
+ #endif
1262
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1263
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
1264
+ MI->flat_insn->detail->arm64.op_count++;
1265
+ }
1266
+
1267
+ if (Shift != 0)
1268
+ printShifter(MI, OpNum + 1, O);
1269
+ }
1270
+ }
1271
+
1272
+ static void printLogicalImm32(MCInst *MI, unsigned OpNum, SStream *O)
1273
+ {
1274
+ int64_t Val = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1275
+
1276
+ Val = AArch64_AM_decodeLogicalImmediate(Val, 32);
1277
+ printUInt32Bang(O, (int)Val);
1278
+
1279
+ if (MI->csh->detail) {
1280
+ #ifndef CAPSTONE_DIET
1281
+ uint8_t access;
1282
+
1283
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1284
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1285
+ MI->ac_idx++;
1286
+ #endif
1287
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1288
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
1289
+ MI->flat_insn->detail->arm64.op_count++;
1290
+ }
1291
+ }
1292
+
1293
+ static void printLogicalImm64(MCInst *MI, unsigned OpNum, SStream *O)
1294
+ {
1295
+ int64_t Val = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1296
+ Val = AArch64_AM_decodeLogicalImmediate(Val, 64);
1297
+
1298
+ switch(MI->flat_insn->id) {
1299
+ default:
1300
+ printInt64Bang(O, Val);
1301
+ break;
1302
+
1303
+ case ARM64_INS_ORR:
1304
+ case ARM64_INS_AND:
1305
+ case ARM64_INS_EOR:
1306
+ case ARM64_INS_TST:
1307
+ // do not print number in negative form
1308
+ if (Val >= 0 && Val <= HEX_THRESHOLD)
1309
+ SStream_concat(O, "#%u", (int)Val);
1310
+ else
1311
+ SStream_concat(O, "#0x%"PRIx64, Val);
1312
+ break;
1313
+ }
1314
+
1315
+ if (MI->csh->detail) {
1316
+ #ifndef CAPSTONE_DIET
1317
+ uint8_t access;
1318
+
1319
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1320
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1321
+ MI->ac_idx++;
1322
+ #endif
1323
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1324
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = (int64_t)Val;
1325
+ MI->flat_insn->detail->arm64.op_count++;
1326
+ }
1327
+ }
1328
+
1329
+ static void printShifter(MCInst *MI, unsigned OpNum, SStream *O)
1330
+ {
1331
+ unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1332
+
1333
+ // LSL #0 should not be printed.
1334
+ if (AArch64_AM_getShiftType(Val) == AArch64_AM_LSL &&
1335
+ AArch64_AM_getShiftValue(Val) == 0)
1336
+ return;
1337
+
1338
+ SStream_concat(O, ", %s ", AArch64_AM_getShiftExtendName(AArch64_AM_getShiftType(Val)));
1339
+ printInt32BangDec(O, AArch64_AM_getShiftValue(Val));
1340
+
1341
+ if (MI->csh->detail) {
1342
+ arm64_shifter shifter = ARM64_SFT_INVALID;
1343
+
1344
+ switch(AArch64_AM_getShiftType(Val)) {
1345
+ default: // never reach
1346
+ case AArch64_AM_LSL:
1347
+ shifter = ARM64_SFT_LSL;
1348
+ break;
1349
+
1350
+ case AArch64_AM_LSR:
1351
+ shifter = ARM64_SFT_LSR;
1352
+ break;
1353
+
1354
+ case AArch64_AM_ASR:
1355
+ shifter = ARM64_SFT_ASR;
1356
+ break;
1357
+
1358
+ case AArch64_AM_ROR:
1359
+ shifter = ARM64_SFT_ROR;
1360
+ break;
1361
+
1362
+ case AArch64_AM_MSL:
1363
+ shifter = ARM64_SFT_MSL;
1364
+ break;
1365
+ }
1366
+
1367
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.type = shifter;
1368
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.value = AArch64_AM_getShiftValue(Val);
1369
+ }
1370
+ }
1371
+
1372
+ static void printShiftedRegister(MCInst *MI, unsigned OpNum, SStream *O)
1373
+ {
1374
+ SStream_concat0(O, getRegisterName(MCOperand_getReg(MCInst_getOperand(MI, OpNum)), AArch64_NoRegAltName));
1375
+
1376
+ if (MI->csh->detail) {
1377
+ #ifndef CAPSTONE_DIET
1378
+ uint8_t access;
1379
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1380
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1381
+ MI->ac_idx++;
1382
+ #endif
1383
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1384
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum));
1385
+ MI->flat_insn->detail->arm64.op_count++;
1386
+ }
1387
+
1388
+ printShifter(MI, OpNum + 1, O);
1389
+ }
1390
+
1391
+ static void printArithExtend(MCInst *MI, unsigned OpNum, SStream *O)
1392
+ {
1393
+ unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1394
+ AArch64_AM_ShiftExtendType ExtType = AArch64_AM_getArithExtendType(Val);
1395
+ unsigned ShiftVal = AArch64_AM_getArithShiftValue(Val);
1396
+
1397
+ // If the destination or first source register operand is [W]SP, print
1398
+ // UXTW/UXTX as LSL, and if the shift amount is also zero, print nothing at
1399
+ // all.
1400
+ if (ExtType == AArch64_AM_UXTW || ExtType == AArch64_AM_UXTX) {
1401
+ unsigned Dest = MCOperand_getReg(MCInst_getOperand(MI, 0));
1402
+ unsigned Src1 = MCOperand_getReg(MCInst_getOperand(MI, 1));
1403
+
1404
+ if (((Dest == AArch64_SP || Src1 == AArch64_SP) &&
1405
+ ExtType == AArch64_AM_UXTX) ||
1406
+ ((Dest == AArch64_WSP || Src1 == AArch64_WSP) &&
1407
+ ExtType == AArch64_AM_UXTW)) {
1408
+ if (ShiftVal != 0) {
1409
+ SStream_concat0(O, ", lsl ");
1410
+ printInt32Bang(O, ShiftVal);
1411
+
1412
+ if (MI->csh->detail) {
1413
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.type = ARM64_SFT_LSL;
1414
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.value = ShiftVal;
1415
+ }
1416
+ }
1417
+
1418
+ return;
1419
+ }
1420
+ }
1421
+
1422
+ SStream_concat(O, ", %s", AArch64_AM_getShiftExtendName(ExtType));
1423
+
1424
+ if (MI->csh->detail) {
1425
+ arm64_extender ext = ARM64_EXT_INVALID;
1426
+ switch(ExtType) {
1427
+ default: // never reach
1428
+
1429
+ case AArch64_AM_UXTB:
1430
+ ext = ARM64_EXT_UXTB;
1431
+ break;
1432
+
1433
+ case AArch64_AM_UXTH:
1434
+ ext = ARM64_EXT_UXTH;
1435
+ break;
1436
+
1437
+ case AArch64_AM_UXTW:
1438
+ ext = ARM64_EXT_UXTW;
1439
+ break;
1440
+
1441
+ case AArch64_AM_UXTX:
1442
+ ext = ARM64_EXT_UXTX;
1443
+ break;
1444
+
1445
+ case AArch64_AM_SXTB:
1446
+ ext = ARM64_EXT_SXTB;
1447
+ break;
1448
+
1449
+ case AArch64_AM_SXTH:
1450
+ ext = ARM64_EXT_SXTH;
1451
+ break;
1452
+
1453
+ case AArch64_AM_SXTW:
1454
+ ext = ARM64_EXT_SXTW;
1455
+ break;
1456
+
1457
+ case AArch64_AM_SXTX:
1458
+ ext = ARM64_EXT_SXTX;
1459
+ break;
1460
+ }
1461
+
1462
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].ext = ext;
1463
+ }
1464
+
1465
+ if (ShiftVal != 0) {
1466
+ SStream_concat0(O, " ");
1467
+ printInt32Bang(O, ShiftVal);
1468
+
1469
+ if (MI->csh->detail) {
1470
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.type = ARM64_SFT_LSL;
1471
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.value = ShiftVal;
1472
+ }
1473
+ }
1474
+ }
1475
+
1476
+ static void printExtendedRegister(MCInst *MI, unsigned OpNum, SStream *O)
1477
+ {
1478
+ unsigned Reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum));
1479
+
1480
+ SStream_concat0(O, getRegisterName(Reg, AArch64_NoRegAltName));
1481
+
1482
+ if (MI->csh->detail) {
1483
+ #ifndef CAPSTONE_DIET
1484
+ uint8_t access;
1485
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1486
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1487
+ MI->ac_idx++;
1488
+ #endif
1489
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1490
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
1491
+ MI->flat_insn->detail->arm64.op_count++;
1492
+ }
1493
+
1494
+ printArithExtend(MI, OpNum + 1, O);
1495
+ }
1496
+
1497
+ static void printMemExtendImpl(MCInst *MI, bool SignExtend, bool DoShift, unsigned Width,
1498
+ char SrcRegKind, SStream *O)
1499
+ {
1500
+ // sxtw, sxtx, uxtw or lsl (== uxtx)
1501
+ bool IsLSL = !SignExtend && SrcRegKind == 'x';
1502
+ if (IsLSL) {
1503
+ SStream_concat0(O, "lsl");
1504
+
1505
+ if (MI->csh->detail) {
1506
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].shift.type = ARM64_SFT_LSL;
1507
+ }
1508
+ } else {
1509
+ SStream_concat(O, "%cxt%c", (SignExtend ? 's' : 'u'), SrcRegKind);
1510
+
1511
+ if (MI->csh->detail) {
1512
+ if (!SignExtend) {
1513
+ switch(SrcRegKind) {
1514
+ default: break;
1515
+ case 'b':
1516
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_UXTB;
1517
+ break;
1518
+ case 'h':
1519
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_UXTH;
1520
+ break;
1521
+ case 'w':
1522
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_UXTW;
1523
+ break;
1524
+ }
1525
+ } else {
1526
+ switch(SrcRegKind) {
1527
+ default: break;
1528
+ case 'b':
1529
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_SXTB;
1530
+ break;
1531
+ case 'h':
1532
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_SXTH;
1533
+ break;
1534
+ case 'w':
1535
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_SXTW;
1536
+ break;
1537
+ case 'x':
1538
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_SXTX;
1539
+ break;
1540
+ }
1541
+ }
1542
+ }
1543
+ }
1544
+
1545
+ if (DoShift || IsLSL) {
1546
+ SStream_concat(O, " #%u", Log2_32(Width / 8));
1547
+
1548
+ if (MI->csh->detail) {
1549
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].shift.type = ARM64_SFT_LSL;
1550
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].shift.value = Log2_32(Width / 8);
1551
+ }
1552
+ }
1553
+ }
1554
+
1555
+ static void printMemExtend(MCInst *MI, unsigned OpNum, SStream *O, char SrcRegKind, unsigned Width)
1556
+ {
1557
+ unsigned SignExtend = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1558
+ unsigned DoShift = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum + 1));
1559
+
1560
+ printMemExtendImpl(MI, SignExtend, DoShift, Width, SrcRegKind, O);
1561
+ }
1562
+
1563
+ static void printRegWithShiftExtend(MCInst *MI, unsigned OpNum, SStream *O,
1564
+ bool SignExtend, int ExtWidth,
1565
+ char SrcRegKind, char Suffix)
1566
+ {
1567
+ bool DoShift;
1568
+
1569
+ printOperand(MI, OpNum, O);
1570
+
1571
+ if (Suffix == 's' || Suffix == 'd')
1572
+ SStream_concat(O, ".%c", Suffix);
1573
+
1574
+ DoShift = ExtWidth != 8;
1575
+ if (SignExtend || DoShift || SrcRegKind == 'w') {
1576
+ SStream_concat0(O, ", ");
1577
+ printMemExtendImpl(MI, SignExtend, DoShift, ExtWidth, SrcRegKind, O);
1578
+ }
1579
+ }
1580
+
1581
+ static void printCondCode(MCInst *MI, unsigned OpNum, SStream *O)
1582
+ {
1583
+ AArch64CC_CondCode CC = (AArch64CC_CondCode)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1584
+ SStream_concat0(O, getCondCodeName(CC));
1585
+
1586
+ if (MI->csh->detail)
1587
+ MI->flat_insn->detail->arm64.cc = (arm64_cc)(CC + 1);
1588
+ }
1589
+
1590
+ static void printInverseCondCode(MCInst *MI, unsigned OpNum, SStream *O)
1591
+ {
1592
+ AArch64CC_CondCode CC = (AArch64CC_CondCode)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1593
+ SStream_concat0(O, getCondCodeName(getInvertedCondCode(CC)));
1594
+
1595
+ if (MI->csh->detail) {
1596
+ MI->flat_insn->detail->arm64.cc = (arm64_cc)(getInvertedCondCode(CC) + 1);
1597
+ }
1598
+ }
1599
+
1600
+ static void printImmScale(MCInst *MI, unsigned OpNum, SStream *O, int Scale)
1601
+ {
1602
+ int64_t val = Scale * MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1603
+
1604
+ printInt64Bang(O, val);
1605
+
1606
+ if (MI->csh->detail) {
1607
+ if (MI->csh->doing_mem) {
1608
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.disp = (int32_t)val;
1609
+ } else {
1610
+ #ifndef CAPSTONE_DIET
1611
+ uint8_t access;
1612
+
1613
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1614
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1615
+ MI->ac_idx++;
1616
+ #endif
1617
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1618
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = val;
1619
+ MI->flat_insn->detail->arm64.op_count++;
1620
+ }
1621
+ }
1622
+ }
1623
+
1624
+ static void printUImm12Offset(MCInst *MI, unsigned OpNum, SStream *O, unsigned Scale)
1625
+ {
1626
+ MCOperand *MO = MCInst_getOperand(MI, OpNum);
1627
+
1628
+ if (MCOperand_isImm(MO)) {
1629
+ int64_t val = Scale * MCOperand_getImm(MO);
1630
+ printInt64Bang(O, val);
1631
+
1632
+ if (MI->csh->detail) {
1633
+ if (MI->csh->doing_mem) {
1634
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.disp = (int32_t)val;
1635
+ } else {
1636
+ #ifndef CAPSTONE_DIET
1637
+ uint8_t access;
1638
+
1639
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1640
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1641
+ MI->ac_idx++;
1642
+ #endif
1643
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1644
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = (int)val;
1645
+ MI->flat_insn->detail->arm64.op_count++;
1646
+ }
1647
+ }
1648
+ }
1649
+ }
1650
+
1651
+ #if 0
1652
+ static void printAMIndexedWB(MCInst *MI, unsigned OpNum, SStream *O, unsigned int Scale)
1653
+ {
1654
+ MCOperand *MO = MCInst_getOperand(MI, OpNum + 1);
1655
+
1656
+ SStream_concat(O, "[%s", getRegisterName(MCOperand_getReg(MCInst_getOperand(MI, OpNum)), AArch64_NoRegAltName));
1657
+
1658
+ if (MCOperand_isImm(MO)) {
1659
+ int64_t val = Scale * MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1660
+ printInt64Bang(O, val);
1661
+ // } else {
1662
+ // // assert(MO1.isExpr() && "Unexpected operand type!");
1663
+ // SStream_concat0(O, ", ");
1664
+ // MO1.getExpr()->print(O, &MAI);
1665
+ }
1666
+
1667
+ SStream_concat0(O, "]");
1668
+ }
1669
+ #endif
1670
+
1671
+ // IsSVEPrefetch = false
1672
+ static void printPrefetchOp(MCInst *MI, unsigned OpNum, SStream *O, bool IsSVEPrefetch)
1673
+ {
1674
+ unsigned prfop = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1675
+
1676
+ if (IsSVEPrefetch) {
1677
+ const SVEPRFM *PRFM = lookupSVEPRFMByEncoding(prfop);
1678
+ if (PRFM)
1679
+ SStream_concat0(O, PRFM->Name);
1680
+
1681
+ return;
1682
+ } else {
1683
+ const PRFM *PRFM = lookupPRFMByEncoding(prfop);
1684
+ if (PRFM)
1685
+ SStream_concat0(O, PRFM->Name);
1686
+
1687
+ return;
1688
+ }
1689
+
1690
+ // FIXME: set OpcodePub?
1691
+
1692
+ printInt32Bang(O, prfop);
1693
+
1694
+ if (MI->csh->detail) {
1695
+ #ifndef CAPSTONE_DIET
1696
+ uint8_t access;
1697
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1698
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1699
+ MI->ac_idx++;
1700
+ #endif
1701
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1702
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = prfop;
1703
+ MI->flat_insn->detail->arm64.op_count++;
1704
+ }
1705
+ }
1706
+
1707
+ static void printPSBHintOp(MCInst *MI, unsigned OpNum, SStream *O)
1708
+ {
1709
+ MCOperand *Op = MCInst_getOperand(MI, OpNum);
1710
+ unsigned int psbhintop = MCOperand_getImm(Op);
1711
+
1712
+ const PSB *PSB = lookupPSBByEncoding(psbhintop);
1713
+ if (PSB)
1714
+ SStream_concat0(O, PSB->Name);
1715
+ else
1716
+ printUInt32Bang(O, psbhintop);
1717
+ }
1718
+
1719
+ static void printBTIHintOp(MCInst *MI, unsigned OpNum, SStream *O) {
1720
+ unsigned btihintop = MCOperand_getImm(MCInst_getOperand(MI, OpNum)) ^ 32;
1721
+
1722
+ const BTI *BTI = lookupBTIByEncoding(btihintop);
1723
+ if (BTI)
1724
+ SStream_concat0(O, BTI->Name);
1725
+ else
1726
+ printUInt32Bang(O, btihintop);
1727
+ }
1728
+
1729
+ static void printFPImmOperand(MCInst *MI, unsigned OpNum, SStream *O)
1730
+ {
1731
+ MCOperand *MO = MCInst_getOperand(MI, OpNum);
1732
+ float FPImm = MCOperand_isFPImm(MO) ? MCOperand_getFPImm(MO) : AArch64_AM_getFPImmFloat((int)MCOperand_getImm(MO));
1733
+
1734
+ // 8 decimal places are enough to perfectly represent permitted floats.
1735
+ #if defined(_KERNEL_MODE)
1736
+ // Issue #681: Windows kernel does not support formatting float point
1737
+ SStream_concat0(O, "#<float_point_unsupported>");
1738
+ #else
1739
+ SStream_concat(O, "#%.8f", FPImm);
1740
+ #endif
1741
+
1742
+ if (MI->csh->detail) {
1743
+ #ifndef CAPSTONE_DIET
1744
+ uint8_t access;
1745
+
1746
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1747
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1748
+ MI->ac_idx++;
1749
+ #endif
1750
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_FP;
1751
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].fp = FPImm;
1752
+ MI->flat_insn->detail->arm64.op_count++;
1753
+ }
1754
+ }
1755
+
1756
+ //static unsigned getNextVectorRegister(unsigned Reg, unsigned Stride = 1)
1757
+ static unsigned getNextVectorRegister(unsigned Reg, unsigned Stride)
1758
+ {
1759
+ while (Stride--) {
1760
+ if (Reg >= AArch64_Q0 && Reg <= AArch64_Q30) // AArch64_Q0 .. AArch64_Q30
1761
+ Reg += 1;
1762
+ else if (Reg == AArch64_Q31) // Vector lists can wrap around.
1763
+ Reg = AArch64_Q0;
1764
+ else if (Reg >= AArch64_Z0 && Reg <= AArch64_Z30) // AArch64_Z0 .. AArch64_Z30
1765
+ Reg += 1;
1766
+ else if (Reg == AArch64_Z31) // Vector lists can wrap around.
1767
+ Reg = AArch64_Z0;
1768
+ }
1769
+
1770
+ return Reg;
1771
+ }
1772
+
1773
+ static void printGPRSeqPairsClassOperand(MCInst *MI, unsigned OpNum, SStream *O, unsigned int size)
1774
+ {
1775
+ // static_assert(size == 64 || size == 32,
1776
+ // "Template parameter must be either 32 or 64");
1777
+ unsigned Reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum));
1778
+ unsigned Sube = (size == 32) ? AArch64_sube32 : AArch64_sube64;
1779
+ unsigned Subo = (size == 32) ? AArch64_subo32 : AArch64_subo64;
1780
+ unsigned Even = MCRegisterInfo_getSubReg(MI->MRI, Reg, Sube);
1781
+ unsigned Odd = MCRegisterInfo_getSubReg(MI->MRI, Reg, Subo);
1782
+
1783
+ SStream_concat(O, "%s, %s", getRegisterName(Even, AArch64_NoRegAltName),
1784
+ getRegisterName(Odd, AArch64_NoRegAltName));
1785
+
1786
+ if (MI->csh->detail) {
1787
+ #ifndef CAPSTONE_DIET
1788
+ uint8_t access;
1789
+
1790
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1791
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1792
+ MI->ac_idx++;
1793
+ #endif
1794
+
1795
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1796
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Even;
1797
+ MI->flat_insn->detail->arm64.op_count++;
1798
+
1799
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1800
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Odd;
1801
+ MI->flat_insn->detail->arm64.op_count++;
1802
+ }
1803
+ }
1804
+
1805
+ static void printVectorList(MCInst *MI, unsigned OpNum, SStream *O,
1806
+ char *LayoutSuffix, MCRegisterInfo *MRI, arm64_vas vas)
1807
+ {
1808
+ #define GETREGCLASS_CONTAIN0(_class, _reg) MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, _class), _reg)
1809
+ unsigned Reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum));
1810
+ unsigned NumRegs = 1, FirstReg, i;
1811
+
1812
+ SStream_concat0(O, "{");
1813
+
1814
+ // Work out how many registers there are in the list (if there is an actual
1815
+ // list).
1816
+ if (GETREGCLASS_CONTAIN0(AArch64_DDRegClassID , Reg) ||
1817
+ GETREGCLASS_CONTAIN0(AArch64_ZPR2RegClassID, Reg) ||
1818
+ GETREGCLASS_CONTAIN0(AArch64_QQRegClassID, Reg))
1819
+ NumRegs = 2;
1820
+ else if (GETREGCLASS_CONTAIN0(AArch64_DDDRegClassID, Reg) ||
1821
+ GETREGCLASS_CONTAIN0(AArch64_ZPR3RegClassID, Reg) ||
1822
+ GETREGCLASS_CONTAIN0(AArch64_QQQRegClassID, Reg))
1823
+ NumRegs = 3;
1824
+ else if (GETREGCLASS_CONTAIN0(AArch64_DDDDRegClassID, Reg) ||
1825
+ GETREGCLASS_CONTAIN0(AArch64_ZPR4RegClassID, Reg) ||
1826
+ GETREGCLASS_CONTAIN0(AArch64_QQQQRegClassID, Reg))
1827
+ NumRegs = 4;
1828
+
1829
+ // Now forget about the list and find out what the first register is.
1830
+ if ((FirstReg = MCRegisterInfo_getSubReg(MRI, Reg, AArch64_dsub0)))
1831
+ Reg = FirstReg;
1832
+ else if ((FirstReg = MCRegisterInfo_getSubReg(MRI, Reg, AArch64_qsub0)))
1833
+ Reg = FirstReg;
1834
+ else if ((FirstReg = MCRegisterInfo_getSubReg(MRI, Reg, AArch64_zsub0)))
1835
+ Reg = FirstReg;
1836
+
1837
+ // If it's a D-reg, we need to promote it to the equivalent Q-reg before
1838
+ // printing (otherwise getRegisterName fails).
1839
+ if (GETREGCLASS_CONTAIN0(AArch64_FPR64RegClassID, Reg)) {
1840
+ const MCRegisterClass *FPR128RC = MCRegisterInfo_getRegClass(MRI, AArch64_FPR128RegClassID);
1841
+ Reg = MCRegisterInfo_getMatchingSuperReg(MRI, Reg, AArch64_dsub, FPR128RC);
1842
+ }
1843
+
1844
+ for (i = 0; i < NumRegs; ++i, Reg = getNextVectorRegister(Reg, 1)) {
1845
+ bool isZReg = GETREGCLASS_CONTAIN0(AArch64_ZPRRegClassID, Reg);
1846
+ if (isZReg)
1847
+ SStream_concat(O, "%s%s", getRegisterName(Reg, AArch64_NoRegAltName), LayoutSuffix);
1848
+ else
1849
+ SStream_concat(O, "%s%s", getRegisterName(Reg, AArch64_vreg), LayoutSuffix);
1850
+
1851
+ if (MI->csh->detail) {
1852
+ #ifndef CAPSTONE_DIET
1853
+ uint8_t access;
1854
+
1855
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1856
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1857
+ MI->ac_idx++;
1858
+ #endif
1859
+ unsigned regForDetail = isZReg ? Reg : AArch64_map_vregister(Reg);
1860
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1861
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = regForDetail;
1862
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].vas = vas;
1863
+ MI->flat_insn->detail->arm64.op_count++;
1864
+ }
1865
+
1866
+ if (i + 1 != NumRegs)
1867
+ SStream_concat0(O, ", ");
1868
+ }
1869
+
1870
+ SStream_concat0(O, "}");
1871
+ }
1872
+
1873
+ static void printTypedVectorList(MCInst *MI, unsigned OpNum, SStream *O, unsigned NumLanes, char LaneKind)
1874
+ {
1875
+ char Suffix[32];
1876
+ arm64_vas vas = 0;
1877
+
1878
+ if (NumLanes) {
1879
+ cs_snprintf(Suffix, sizeof(Suffix), ".%u%c", NumLanes, LaneKind);
1880
+
1881
+ switch(LaneKind) {
1882
+ default: break;
1883
+ case 'b':
1884
+ switch(NumLanes) {
1885
+ default: break;
1886
+ case 1:
1887
+ vas = ARM64_VAS_1B;
1888
+ break;
1889
+ case 4:
1890
+ vas = ARM64_VAS_4B;
1891
+ break;
1892
+ case 8:
1893
+ vas = ARM64_VAS_8B;
1894
+ break;
1895
+ case 16:
1896
+ vas = ARM64_VAS_16B;
1897
+ break;
1898
+ }
1899
+ break;
1900
+ case 'h':
1901
+ switch(NumLanes) {
1902
+ default: break;
1903
+ case 1:
1904
+ vas = ARM64_VAS_1H;
1905
+ break;
1906
+ case 2:
1907
+ vas = ARM64_VAS_2H;
1908
+ break;
1909
+ case 4:
1910
+ vas = ARM64_VAS_4H;
1911
+ break;
1912
+ case 8:
1913
+ vas = ARM64_VAS_8H;
1914
+ break;
1915
+ }
1916
+ break;
1917
+ case 's':
1918
+ switch(NumLanes) {
1919
+ default: break;
1920
+ case 1:
1921
+ vas = ARM64_VAS_1S;
1922
+ break;
1923
+ case 2:
1924
+ vas = ARM64_VAS_2S;
1925
+ break;
1926
+ case 4:
1927
+ vas = ARM64_VAS_4S;
1928
+ break;
1929
+ }
1930
+ break;
1931
+ case 'd':
1932
+ switch(NumLanes) {
1933
+ default: break;
1934
+ case 1:
1935
+ vas = ARM64_VAS_1D;
1936
+ break;
1937
+ case 2:
1938
+ vas = ARM64_VAS_2D;
1939
+ break;
1940
+ }
1941
+ break;
1942
+ case 'q':
1943
+ switch(NumLanes) {
1944
+ default: break;
1945
+ case 1:
1946
+ vas = ARM64_VAS_1Q;
1947
+ break;
1948
+ }
1949
+ break;
1950
+ }
1951
+ } else {
1952
+ cs_snprintf(Suffix, sizeof(Suffix), ".%c", LaneKind);
1953
+
1954
+ switch(LaneKind) {
1955
+ default: break;
1956
+ case 'b':
1957
+ vas = ARM64_VAS_1B;
1958
+ break;
1959
+ case 'h':
1960
+ vas = ARM64_VAS_1H;
1961
+ break;
1962
+ case 's':
1963
+ vas = ARM64_VAS_1S;
1964
+ break;
1965
+ case 'd':
1966
+ vas = ARM64_VAS_1D;
1967
+ break;
1968
+ case 'q':
1969
+ vas = ARM64_VAS_1Q;
1970
+ break;
1971
+ }
1972
+ }
1973
+
1974
+ printVectorList(MI, OpNum, O, Suffix, MI->MRI, vas);
1975
+ }
1976
+
1977
+ static void printVectorIndex(MCInst *MI, unsigned OpNum, SStream *O)
1978
+ {
1979
+ SStream_concat0(O, "[");
1980
+ printInt32(O, (int)MCOperand_getImm(MCInst_getOperand(MI, OpNum)));
1981
+ SStream_concat0(O, "]");
1982
+
1983
+ if (MI->csh->detail) {
1984
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].vector_index = (int)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1985
+ }
1986
+ }
1987
+
1988
+ static void printAlignedLabel(MCInst *MI, unsigned OpNum, SStream *O)
1989
+ {
1990
+ MCOperand *Op = MCInst_getOperand(MI, OpNum);
1991
+
1992
+ // If the label has already been resolved to an immediate offset (say, when
1993
+ // we're running the disassembler), just print the immediate.
1994
+ if (MCOperand_isImm(Op)) {
1995
+ uint64_t imm = (MCOperand_getImm(Op) * 4) + MI->address;
1996
+ printUInt64Bang(O, imm);
1997
+
1998
+ if (MI->csh->detail) {
1999
+ #ifndef CAPSTONE_DIET
2000
+ uint8_t access;
2001
+
2002
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2003
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2004
+ MI->ac_idx++;
2005
+ #endif
2006
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
2007
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = imm;
2008
+ MI->flat_insn->detail->arm64.op_count++;
2009
+ }
2010
+ }
2011
+ }
2012
+
2013
+ static void printAdrpLabel(MCInst *MI, unsigned OpNum, SStream *O)
2014
+ {
2015
+ MCOperand *Op = MCInst_getOperand(MI, OpNum);
2016
+
2017
+ if (MCOperand_isImm(Op)) {
2018
+ // ADRP sign extends a 21-bit offset, shifts it left by 12
2019
+ // and adds it to the value of the PC with its bottom 12 bits cleared
2020
+ uint64_t imm = (MCOperand_getImm(Op) * 0x1000) + (MI->address & ~0xfff);
2021
+ printUInt64Bang(O, imm);
2022
+
2023
+ if (MI->csh->detail) {
2024
+ #ifndef CAPSTONE_DIET
2025
+ uint8_t access;
2026
+
2027
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2028
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2029
+ MI->ac_idx++;
2030
+ #endif
2031
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
2032
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = imm;
2033
+ MI->flat_insn->detail->arm64.op_count++;
2034
+ }
2035
+ }
2036
+ }
2037
+
2038
+ static void printBarrierOption(MCInst *MI, unsigned OpNum, SStream *O)
2039
+ {
2040
+ unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2041
+ unsigned Opcode = MCInst_getOpcode(MI);
2042
+ const char *Name = NULL;
2043
+
2044
+ if (Opcode == AArch64_ISB) {
2045
+ const ISB *ISB = lookupISBByEncoding(Val);
2046
+ Name = ISB ? ISB->Name : NULL;
2047
+ } else if (Opcode == AArch64_TSB) {
2048
+ const TSB *TSB = lookupTSBByEncoding(Val);
2049
+ Name = TSB ? TSB->Name : NULL;
2050
+ } else {
2051
+ const DB *DB = lookupDBByEncoding(Val);
2052
+ Name = DB ? DB->Name : NULL;
2053
+ }
2054
+
2055
+ if (Name) {
2056
+ SStream_concat0(O, Name);
2057
+
2058
+ if (MI->csh->detail) {
2059
+ #ifndef CAPSTONE_DIET
2060
+ uint8_t access;
2061
+
2062
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2063
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2064
+ MI->ac_idx++;
2065
+ #endif
2066
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_BARRIER;
2067
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].barrier = Val;
2068
+ MI->flat_insn->detail->arm64.op_count++;
2069
+ }
2070
+ } else {
2071
+ printUInt32Bang(O, Val);
2072
+
2073
+ if (MI->csh->detail) {
2074
+ #ifndef CAPSTONE_DIET
2075
+ uint8_t access;
2076
+
2077
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2078
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2079
+ MI->ac_idx++;
2080
+ #endif
2081
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
2082
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
2083
+ MI->flat_insn->detail->arm64.op_count++;
2084
+ }
2085
+ }
2086
+ }
2087
+
2088
+ static void printBarriernXSOption(MCInst *MI, unsigned OpNo, SStream *O) {
2089
+ unsigned Val = MCOperand_getImm(MCInst_getOperand(MI, OpNo));
2090
+ // assert(MI->getOpcode() == AArch64::DSBnXS);
2091
+
2092
+ const char *Name = NULL;
2093
+ const DBnXS *DB = lookupDBnXSByEncoding(Val);
2094
+ Name = DB ? DB->Name : NULL;
2095
+
2096
+ if (Name) {
2097
+ SStream_concat0(O, Name);
2098
+
2099
+ if (MI->csh->detail) {
2100
+ #ifndef CAPSTONE_DIET
2101
+ uint8_t access;
2102
+
2103
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2104
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2105
+ MI->ac_idx++;
2106
+ #endif
2107
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_BARRIER;
2108
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].barrier = Val;
2109
+ MI->flat_insn->detail->arm64.op_count++;
2110
+ }
2111
+ }
2112
+ else {
2113
+ printUInt32Bang(O, Val);
2114
+
2115
+ if (MI->csh->detail) {
2116
+ #ifndef CAPSTONE_DIET
2117
+ uint8_t access;
2118
+
2119
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2120
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2121
+ MI->ac_idx++;
2122
+ #endif
2123
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
2124
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
2125
+ MI->flat_insn->detail->arm64.op_count++;
2126
+ }
2127
+ }
2128
+ }
2129
+
2130
+ static void printMRSSystemRegister(MCInst *MI, unsigned OpNum, SStream *O)
2131
+ {
2132
+ unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2133
+ const SysReg *Reg = lookupSysRegByEncoding(Val);
2134
+
2135
+ // Horrible hack for the one register that has identical encodings but
2136
+ // different names in MSR and MRS. Because of this, one of MRS and MSR is
2137
+ // going to get the wrong entry
2138
+ if (Val == ARM64_SYSREG_DBGDTRRX_EL0) {
2139
+ SStream_concat0(O, "dbgdtrrx_el0");
2140
+
2141
+ if (MI->csh->detail) {
2142
+ #ifndef CAPSTONE_DIET
2143
+ uint8_t access;
2144
+
2145
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2146
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2147
+ MI->ac_idx++;
2148
+ #endif
2149
+
2150
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_SYS;
2151
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].sys = Val;
2152
+ MI->flat_insn->detail->arm64.op_count++;
2153
+ }
2154
+
2155
+ return;
2156
+ }
2157
+
2158
+ // Another hack for a register which has an alternative name which is not an alias,
2159
+ // and is not in the Armv9-A documentation.
2160
+ if( Val == ARM64_SYSREG_VSCTLR_EL2){
2161
+ SStream_concat0(O, "ttbr0_el2");
2162
+
2163
+ if (MI->csh->detail) {
2164
+ #ifndef CAPSTONE_DIET
2165
+ uint8_t access;
2166
+
2167
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2168
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2169
+ MI->ac_idx++;
2170
+ #endif
2171
+
2172
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_SYS;
2173
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].sys = Val;
2174
+ MI->flat_insn->detail->arm64.op_count++;
2175
+ }
2176
+
2177
+ return;
2178
+ }
2179
+
2180
+ // if (Reg && Reg->Readable && Reg->haveFeatures(STI.getFeatureBits()))
2181
+ if (Reg && Reg->Readable) {
2182
+ SStream_concat0(O, Reg->Name);
2183
+
2184
+ if (MI->csh->detail) {
2185
+ #ifndef CAPSTONE_DIET
2186
+ uint8_t access;
2187
+
2188
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2189
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2190
+ MI->ac_idx++;
2191
+ #endif
2192
+
2193
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_SYS;
2194
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].sys = Reg->Encoding;
2195
+ MI->flat_insn->detail->arm64.op_count++;
2196
+ }
2197
+ } else {
2198
+ char result[128];
2199
+
2200
+ AArch64SysReg_genericRegisterString(Val, result);
2201
+ SStream_concat0(O, result);
2202
+
2203
+ if (MI->csh->detail) {
2204
+ #ifndef CAPSTONE_DIET
2205
+ uint8_t access;
2206
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2207
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2208
+ MI->ac_idx++;
2209
+ #endif
2210
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG_MRS;
2211
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Val;
2212
+ MI->flat_insn->detail->arm64.op_count++;
2213
+ }
2214
+ }
2215
+ }
2216
+
2217
+ static void printMSRSystemRegister(MCInst *MI, unsigned OpNum, SStream *O)
2218
+ {
2219
+ unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2220
+ const SysReg *Reg = lookupSysRegByEncoding(Val);
2221
+
2222
+ // Horrible hack for the one register that has identical encodings but
2223
+ // different names in MSR and MRS. Because of this, one of MRS and MSR is
2224
+ // going to get the wrong entry
2225
+ if (Val == ARM64_SYSREG_DBGDTRTX_EL0) {
2226
+ SStream_concat0(O, "dbgdtrtx_el0");
2227
+
2228
+ if (MI->csh->detail) {
2229
+ #ifndef CAPSTONE_DIET
2230
+ uint8_t access;
2231
+
2232
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2233
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2234
+ MI->ac_idx++;
2235
+ #endif
2236
+
2237
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_SYS;
2238
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].sys = Val;
2239
+ MI->flat_insn->detail->arm64.op_count++;
2240
+ }
2241
+
2242
+ return;
2243
+ }
2244
+
2245
+ // Another hack for a register which has an alternative name which is not an alias,
2246
+ // and is not in the Armv9-A documentation.
2247
+ if( Val == ARM64_SYSREG_VSCTLR_EL2){
2248
+ SStream_concat0(O, "ttbr0_el2");
2249
+
2250
+ if (MI->csh->detail) {
2251
+ #ifndef CAPSTONE_DIET
2252
+ uint8_t access;
2253
+
2254
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2255
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2256
+ MI->ac_idx++;
2257
+ #endif
2258
+
2259
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_SYS;
2260
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].sys = Val;
2261
+ MI->flat_insn->detail->arm64.op_count++;
2262
+ }
2263
+
2264
+ return;
2265
+ }
2266
+
2267
+ // if (Reg && Reg->Writeable && Reg->haveFeatures(STI.getFeatureBits()))
2268
+ if (Reg && Reg->Writeable) {
2269
+ SStream_concat0(O, Reg->Name);
2270
+
2271
+ if (MI->csh->detail) {
2272
+ #ifndef CAPSTONE_DIET
2273
+ uint8_t access;
2274
+
2275
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2276
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2277
+ MI->ac_idx++;
2278
+ #endif
2279
+
2280
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_SYS;
2281
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].sys = Reg->Encoding;
2282
+ MI->flat_insn->detail->arm64.op_count++;
2283
+ }
2284
+ } else {
2285
+ char result[128];
2286
+
2287
+ AArch64SysReg_genericRegisterString(Val, result);
2288
+ SStream_concat0(O, result);
2289
+
2290
+ if (MI->csh->detail) {
2291
+ #ifndef CAPSTONE_DIET
2292
+ uint8_t access;
2293
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2294
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2295
+ MI->ac_idx++;
2296
+ #endif
2297
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG_MRS;
2298
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Val;
2299
+ MI->flat_insn->detail->arm64.op_count++;
2300
+ }
2301
+ }
2302
+ }
2303
+
2304
+ static void printSystemPStateField(MCInst *MI, unsigned OpNum, SStream *O)
2305
+ {
2306
+ unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2307
+
2308
+ const PState *PState = lookupPStateByEncoding(Val);
2309
+
2310
+ if (PState) {
2311
+ SStream_concat0(O, PState->Name);
2312
+
2313
+ if (MI->csh->detail) {
2314
+ #ifndef CAPSTONE_DIET
2315
+ uint8_t access;
2316
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2317
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2318
+ MI->ac_idx++;
2319
+ #endif
2320
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_PSTATE;
2321
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].pstate = Val;
2322
+ MI->flat_insn->detail->arm64.op_count++;
2323
+ }
2324
+ } else {
2325
+ printUInt32Bang(O, Val);
2326
+
2327
+ if (MI->csh->detail) {
2328
+ #ifndef CAPSTONE_DIET
2329
+ unsigned char access;
2330
+
2331
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2332
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2333
+ MI->ac_idx++;
2334
+ #endif
2335
+
2336
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
2337
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
2338
+ MI->flat_insn->detail->arm64.op_count++;
2339
+ }
2340
+ }
2341
+ }
2342
+
2343
+ static void printSIMDType10Operand(MCInst *MI, unsigned OpNum, SStream *O)
2344
+ {
2345
+ uint8_t RawVal = (uint8_t)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2346
+ uint64_t Val = AArch64_AM_decodeAdvSIMDModImmType10(RawVal);
2347
+
2348
+ SStream_concat(O, "#%#016llx", Val);
2349
+
2350
+ if (MI->csh->detail) {
2351
+ #ifndef CAPSTONE_DIET
2352
+ unsigned char access;
2353
+
2354
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2355
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2356
+ MI->ac_idx++;
2357
+ #endif
2358
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
2359
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
2360
+ MI->flat_insn->detail->arm64.op_count++;
2361
+ }
2362
+ }
2363
+
2364
+ static void printComplexRotationOp(MCInst *MI, unsigned OpNum, SStream *O, int64_t Angle, int64_t Remainder)
2365
+ {
2366
+ unsigned int Val = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2367
+ printInt64Bang(O, (Val * Angle) + Remainder);
2368
+ op_addImm(MI, (Val * Angle) + Remainder);
2369
+ }
2370
+
2371
+ static void printSVCROp(MCInst *MI, unsigned OpNum, SStream *O)
2372
+ {
2373
+ MCOperand *MO = MCInst_getOperand(MI, OpNum);
2374
+ // assert(MCOperand_isImm(MO) && "Unexpected operand type!");
2375
+ unsigned svcrop = MCOperand_getImm(MO);
2376
+ const SVCR *svcr = lookupSVCRByEncoding(svcrop);
2377
+ // assert(svcr && "Unexpected SVCR operand!");
2378
+ SStream_concat0(O, svcr->Name);
2379
+
2380
+ if (MI->csh->detail) {
2381
+ #ifndef CAPSTONE_DIET
2382
+ uint8_t access;
2383
+
2384
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2385
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2386
+ MI->ac_idx++;
2387
+ #endif
2388
+
2389
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_SVCR;
2390
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].sys = (unsigned)ARM64_SYSREG_SVCR;
2391
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].svcr = svcr->Encoding;
2392
+ MI->flat_insn->detail->arm64.op_count++;
2393
+ }
2394
+ }
2395
+
2396
+ static void printMatrix(MCInst *MI, unsigned OpNum, SStream *O, int EltSize)
2397
+ {
2398
+ MCOperand *RegOp = MCInst_getOperand(MI, OpNum);
2399
+ // assert(MCOperand_isReg(RegOp) && "Unexpected operand type!");
2400
+ unsigned Reg = MCOperand_getReg(RegOp);
2401
+
2402
+ SStream_concat0(O, getRegisterName(Reg, AArch64_NoRegAltName));
2403
+ const char *sizeStr = "";
2404
+ switch (EltSize) {
2405
+ case 0:
2406
+ sizeStr = "";
2407
+ break;
2408
+ case 8:
2409
+ sizeStr = ".b";
2410
+ break;
2411
+ case 16:
2412
+ sizeStr = ".h";
2413
+ break;
2414
+ case 32:
2415
+ sizeStr = ".s";
2416
+ break;
2417
+ case 64:
2418
+ sizeStr = ".d";
2419
+ break;
2420
+ case 128:
2421
+ sizeStr = ".q";
2422
+ break;
2423
+ default:
2424
+ break;
2425
+ // llvm_unreachable("Unsupported element size");
2426
+ }
2427
+ SStream_concat0(O, sizeStr);
2428
+
2429
+ if (MI->csh->detail) {
2430
+ #ifndef CAPSTONE_DIET
2431
+ uint8_t access;
2432
+
2433
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2434
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2435
+ MI->ac_idx++;
2436
+ #endif
2437
+
2438
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
2439
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
2440
+ MI->flat_insn->detail->arm64.op_count++;
2441
+ }
2442
+ }
2443
+
2444
+ static void printMatrixIndex(MCInst *MI, unsigned OpNum, SStream *O)
2445
+ {
2446
+ int64_t imm = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2447
+ printInt64(O, imm);
2448
+
2449
+ if (MI->csh->detail) {
2450
+ if (MI->csh->doing_SME_Index) {
2451
+ // Access op_count-1 as We want to add info to previous operand, not create a new one
2452
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count-1].sme_index.disp = imm;
2453
+ }
2454
+ }
2455
+ }
2456
+
2457
+ static void printMatrixTile(MCInst *MI, unsigned OpNum, SStream *O)
2458
+ {
2459
+ MCOperand *RegOp = MCInst_getOperand(MI, OpNum);
2460
+ // assert(MCOperand_isReg(RegOp) && "Unexpected operand type!");
2461
+ unsigned Reg = MCOperand_getReg(RegOp);
2462
+ SStream_concat0(O, getRegisterName(Reg, AArch64_NoRegAltName));
2463
+
2464
+ if (MI->csh->detail) {
2465
+ #ifndef CAPSTONE_DIET
2466
+ uint8_t access;
2467
+
2468
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2469
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2470
+ MI->ac_idx++;
2471
+ #endif
2472
+
2473
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
2474
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
2475
+ MI->flat_insn->detail->arm64.op_count++;
2476
+ }
2477
+ }
2478
+
2479
+ static void printMatrixTileVector(MCInst *MI, unsigned OpNum, SStream *O, bool IsVertical)
2480
+ {
2481
+ MCOperand *RegOp = MCInst_getOperand(MI, OpNum);
2482
+ // assert(MCOperand_isReg(RegOp) && "Unexpected operand type!");
2483
+ unsigned Reg = MCOperand_getReg(RegOp);
2484
+ #ifndef CAPSTONE_DIET
2485
+ const char *RegName = getRegisterName(Reg, AArch64_NoRegAltName);
2486
+
2487
+ const size_t strLn = strlen(RegName);
2488
+ // +2 for extra chars, + 1 for null char \0
2489
+ char *RegNameNew = cs_mem_malloc(sizeof(char) * (strLn + 2 + 1));
2490
+ int index = 0, i;
2491
+ for (i = 0; i < (strLn + 2); i++){
2492
+ if(RegName[i] != '.'){
2493
+ RegNameNew[index] = RegName[i];
2494
+ index++;
2495
+ }
2496
+ else{
2497
+ RegNameNew[index] = IsVertical ? 'v' : 'h';
2498
+ RegNameNew[index + 1] = '.';
2499
+ index += 2;
2500
+ }
2501
+ }
2502
+ SStream_concat0(O, RegNameNew);
2503
+ #endif
2504
+
2505
+ if (MI->csh->detail) {
2506
+ #ifndef CAPSTONE_DIET
2507
+ uint8_t access;
2508
+
2509
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2510
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2511
+ MI->ac_idx++;
2512
+ #endif
2513
+
2514
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
2515
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
2516
+ MI->flat_insn->detail->arm64.op_count++;
2517
+ }
2518
+ #ifndef CAPSTONE_DIET
2519
+ cs_mem_free(RegNameNew);
2520
+ #endif
2521
+ }
2522
+
2523
+ static const unsigned MatrixZADRegisterTable[] = {
2524
+ AArch64_ZAD0, AArch64_ZAD1, AArch64_ZAD2, AArch64_ZAD3,
2525
+ AArch64_ZAD4, AArch64_ZAD5, AArch64_ZAD6, AArch64_ZAD7
2526
+ };
2527
+
2528
+ static void printMatrixTileList(MCInst *MI, unsigned OpNum, SStream *O){
2529
+ unsigned MaxRegs = 8;
2530
+ unsigned RegMask = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2531
+
2532
+ unsigned NumRegs = 0, I;
2533
+ for (I = 0; I < MaxRegs; ++I)
2534
+ if ((RegMask & (1 << I)) != 0)
2535
+ ++NumRegs;
2536
+
2537
+ SStream_concat0(O, "{");
2538
+ unsigned Printed = 0, J;
2539
+ for (J = 0; J < MaxRegs; ++J) {
2540
+ unsigned Reg = RegMask & (1 << J);
2541
+ if (Reg == 0)
2542
+ continue;
2543
+ SStream_concat0(O, getRegisterName(MatrixZADRegisterTable[J], AArch64_NoRegAltName));
2544
+
2545
+ if (MI->csh->detail) {
2546
+ #ifndef CAPSTONE_DIET
2547
+ uint8_t access;
2548
+
2549
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2550
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2551
+ MI->ac_idx++;
2552
+ #endif
2553
+
2554
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
2555
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MatrixZADRegisterTable[J];
2556
+ MI->flat_insn->detail->arm64.op_count++;
2557
+ }
2558
+
2559
+ if (Printed + 1 != NumRegs)
2560
+ SStream_concat0(O, ", ");
2561
+ ++Printed;
2562
+ }
2563
+ SStream_concat0(O, "}");
2564
+ }
2565
+
2566
+ static void printSVEPattern(MCInst *MI, unsigned OpNum, SStream *O)
2567
+ {
2568
+ unsigned Val = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2569
+
2570
+ const SVEPREDPAT *Pat = lookupSVEPREDPATByEncoding(Val);
2571
+ if (Pat)
2572
+ SStream_concat0(O, Pat->Name);
2573
+ else
2574
+ printUInt32Bang(O, Val);
2575
+ }
2576
+
2577
+ // default suffix = 0
2578
+ static void printSVERegOp(MCInst *MI, unsigned OpNum, SStream *O, char suffix)
2579
+ {
2580
+ unsigned int Reg;
2581
+
2582
+ #if 0
2583
+ switch (suffix) {
2584
+ case 0:
2585
+ case 'b':
2586
+ case 'h':
2587
+ case 's':
2588
+ case 'd':
2589
+ case 'q':
2590
+ break;
2591
+ default:
2592
+ // llvm_unreachable("Invalid kind specifier.");
2593
+ }
2594
+ #endif
2595
+
2596
+ Reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum));
2597
+
2598
+ if (MI->csh->detail) {
2599
+ #ifndef CAPSTONE_DIET
2600
+ uint8_t access;
2601
+
2602
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2603
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2604
+ MI->ac_idx++;
2605
+ #endif
2606
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
2607
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
2608
+ MI->flat_insn->detail->arm64.op_count++;
2609
+ }
2610
+
2611
+ SStream_concat0(O, getRegisterName(Reg, AArch64_NoRegAltName));
2612
+
2613
+ if (suffix != '\0')
2614
+ SStream_concat(O, ".%c", suffix);
2615
+ }
2616
+
2617
+ static void printImmSVE16(int16_t Val, SStream *O)
2618
+ {
2619
+ printUInt32Bang(O, Val);
2620
+ }
2621
+
2622
+ static void printImmSVE32(int32_t Val, SStream *O)
2623
+ {
2624
+ printUInt32Bang(O, Val);
2625
+ }
2626
+
2627
+ static void printImmSVE64(int64_t Val, SStream *O)
2628
+ {
2629
+ printUInt64Bang(O, Val);
2630
+ }
2631
+
2632
+ static void printImm8OptLsl32(MCInst *MI, unsigned OpNum, SStream *O)
2633
+ {
2634
+ unsigned UnscaledVal = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2635
+ unsigned Shift = MCOperand_getImm(MCInst_getOperand(MI, OpNum + 1));
2636
+ uint32_t Val;
2637
+
2638
+ // assert(AArch64_AM::getShiftType(Shift) == AArch64_AM::LSL &&
2639
+ // "Unexepected shift type!");
2640
+
2641
+ // #0 lsl #8 is never pretty printed
2642
+ if ((UnscaledVal == 0) && (AArch64_AM_getShiftValue(Shift) != 0)) {
2643
+ printUInt32Bang(O, UnscaledVal);
2644
+ printShifter(MI, OpNum + 1, O);
2645
+ return;
2646
+ }
2647
+
2648
+ Val = UnscaledVal * (1 << AArch64_AM_getShiftValue(Shift));
2649
+ printImmSVE32(Val, O);
2650
+ }
2651
+
2652
+ static void printImm8OptLsl64(MCInst *MI, unsigned OpNum, SStream *O)
2653
+ {
2654
+ unsigned UnscaledVal = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2655
+ unsigned Shift = MCOperand_getImm(MCInst_getOperand(MI, OpNum + 1));
2656
+ uint64_t Val;
2657
+
2658
+ // assert(AArch64_AM::getShiftType(Shift) == AArch64_AM::LSL &&
2659
+ // "Unexepected shift type!");
2660
+
2661
+ // #0 lsl #8 is never pretty printed
2662
+ if ((UnscaledVal == 0) && (AArch64_AM_getShiftValue(Shift) != 0)) {
2663
+ printUInt32Bang(O, UnscaledVal);
2664
+ printShifter(MI, OpNum + 1, O);
2665
+ return;
2666
+ }
2667
+
2668
+ Val = UnscaledVal * (1 << AArch64_AM_getShiftValue(Shift));
2669
+ printImmSVE64(Val, O);
2670
+ }
2671
+
2672
+ static void printSVELogicalImm16(MCInst *MI, unsigned OpNum, SStream *O)
2673
+ {
2674
+ uint64_t Val = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2675
+ uint64_t PrintVal = AArch64_AM_decodeLogicalImmediate(Val, 64);
2676
+
2677
+ // Prefer the default format for 16bit values, hex otherwise.
2678
+ printImmSVE16(PrintVal, O);
2679
+ }
2680
+
2681
+ static void printSVELogicalImm32(MCInst *MI, unsigned OpNum, SStream *O)
2682
+ {
2683
+ uint64_t Val = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2684
+ uint64_t PrintVal = AArch64_AM_decodeLogicalImmediate(Val, 64);
2685
+
2686
+ // Prefer the default format for 16bit values, hex otherwise.
2687
+ if ((uint16_t)PrintVal == (uint32_t)PrintVal)
2688
+ printImmSVE16(PrintVal, O);
2689
+ else
2690
+ printUInt64Bang(O, PrintVal);
2691
+ }
2692
+
2693
+ static void printSVELogicalImm64(MCInst *MI, unsigned OpNum, SStream *O)
2694
+ {
2695
+ uint64_t Val = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2696
+ uint64_t PrintVal = AArch64_AM_decodeLogicalImmediate(Val, 64);
2697
+
2698
+ printImmSVE64(PrintVal, O);
2699
+ }
2700
+
2701
+ static void printZPRasFPR(MCInst *MI, unsigned OpNum, SStream *O, int Width)
2702
+ {
2703
+ unsigned int Base, Reg;
2704
+
2705
+ switch (Width) {
2706
+ default: // llvm_unreachable("Unsupported width");
2707
+ case 8: Base = AArch64_B0; break;
2708
+ case 16: Base = AArch64_H0; break;
2709
+ case 32: Base = AArch64_S0; break;
2710
+ case 64: Base = AArch64_D0; break;
2711
+ case 128: Base = AArch64_Q0; break;
2712
+ }
2713
+
2714
+ Reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum)) - AArch64_Z0 + Base;
2715
+
2716
+ SStream_concat0(O, getRegisterName(Reg, AArch64_NoRegAltName));
2717
+
2718
+ if (MI->csh->detail) {
2719
+ #ifndef CAPSTONE_DIET
2720
+ uint8_t access;
2721
+
2722
+ access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
2723
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
2724
+ MI->ac_idx++;
2725
+ #endif
2726
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
2727
+ MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
2728
+ MI->flat_insn->detail->arm64.op_count++;
2729
+ }
2730
+ }
2731
+
2732
+ static void printExactFPImm(MCInst *MI, unsigned OpNum, SStream *O, unsigned ImmIs0, unsigned ImmIs1)
2733
+ {
2734
+ const ExactFPImm *Imm0Desc = lookupExactFPImmByEnum(ImmIs0);
2735
+ const ExactFPImm *Imm1Desc = lookupExactFPImmByEnum(ImmIs1);
2736
+ unsigned Val = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
2737
+
2738
+ SStream_concat0(O, Val ? Imm1Desc->Repr : Imm0Desc->Repr);
2739
+ }
2740
+
2741
+ static void printGPR64as32(MCInst *MI, unsigned OpNum, SStream *O)
2742
+ {
2743
+ unsigned int Reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum));
2744
+
2745
+ SStream_concat0(O, getRegisterName(getWRegFromXReg(Reg), AArch64_NoRegAltName));
2746
+ }
2747
+
2748
+ static void printGPR64x8(MCInst *MI, unsigned OpNum, SStream *O)
2749
+ {
2750
+ unsigned int Reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum));
2751
+
2752
+ SStream_concat0(O, getRegisterName(MCRegisterInfo_getSubReg(MI->MRI, Reg, AArch64_x8sub_0), AArch64_NoRegAltName));
2753
+ }
2754
+
2755
+ #define PRINT_ALIAS_INSTR
2756
+ #include "AArch64GenAsmWriter.inc"
2757
+ #include "AArch64GenRegisterName.inc"
2758
+
2759
+ void AArch64_post_printer(csh handle, cs_insn *flat_insn, char *insn_asm, MCInst *mci)
2760
+ {
2761
+ if (((cs_struct *)handle)->detail != CS_OPT_ON)
2762
+ return;
2763
+
2764
+ if (mci->csh->detail) {
2765
+ unsigned opcode = MCInst_getOpcode(mci);
2766
+
2767
+ switch (opcode) {
2768
+ default:
2769
+ break;
2770
+ case AArch64_LD1Fourv16b_POST:
2771
+ case AArch64_LD1Fourv1d_POST:
2772
+ case AArch64_LD1Fourv2d_POST:
2773
+ case AArch64_LD1Fourv2s_POST:
2774
+ case AArch64_LD1Fourv4h_POST:
2775
+ case AArch64_LD1Fourv4s_POST:
2776
+ case AArch64_LD1Fourv8b_POST:
2777
+ case AArch64_LD1Fourv8h_POST:
2778
+ case AArch64_LD1Onev16b_POST:
2779
+ case AArch64_LD1Onev1d_POST:
2780
+ case AArch64_LD1Onev2d_POST:
2781
+ case AArch64_LD1Onev2s_POST:
2782
+ case AArch64_LD1Onev4h_POST:
2783
+ case AArch64_LD1Onev4s_POST:
2784
+ case AArch64_LD1Onev8b_POST:
2785
+ case AArch64_LD1Onev8h_POST:
2786
+ case AArch64_LD1Rv16b_POST:
2787
+ case AArch64_LD1Rv1d_POST:
2788
+ case AArch64_LD1Rv2d_POST:
2789
+ case AArch64_LD1Rv2s_POST:
2790
+ case AArch64_LD1Rv4h_POST:
2791
+ case AArch64_LD1Rv4s_POST:
2792
+ case AArch64_LD1Rv8b_POST:
2793
+ case AArch64_LD1Rv8h_POST:
2794
+ case AArch64_LD1Threev16b_POST:
2795
+ case AArch64_LD1Threev1d_POST:
2796
+ case AArch64_LD1Threev2d_POST:
2797
+ case AArch64_LD1Threev2s_POST:
2798
+ case AArch64_LD1Threev4h_POST:
2799
+ case AArch64_LD1Threev4s_POST:
2800
+ case AArch64_LD1Threev8b_POST:
2801
+ case AArch64_LD1Threev8h_POST:
2802
+ case AArch64_LD1Twov16b_POST:
2803
+ case AArch64_LD1Twov1d_POST:
2804
+ case AArch64_LD1Twov2d_POST:
2805
+ case AArch64_LD1Twov2s_POST:
2806
+ case AArch64_LD1Twov4h_POST:
2807
+ case AArch64_LD1Twov4s_POST:
2808
+ case AArch64_LD1Twov8b_POST:
2809
+ case AArch64_LD1Twov8h_POST:
2810
+ case AArch64_LD1i16_POST:
2811
+ case AArch64_LD1i32_POST:
2812
+ case AArch64_LD1i64_POST:
2813
+ case AArch64_LD1i8_POST:
2814
+ case AArch64_LD2Rv16b_POST:
2815
+ case AArch64_LD2Rv1d_POST:
2816
+ case AArch64_LD2Rv2d_POST:
2817
+ case AArch64_LD2Rv2s_POST:
2818
+ case AArch64_LD2Rv4h_POST:
2819
+ case AArch64_LD2Rv4s_POST:
2820
+ case AArch64_LD2Rv8b_POST:
2821
+ case AArch64_LD2Rv8h_POST:
2822
+ case AArch64_LD2Twov16b_POST:
2823
+ case AArch64_LD2Twov2d_POST:
2824
+ case AArch64_LD2Twov2s_POST:
2825
+ case AArch64_LD2Twov4h_POST:
2826
+ case AArch64_LD2Twov4s_POST:
2827
+ case AArch64_LD2Twov8b_POST:
2828
+ case AArch64_LD2Twov8h_POST:
2829
+ case AArch64_LD2i16_POST:
2830
+ case AArch64_LD2i32_POST:
2831
+ case AArch64_LD2i64_POST:
2832
+ case AArch64_LD2i8_POST:
2833
+ case AArch64_LD3Rv16b_POST:
2834
+ case AArch64_LD3Rv1d_POST:
2835
+ case AArch64_LD3Rv2d_POST:
2836
+ case AArch64_LD3Rv2s_POST:
2837
+ case AArch64_LD3Rv4h_POST:
2838
+ case AArch64_LD3Rv4s_POST:
2839
+ case AArch64_LD3Rv8b_POST:
2840
+ case AArch64_LD3Rv8h_POST:
2841
+ case AArch64_LD3Threev16b_POST:
2842
+ case AArch64_LD3Threev2d_POST:
2843
+ case AArch64_LD3Threev2s_POST:
2844
+ case AArch64_LD3Threev4h_POST:
2845
+ case AArch64_LD3Threev4s_POST:
2846
+ case AArch64_LD3Threev8b_POST:
2847
+ case AArch64_LD3Threev8h_POST:
2848
+ case AArch64_LD3i16_POST:
2849
+ case AArch64_LD3i32_POST:
2850
+ case AArch64_LD3i64_POST:
2851
+ case AArch64_LD3i8_POST:
2852
+ case AArch64_LD4Fourv16b_POST:
2853
+ case AArch64_LD4Fourv2d_POST:
2854
+ case AArch64_LD4Fourv2s_POST:
2855
+ case AArch64_LD4Fourv4h_POST:
2856
+ case AArch64_LD4Fourv4s_POST:
2857
+ case AArch64_LD4Fourv8b_POST:
2858
+ case AArch64_LD4Fourv8h_POST:
2859
+ case AArch64_LD4Rv16b_POST:
2860
+ case AArch64_LD4Rv1d_POST:
2861
+ case AArch64_LD4Rv2d_POST:
2862
+ case AArch64_LD4Rv2s_POST:
2863
+ case AArch64_LD4Rv4h_POST:
2864
+ case AArch64_LD4Rv4s_POST:
2865
+ case AArch64_LD4Rv8b_POST:
2866
+ case AArch64_LD4Rv8h_POST:
2867
+ case AArch64_LD4i16_POST:
2868
+ case AArch64_LD4i32_POST:
2869
+ case AArch64_LD4i64_POST:
2870
+ case AArch64_LD4i8_POST:
2871
+ case AArch64_LDRBBpost:
2872
+ case AArch64_LDRBpost:
2873
+ case AArch64_LDRDpost:
2874
+ case AArch64_LDRHHpost:
2875
+ case AArch64_LDRHpost:
2876
+ case AArch64_LDRQpost:
2877
+ case AArch64_LDPDpost:
2878
+ case AArch64_LDPQpost:
2879
+ case AArch64_LDPSWpost:
2880
+ case AArch64_LDPSpost:
2881
+ case AArch64_LDPWpost:
2882
+ case AArch64_LDPXpost:
2883
+ case AArch64_ST1Fourv16b_POST:
2884
+ case AArch64_ST1Fourv1d_POST:
2885
+ case AArch64_ST1Fourv2d_POST:
2886
+ case AArch64_ST1Fourv2s_POST:
2887
+ case AArch64_ST1Fourv4h_POST:
2888
+ case AArch64_ST1Fourv4s_POST:
2889
+ case AArch64_ST1Fourv8b_POST:
2890
+ case AArch64_ST1Fourv8h_POST:
2891
+ case AArch64_ST1Onev16b_POST:
2892
+ case AArch64_ST1Onev1d_POST:
2893
+ case AArch64_ST1Onev2d_POST:
2894
+ case AArch64_ST1Onev2s_POST:
2895
+ case AArch64_ST1Onev4h_POST:
2896
+ case AArch64_ST1Onev4s_POST:
2897
+ case AArch64_ST1Onev8b_POST:
2898
+ case AArch64_ST1Onev8h_POST:
2899
+ case AArch64_ST1Threev16b_POST:
2900
+ case AArch64_ST1Threev1d_POST:
2901
+ case AArch64_ST1Threev2d_POST:
2902
+ case AArch64_ST1Threev2s_POST:
2903
+ case AArch64_ST1Threev4h_POST:
2904
+ case AArch64_ST1Threev4s_POST:
2905
+ case AArch64_ST1Threev8b_POST:
2906
+ case AArch64_ST1Threev8h_POST:
2907
+ case AArch64_ST1Twov16b_POST:
2908
+ case AArch64_ST1Twov1d_POST:
2909
+ case AArch64_ST1Twov2d_POST:
2910
+ case AArch64_ST1Twov2s_POST:
2911
+ case AArch64_ST1Twov4h_POST:
2912
+ case AArch64_ST1Twov4s_POST:
2913
+ case AArch64_ST1Twov8b_POST:
2914
+ case AArch64_ST1Twov8h_POST:
2915
+ case AArch64_ST1i16_POST:
2916
+ case AArch64_ST1i32_POST:
2917
+ case AArch64_ST1i64_POST:
2918
+ case AArch64_ST1i8_POST:
2919
+ case AArch64_ST2GPostIndex:
2920
+ case AArch64_ST2Twov16b_POST:
2921
+ case AArch64_ST2Twov2d_POST:
2922
+ case AArch64_ST2Twov2s_POST:
2923
+ case AArch64_ST2Twov4h_POST:
2924
+ case AArch64_ST2Twov4s_POST:
2925
+ case AArch64_ST2Twov8b_POST:
2926
+ case AArch64_ST2Twov8h_POST:
2927
+ case AArch64_ST2i16_POST:
2928
+ case AArch64_ST2i32_POST:
2929
+ case AArch64_ST2i64_POST:
2930
+ case AArch64_ST2i8_POST:
2931
+ case AArch64_ST3Threev16b_POST:
2932
+ case AArch64_ST3Threev2d_POST:
2933
+ case AArch64_ST3Threev2s_POST:
2934
+ case AArch64_ST3Threev4h_POST:
2935
+ case AArch64_ST3Threev4s_POST:
2936
+ case AArch64_ST3Threev8b_POST:
2937
+ case AArch64_ST3Threev8h_POST:
2938
+ case AArch64_ST3i16_POST:
2939
+ case AArch64_ST3i32_POST:
2940
+ case AArch64_ST3i64_POST:
2941
+ case AArch64_ST3i8_POST:
2942
+ case AArch64_ST4Fourv16b_POST:
2943
+ case AArch64_ST4Fourv2d_POST:
2944
+ case AArch64_ST4Fourv2s_POST:
2945
+ case AArch64_ST4Fourv4h_POST:
2946
+ case AArch64_ST4Fourv4s_POST:
2947
+ case AArch64_ST4Fourv8b_POST:
2948
+ case AArch64_ST4Fourv8h_POST:
2949
+ case AArch64_ST4i16_POST:
2950
+ case AArch64_ST4i32_POST:
2951
+ case AArch64_ST4i64_POST:
2952
+ case AArch64_ST4i8_POST:
2953
+ case AArch64_STPDpost:
2954
+ case AArch64_STPQpost:
2955
+ case AArch64_STPSpost:
2956
+ case AArch64_STPWpost:
2957
+ case AArch64_STPXpost:
2958
+ case AArch64_STRBBpost:
2959
+ case AArch64_STRBpost:
2960
+ case AArch64_STRDpost:
2961
+ case AArch64_STRHHpost:
2962
+ case AArch64_STRHpost:
2963
+ case AArch64_STRQpost:
2964
+ case AArch64_STRSpost:
2965
+ case AArch64_STRWpost:
2966
+ case AArch64_STRXpost:
2967
+ case AArch64_STZ2GPostIndex:
2968
+ case AArch64_STZGPostIndex:
2969
+ case AArch64_STGPostIndex:
2970
+ case AArch64_STGPpost:
2971
+ case AArch64_LDRSBWpost:
2972
+ case AArch64_LDRSBXpost:
2973
+ case AArch64_LDRSHWpost:
2974
+ case AArch64_LDRSHXpost:
2975
+ case AArch64_LDRSWpost:
2976
+ case AArch64_LDRSpost:
2977
+ case AArch64_LDRWpost:
2978
+ case AArch64_LDRXpost:
2979
+ flat_insn->detail->arm64.writeback = true;
2980
+ flat_insn->detail->arm64.post_index = true;
2981
+ break;
2982
+ case AArch64_LDRAAwriteback:
2983
+ case AArch64_LDRABwriteback:
2984
+ case AArch64_ST2GPreIndex:
2985
+ case AArch64_LDPDpre:
2986
+ case AArch64_LDPQpre:
2987
+ case AArch64_LDPSWpre:
2988
+ case AArch64_LDPSpre:
2989
+ case AArch64_LDPWpre:
2990
+ case AArch64_LDPXpre:
2991
+ case AArch64_LDRBBpre:
2992
+ case AArch64_LDRBpre:
2993
+ case AArch64_LDRDpre:
2994
+ case AArch64_LDRHHpre:
2995
+ case AArch64_LDRHpre:
2996
+ case AArch64_LDRQpre:
2997
+ case AArch64_LDRSBWpre:
2998
+ case AArch64_LDRSBXpre:
2999
+ case AArch64_LDRSHWpre:
3000
+ case AArch64_LDRSHXpre:
3001
+ case AArch64_LDRSWpre:
3002
+ case AArch64_LDRSpre:
3003
+ case AArch64_LDRWpre:
3004
+ case AArch64_LDRXpre:
3005
+ case AArch64_STGPreIndex:
3006
+ case AArch64_STPDpre:
3007
+ case AArch64_STPQpre:
3008
+ case AArch64_STPSpre:
3009
+ case AArch64_STPWpre:
3010
+ case AArch64_STPXpre:
3011
+ case AArch64_STRBBpre:
3012
+ case AArch64_STRBpre:
3013
+ case AArch64_STRDpre:
3014
+ case AArch64_STRHHpre:
3015
+ case AArch64_STRHpre:
3016
+ case AArch64_STRQpre:
3017
+ case AArch64_STRSpre:
3018
+ case AArch64_STRWpre:
3019
+ case AArch64_STRXpre:
3020
+ case AArch64_STZ2GPreIndex:
3021
+ case AArch64_STZGPreIndex:
3022
+ case AArch64_STGPpre:
3023
+ flat_insn->detail->arm64.writeback = true;
3024
+ break;
3025
+ }
3026
+ }
3027
+ }
3028
+
3029
+ #endif