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.
- package/LICENSE +26 -0
- package/README.md +191 -0
- package/binding.gyp +168 -0
- package/deps/capstone/LEB128.h +38 -0
- package/deps/capstone/MCDisassembler.h +14 -0
- package/deps/capstone/MCFixedLenDisassembler.h +32 -0
- package/deps/capstone/MCInst.c +270 -0
- package/deps/capstone/MCInst.h +165 -0
- package/deps/capstone/MCInstrDesc.c +41 -0
- package/deps/capstone/MCInstrDesc.h +167 -0
- package/deps/capstone/MCRegisterInfo.c +151 -0
- package/deps/capstone/MCRegisterInfo.h +116 -0
- package/deps/capstone/Mapping.c +254 -0
- package/deps/capstone/Mapping.h +174 -0
- package/deps/capstone/MathExtras.h +442 -0
- package/deps/capstone/SStream.c +181 -0
- package/deps/capstone/SStream.h +40 -0
- package/deps/capstone/arch/AArch64/AArch64AddressingModes.h +945 -0
- package/deps/capstone/arch/AArch64/AArch64BaseInfo.c +77 -0
- package/deps/capstone/arch/AArch64/AArch64BaseInfo.h +585 -0
- package/deps/capstone/arch/AArch64/AArch64Disassembler.c +2280 -0
- package/deps/capstone/arch/AArch64/AArch64Disassembler.h +18 -0
- package/deps/capstone/arch/AArch64/AArch64GenAsmWriter.inc +26589 -0
- package/deps/capstone/arch/AArch64/AArch64GenDisassemblerTables.inc +27322 -0
- package/deps/capstone/arch/AArch64/AArch64GenInstrInfo.inc +13194 -0
- package/deps/capstone/arch/AArch64/AArch64GenRegisterInfo.inc +3814 -0
- package/deps/capstone/arch/AArch64/AArch64GenRegisterName.inc +714 -0
- package/deps/capstone/arch/AArch64/AArch64GenRegisterV.inc +673 -0
- package/deps/capstone/arch/AArch64/AArch64GenSubtargetInfo.inc +229 -0
- package/deps/capstone/arch/AArch64/AArch64GenSystemOperands.inc +2863 -0
- package/deps/capstone/arch/AArch64/AArch64GenSystemOperands_enum.inc +21 -0
- package/deps/capstone/arch/AArch64/AArch64InstPrinter.c +3029 -0
- package/deps/capstone/arch/AArch64/AArch64InstPrinter.h +28 -0
- package/deps/capstone/arch/AArch64/AArch64Mapping.c +883 -0
- package/deps/capstone/arch/AArch64/AArch64Mapping.h +43 -0
- package/deps/capstone/arch/AArch64/AArch64MappingInsn.inc +37790 -0
- package/deps/capstone/arch/AArch64/AArch64MappingInsnName.inc +1282 -0
- package/deps/capstone/arch/AArch64/AArch64MappingInsnOp.inc +26994 -0
- package/deps/capstone/arch/AArch64/AArch64Module.c +44 -0
- package/deps/capstone/arch/AArch64/AArch64Module.h +12 -0
- package/deps/capstone/arch/ARM/ARMAddressingModes.h +698 -0
- package/deps/capstone/arch/ARM/ARMBaseInfo.h +486 -0
- package/deps/capstone/arch/ARM/ARMDisassembler.c +5763 -0
- package/deps/capstone/arch/ARM/ARMDisassembler.h +18 -0
- package/deps/capstone/arch/ARM/ARMGenAsmWriter.inc +9545 -0
- package/deps/capstone/arch/ARM/ARMGenDisassemblerTables.inc +15185 -0
- package/deps/capstone/arch/ARM/ARMGenInstrInfo.inc +6632 -0
- package/deps/capstone/arch/ARM/ARMGenRegisterInfo.inc +2102 -0
- package/deps/capstone/arch/ARM/ARMGenRegisterName.inc +231 -0
- package/deps/capstone/arch/ARM/ARMGenRegisterName_digit.inc +231 -0
- package/deps/capstone/arch/ARM/ARMGenSubtargetInfo.inc +162 -0
- package/deps/capstone/arch/ARM/ARMGenSystemRegister.inc +270 -0
- package/deps/capstone/arch/ARM/ARMInstPrinter.c +3364 -0
- package/deps/capstone/arch/ARM/ARMInstPrinter.h +43 -0
- package/deps/capstone/arch/ARM/ARMMapping.c +551 -0
- package/deps/capstone/arch/ARM/ARMMapping.h +40 -0
- package/deps/capstone/arch/ARM/ARMMappingInsn.inc +18772 -0
- package/deps/capstone/arch/ARM/ARMMappingInsnName.inc +475 -0
- package/deps/capstone/arch/ARM/ARMMappingInsnOp.inc +10729 -0
- package/deps/capstone/arch/ARM/ARMModule.c +63 -0
- package/deps/capstone/arch/ARM/ARMModule.h +12 -0
- package/deps/capstone/arch/BPF/BPFConstants.h +88 -0
- package/deps/capstone/arch/BPF/BPFDisassembler.c +464 -0
- package/deps/capstone/arch/BPF/BPFDisassembler.h +27 -0
- package/deps/capstone/arch/BPF/BPFInstPrinter.c +285 -0
- package/deps/capstone/arch/BPF/BPFInstPrinter.h +16 -0
- package/deps/capstone/arch/BPF/BPFMapping.c +513 -0
- package/deps/capstone/arch/BPF/BPFMapping.h +21 -0
- package/deps/capstone/arch/BPF/BPFModule.c +34 -0
- package/deps/capstone/arch/BPF/BPFModule.h +12 -0
- package/deps/capstone/arch/EVM/EVMDisassembler.c +379 -0
- package/deps/capstone/arch/EVM/EVMDisassembler.h +12 -0
- package/deps/capstone/arch/EVM/EVMInstPrinter.c +20 -0
- package/deps/capstone/arch/EVM/EVMInstPrinter.h +17 -0
- package/deps/capstone/arch/EVM/EVMMapping.c +344 -0
- package/deps/capstone/arch/EVM/EVMMapping.h +8 -0
- package/deps/capstone/arch/EVM/EVMMappingInsn.inc +259 -0
- package/deps/capstone/arch/EVM/EVMModule.c +33 -0
- package/deps/capstone/arch/EVM/EVMModule.h +12 -0
- package/deps/capstone/arch/M680X/M680XDisassembler.c +2307 -0
- package/deps/capstone/arch/M680X/M680XDisassembler.h +17 -0
- package/deps/capstone/arch/M680X/M680XDisassemblerInternals.h +57 -0
- package/deps/capstone/arch/M680X/M680XInstPrinter.c +360 -0
- package/deps/capstone/arch/M680X/M680XInstPrinter.h +25 -0
- package/deps/capstone/arch/M680X/M680XModule.c +77 -0
- package/deps/capstone/arch/M680X/M680XModule.h +12 -0
- package/deps/capstone/arch/M680X/cpu12.inc +335 -0
- package/deps/capstone/arch/M680X/hcs08.inc +60 -0
- package/deps/capstone/arch/M680X/hd6301.inc +15 -0
- package/deps/capstone/arch/M680X/hd6309.inc +259 -0
- package/deps/capstone/arch/M680X/insn_props.inc +367 -0
- package/deps/capstone/arch/M680X/m6800.inc +277 -0
- package/deps/capstone/arch/M680X/m6801.inc +39 -0
- package/deps/capstone/arch/M680X/m6805.inc +277 -0
- package/deps/capstone/arch/M680X/m6808.inc +91 -0
- package/deps/capstone/arch/M680X/m6809.inc +352 -0
- package/deps/capstone/arch/M680X/m6811.inc +105 -0
- package/deps/capstone/arch/M68K/M68KDisassembler.c +3668 -0
- package/deps/capstone/arch/M68K/M68KDisassembler.h +30 -0
- package/deps/capstone/arch/M68K/M68KInstPrinter.c +387 -0
- package/deps/capstone/arch/M68K/M68KInstPrinter.h +21 -0
- package/deps/capstone/arch/M68K/M68KInstructionTable.inc +65540 -0
- package/deps/capstone/arch/M68K/M68KModule.c +42 -0
- package/deps/capstone/arch/M68K/M68KModule.h +12 -0
- package/deps/capstone/arch/MOS65XX/MOS65XXDisassembler.c +544 -0
- package/deps/capstone/arch/MOS65XX/MOS65XXDisassembler.h +22 -0
- package/deps/capstone/arch/MOS65XX/MOS65XXDisassemblerInternals.h +23 -0
- package/deps/capstone/arch/MOS65XX/MOS65XXModule.c +79 -0
- package/deps/capstone/arch/MOS65XX/MOS65XXModule.h +12 -0
- package/deps/capstone/arch/MOS65XX/instruction_info.inc +106 -0
- package/deps/capstone/arch/MOS65XX/m6502.inc +256 -0
- package/deps/capstone/arch/MOS65XX/m65816.inc +256 -0
- package/deps/capstone/arch/MOS65XX/m65c02.inc +256 -0
- package/deps/capstone/arch/MOS65XX/mw65c02.inc +256 -0
- package/deps/capstone/arch/Mips/MipsDisassembler.c +1794 -0
- package/deps/capstone/arch/Mips/MipsDisassembler.h +16 -0
- package/deps/capstone/arch/Mips/MipsGenAsmWriter.inc +5725 -0
- package/deps/capstone/arch/Mips/MipsGenDisassemblerTables.inc +6942 -0
- package/deps/capstone/arch/Mips/MipsGenInstrInfo.inc +1805 -0
- package/deps/capstone/arch/Mips/MipsGenRegisterInfo.inc +1679 -0
- package/deps/capstone/arch/Mips/MipsGenSubtargetInfo.inc +52 -0
- package/deps/capstone/arch/Mips/MipsInstPrinter.c +424 -0
- package/deps/capstone/arch/Mips/MipsInstPrinter.h +25 -0
- package/deps/capstone/arch/Mips/MipsMapping.c +1070 -0
- package/deps/capstone/arch/Mips/MipsMapping.h +25 -0
- package/deps/capstone/arch/Mips/MipsMappingInsn.inc +9315 -0
- package/deps/capstone/arch/Mips/MipsModule.c +52 -0
- package/deps/capstone/arch/Mips/MipsModule.h +12 -0
- package/deps/capstone/arch/PowerPC/PPCDisassembler.c +627 -0
- package/deps/capstone/arch/PowerPC/PPCDisassembler.h +17 -0
- package/deps/capstone/arch/PowerPC/PPCGenAsmWriter.inc +11451 -0
- package/deps/capstone/arch/PowerPC/PPCGenDisassemblerTables.inc +6886 -0
- package/deps/capstone/arch/PowerPC/PPCGenInstrInfo.inc +4772 -0
- package/deps/capstone/arch/PowerPC/PPCGenRegisterInfo.inc +1122 -0
- package/deps/capstone/arch/PowerPC/PPCGenRegisterName.inc +278 -0
- package/deps/capstone/arch/PowerPC/PPCGenSubtargetInfo.inc +90 -0
- package/deps/capstone/arch/PowerPC/PPCInstPrinter.c +1238 -0
- package/deps/capstone/arch/PowerPC/PPCInstPrinter.h +15 -0
- package/deps/capstone/arch/PowerPC/PPCMapping.c +570 -0
- package/deps/capstone/arch/PowerPC/PPCMapping.h +40 -0
- package/deps/capstone/arch/PowerPC/PPCMappingInsn.inc +13220 -0
- package/deps/capstone/arch/PowerPC/PPCMappingInsnName.inc +1731 -0
- package/deps/capstone/arch/PowerPC/PPCModule.c +45 -0
- package/deps/capstone/arch/PowerPC/PPCModule.h +12 -0
- package/deps/capstone/arch/PowerPC/PPCPredicates.h +62 -0
- package/deps/capstone/arch/RISCV/RISCVBaseInfo.h +106 -0
- package/deps/capstone/arch/RISCV/RISCVDisassembler.c +433 -0
- package/deps/capstone/arch/RISCV/RISCVDisassembler.h +18 -0
- package/deps/capstone/arch/RISCV/RISCVGenAsmWriter.inc +2651 -0
- package/deps/capstone/arch/RISCV/RISCVGenDisassemblerTables.inc +1776 -0
- package/deps/capstone/arch/RISCV/RISCVGenInsnNameMaps.inc +275 -0
- package/deps/capstone/arch/RISCV/RISCVGenInstrInfo.inc +470 -0
- package/deps/capstone/arch/RISCV/RISCVGenRegisterInfo.inc +426 -0
- package/deps/capstone/arch/RISCV/RISCVGenSubtargetInfo.inc +33 -0
- package/deps/capstone/arch/RISCV/RISCVInstPrinter.c +447 -0
- package/deps/capstone/arch/RISCV/RISCVInstPrinter.h +24 -0
- package/deps/capstone/arch/RISCV/RISCVMapping.c +366 -0
- package/deps/capstone/arch/RISCV/RISCVMapping.h +22 -0
- package/deps/capstone/arch/RISCV/RISCVMappingInsn.inc +1635 -0
- package/deps/capstone/arch/RISCV/RISCVModule.c +42 -0
- package/deps/capstone/arch/RISCV/RISCVModule.h +12 -0
- package/deps/capstone/arch/SH/SHDisassembler.c +2221 -0
- package/deps/capstone/arch/SH/SHDisassembler.h +19 -0
- package/deps/capstone/arch/SH/SHInsnTable.inc +66 -0
- package/deps/capstone/arch/SH/SHInstPrinter.c +438 -0
- package/deps/capstone/arch/SH/SHInstPrinter.h +23 -0
- package/deps/capstone/arch/SH/SHModule.c +39 -0
- package/deps/capstone/arch/SH/SHModule.h +12 -0
- package/deps/capstone/arch/SH/mktable.rb +390 -0
- package/deps/capstone/arch/Sparc/Sparc.h +63 -0
- package/deps/capstone/arch/Sparc/SparcDisassembler.c +500 -0
- package/deps/capstone/arch/Sparc/SparcDisassembler.h +17 -0
- package/deps/capstone/arch/Sparc/SparcGenAsmWriter.inc +5709 -0
- package/deps/capstone/arch/Sparc/SparcGenDisassemblerTables.inc +2028 -0
- package/deps/capstone/arch/Sparc/SparcGenInstrInfo.inc +514 -0
- package/deps/capstone/arch/Sparc/SparcGenRegisterInfo.inc +451 -0
- package/deps/capstone/arch/Sparc/SparcGenSubtargetInfo.inc +27 -0
- package/deps/capstone/arch/Sparc/SparcInstPrinter.c +446 -0
- package/deps/capstone/arch/Sparc/SparcInstPrinter.h +17 -0
- package/deps/capstone/arch/Sparc/SparcMapping.c +665 -0
- package/deps/capstone/arch/Sparc/SparcMapping.h +34 -0
- package/deps/capstone/arch/Sparc/SparcMappingInsn.inc +2643 -0
- package/deps/capstone/arch/Sparc/SparcModule.c +45 -0
- package/deps/capstone/arch/Sparc/SparcModule.h +12 -0
- package/deps/capstone/arch/SystemZ/SystemZDisassembler.c +484 -0
- package/deps/capstone/arch/SystemZ/SystemZDisassembler.h +17 -0
- package/deps/capstone/arch/SystemZ/SystemZGenAsmWriter.inc +11575 -0
- package/deps/capstone/arch/SystemZ/SystemZGenDisassemblerTables.inc +10262 -0
- package/deps/capstone/arch/SystemZ/SystemZGenInsnNameMaps.inc +2348 -0
- package/deps/capstone/arch/SystemZ/SystemZGenInstrInfo.inc +2820 -0
- package/deps/capstone/arch/SystemZ/SystemZGenRegisterInfo.inc +741 -0
- package/deps/capstone/arch/SystemZ/SystemZGenSubtargetInfo.inc +49 -0
- package/deps/capstone/arch/SystemZ/SystemZInstPrinter.c +433 -0
- package/deps/capstone/arch/SystemZ/SystemZInstPrinter.h +15 -0
- package/deps/capstone/arch/SystemZ/SystemZMCTargetDesc.c +195 -0
- package/deps/capstone/arch/SystemZ/SystemZMCTargetDesc.h +51 -0
- package/deps/capstone/arch/SystemZ/SystemZMapping.c +479 -0
- package/deps/capstone/arch/SystemZ/SystemZMapping.h +23 -0
- package/deps/capstone/arch/SystemZ/SystemZMappingInsn.inc +14175 -0
- package/deps/capstone/arch/SystemZ/SystemZModule.c +44 -0
- package/deps/capstone/arch/SystemZ/SystemZModule.h +12 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xDisassembler.c +628 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xDisassembler.h +19 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xGenAsmWriter.inc +684 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xGenDisassemblerTables.inc +1352 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xGenInstrInfo.inc +298 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xGenRegisterInfo.inc +277 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xInstPrinter.c +572 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xInstPrinter.h +15 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xMapping.c +1926 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xMapping.h +26 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xModule.c +39 -0
- package/deps/capstone/arch/TMS320C64x/TMS320C64xModule.h +12 -0
- package/deps/capstone/arch/TriCore/TriCore.td +134 -0
- package/deps/capstone/arch/TriCore/TriCoreCallingConv.td +61 -0
- package/deps/capstone/arch/TriCore/TriCoreDisassembler.c +1655 -0
- package/deps/capstone/arch/TriCore/TriCoreDisassembler.h +18 -0
- package/deps/capstone/arch/TriCore/TriCoreGenAsmWriter.inc +3691 -0
- package/deps/capstone/arch/TriCore/TriCoreGenCSFeatureName.inc +22 -0
- package/deps/capstone/arch/TriCore/TriCoreGenCSMappingInsn.inc +8938 -0
- package/deps/capstone/arch/TriCore/TriCoreGenCSMappingInsnName.inc +404 -0
- package/deps/capstone/arch/TriCore/TriCoreGenCSMappingInsnOp.inc +7994 -0
- package/deps/capstone/arch/TriCore/TriCoreGenCSOpGroup.inc +32 -0
- package/deps/capstone/arch/TriCore/TriCoreGenDisassemblerTables.inc +4044 -0
- package/deps/capstone/arch/TriCore/TriCoreGenInstrInfo.inc +2693 -0
- package/deps/capstone/arch/TriCore/TriCoreGenRegisterInfo.inc +295 -0
- package/deps/capstone/arch/TriCore/TriCoreGenSubtargetInfo.inc +40 -0
- package/deps/capstone/arch/TriCore/TriCoreInstPrinter.c +488 -0
- package/deps/capstone/arch/TriCore/TriCoreInstrFormats.td +773 -0
- package/deps/capstone/arch/TriCore/TriCoreInstrInfo.td +1873 -0
- package/deps/capstone/arch/TriCore/TriCoreLinkage.h +21 -0
- package/deps/capstone/arch/TriCore/TriCoreMapping.c +241 -0
- package/deps/capstone/arch/TriCore/TriCoreMapping.h +32 -0
- package/deps/capstone/arch/TriCore/TriCoreModule.c +44 -0
- package/deps/capstone/arch/TriCore/TriCoreModule.h +11 -0
- package/deps/capstone/arch/TriCore/TriCoreRegisterInfo.td +153 -0
- package/deps/capstone/arch/WASM/WASMDisassembler.c +1009 -0
- package/deps/capstone/arch/WASM/WASMDisassembler.h +12 -0
- package/deps/capstone/arch/WASM/WASMInstPrinter.c +47 -0
- package/deps/capstone/arch/WASM/WASMInstPrinter.h +18 -0
- package/deps/capstone/arch/WASM/WASMMapping.c +333 -0
- package/deps/capstone/arch/WASM/WASMMapping.h +9 -0
- package/deps/capstone/arch/WASM/WASMModule.c +33 -0
- package/deps/capstone/arch/WASM/WASMModule.h +12 -0
- package/deps/capstone/arch/X86/X86ATTInstPrinter.c +997 -0
- package/deps/capstone/arch/X86/X86BaseInfo.h +50 -0
- package/deps/capstone/arch/X86/X86Disassembler.c +1033 -0
- package/deps/capstone/arch/X86/X86Disassembler.h +28 -0
- package/deps/capstone/arch/X86/X86DisassemblerDecoder.c +2358 -0
- package/deps/capstone/arch/X86/X86DisassemblerDecoder.h +725 -0
- package/deps/capstone/arch/X86/X86DisassemblerDecoderCommon.h +483 -0
- package/deps/capstone/arch/X86/X86GenAsmWriter.inc +49199 -0
- package/deps/capstone/arch/X86/X86GenAsmWriter1.inc +33196 -0
- package/deps/capstone/arch/X86/X86GenAsmWriter1_reduce.inc +2531 -0
- package/deps/capstone/arch/X86/X86GenAsmWriter_reduce.inc +2855 -0
- package/deps/capstone/arch/X86/X86GenDisassemblerTables.inc +112961 -0
- package/deps/capstone/arch/X86/X86GenDisassemblerTables2.inc +102151 -0
- package/deps/capstone/arch/X86/X86GenDisassemblerTables_reduce.inc +28047 -0
- package/deps/capstone/arch/X86/X86GenDisassemblerTables_reduce2.inc +18827 -0
- package/deps/capstone/arch/X86/X86GenInstrInfo.inc +15158 -0
- package/deps/capstone/arch/X86/X86GenInstrInfo_reduce.inc +1564 -0
- package/deps/capstone/arch/X86/X86GenRegisterInfo.inc +1549 -0
- package/deps/capstone/arch/X86/X86GenRegisterName.inc +292 -0
- package/deps/capstone/arch/X86/X86GenRegisterName1.inc +291 -0
- package/deps/capstone/arch/X86/X86ImmSize.inc +335 -0
- package/deps/capstone/arch/X86/X86InstPrinter.h +26 -0
- package/deps/capstone/arch/X86/X86InstPrinterCommon.c +116 -0
- package/deps/capstone/arch/X86/X86InstPrinterCommon.h +16 -0
- package/deps/capstone/arch/X86/X86IntelInstPrinter.c +1061 -0
- package/deps/capstone/arch/X86/X86Lookup16.inc +16874 -0
- package/deps/capstone/arch/X86/X86Lookup16_reduce.inc +2308 -0
- package/deps/capstone/arch/X86/X86Mapping.c +2266 -0
- package/deps/capstone/arch/X86/X86Mapping.h +96 -0
- package/deps/capstone/arch/X86/X86MappingInsn.inc +105977 -0
- package/deps/capstone/arch/X86/X86MappingInsnName.inc +1527 -0
- package/deps/capstone/arch/X86/X86MappingInsnName_reduce.inc +348 -0
- package/deps/capstone/arch/X86/X86MappingInsnOp.inc +75700 -0
- package/deps/capstone/arch/X86/X86MappingInsnOp_reduce.inc +7729 -0
- package/deps/capstone/arch/X86/X86MappingInsn_reduce.inc +10819 -0
- package/deps/capstone/arch/X86/X86MappingReg.inc +280 -0
- package/deps/capstone/arch/X86/X86Module.c +94 -0
- package/deps/capstone/arch/X86/X86Module.h +12 -0
- package/deps/capstone/arch/XCore/XCoreDisassembler.c +794 -0
- package/deps/capstone/arch/XCore/XCoreDisassembler.h +17 -0
- package/deps/capstone/arch/XCore/XCoreGenAsmWriter.inc +772 -0
- package/deps/capstone/arch/XCore/XCoreGenDisassemblerTables.inc +853 -0
- package/deps/capstone/arch/XCore/XCoreGenInstrInfo.inc +267 -0
- package/deps/capstone/arch/XCore/XCoreGenRegisterInfo.inc +110 -0
- package/deps/capstone/arch/XCore/XCoreInstPrinter.c +250 -0
- package/deps/capstone/arch/XCore/XCoreInstPrinter.h +18 -0
- package/deps/capstone/arch/XCore/XCoreMapping.c +297 -0
- package/deps/capstone/arch/XCore/XCoreMapping.h +26 -0
- package/deps/capstone/arch/XCore/XCoreMappingInsn.inc +1287 -0
- package/deps/capstone/arch/XCore/XCoreModule.c +41 -0
- package/deps/capstone/arch/XCore/XCoreModule.h +12 -0
- package/deps/capstone/cs.c +1664 -0
- package/deps/capstone/cs_priv.h +101 -0
- package/deps/capstone/cs_simple_types.h +886 -0
- package/deps/capstone/include/capstone/arm.h +991 -0
- package/deps/capstone/include/capstone/arm64.h +3159 -0
- package/deps/capstone/include/capstone/bpf.h +209 -0
- package/deps/capstone/include/capstone/capstone.h +875 -0
- package/deps/capstone/include/capstone/evm.h +188 -0
- package/deps/capstone/include/capstone/m680x.h +537 -0
- package/deps/capstone/include/capstone/m68k.h +613 -0
- package/deps/capstone/include/capstone/mips.h +956 -0
- package/deps/capstone/include/capstone/mos65xx.h +204 -0
- package/deps/capstone/include/capstone/platform.h +122 -0
- package/deps/capstone/include/capstone/ppc.h +2108 -0
- package/deps/capstone/include/capstone/riscv.h +531 -0
- package/deps/capstone/include/capstone/sh.h +465 -0
- package/deps/capstone/include/capstone/sparc.h +520 -0
- package/deps/capstone/include/capstone/systemz.h +2601 -0
- package/deps/capstone/include/capstone/tms320c64x.h +359 -0
- package/deps/capstone/include/capstone/tricore.h +567 -0
- package/deps/capstone/include/capstone/wasm.h +250 -0
- package/deps/capstone/include/capstone/x86.h +1986 -0
- package/deps/capstone/include/capstone/xcore.h +235 -0
- package/deps/capstone/include/platform.h +110 -0
- package/deps/capstone/include/windowsce/intrin.h +12 -0
- package/deps/capstone/include/windowsce/stdint.h +133 -0
- package/deps/capstone/utils.c +140 -0
- package/deps/capstone/utils.h +54 -0
- package/index.d.ts +448 -0
- package/index.js +64 -0
- package/index.mjs +25 -0
- package/package.json +82 -0
- package/prebuilds/win32-x64/hexcore-capstone.node +0 -0
- package/src/capstone_wrapper.cpp +910 -0
- package/src/capstone_wrapper.h +147 -0
- package/src/disasm_async_worker.h +215 -0
- 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
|