aboutsummaryrefslogtreecommitdiffstats
path: root/capstone/suite/synctools/asmwriter.py
diff options
context:
space:
mode:
Diffstat (limited to 'capstone/suite/synctools/asmwriter.py')
-rwxr-xr-xcapstone/suite/synctools/asmwriter.py748
1 files changed, 748 insertions, 0 deletions
diff --git a/capstone/suite/synctools/asmwriter.py b/capstone/suite/synctools/asmwriter.py
new file mode 100755
index 000000000..b511759c2
--- /dev/null
+++ b/capstone/suite/synctools/asmwriter.py
@@ -0,0 +1,748 @@
+#!/usr/bin/python
+# convert LLVM GenAsmWriter.inc for Capstone disassembler.
+# by Nguyen Anh Quynh, 2019
+
+import sys
+
+if len(sys.argv) == 1:
+ print("Syntax: %s <GenAsmWriter.inc> <Output-GenAsmWriter.inc> <Output-GenRegisterName.inc> <arch>" %sys.argv[0])
+ sys.exit(1)
+
+arch = sys.argv[4]
+f = open(sys.argv[1])
+lines = f.readlines()
+f.close()
+
+f1 = open(sys.argv[2], 'w+')
+
+f2 = open(sys.argv[3], 'w+')
+
+f1.write("/* Capstone Disassembly Engine, http://www.capstone-engine.org */\n")
+f1.write("/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */\n")
+f1.write("\n")
+
+f2.write("/* Capstone Disassembly Engine, http://www.capstone-engine.org */\n")
+f2.write("/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */\n")
+f2.write("\n")
+
+need_endif = False
+in_getRegisterName = False
+in_printAliasInstr = False
+fragment_no = None
+skip_printing = False
+
+skip_line = 0
+skip_count = 0
+
+def replace_getOp(line):
+ line2 = line
+ if 'MI->getOperand(0)' in line:
+ line2 = line.replace('MI->getOperand(0)', 'MCInst_getOperand(MI, 0)')
+ elif 'MI->getOperand(1)' in line:
+ line2 = line.replace('MI->getOperand(1)', 'MCInst_getOperand(MI, 1)')
+ elif 'MI->getOperand(2)' in line:
+ line2 = line.replace('MI->getOperand(2)', 'MCInst_getOperand(MI, 2)')
+ elif 'MI->getOperand(3)' in line:
+ line2 = line.replace('MI->getOperand(3)', 'MCInst_getOperand(MI, 3)')
+ elif 'MI->getOperand(4)' in line:
+ line2 = line.replace('MI->getOperand(4)', 'MCInst_getOperand(MI, 4)')
+ elif 'MI->getOperand(5)' in line:
+ line2 = line.replace('MI->getOperand(5)', 'MCInst_getOperand(MI, 5)')
+ elif 'MI->getOperand(6)' in line:
+ line2 = line.replace('MI->getOperand(6)', 'MCInst_getOperand(MI, 6)')
+ elif 'MI->getOperand(7)' in line:
+ line2 = line.replace('MI->getOperand(7)', 'MCInst_getOperand(MI, 7)')
+ elif 'MI->getOperand(8)' in line:
+ line2 = line.replace('MI->getOperand(8)', 'MCInst_getOperand(MI, 8)')
+ return line2
+
+def replace_getReg(line):
+ line2 = line
+ if 'MI->getOperand(0).getReg()' in line:
+ line2 = line.replace('MI->getOperand(0).getReg()', 'MCOperand_getReg(MCInst_getOperand(MI, 0))')
+ elif 'MI->getOperand(1).getReg()' in line:
+ line2 = line.replace('MI->getOperand(1).getReg()', 'MCOperand_getReg(MCInst_getOperand(MI, 1))')
+ elif 'MI->getOperand(2).getReg()' in line:
+ line2 = line.replace('MI->getOperand(2).getReg()', 'MCOperand_getReg(MCInst_getOperand(MI, 2))')
+ elif 'MI->getOperand(3).getReg()' in line:
+ line2 = line.replace('MI->getOperand(3).getReg()', 'MCOperand_getReg(MCInst_getOperand(MI, 3))')
+ elif 'MI->getOperand(4).getReg()' in line:
+ line2 = line.replace('MI->getOperand(4).getReg()', 'MCOperand_getReg(MCInst_getOperand(MI, 4))')
+ elif 'MI->getOperand(5).getReg()' in line:
+ line2 = line.replace('MI->getOperand(5).getReg()', 'MCOperand_getReg(MCInst_getOperand(MI, 5))')
+ elif 'MI->getOperand(6).getReg()' in line:
+ line2 = line.replace('MI->getOperand(6).getReg()', 'MCOperand_getReg(MCInst_getOperand(MI, 6))')
+ elif 'MI->getOperand(7).getReg()' in line:
+ line2 = line.replace('MI->getOperand(7).getReg()', 'MCOperand_getReg(MCInst_getOperand(MI, 7))')
+ elif 'MI->getOperand(8).getReg()' in line:
+ line2 = line.replace('MI->getOperand(8).getReg()', 'MCOperand_getReg(MCInst_getOperand(MI, 8))')
+ return line2
+
+# extract param between text()
+# MRI.getRegClass(AArch64::GPR32spRegClassID).contains(MI->getOperand(1).getReg()))
+def extract_paren(line, text):
+ i = line.index(text)
+ return line[line.index('(', i)+1 : line.index(')', i)]
+
+
+# extract text between <>
+# printSVERegOp<'q'>
+def extract_brackets(line):
+ if '<' in line:
+ return line[line.index('<')+1 : line.index('>')]
+ else:
+ return ''
+
+# delete text between <>, including <>
+# printSVERegOp<'q'>
+def del_brackets(line):
+ if '<' in line:
+ return line[:line.index('<')] + line[line.index('>') + 1:]
+ else:
+ return line
+
+
+def print_line(line):
+ line = line.replace('::', '_')
+ line = line.replace('nullptr', 'NULL')
+ if not skip_printing:
+ if in_getRegisterName:
+ f2.write(line + "\n")
+ else:
+ f1.write(line + "\n")
+
+
+for line in lines:
+ line = line.rstrip()
+ #print("@", line)
+
+ # skip Alias
+ if arch.upper() == 'X86':
+ if 'PRINT_ALIAS_INSTR' in line:
+ # done
+ break
+
+ if skip_line:
+ skip_count += 1
+ if skip_count <= skip_line:
+ # skip this line
+ continue
+ else:
+ # skip enough number of lines, reset counters
+ skip_line = 0
+ skip_count = 0
+
+ if "::printInstruction" in line:
+ if arch.upper() in ('AARCH64', 'ARM64'):
+ #print_line("static void printInstruction(MCInst *MI, SStream *O, MCRegisterInfo *MRI)\n{")
+ print_line("static void printInstruction(MCInst *MI, SStream *O)\n{")
+ else:
+ print_line("static void printInstruction(MCInst *MI, SStream *O)\n{")
+ elif 'const char *AArch64InstPrinter::' in line:
+ continue
+ elif 'getRegisterName(' in line:
+ if 'unsigned AltIdx' in line:
+ print_line("static const char *getRegisterName(unsigned RegNo, unsigned AltIdx)\n{")
+ else:
+ print_line("static const char *getRegisterName(unsigned RegNo)\n{")
+ elif 'getRegisterName' in line:
+ in_getRegisterName = True
+ print_line(line)
+ elif '::printAliasInstr' in line:
+ if arch.upper() in ('AARCH64', 'PPC'):
+ print_line("static char *printAliasInstr(MCInst *MI, SStream *OS, MCRegisterInfo *MRI)\n{")
+ print_line(' #define GETREGCLASS_CONTAIN(_class, _reg) MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, _class), MCOperand_getReg(MCInst_getOperand(MI, _reg)))')
+ else:
+ print_line("static bool printAliasInstr(MCInst *MI, SStream *OS)\n{")
+ print_line(" unsigned int I = 0, OpIdx, PrintMethodIdx;")
+ print_line(" char *tmpString;")
+ in_printAliasInstr = True
+ elif 'STI.getFeatureBits()[' in line:
+ if arch.upper() == 'ARM':
+ line2 = line.replace('STI.getFeatureBits()[', 'ARM_getFeatureBits(MI->csh->mode, ')
+ elif arch.upper() == 'AARCH64':
+ line2 = line.replace('STI.getFeatureBits()[', 'AArch64_getFeatureBits(')
+ line2 = line2.replace(']', ')')
+ print_line(line2)
+ elif ', STI, ' in line:
+ line2 = line.replace(', STI, ', ', ')
+
+ if 'printSVELogicalImm<' in line:
+ if 'int16' in line:
+ line2 = line2.replace('printSVELogicalImm', 'printSVELogicalImm16')
+ line2 = line2.replace('<int16_t>', '')
+ elif 'int32' in line:
+ line2 = line2.replace('printSVELogicalImm', 'printSVELogicalImm32')
+ line2 = line2.replace('<int32_t>', '')
+ else:
+ line2 = line2.replace('printSVELogicalImm', 'printSVELogicalImm64')
+ line2 = line2.replace('<int64_t>', '')
+
+ if 'MI->getOperand(' in line:
+ line2 = replace_getOp(line2)
+
+ # C++ template
+ if 'printPrefetchOp' in line2:
+ param = extract_brackets(line2)
+ if param == '':
+ param = 'false'
+ line2 = del_brackets(line2)
+ line2 = line2.replace(', O);', ', O, %s);' %param)
+ line2 = line2.replace(', OS);', ', OS, %s);' %param)
+ elif '<false>' in line2:
+ line2 = line2.replace('<false>', '')
+ line2 = line2.replace(', O);', ', O, false);')
+ line2 = line2.replace('STI, ', '')
+ elif '<true>' in line:
+ line2 = line2.replace('<true>', '')
+ line2 = line2.replace(', O);', ', O, true);')
+ line2 = line2.replace('STI, ', '')
+ elif 'printAdrLabelOperand' in line:
+ # C++ template
+ if '<0>' in line:
+ line2 = line2.replace('<0>', '')
+ line2 = line2.replace(', O);', ', O, 0);')
+ elif '<1>' in line:
+ line2 = line2.replace('<1>', '')
+ line2 = line2.replace(', O);', ', O, 1);')
+ elif '<2>' in line:
+ line2 = line2.replace('<2>', '')
+ line2 = line2.replace(', O);', ', O, 2);')
+ elif 'printImm8OptLsl' in line2:
+ param = extract_brackets(line2)
+ line2 = del_brackets(line2)
+ if '8' in param or '16' in param or '32' in param:
+ line2 = line2.replace('printImm8OptLsl', 'printImm8OptLsl32')
+ elif '64' in param:
+ line2 = line2.replace('printImm8OptLsl', 'printImm8OptLsl64')
+ elif 'printLogicalImm' in line2:
+ param = extract_brackets(line2)
+ line2 = del_brackets(line2)
+ if '8' in param or '16' in param or '32' in param:
+ line2 = line2.replace('printLogicalImm', 'printLogicalImm32')
+ elif '64' in param:
+ line2 = line2.replace('printLogicalImm', 'printLogicalImm64')
+ elif 'printSVERegOp' in line2 or 'printGPRSeqPairsClassOperand' in line2 or 'printTypedVectorList' in line2 or 'printPostIncOperand' in line2 or 'printImmScale' in line2 or 'printRegWithShiftExtend' in line2 or 'printUImm12Offset' in line2 or 'printExactFPImm' in line2 or 'printMemExtend' in line2 or 'printZPRasFPR' in line2:
+ param = extract_brackets(line2)
+ if param == '':
+ param = '0'
+ line2 = del_brackets(line2)
+ line2 = line2.replace(', O);', ', O, %s);' %param)
+ line2 = line2.replace(', OS);', ', OS, %s);' %param)
+ elif 'printComplexRotationOp' in line:
+ # printComplexRotationOp<90, 0>(MI, 5, STI, O);
+ bracket_content = line2[line2.index('<') + 1 : line2.index('>')]
+ line2 = line2.replace('<' + bracket_content + '>', '')
+ line2 = line2.replace(' O);', ' O, %s);' %bracket_content)
+
+ print_line(line2)
+ elif "static const char AsmStrs[]" in line:
+ print_line("#ifndef CAPSTONE_DIET")
+ print_line(" static const char AsmStrs[] = {")
+ need_endif = True
+ elif "static const char AsmStrsNoRegAltName[]" in line:
+ print_line("#ifndef CAPSTONE_DIET")
+ print_line(" static const char AsmStrsNoRegAltName[] = {")
+ need_endif = True
+ elif line == ' O << "\\t";':
+ print_line(" unsigned int opcode = MCInst_getOpcode(MI);")
+ print_line(' // printf("opcode = %u\\n", opcode);');
+ elif 'MI->getOpcode()' in line:
+ if 'switch' in line:
+ line2 = line.replace('MI->getOpcode()', 'MCInst_getOpcode(MI)')
+ else:
+ line2 = line.replace('MI->getOpcode()', 'opcode')
+ print_line(line2)
+
+ elif 'O << ' in line:
+ if '"' in line:
+ line2 = line.lower()
+ line2 = line2.replace('o << ', 'SStream_concat0(O, ');
+ else:
+ line2 = line.replace('O << ', 'SStream_concat0(O, ');
+ line2 = line2.replace("'", '"')
+ line2 = line2.replace(';', ');')
+ if '" : "' in line2: # "segment : offset" in X86
+ line2 = line2.replace('" : "', '":"')
+
+ # ARM
+ print_line(line2)
+
+ if '", #0"' in line2:
+ print_line(' op_addImm(MI, 0);')
+
+ if '", #1"' in line2:
+ print_line(' op_addImm(MI, 1);')
+
+ # PowerPC
+ if '", 268"' in line2:
+ print_line(' op_addImm(MI, 268);')
+
+ elif '", 256"' in line2:
+ print_line(' op_addImm(MI, 256);')
+
+ elif '", 0, "' in line2 or '", 0"' in line2:
+ print_line(' op_addImm(MI, 0);')
+
+ elif '", -1"' in line2:
+ print_line(' op_addImm(MI, -1);')
+
+ if '[' in line2:
+ if not '[]' in line2:
+ print_line(' set_mem_access(MI, true);')
+
+ if ']' in line2:
+ if not '[]' in line2:
+ print_line(' set_mem_access(MI, false);')
+
+ if '".f64\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F64);')
+ elif '".f32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F32);')
+ elif '".f16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F16);')
+ elif '".s64\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_S64);')
+ elif '".s32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_S32);')
+ elif '".s16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_S16);')
+ elif '".s8\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_S8);')
+ elif '".u64\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_U64);')
+ elif '".u32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_U32);')
+ elif '".u16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_U16);')
+ elif '".u8\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_U8);')
+ elif '".i64\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_I64);')
+ elif '".i32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_I32);')
+ elif '".i16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_I16);')
+ elif '".i8\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_I8);')
+ elif '".f16.f64\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F16F64);')
+ elif '".f64.f16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F64F16);')
+ elif '".f16.f32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F16F32);')
+ elif '".f32.f16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F32F16);')
+ elif '".f64.f32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F64F32);')
+ elif '".f32.f64\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F32F64);')
+ elif '".s32.f32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_S32F32);')
+ elif '".f32.s32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F32S32);')
+ elif '".u32.f32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_U32F32);')
+ elif '".f32.u32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F32U32);')
+ elif '".p8\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_P8);')
+ elif '".f64.s16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F64S16);')
+ elif '".s16.f64\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_S16F64);')
+ elif '".f32.s16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F32S16);')
+ elif '".s16.f32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_S16F32);')
+ elif '".f64.s32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F64S32);')
+ elif '".s32.f64\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_S32F64);')
+ elif '".f64.u16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F64U16);')
+ elif '".u16.f64\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_U16F64);')
+ elif '".f32.u16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F32U16);')
+ elif '".u16.f32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_U16F32);')
+ elif '".f64.u32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F64U32);')
+ elif '".u32.f64\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_U32F64);')
+ elif '".f16.u32\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F16U32);')
+ elif '".u32.f16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_U32F16);')
+ elif '".f16.u16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_F16U16);')
+ elif '".u16.f16\\t"' in line2:
+ print_line(' ARM_addVectorDataType(MI, ARM_VECTORDATA_U16F16);')
+ elif '"\\tlr"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_LR);')
+ elif '"\\tapsr_nzcv, fpscr"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_APSR_NZCV);')
+ print_line(' ARM_addReg(MI, ARM_REG_FPSCR);')
+ elif '"\\tpc, lr"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_PC);')
+ print_line(' ARM_addReg(MI, ARM_REG_LR);')
+ elif '"\\tfpscr, "' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPSCR);')
+ elif '"\\tfpexc, "' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPEXC);')
+ elif '"\\tfpinst, "' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPINST);')
+ elif '"\\tfpinst2, "' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPINST2);')
+ elif '"\\tfpsid, "' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPSID);')
+ elif '"\\tsp, "' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_SP);')
+ elif '"\\tsp!, "' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_SP);')
+ elif '", apsr"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_APSR);')
+ elif '", spsr"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_SPSR);')
+ elif '", fpscr"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPSCR);')
+ elif '", fpscr"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPSCR);')
+ elif '", fpexc"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPEXC);')
+ elif '", fpinst"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPINST);')
+ elif '", fpinst2"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPINST2);')
+ elif '", fpsid"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_FPSID);')
+ elif '", mvfr0"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_MVFR0);')
+ elif '", mvfr1"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_MVFR1);')
+ elif '", mvfr2"' in line2:
+ print_line(' ARM_addReg(MI, ARM_REG_MVFR2);')
+ elif '.8\\t' in line2:
+ print_line(' ARM_addVectorDataSize(MI, 8);')
+ elif '.16\\t' in line2:
+ print_line(' ARM_addVectorDataSize(MI, 16);')
+ elif '.32\\t' in line2:
+ print_line(' ARM_addVectorDataSize(MI, 32);')
+ elif '.64\\t' in line2:
+ print_line(' ARM_addVectorDataSize(MI, 64);')
+ elif '" ^"' in line2:
+ print_line(' ARM_addUserMode(MI);')
+
+ if '.16b' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_16B);')
+ elif '.8b' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_8B);')
+ elif '.4b' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_4B);')
+ elif '.b' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_1B);')
+ elif '.8h' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_8H);')
+ elif '.4h' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_4H);')
+ elif '.2h' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_2H);')
+ elif '.h' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_1H);')
+ elif '.4s' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_4S);')
+ elif '.2s' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_2S);')
+ elif '.s' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_1S);')
+ elif '.2d' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_2D);')
+ elif '.1d' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_1D);')
+ elif '.1q' in line2:
+ print_line(' arm64_op_addVectorArrSpecifier(MI, ARM64_VAS_1Q);')
+
+ if '#0.0' in line2:
+ print_line(' arm64_op_addFP(MI, 0);')
+ elif '#0' in line2:
+ print_line(' arm64_op_addImm(MI, 0);')
+ elif '#8' in line2:
+ print_line(' arm64_op_addImm(MI, 8);')
+ elif '#16' in line2:
+ print_line(' arm64_op_addImm(MI, 16);')
+ elif '#32' in line2:
+ print_line(' arm64_op_addImm(MI, 32);')
+
+ # X86
+ if '", %rax"' in line2 or '", rax"' in line2:
+ print_line(' op_addReg(MI, X86_REG_RAX);')
+ elif '", %eax"' in line2 or '", eax"' in line2:
+ print_line(' op_addReg(MI, X86_REG_EAX);')
+ elif '", %ax"' in line2 or '", ax"' in line2:
+ print_line(' op_addReg(MI, X86_REG_AX);')
+ elif '", %al"' in line2 or '", al"' in line2:
+ print_line(' op_addReg(MI, X86_REG_AL);')
+ elif '", %dx"' in line2 or '", dx"' in line2:
+ print_line(' op_addReg(MI, X86_REG_DX);')
+ elif '", %st(0)"' in line2 or '", st(0)"' in line2:
+ print_line(' op_addReg(MI, X86_REG_ST0);')
+ elif '", 1"' in line2:
+ print_line(' op_addImm(MI, 1);')
+ elif '", cl"' in line2:
+ print_line(' op_addReg(MI, X86_REG_CL);')
+ elif '"{1to2}, "' in line2:
+ print_line(' op_addAvxBroadcast(MI, X86_AVX_BCAST_2);')
+ elif '"{1to4}, "' in line2:
+ print_line(' op_addAvxBroadcast(MI, X86_AVX_BCAST_4);')
+ elif '"{1to8}, "' in line2:
+ print_line(' op_addAvxBroadcast(MI, X86_AVX_BCAST_8);')
+ elif '"{1to16}, "' in line2:
+ print_line(' op_addAvxBroadcast(MI, X86_AVX_BCAST_16);')
+ elif '{z}{sae}' in line2:
+ print_line(' op_addAvxSae(MI);')
+ print_line(' op_addAvxZeroOpmask(MI);')
+ elif ('{z}' in line2):
+ print_line(' op_addAvxZeroOpmask(MI);')
+ elif '{sae}' in line2:
+ print_line(' op_addAvxSae(MI);')
+ elif 'llvm_unreachable("Invalid command number.");' in line:
+ line2 = line.replace('llvm_unreachable("Invalid command number.");', '// unreachable')
+ print_line(line2)
+ elif ('assert(' in line) or ('assert (' in line):
+ pass
+ elif 'Invalid alt name index' in line:
+ pass
+ elif '::' in line and 'case ' in line:
+ #print_line(line2)
+ print_line(line)
+ elif 'MI->getNumOperands()' in line:
+ line2 = line.replace('MI->getNumOperands()', 'MCInst_getNumOperands(MI)')
+ print_line(line2)
+ elif 'const MCOperand &MCOp' in line:
+ line2 = line.replace('const MCOperand &MCOp', 'MCOperand *MCOp')
+ print_line(line2)
+ elif 'MI->getOperand(0).isImm()' in line:
+ line2 = line.replace('MI->getOperand(0).isImm()', 'MCOperand_isImm(MCInst_getOperand(MI, 0))')
+ print_line(line2)
+ elif 'MI->getOperand(1).isImm()' in line:
+ line2 = line.replace('MI->getOperand(1).isImm()', 'MCOperand_isImm(MCInst_getOperand(MI, 1))')
+ print_line(line2)
+ elif 'MI->getOperand(2).isImm()' in line:
+ line2 = line.replace('MI->getOperand(2).isImm()', 'MCOperand_isImm(MCInst_getOperand(MI, 2))')
+ print_line(line2)
+ elif 'MI->getOperand(3).isImm()' in line:
+ line2 = line.replace('MI->getOperand(3).isImm()', 'MCOperand_isImm(MCInst_getOperand(MI, 3))')
+ print_line(line2)
+ elif 'MI->getOperand(4).isImm()' in line:
+ line2 = line.replace('MI->getOperand(4).isImm()', 'MCOperand_isImm(MCInst_getOperand(MI, 4))')
+ print_line(line2)
+ elif 'MI->getOperand(5).isImm()' in line:
+ line2 = line.replace('MI->getOperand(5).isImm()', 'MCOperand_isImm(MCInst_getOperand(MI, 5))')
+ print_line(line2)
+ elif 'MI->getOperand(6).isImm()' in line:
+ line2 = line.replace('MI->getOperand(6).isImm()', 'MCOperand_isImm(MCInst_getOperand(MI, 6))')
+ print_line(line2)
+ elif 'MI->getOperand(7).isImm()' in line:
+ line2 = line.replace('MI->getOperand(7).isImm()', 'MCOperand_isImm(MCInst_getOperand(MI, 7))')
+ print_line(line2)
+ elif 'MI->getOperand(8).isImm()' in line:
+ line2 = line.replace('MI->getOperand(8).isImm()', 'MCOperand_isImm(MCInst_getOperand(MI, 8))')
+ print_line(line2)
+ elif 'MI->getOperand(0).getImm()' in line:
+ line2 = line.replace('MI->getOperand(0).getImm()', 'MCOperand_getImm(MCInst_getOperand(MI, 0))')
+ print_line(line2)
+ elif 'MI->getOperand(1).getImm()' in line:
+ line2 = line.replace('MI->getOperand(1).getImm()', 'MCOperand_getImm(MCInst_getOperand(MI, 1))')
+ print_line(line2)
+ elif 'MI->getOperand(2).getImm()' in line:
+ line2 = line.replace('MI->getOperand(2).getImm()', 'MCOperand_getImm(MCInst_getOperand(MI, 2))')
+ print_line(line2)
+ elif 'MI->getOperand(3).getImm()' in line:
+ line2 = line.replace('MI->getOperand(3).getImm()', 'MCOperand_getImm(MCInst_getOperand(MI, 3))')
+ print_line(line2)
+ elif 'MI->getOperand(4).getImm()' in line:
+ line2 = line.replace('MI->getOperand(4).getImm()', 'MCOperand_getImm(MCInst_getOperand(MI, 4))')
+ print_line(line2)
+ elif 'MI->getOperand(5).getImm()' in line:
+ line2 = line.replace('MI->getOperand(5).getImm()', 'MCOperand_getImm(MCInst_getOperand(MI, 5))')
+ print_line(line2)
+ elif 'MI->getOperand(6).getImm()' in line:
+ line2 = line.replace('MI->getOperand(6).getImm()', 'MCOperand_getImm(MCInst_getOperand(MI, 6))')
+ print_line(line2)
+ elif 'MI->getOperand(7).getImm()' in line:
+ line2 = line.replace('MI->getOperand(7).getImm()', 'MCOperand_getImm(MCInst_getOperand(MI, 7))')
+ print_line(line2)
+ elif 'MI->getOperand(8).getImm()' in line:
+ line2 = line.replace('MI->getOperand(8).getImm()', 'MCOperand_getImm(MCInst_getOperand(MI, 8))')
+ print_line(line2)
+ elif 'MRI.getRegClass(' in line:
+ classid = extract_paren(line, 'getRegClass(')
+ operand = extract_paren(line, 'getOperand')
+ line2 = line.replace('MI->getNumOperands()', 'MCInst_getNumOperands(MI)')
+ line2 = ' GETREGCLASS_CONTAIN(%s, %s)' %(classid, operand)
+ if line.endswith('())) {'):
+ line2 += ') {'
+ elif line.endswith(' {'):
+ line2 += ' {'
+ elif line.endswith(' &&'):
+ line2 += ' &&'
+ print_line(line2)
+ elif 'MI->getOperand(' in line and 'isReg' in line:
+ operand = extract_paren(line, 'getOperand')
+ line2 = ' MCOperand_isReg(MCInst_getOperand(MI, %s))' %(operand)
+ # MI->getOperand(1).isReg() &&
+ if line.endswith(' {'):
+ line2 += ' {'
+ elif line.endswith(' &&'):
+ line2 += ' &&'
+ print_line(line2)
+ elif 'MI->getOperand(' in line and 'getReg' in line:
+ line2 = replace_getReg(line)
+ # one more time
+ line2 = replace_getReg(line2)
+ print_line(line2)
+ elif ' return false;' in line and in_printAliasInstr:
+ print_line(' return NULL;')
+ elif 'MCOp.isImm()' in line:
+ line2 = line.replace('MCOp.isImm()', 'MCOperand_isImm(MCOp)')
+ print_line(line2)
+ elif 'MCOp.getImm()' in line:
+ line2 = line.replace('MCOp.getImm()', 'MCOperand_getImm(MCOp)')
+ if 'int64_t Val =' in line:
+ line2 = line2.replace('int64_t Val =', 'Val =')
+ print_line(line2)
+ elif 'isSVEMaskOfIdenticalElements<' in line:
+ if 'int8' in line:
+ line2 = line.replace('isSVEMaskOfIdenticalElements', 'isSVEMaskOfIdenticalElements8')
+ line2 = line2.replace('<int8_t>', '')
+ elif 'int16' in line:
+ line2 = line.replace('isSVEMaskOfIdenticalElements', 'isSVEMaskOfIdenticalElements16')
+ line2 = line2.replace('<int16_t>', '')
+ elif 'int32' in line:
+ line2 = line.replace('isSVEMaskOfIdenticalElements', 'isSVEMaskOfIdenticalElements32')
+ line2 = line2.replace('<int32_t>', '')
+ else:
+ line2 = line.replace('isSVEMaskOfIdenticalElements', 'isSVEMaskOfIdenticalElements64')
+ line2 = line2.replace('<int64_t>', '')
+ print_line(line2)
+ elif 'switch (PredicateIndex) {' in line:
+ print_line(' int64_t Val;')
+ print_line(line)
+ elif 'unsigned I = 0;' in line and in_printAliasInstr:
+ print_line("""
+ tmpString = cs_strdup(AsmString);
+
+ while (AsmString[I] != ' ' && AsmString[I] != '\\t' &&
+ AsmString[I] != '$' && AsmString[I] != '\\0')
+ ++I;
+
+ tmpString[I] = 0;
+ SStream_concat0(OS, tmpString);
+
+ if (AsmString[I] != '\\0') {
+ if (AsmString[I] == ' ' || AsmString[I] == '\\t') {
+ SStream_concat0(OS, " ");
+ ++I;
+ }
+
+ do {
+ if (AsmString[I] == '$') {
+ ++I;
+ if (AsmString[I] == (char)0xff) {
+ ++I;
+ OpIdx = AsmString[I++] - 1;
+ PrintMethodIdx = AsmString[I++] - 1;
+ printCustomAliasOperand(MI, OpIdx, PrintMethodIdx, OS);
+ } else
+ printOperand(MI, (unsigned)(AsmString[I++]) - 1, OS);
+ } else {
+ SStream_concat1(OS, AsmString[I++]);
+ }
+ } while (AsmString[I] != '\\0');
+ }
+
+ return tmpString;
+}
+ """)
+ in_printAliasInstr = False
+ # skip next few lines
+ skip_printing = True
+ elif '::printCustomAliasOperand' in line:
+ # print again
+ skip_printing = False
+ print_line('static void printCustomAliasOperand(')
+ elif 'const MCSubtargetInfo &STI' in line:
+ pass
+ elif 'const MCInst *MI' in line:
+ line2 = line.replace('const MCInst *MI', 'MCInst *MI')
+ print_line(line2)
+ elif 'llvm_unreachable("' in line:
+ if 'default: ' in line:
+ print_line(' default:')
+ elif 'llvm_unreachable("Unknown MCOperandPredicate kind")' in line:
+ print_line(' return false; // never reach')
+ else:
+ pass
+ elif 'raw_ostream &' in line:
+ line2 = line.replace('raw_ostream &', 'SStream *')
+ if line2.endswith(' {'):
+ line2 = line2.replace(' {', '\n{')
+ print_line(line2)
+ elif 'printPredicateOperand(' in line and 'STI, ' in line:
+ line2 = line.replace('STI, ', '')
+ print_line(line2)
+ elif '// Fragment ' in line:
+ # // Fragment 0 encoded into 6 bits for 51 unique commands.
+ tmp = line.strip().split(' ')
+ fragment_no = tmp[2]
+ print_line(line)
+ elif ('switch ((' in line or 'if ((' in line) and 'Bits' in line:
+ # switch ((Bits >> 14) & 63) {
+ bits = line.strip()
+ bits = bits.replace('switch ', '')
+ bits = bits.replace('if ', '')
+ bits = bits.replace('{', '')
+ bits = bits.strip()
+ print_line(' // printf("Fragment %s: %%"PRIu64"\\n", %s);' %(fragment_no, bits))
+ print_line(line)
+ elif not skip_printing:
+ print_line(line)
+
+ if line == ' };':
+ if need_endif and not in_getRegisterName:
+ # endif only for AsmStrs when we are not inside getRegisterName()
+ print_line("#endif")
+ need_endif = False
+ elif 'return AsmStrs+RegAsmOffset[RegNo-1];' in line:
+ if in_getRegisterName:
+ # return NULL for register name on Diet mode
+ print_line("#else")
+ print_line(" return NULL;")
+ print_line("#endif")
+ print_line("}")
+ need_endif = False
+ in_getRegisterName = False
+ # skip 1 line
+ skip_line = 1
+ elif line == ' }':
+ # ARM64
+ if in_getRegisterName:
+ # return NULL for register name on Diet mode
+ print_line("#else")
+ print_line(" return NULL;")
+ print_line("#endif")
+ print_line("}")
+ need_endif = False
+ in_getRegisterName = False
+ # skip 1 line
+ skip_line = 1
+ elif 'default:' in line:
+ # ARM64
+ if in_getRegisterName:
+ # get the size of RegAsmOffsetvreg[]
+ print_line(" return (const char *)(sizeof(RegAsmOffsetvreg)/sizeof(RegAsmOffsetvreg[0]));")
+
+
+f1.close()
+f2.close()