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,1238 @@
1
+ //===-- PPCInstPrinter.cpp - Convert PPC 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 PPC MCInst to a .s file.
11
+ //
12
+ //===----------------------------------------------------------------------===//
13
+
14
+ /* Capstone Disassembly Engine */
15
+ /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
16
+
17
+ #ifdef CAPSTONE_HAS_POWERPC
18
+
19
+ #include <stdio.h>
20
+ #include <stdlib.h>
21
+ #include <string.h>
22
+
23
+ #include "PPCInstPrinter.h"
24
+ #include "PPCPredicates.h"
25
+ #include "../../MCInst.h"
26
+ #include "../../utils.h"
27
+ #include "../../SStream.h"
28
+ #include "../../MCRegisterInfo.h"
29
+ #include "../../MathExtras.h"
30
+ #include "PPCMapping.h"
31
+
32
+ #ifndef CAPSTONE_DIET
33
+ static const char *getRegisterName(unsigned RegNo);
34
+ #endif
35
+
36
+ static void printOperand(MCInst *MI, unsigned OpNo, SStream *O);
37
+ static void printInstruction(MCInst *MI, SStream *O);
38
+ static void printAbsBranchOperand(MCInst *MI, unsigned OpNo, SStream *O);
39
+ static char *printAliasInstr(MCInst *MI, SStream *OS, MCRegisterInfo *MRI);
40
+ static char *printAliasBcc(MCInst *MI, SStream *OS, void *info);
41
+ static void printCustomAliasOperand(MCInst *MI, unsigned OpIdx,
42
+ unsigned PrintMethodIdx, SStream *OS);
43
+
44
+ #if 0
45
+ static void printRegName(SStream *OS, unsigned RegNo)
46
+ {
47
+ char *RegName = getRegisterName(RegNo);
48
+
49
+ if (RegName[0] == 'q' /* QPX */) {
50
+ // The system toolchain on the BG/Q does not understand QPX register names
51
+ // in .cfi_* directives, so print the name of the floating-point
52
+ // subregister instead.
53
+ RegName[0] = 'f';
54
+ }
55
+
56
+ SStream_concat0(OS, RegName);
57
+ }
58
+ #endif
59
+
60
+ static void set_mem_access(MCInst *MI, bool status)
61
+ {
62
+ if (MI->csh->detail != CS_OPT_ON)
63
+ return;
64
+
65
+ MI->csh->doing_mem = status;
66
+
67
+ if (status) {
68
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_MEM;
69
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].mem.base = PPC_REG_INVALID;
70
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].mem.disp = 0;
71
+ } else {
72
+ // done, create the next operand slot
73
+ MI->flat_insn->detail->ppc.op_count++;
74
+ }
75
+ }
76
+
77
+ void PPC_post_printer(csh ud, cs_insn *insn, char *insn_asm, MCInst *mci)
78
+ {
79
+ if (((cs_struct *)ud)->detail != CS_OPT_ON)
80
+ return;
81
+
82
+ // check if this insn has branch hint
83
+ if (strrchr(insn->mnemonic, '+') != NULL && !strstr(insn_asm, ".+")) {
84
+ insn->detail->ppc.bh = PPC_BH_PLUS;
85
+ } else if (strrchr(insn->mnemonic, '-') != NULL) {
86
+ insn->detail->ppc.bh = PPC_BH_MINUS;
87
+ }
88
+
89
+ if (strrchr(insn->mnemonic, '.') != NULL) {
90
+ insn->detail->ppc.update_cr0 = true;
91
+ }
92
+ }
93
+
94
+ #define GET_INSTRINFO_ENUM
95
+ #include "PPCGenInstrInfo.inc"
96
+
97
+ #define GET_REGINFO_ENUM
98
+ #include "PPCGenRegisterInfo.inc"
99
+
100
+ static void op_addBC(MCInst *MI, unsigned int bc)
101
+ {
102
+ if (MI->csh->detail) {
103
+ MI->flat_insn->detail->ppc.bc = (ppc_bc)bc;
104
+ }
105
+ }
106
+
107
+ #define CREQ (0)
108
+ #define CRGT (1)
109
+ #define CRLT (2)
110
+ #define CRUN (3)
111
+
112
+ static int getBICRCond(int bi)
113
+ {
114
+ return (bi - PPC_CR0EQ) >> 3;
115
+ }
116
+
117
+ static int getBICR(int bi)
118
+ {
119
+ return ((bi - PPC_CR0EQ) & 7) + PPC_CR0;
120
+ }
121
+
122
+ static void op_addReg(MCInst *MI, unsigned int reg)
123
+ {
124
+ if (MI->csh->detail) {
125
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_REG;
126
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].reg = reg;
127
+ MI->flat_insn->detail->ppc.op_count++;
128
+ }
129
+ }
130
+
131
+ static void add_CRxx(MCInst *MI, ppc_reg reg)
132
+ {
133
+ if (MI->csh->detail) {
134
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_REG;
135
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].reg = reg;
136
+ MI->flat_insn->detail->ppc.op_count++;
137
+ }
138
+ }
139
+
140
+ static char *printAliasBcc(MCInst *MI, SStream *OS, void *info)
141
+ {
142
+ #define GETREGCLASS_CONTAIN(_class, _reg) MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, _class), MCOperand_getReg(MCInst_getOperand(MI, _reg)))
143
+ SStream ss;
144
+ const char *opCode;
145
+ char *tmp, *AsmMnem, *AsmOps, *c;
146
+ int OpIdx, PrintMethodIdx;
147
+ int decCtr = false, needComma = false;
148
+ MCRegisterInfo *MRI = (MCRegisterInfo *)info;
149
+
150
+ SStream_Init(&ss);
151
+
152
+ switch (MCInst_getOpcode(MI)) {
153
+ default: return NULL;
154
+ case PPC_gBC:
155
+ opCode = "b%s";
156
+ break;
157
+ case PPC_gBCA:
158
+ opCode = "b%sa";
159
+ break;
160
+ case PPC_gBCCTR:
161
+ opCode = "b%sctr";
162
+ break;
163
+ case PPC_gBCCTRL:
164
+ opCode = "b%sctrl";
165
+ break;
166
+ case PPC_gBCL:
167
+ opCode = "b%sl";
168
+ break;
169
+ case PPC_gBCLA:
170
+ opCode = "b%sla";
171
+ break;
172
+ case PPC_gBCLR:
173
+ opCode = "b%slr";
174
+ break;
175
+ case PPC_gBCLRL:
176
+ opCode = "b%slrl";
177
+ break;
178
+ }
179
+
180
+ if (MCInst_getNumOperands(MI) == 3 &&
181
+ MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
182
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) >= 0) &&
183
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) <= 1)) {
184
+ SStream_concat(&ss, opCode, "dnzf");
185
+ decCtr = true;
186
+ }
187
+
188
+ if (MCInst_getNumOperands(MI) == 3 &&
189
+ MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
190
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) >= 2) &&
191
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) <= 3)) {
192
+ SStream_concat(&ss, opCode, "dzf");
193
+ decCtr = true;
194
+ }
195
+
196
+ if (MCInst_getNumOperands(MI) == 3 &&
197
+ MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
198
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) >= 4) &&
199
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) <= 7) &&
200
+ MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
201
+ GETREGCLASS_CONTAIN(PPC_CRBITRCRegClassID, 1)) {
202
+ int cr = getBICRCond(MCOperand_getReg(MCInst_getOperand(MI, 1)));
203
+
204
+ switch(cr) {
205
+ case CREQ:
206
+ SStream_concat(&ss, opCode, "ne");
207
+ break;
208
+ case CRGT:
209
+ SStream_concat(&ss, opCode, "le");
210
+ break;
211
+ case CRLT:
212
+ SStream_concat(&ss, opCode, "ge");
213
+ break;
214
+ case CRUN:
215
+ SStream_concat(&ss, opCode, "ns");
216
+ break;
217
+ }
218
+
219
+ if (MCOperand_getImm(MCInst_getOperand(MI, 0)) == 6)
220
+ SStream_concat0(&ss, "-");
221
+
222
+ if (MCOperand_getImm(MCInst_getOperand(MI, 0)) == 7)
223
+ SStream_concat0(&ss, "+");
224
+
225
+ decCtr = false;
226
+ }
227
+
228
+ if (MCInst_getNumOperands(MI) == 3 &&
229
+ MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
230
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) >= 8) &&
231
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) <= 9)) {
232
+ SStream_concat(&ss, opCode, "dnzt");
233
+ decCtr = true;
234
+ }
235
+
236
+ if (MCInst_getNumOperands(MI) == 3 &&
237
+ MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
238
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) >= 10) &&
239
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) <= 11)) {
240
+ SStream_concat(&ss, opCode, "dzt");
241
+ decCtr = true;
242
+ }
243
+
244
+ if (MCInst_getNumOperands(MI) == 3 &&
245
+ MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
246
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) >= 12) &&
247
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) <= 15) &&
248
+ MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
249
+ GETREGCLASS_CONTAIN(PPC_CRBITRCRegClassID, 1)) {
250
+ int cr = getBICRCond(MCOperand_getReg(MCInst_getOperand(MI, 1)));
251
+
252
+ switch(cr) {
253
+ case CREQ:
254
+ SStream_concat(&ss, opCode, "eq");
255
+ break;
256
+ case CRGT:
257
+ SStream_concat(&ss, opCode, "gt");
258
+ break;
259
+ case CRLT:
260
+ SStream_concat(&ss, opCode, "lt");
261
+ break;
262
+ case CRUN:
263
+ SStream_concat(&ss, opCode, "so");
264
+ break;
265
+ }
266
+
267
+ if (MCOperand_getImm(MCInst_getOperand(MI, 0)) == 14)
268
+ SStream_concat0(&ss, "-");
269
+
270
+ if (MCOperand_getImm(MCInst_getOperand(MI, 0)) == 15)
271
+ SStream_concat0(&ss, "+");
272
+
273
+ decCtr = false;
274
+ }
275
+
276
+ if (MCInst_getNumOperands(MI) == 3 &&
277
+ MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
278
+ ((MCOperand_getImm(MCInst_getOperand(MI, 0)) & 0x12)== 16)) {
279
+ SStream_concat(&ss, opCode, "dnz");
280
+
281
+ if (MCOperand_getImm(MCInst_getOperand(MI, 0)) == 24)
282
+ SStream_concat0(&ss, "-");
283
+
284
+ if (MCOperand_getImm(MCInst_getOperand(MI, 0)) == 25)
285
+ SStream_concat0(&ss, "+");
286
+
287
+ needComma = false;
288
+ }
289
+
290
+ if (MCInst_getNumOperands(MI) == 3 &&
291
+ MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
292
+ ((MCOperand_getImm(MCInst_getOperand(MI, 0)) & 0x12)== 18)) {
293
+ SStream_concat(&ss, opCode, "dz");
294
+
295
+ if (MCOperand_getImm(MCInst_getOperand(MI, 0)) == 26)
296
+ SStream_concat0(&ss, "-");
297
+
298
+ if (MCOperand_getImm(MCInst_getOperand(MI, 0)) == 27)
299
+ SStream_concat0(&ss, "+");
300
+
301
+ needComma = false;
302
+ }
303
+
304
+ if (MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
305
+ GETREGCLASS_CONTAIN(PPC_CRBITRCRegClassID, 1) &&
306
+ MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
307
+ (MCOperand_getImm(MCInst_getOperand(MI, 0)) < 16)) {
308
+ int cr = getBICR(MCOperand_getReg(MCInst_getOperand(MI, 1)));
309
+
310
+ if (decCtr) {
311
+ int cd;
312
+ needComma = true;
313
+ SStream_concat0(&ss, " ");
314
+
315
+ if (cr > PPC_CR0) {
316
+ SStream_concat(&ss, "4*cr%d+", cr - PPC_CR0);
317
+ }
318
+
319
+ cd = getBICRCond(MCOperand_getReg(MCInst_getOperand(MI, 1)));
320
+ switch(cd) {
321
+ case CREQ:
322
+ SStream_concat0(&ss, "eq");
323
+ if (cr <= PPC_CR0)
324
+ add_CRxx(MI, PPC_REG_CR0EQ);
325
+ op_addBC(MI, PPC_BC_EQ);
326
+ break;
327
+ case CRGT:
328
+ SStream_concat0(&ss, "gt");
329
+ if (cr <= PPC_CR0)
330
+ add_CRxx(MI, PPC_REG_CR0GT);
331
+ op_addBC(MI, PPC_BC_GT);
332
+ break;
333
+ case CRLT:
334
+ SStream_concat0(&ss, "lt");
335
+ if (cr <= PPC_CR0)
336
+ add_CRxx(MI, PPC_REG_CR0LT);
337
+ op_addBC(MI, PPC_BC_LT);
338
+ break;
339
+ case CRUN:
340
+ SStream_concat0(&ss, "so");
341
+ if (cr <= PPC_CR0)
342
+ add_CRxx(MI, PPC_REG_CR0UN);
343
+ op_addBC(MI, PPC_BC_SO);
344
+ break;
345
+ }
346
+
347
+ if (cr > PPC_CR0) {
348
+ if (MI->csh->detail) {
349
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_REG;
350
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].reg = MCOperand_getReg(MCInst_getOperand(MI, 1));
351
+ MI->flat_insn->detail->ppc.op_count++;
352
+ }
353
+ }
354
+ } else {
355
+ if (cr > PPC_CR0) {
356
+ needComma = true;
357
+ SStream_concat(&ss, " cr%d", cr - PPC_CR0);
358
+ op_addReg(MI, PPC_REG_CR0 + cr - PPC_CR0);
359
+ }
360
+ }
361
+ }
362
+
363
+ if (MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
364
+ MCOperand_getImm(MCInst_getOperand(MI, 2)) != 0) {
365
+ if (needComma)
366
+ SStream_concat0(&ss, ",");
367
+
368
+ SStream_concat0(&ss, " $\xFF\x03\x01");
369
+ }
370
+
371
+ tmp = cs_strdup(ss.buffer);
372
+ AsmMnem = tmp;
373
+ for(AsmOps = tmp; *AsmOps; AsmOps++) {
374
+ if (*AsmOps == ' ' || *AsmOps == '\t') {
375
+ *AsmOps = '\0';
376
+ AsmOps++;
377
+ break;
378
+ }
379
+ }
380
+
381
+ SStream_concat0(OS, AsmMnem);
382
+ if (*AsmOps) {
383
+ SStream_concat0(OS, "\t");
384
+ for (c = AsmOps; *c; c++) {
385
+ if (*c == '$') {
386
+ c += 1;
387
+ if (*c == (char)0xff) {
388
+ c += 1;
389
+ OpIdx = *c - 1;
390
+ c += 1;
391
+ PrintMethodIdx = *c - 1;
392
+ printCustomAliasOperand(MI, OpIdx, PrintMethodIdx, OS);
393
+ } else
394
+ printOperand(MI, *c - 1, OS);
395
+ } else {
396
+ SStream_concat1(OS, *c);
397
+ }
398
+ }
399
+ }
400
+
401
+ return tmp;
402
+ }
403
+
404
+ static bool isBOCTRBranch(unsigned int op)
405
+ {
406
+ return ((op >= PPC_BDNZ) && (op <= PPC_BDZp));
407
+ }
408
+
409
+ void PPC_printInst(MCInst *MI, SStream *O, void *Info)
410
+ {
411
+ char *mnem;
412
+ unsigned int opcode = MCInst_getOpcode(MI);
413
+ memset(O->buffer, 0, sizeof(O->buffer));
414
+
415
+ // printf("opcode = %u\n", opcode);
416
+
417
+ // Check for slwi/srwi mnemonics.
418
+ if (opcode == PPC_RLWINM) {
419
+ unsigned char SH = (unsigned char)MCOperand_getImm(MCInst_getOperand(MI, 2));
420
+ unsigned char MB = (unsigned char)MCOperand_getImm(MCInst_getOperand(MI, 3));
421
+ unsigned char ME = (unsigned char)MCOperand_getImm(MCInst_getOperand(MI, 4));
422
+ bool useSubstituteMnemonic = false;
423
+
424
+ if (SH <= 31 && MB == 0 && ME == (31 - SH)) {
425
+ SStream_concat0(O, "slwi\t");
426
+ MCInst_setOpcodePub(MI, PPC_INS_SLWI);
427
+ useSubstituteMnemonic = true;
428
+ }
429
+
430
+ if (SH <= 31 && MB == (32 - SH) && ME == 31) {
431
+ SStream_concat0(O, "srwi\t");
432
+ MCInst_setOpcodePub(MI, PPC_INS_SRWI);
433
+ useSubstituteMnemonic = true;
434
+ SH = 32 - SH;
435
+ }
436
+
437
+ if (useSubstituteMnemonic) {
438
+ printOperand(MI, 0, O);
439
+ SStream_concat0(O, ", ");
440
+ printOperand(MI, 1, O);
441
+
442
+ if (SH > HEX_THRESHOLD)
443
+ SStream_concat(O, ", 0x%x", (unsigned int)SH);
444
+ else
445
+ SStream_concat(O, ", %u", (unsigned int)SH);
446
+
447
+ if (MI->csh->detail) {
448
+ cs_ppc *ppc = &MI->flat_insn->detail->ppc;
449
+
450
+ ppc->operands[ppc->op_count].type = PPC_OP_IMM;
451
+ ppc->operands[ppc->op_count].imm = SH;
452
+ ++ppc->op_count;
453
+ }
454
+
455
+ return;
456
+ }
457
+ }
458
+
459
+ if ((opcode == PPC_OR || opcode == PPC_OR8) &&
460
+ MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 2))) {
461
+ SStream_concat0(O, "mr\t");
462
+ MCInst_setOpcodePub(MI, PPC_INS_MR);
463
+
464
+ printOperand(MI, 0, O);
465
+ SStream_concat0(O, ", ");
466
+ printOperand(MI, 1, O);
467
+
468
+ return;
469
+ }
470
+
471
+ if (opcode == PPC_RLDICR ||
472
+ opcode == PPC_RLDICR_32) {
473
+ unsigned char SH = (unsigned char)MCOperand_getImm(MCInst_getOperand(MI, 2));
474
+ unsigned char ME = (unsigned char)MCOperand_getImm(MCInst_getOperand(MI, 3));
475
+
476
+ // rldicr RA, RS, SH, 63-SH == sldi RA, RS, SH
477
+ if (63 - SH == ME) {
478
+ SStream_concat0(O, "sldi\t");
479
+ MCInst_setOpcodePub(MI, PPC_INS_SLDI);
480
+
481
+ printOperand(MI, 0, O);
482
+ SStream_concat0(O, ", ");
483
+ printOperand(MI, 1, O);
484
+
485
+ if (SH > HEX_THRESHOLD)
486
+ SStream_concat(O, ", 0x%x", (unsigned int)SH);
487
+ else
488
+ SStream_concat(O, ", %u", (unsigned int)SH);
489
+
490
+ if (MI->csh->detail) {
491
+ cs_ppc *ppc = &MI->flat_insn->detail->ppc;
492
+
493
+ ppc->operands[ppc->op_count].type = PPC_OP_IMM;
494
+ ppc->operands[ppc->op_count].imm = SH;
495
+ ++ppc->op_count;
496
+ }
497
+
498
+
499
+ return;
500
+ }
501
+ }
502
+
503
+ // dcbt[st] is printed manually here because:
504
+ // 1. The assembly syntax is different between embedded and server targets
505
+ // 2. We must print the short mnemonics for TH == 0 because the
506
+ // embedded/server syntax default will not be stable across assemblers
507
+ // The syntax for dcbt is:
508
+ // dcbt ra, rb, th [server]
509
+ // dcbt th, ra, rb [embedded]
510
+ // where th can be omitted when it is 0. dcbtst is the same.
511
+ if (opcode == PPC_DCBT || opcode == PPC_DCBTST) {
512
+ unsigned char TH = (unsigned char)MCOperand_getImm(MCInst_getOperand(MI, 0));
513
+
514
+ SStream_concat0(O, "dcbt");
515
+ MCInst_setOpcodePub(MI, PPC_INS_DCBT);
516
+
517
+ if (opcode == PPC_DCBTST) {
518
+ SStream_concat0(O, "st");
519
+ MCInst_setOpcodePub(MI, PPC_INS_DCBTST);
520
+ }
521
+
522
+ if (TH == 16) {
523
+ SStream_concat0(O, "t");
524
+ MCInst_setOpcodePub(MI, PPC_INS_DCBTSTT);
525
+ }
526
+
527
+ SStream_concat0(O, "\t");
528
+
529
+ if (MI->csh->mode & CS_MODE_BOOKE && TH != 0 && TH != 16) {
530
+ if (TH > HEX_THRESHOLD)
531
+ SStream_concat(O, "0x%x, ", (unsigned int)TH);
532
+ else
533
+ SStream_concat(O, "%u, ", (unsigned int)TH);
534
+
535
+ if (MI->csh->detail) {
536
+ cs_ppc *ppc = &MI->flat_insn->detail->ppc;
537
+
538
+ ppc->operands[ppc->op_count].type = PPC_OP_IMM;
539
+ ppc->operands[ppc->op_count].imm = TH;
540
+ ++ppc->op_count;
541
+ }
542
+ }
543
+
544
+ printOperand(MI, 1, O);
545
+ SStream_concat0(O, ", ");
546
+ printOperand(MI, 2, O);
547
+
548
+ if (!(MI->csh->mode & CS_MODE_BOOKE) && TH != 0 && TH != 16) {
549
+ if (TH > HEX_THRESHOLD)
550
+ SStream_concat(O, ", 0x%x", (unsigned int)TH);
551
+ else
552
+ SStream_concat(O, ", %u", (unsigned int)TH);
553
+
554
+ if (MI->csh->detail) {
555
+ cs_ppc *ppc = &MI->flat_insn->detail->ppc;
556
+
557
+ ppc->operands[ppc->op_count].type = PPC_OP_IMM;
558
+ ppc->operands[ppc->op_count].imm = TH;
559
+ ++ppc->op_count;
560
+ }
561
+ }
562
+
563
+ return;
564
+ }
565
+
566
+ if (opcode == PPC_DCBF) {
567
+ unsigned char L = (unsigned char)MCOperand_getImm(MCInst_getOperand(MI, 0));
568
+
569
+ if (!L || L == 1 || L == 3) {
570
+ SStream_concat0(O, "dcbf");
571
+ MCInst_setOpcodePub(MI, PPC_INS_DCBF);
572
+
573
+ if (L == 1 || L == 3) {
574
+ SStream_concat0(O, "l");
575
+ MCInst_setOpcodePub(MI, PPC_INS_DCBFL);
576
+ }
577
+
578
+ if (L == 3) {
579
+ SStream_concat0(O, "p");
580
+ MCInst_setOpcodePub(MI, PPC_INS_DCBFLP);
581
+ }
582
+
583
+ SStream_concat0(O, "\t");
584
+
585
+ printOperand(MI, 1, O);
586
+ SStream_concat0(O, ", ");
587
+ printOperand(MI, 2, O);
588
+
589
+ return;
590
+ }
591
+ }
592
+
593
+ if (opcode == PPC_B || opcode == PPC_BA || opcode == PPC_BL ||
594
+ opcode == PPC_BLA) {
595
+ int64_t bd = MCOperand_getImm(MCInst_getOperand(MI, 0));
596
+ bd = SignExtend64(bd, 24);
597
+ MCOperand_setImm(MCInst_getOperand(MI, 0), bd);
598
+ }
599
+
600
+ if (opcode == PPC_gBC || opcode == PPC_gBCA || opcode == PPC_gBCL ||
601
+ opcode == PPC_gBCLA) {
602
+ int64_t bd = MCOperand_getImm(MCInst_getOperand(MI, 2));
603
+ bd = SignExtend64(bd, 14);
604
+ MCOperand_setImm(MCInst_getOperand(MI, 2), bd);
605
+ }
606
+
607
+ if (isBOCTRBranch(MCInst_getOpcode(MI))) {
608
+ if (MCOperand_isImm(MCInst_getOperand(MI,0))) {
609
+ int64_t bd = MCOperand_getImm(MCInst_getOperand(MI, 0));
610
+ bd = SignExtend64(bd, 14);
611
+ MCOperand_setImm(MCInst_getOperand(MI, 0), bd);
612
+ }
613
+ }
614
+
615
+ mnem = printAliasBcc(MI, O, Info);
616
+ if (!mnem)
617
+ mnem = printAliasInstr(MI, O, Info);
618
+
619
+ if (mnem != NULL) {
620
+ if (strlen(mnem) > 0) {
621
+ // check to remove the last letter of ('.', '-', '+')
622
+ if (mnem[strlen(mnem) - 1] == '-' || mnem[strlen(mnem) - 1] == '+' || mnem[strlen(mnem) - 1] == '.')
623
+ mnem[strlen(mnem) - 1] = '\0';
624
+
625
+ MCInst_setOpcodePub(MI, PPC_map_insn(mnem));
626
+
627
+ if (MI->csh->detail) {
628
+ struct ppc_alias alias;
629
+
630
+ if (PPC_alias_insn(mnem, &alias)) {
631
+ MI->flat_insn->detail->ppc.bc = (ppc_bc)alias.cc;
632
+ }
633
+ }
634
+ }
635
+
636
+ cs_mem_free(mnem);
637
+ } else
638
+ printInstruction(MI, O);
639
+
640
+ const char *mnem_end = strchr(O->buffer, ' ');
641
+ unsigned mnem_len = 0;
642
+ if (mnem_end)
643
+ mnem_len = mnem_end - O->buffer;
644
+ if (!mnem_end || mnem_len >= sizeof(MI->flat_insn->mnemonic))
645
+ mnem_len = sizeof(MI->flat_insn->mnemonic) - 1;
646
+
647
+ memset(MI->flat_insn->mnemonic, 0, sizeof(MI->flat_insn->mnemonic));
648
+ memcpy(MI->flat_insn->mnemonic, O->buffer, mnem_len);
649
+ }
650
+
651
+ // FIXME
652
+ enum ppc_bc_hint {
653
+ PPC_BC_LT_MINUS = (0 << 5) | 14,
654
+ PPC_BC_LE_MINUS = (1 << 5) | 6,
655
+ PPC_BC_EQ_MINUS = (2 << 5) | 14,
656
+ PPC_BC_GE_MINUS = (0 << 5) | 6,
657
+ PPC_BC_GT_MINUS = (1 << 5) | 14,
658
+ PPC_BC_NE_MINUS = (2 << 5) | 6,
659
+ PPC_BC_UN_MINUS = (3 << 5) | 14,
660
+ PPC_BC_NU_MINUS = (3 << 5) | 6,
661
+ PPC_BC_LT_PLUS = (0 << 5) | 15,
662
+ PPC_BC_LE_PLUS = (1 << 5) | 7,
663
+ PPC_BC_EQ_PLUS = (2 << 5) | 15,
664
+ PPC_BC_GE_PLUS = (0 << 5) | 7,
665
+ PPC_BC_GT_PLUS = (1 << 5) | 15,
666
+ PPC_BC_NE_PLUS = (2 << 5) | 7,
667
+ PPC_BC_UN_PLUS = (3 << 5) | 15,
668
+ PPC_BC_NU_PLUS = (3 << 5) | 7,
669
+ };
670
+
671
+ // FIXME
672
+ // normalize CC to remove _MINUS & _PLUS
673
+ static int cc_normalize(int cc)
674
+ {
675
+ switch(cc) {
676
+ default: return cc;
677
+ case PPC_BC_LT_MINUS: return PPC_BC_LT;
678
+ case PPC_BC_LE_MINUS: return PPC_BC_LE;
679
+ case PPC_BC_EQ_MINUS: return PPC_BC_EQ;
680
+ case PPC_BC_GE_MINUS: return PPC_BC_GE;
681
+ case PPC_BC_GT_MINUS: return PPC_BC_GT;
682
+ case PPC_BC_NE_MINUS: return PPC_BC_NE;
683
+ case PPC_BC_UN_MINUS: return PPC_BC_UN;
684
+ case PPC_BC_NU_MINUS: return PPC_BC_NU;
685
+ case PPC_BC_LT_PLUS : return PPC_BC_LT;
686
+ case PPC_BC_LE_PLUS : return PPC_BC_LE;
687
+ case PPC_BC_EQ_PLUS : return PPC_BC_EQ;
688
+ case PPC_BC_GE_PLUS : return PPC_BC_GE;
689
+ case PPC_BC_GT_PLUS : return PPC_BC_GT;
690
+ case PPC_BC_NE_PLUS : return PPC_BC_NE;
691
+ case PPC_BC_UN_PLUS : return PPC_BC_UN;
692
+ case PPC_BC_NU_PLUS : return PPC_BC_NU;
693
+ }
694
+ }
695
+
696
+ static void printPredicateOperand(MCInst *MI, unsigned OpNo,
697
+ SStream *O, const char *Modifier)
698
+ {
699
+ unsigned Code = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
700
+
701
+ MI->flat_insn->detail->ppc.bc = (ppc_bc)cc_normalize(Code);
702
+
703
+ if (!strcmp(Modifier, "cc")) {
704
+ switch ((ppc_predicate)Code) {
705
+ default: // unreachable
706
+ case PPC_PRED_LT_MINUS:
707
+ case PPC_PRED_LT_PLUS:
708
+ case PPC_PRED_LT:
709
+ SStream_concat0(O, "lt");
710
+ return;
711
+ case PPC_PRED_LE_MINUS:
712
+ case PPC_PRED_LE_PLUS:
713
+ case PPC_PRED_LE:
714
+ SStream_concat0(O, "le");
715
+ return;
716
+ case PPC_PRED_EQ_MINUS:
717
+ case PPC_PRED_EQ_PLUS:
718
+ case PPC_PRED_EQ:
719
+ SStream_concat0(O, "eq");
720
+ return;
721
+ case PPC_PRED_GE_MINUS:
722
+ case PPC_PRED_GE_PLUS:
723
+ case PPC_PRED_GE:
724
+ SStream_concat0(O, "ge");
725
+ return;
726
+ case PPC_PRED_GT_MINUS:
727
+ case PPC_PRED_GT_PLUS:
728
+ case PPC_PRED_GT:
729
+ SStream_concat0(O, "gt");
730
+ return;
731
+ case PPC_PRED_NE_MINUS:
732
+ case PPC_PRED_NE_PLUS:
733
+ case PPC_PRED_NE:
734
+ SStream_concat0(O, "ne");
735
+ return;
736
+ case PPC_PRED_UN_MINUS:
737
+ case PPC_PRED_UN_PLUS:
738
+ case PPC_PRED_UN:
739
+ SStream_concat0(O, "un");
740
+ return;
741
+ case PPC_PRED_NU_MINUS:
742
+ case PPC_PRED_NU_PLUS:
743
+ case PPC_PRED_NU:
744
+ SStream_concat0(O, "nu");
745
+ return;
746
+ case PPC_PRED_BIT_SET:
747
+ case PPC_PRED_BIT_UNSET:
748
+ // llvm_unreachable("Invalid use of bit predicate code");
749
+ SStream_concat0(O, "invalid-predicate");
750
+ return;
751
+ }
752
+ }
753
+
754
+ if (!strcmp(Modifier, "pm")) {
755
+ switch ((ppc_predicate)Code) {
756
+ case PPC_PRED_LT:
757
+ case PPC_PRED_LE:
758
+ case PPC_PRED_EQ:
759
+ case PPC_PRED_GE:
760
+ case PPC_PRED_GT:
761
+ case PPC_PRED_NE:
762
+ case PPC_PRED_UN:
763
+ case PPC_PRED_NU:
764
+ return;
765
+ case PPC_PRED_LT_MINUS:
766
+ case PPC_PRED_LE_MINUS:
767
+ case PPC_PRED_EQ_MINUS:
768
+ case PPC_PRED_GE_MINUS:
769
+ case PPC_PRED_GT_MINUS:
770
+ case PPC_PRED_NE_MINUS:
771
+ case PPC_PRED_UN_MINUS:
772
+ case PPC_PRED_NU_MINUS:
773
+ SStream_concat0(O, "-");
774
+ return;
775
+ case PPC_PRED_LT_PLUS:
776
+ case PPC_PRED_LE_PLUS:
777
+ case PPC_PRED_EQ_PLUS:
778
+ case PPC_PRED_GE_PLUS:
779
+ case PPC_PRED_GT_PLUS:
780
+ case PPC_PRED_NE_PLUS:
781
+ case PPC_PRED_UN_PLUS:
782
+ case PPC_PRED_NU_PLUS:
783
+ SStream_concat0(O, "+");
784
+ return;
785
+ case PPC_PRED_BIT_SET:
786
+ case PPC_PRED_BIT_UNSET:
787
+ // llvm_unreachable("Invalid use of bit predicate code");
788
+ SStream_concat0(O, "invalid-predicate");
789
+ return;
790
+ default: // unreachable
791
+ return;
792
+ }
793
+ // llvm_unreachable("Invalid predicate code");
794
+ }
795
+
796
+ //assert(StringRef(Modifier) == "reg" &&
797
+ // "Need to specify 'cc', 'pm' or 'reg' as predicate op modifier!");
798
+ printOperand(MI, OpNo + 1, O);
799
+ }
800
+
801
+ static void printATBitsAsHint(MCInst *MI, unsigned OpNo, SStream *O)
802
+ {
803
+ unsigned Code = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
804
+
805
+ if (Code == 2) {
806
+ SStream_concat0(O, "-");
807
+ } else if (Code == 3) {
808
+ SStream_concat0(O, "+");
809
+ }
810
+ }
811
+
812
+ static void printU1ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
813
+ {
814
+ unsigned int Value = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
815
+
816
+ // assert(Value <= 1 && "Invalid u1imm argument!");
817
+
818
+ printUInt32(O, Value);
819
+
820
+ if (MI->csh->detail) {
821
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
822
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
823
+ MI->flat_insn->detail->ppc.op_count++;
824
+ }
825
+ }
826
+
827
+ static void printU2ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
828
+ {
829
+ unsigned int Value = (int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
830
+ //assert(Value <= 3 && "Invalid u2imm argument!");
831
+
832
+ printUInt32(O, Value);
833
+
834
+ if (MI->csh->detail) {
835
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
836
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
837
+ MI->flat_insn->detail->ppc.op_count++;
838
+ }
839
+ }
840
+
841
+ static void printU3ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
842
+ {
843
+ unsigned int Value = (int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
844
+ //assert(Value <= 8 && "Invalid u3imm argument!");
845
+
846
+ printUInt32(O, Value);
847
+
848
+ if (MI->csh->detail) {
849
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
850
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
851
+ MI->flat_insn->detail->ppc.op_count++;
852
+ }
853
+ }
854
+
855
+ static void printU4ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
856
+ {
857
+ unsigned int Value = (int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
858
+ //assert(Value <= 15 && "Invalid u4imm argument!");
859
+
860
+ printUInt32(O, Value);
861
+
862
+ if (MI->csh->detail) {
863
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
864
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
865
+ MI->flat_insn->detail->ppc.op_count++;
866
+ }
867
+ }
868
+
869
+ static void printS5ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
870
+ {
871
+ int Value = (int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
872
+ Value = SignExtend32(Value, 5);
873
+
874
+ printInt32(O, Value);
875
+
876
+ if (MI->csh->detail) {
877
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
878
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
879
+ MI->flat_insn->detail->ppc.op_count++;
880
+ }
881
+ }
882
+
883
+ static void printU5ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
884
+ {
885
+ unsigned int Value = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
886
+
887
+ //assert(Value <= 31 && "Invalid u5imm argument!");
888
+ printUInt32(O, Value);
889
+
890
+ if (MI->csh->detail) {
891
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
892
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
893
+ MI->flat_insn->detail->ppc.op_count++;
894
+ }
895
+ }
896
+
897
+ static void printU6ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
898
+ {
899
+ unsigned int Value = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
900
+
901
+ //assert(Value <= 63 && "Invalid u6imm argument!");
902
+ printUInt32(O, Value);
903
+
904
+ if (MI->csh->detail) {
905
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
906
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
907
+ MI->flat_insn->detail->ppc.op_count++;
908
+ }
909
+ }
910
+
911
+ static void printU7ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
912
+ {
913
+ unsigned int Value = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
914
+
915
+ //assert(Value <= 127 && "Invalid u7imm argument!");
916
+ printUInt32(O, Value);
917
+
918
+ if (MI->csh->detail) {
919
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
920
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
921
+ MI->flat_insn->detail->ppc.op_count++;
922
+ }
923
+ }
924
+
925
+ // Operands of BUILD_VECTOR are signed and we use this to print operands
926
+ // of XXSPLTIB which are unsigned. So we simply truncate to 8 bits and
927
+ // print as unsigned.
928
+ static void printU8ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
929
+ {
930
+ unsigned int Value = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
931
+
932
+ printUInt32(O, Value);
933
+
934
+ if (MI->csh->detail) {
935
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
936
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
937
+ MI->flat_insn->detail->ppc.op_count++;
938
+ }
939
+ }
940
+
941
+ static void printU10ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
942
+ {
943
+ unsigned int Value = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
944
+
945
+ //assert(Value <= 1023 && "Invalid u10imm argument!");
946
+ printUInt32(O, Value);
947
+
948
+ if (MI->csh->detail) {
949
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
950
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
951
+ MI->flat_insn->detail->ppc.op_count++;
952
+ }
953
+ }
954
+
955
+ static void printS12ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
956
+ {
957
+ if (MCOperand_isImm(MCInst_getOperand(MI, OpNo))) {
958
+ int Imm = (int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
959
+ Imm = SignExtend32(Imm, 12);
960
+
961
+ printInt32(O, Imm);
962
+
963
+ if (MI->csh->detail) {
964
+ if (MI->csh->doing_mem) {
965
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].mem.disp = Imm;
966
+ } else {
967
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
968
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Imm;
969
+ MI->flat_insn->detail->ppc.op_count++;
970
+ }
971
+ }
972
+ } else
973
+ printOperand(MI, OpNo, O);
974
+ }
975
+
976
+ static void printU12ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
977
+ {
978
+ unsigned short Value = (unsigned short)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
979
+
980
+ // assert(Value <= 4095 && "Invalid u12imm argument!");
981
+
982
+ printUInt32(O, Value);
983
+
984
+ if (MI->csh->detail) {
985
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
986
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Value;
987
+ MI->flat_insn->detail->ppc.op_count++;
988
+ }
989
+ }
990
+
991
+ static void printS16ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
992
+ {
993
+ if (MCOperand_isImm(MCInst_getOperand(MI, OpNo))) {
994
+ short Imm = (short)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
995
+ printInt32(O, Imm);
996
+
997
+ if (MI->csh->detail) {
998
+ if (MI->csh->doing_mem) {
999
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].mem.disp = Imm;
1000
+ } else {
1001
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
1002
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Imm;
1003
+ MI->flat_insn->detail->ppc.op_count++;
1004
+ }
1005
+ }
1006
+ } else
1007
+ printOperand(MI, OpNo, O);
1008
+ }
1009
+
1010
+ static void printU16ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
1011
+ {
1012
+ if (MCOperand_isImm(MCInst_getOperand(MI, OpNo))) {
1013
+ unsigned short Imm = (unsigned short)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
1014
+ printUInt32(O, Imm);
1015
+
1016
+ if (MI->csh->detail) {
1017
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
1018
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = Imm;
1019
+ MI->flat_insn->detail->ppc.op_count++;
1020
+ }
1021
+ } else
1022
+ printOperand(MI, OpNo, O);
1023
+ }
1024
+
1025
+ static void printBranchOperand(MCInst *MI, unsigned OpNo, SStream *O)
1026
+ {
1027
+ if (!MCOperand_isImm(MCInst_getOperand(MI, OpNo))) {
1028
+ printOperand(MI, OpNo, O);
1029
+
1030
+ return;
1031
+ }
1032
+
1033
+ // Branches can take an immediate operand. This is used by the branch
1034
+ // selection pass to print .+8, an eight byte displacement from the PC.
1035
+ // O << ".+";
1036
+ printAbsBranchOperand(MI, OpNo, O);
1037
+ }
1038
+
1039
+ static void printAbsBranchOperand(MCInst *MI, unsigned OpNo, SStream *O)
1040
+ {
1041
+ int64_t imm;
1042
+
1043
+ if (!MCOperand_isImm(MCInst_getOperand(MI, OpNo))) {
1044
+ printOperand(MI, OpNo, O);
1045
+
1046
+ return;
1047
+ }
1048
+
1049
+ imm = SignExtend32(MCOperand_getImm(MCInst_getOperand(MI, OpNo)) * 4, 32);
1050
+ //imm = MCOperand_getImm(MCInst_getOperand(MI, OpNo)) * 4;
1051
+
1052
+ if (!PPC_abs_branch(MI->csh, MCInst_getOpcode(MI))) {
1053
+ imm += MI->address;
1054
+ }
1055
+
1056
+ printUInt64(O, imm);
1057
+
1058
+ if (MI->csh->detail) {
1059
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
1060
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = imm;
1061
+ MI->flat_insn->detail->ppc.op_count++;
1062
+ }
1063
+ }
1064
+
1065
+ static void printcrbitm(MCInst *MI, unsigned OpNo, SStream *O)
1066
+ {
1067
+ unsigned RegNo;
1068
+ unsigned CCReg = MCOperand_getReg(MCInst_getOperand(MI, OpNo));
1069
+
1070
+ switch (CCReg) {
1071
+ default: // llvm_unreachable("Unknown CR register");
1072
+ case PPC_CR0: RegNo = 0; break;
1073
+ case PPC_CR1: RegNo = 1; break;
1074
+ case PPC_CR2: RegNo = 2; break;
1075
+ case PPC_CR3: RegNo = 3; break;
1076
+ case PPC_CR4: RegNo = 4; break;
1077
+ case PPC_CR5: RegNo = 5; break;
1078
+ case PPC_CR6: RegNo = 6; break;
1079
+ case PPC_CR7: RegNo = 7; break;
1080
+ }
1081
+
1082
+ printUInt32(O, 0x80 >> RegNo);
1083
+ }
1084
+
1085
+ static void printMemRegImm(MCInst *MI, unsigned OpNo, SStream *O)
1086
+ {
1087
+ set_mem_access(MI, true);
1088
+
1089
+ printS16ImmOperand(MI, OpNo, O);
1090
+
1091
+ SStream_concat0(O, "(");
1092
+
1093
+ if (MCOperand_getReg(MCInst_getOperand(MI, OpNo + 1)) == PPC_R0)
1094
+ SStream_concat0(O, "0");
1095
+ else
1096
+ printOperand(MI, OpNo + 1, O);
1097
+
1098
+ SStream_concat0(O, ")");
1099
+
1100
+ set_mem_access(MI, false);
1101
+ }
1102
+
1103
+ static void printPSMemRegImm(MCInst *MI, unsigned OpNo, SStream *O)
1104
+ {
1105
+ set_mem_access(MI, true);
1106
+
1107
+ printS12ImmOperand(MI, OpNo, O);
1108
+
1109
+ SStream_concat0(O, "(");
1110
+ printOperand(MI, OpNo + 1, O);
1111
+ SStream_concat0(O, ")");
1112
+
1113
+ set_mem_access(MI, false);
1114
+ }
1115
+
1116
+ static void printMemRegReg(MCInst *MI, unsigned OpNo, SStream *O)
1117
+ {
1118
+ // When used as the base register, r0 reads constant zero rather than
1119
+ // the value contained in the register. For this reason, the darwin
1120
+ // assembler requires that we print r0 as 0 (no r) when used as the base.
1121
+ if (MCOperand_getReg(MCInst_getOperand(MI, OpNo)) == PPC_R0)
1122
+ SStream_concat0(O, "0");
1123
+ else
1124
+ printOperand(MI, OpNo, O);
1125
+ SStream_concat0(O, ", ");
1126
+
1127
+ printOperand(MI, OpNo + 1, O);
1128
+ }
1129
+
1130
+ static void printTLSCall(MCInst *MI, unsigned OpNo, SStream *O)
1131
+ {
1132
+ set_mem_access(MI, true);
1133
+ //printBranchOperand(MI, OpNo, O);
1134
+
1135
+ // On PPC64, VariantKind is VK_None, but on PPC32, it's VK_PLT, and it must
1136
+ // come at the _end_ of the expression.
1137
+
1138
+ SStream_concat0(O, "(");
1139
+ printOperand(MI, OpNo + 1, O);
1140
+ SStream_concat0(O, ")");
1141
+
1142
+ set_mem_access(MI, false);
1143
+ }
1144
+
1145
+ /// stripRegisterPrefix - This method strips the character prefix from a
1146
+ /// register name so that only the number is left. Used by for linux asm.
1147
+ static char *stripRegisterPrefix(const char *RegName)
1148
+ {
1149
+ switch (RegName[0]) {
1150
+ case 'r':
1151
+ case 'f':
1152
+ case 'q': // for QPX
1153
+ case 'v':
1154
+ if (RegName[1] == 's')
1155
+ return cs_strdup(RegName + 2);
1156
+
1157
+ return cs_strdup(RegName + 1);
1158
+ case 'c':
1159
+ if (RegName[1] == 'r') {
1160
+ // skip the first 2 letters "cr"
1161
+ char *name = cs_strdup(RegName + 2);
1162
+
1163
+ // also strip the last 2 letters
1164
+ if(strlen(name) > 2)
1165
+ name[strlen(name) - 2] = '\0';
1166
+
1167
+ return name;
1168
+ }
1169
+ }
1170
+
1171
+ return cs_strdup(RegName);
1172
+ }
1173
+
1174
+ static void printOperand(MCInst *MI, unsigned OpNo, SStream *O)
1175
+ {
1176
+ MCOperand *Op = MCInst_getOperand(MI, OpNo);
1177
+ if (MCOperand_isReg(Op)) {
1178
+ unsigned reg = MCOperand_getReg(Op);
1179
+ #ifndef CAPSTONE_DIET
1180
+ const char *RegName = getRegisterName(reg);
1181
+
1182
+ // printf("reg = %u (%s)\n", reg, RegName);
1183
+
1184
+ // convert internal register ID to public register ID
1185
+ reg = PPC_name_reg(RegName);
1186
+
1187
+ // The linux and AIX assembler does not take register prefixes.
1188
+ if (MI->csh->syntax == CS_OPT_SYNTAX_NOREGNAME) {
1189
+ char *name = stripRegisterPrefix(RegName);
1190
+ SStream_concat0(O, name);
1191
+ cs_mem_free(name);
1192
+ } else
1193
+ SStream_concat0(O, RegName);
1194
+ #endif
1195
+
1196
+ if (MI->csh->detail) {
1197
+ if (MI->csh->doing_mem) {
1198
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].mem.base = reg;
1199
+ } else {
1200
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_REG;
1201
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].reg = reg;
1202
+ MI->flat_insn->detail->ppc.op_count++;
1203
+ }
1204
+ }
1205
+
1206
+ return;
1207
+ }
1208
+
1209
+ if (MCOperand_isImm(Op)) {
1210
+ int32_t imm = (int32_t)MCOperand_getImm(Op);
1211
+ printInt32(O, imm);
1212
+
1213
+ if (MI->csh->detail) {
1214
+ if (MI->csh->doing_mem) {
1215
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].mem.disp = (int32_t)imm;
1216
+ } else {
1217
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
1218
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = imm;
1219
+ MI->flat_insn->detail->ppc.op_count++;
1220
+ }
1221
+ }
1222
+ }
1223
+ }
1224
+
1225
+ static void op_addImm(MCInst *MI, int v)
1226
+ {
1227
+ if (MI->csh->detail) {
1228
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].type = PPC_OP_IMM;
1229
+ MI->flat_insn->detail->ppc.operands[MI->flat_insn->detail->ppc.op_count].imm = v;
1230
+ MI->flat_insn->detail->ppc.op_count++;
1231
+ }
1232
+ }
1233
+
1234
+ #define PRINT_ALIAS_INSTR
1235
+ #include "PPCGenRegisterName.inc"
1236
+ #include "PPCGenAsmWriter.inc"
1237
+
1238
+ #endif