| /* Capstone testing regression */ |
| /* By Do Minh Tuan <tuanit96@gmail.com>, 02-2019 */ |
| |
| |
| #include "factory.h" |
| |
| char *get_detail_tms320c64x(csh *handle, cs_mode mode, cs_insn *ins) |
| { |
| cs_tms320c64x *tms320c64x; |
| int i; |
| char *result; |
| |
| result = (char *)malloc(sizeof(char)); |
| result[0] = '\0'; |
| |
| if (ins->detail == NULL) |
| return result; |
| |
| tms320c64x = &(ins->detail->tms320c64x); |
| if (tms320c64x->op_count) |
| add_str(&result, " ; op_count: %u", tms320c64x->op_count); |
| |
| for (i = 0; i < tms320c64x->op_count; i++) { |
| cs_tms320c64x_op *op = &(tms320c64x->operands[i]); |
| switch((int)op->type) { |
| default: |
| break; |
| case TMS320C64X_OP_REG: |
| add_str(&result, " ; operands[%u].type: REG = %s", i, cs_reg_name(*handle, op->reg)); |
| break; |
| case TMS320C64X_OP_IMM: |
| add_str(&result, " ; operands[%u].type: IMM = 0x%x", i, op->imm); |
| break; |
| case TMS320C64X_OP_MEM: |
| add_str(&result, " ; operands[%u].type: MEM", i); |
| if (op->mem.base != TMS320C64X_REG_INVALID) |
| add_str(&result, " ; operands[%u].mem.base: REG = %s", i, cs_reg_name(*handle, op->mem.base)); |
| add_str(&result, " ; operands[%u].mem.disptype: ", i); |
| if (op->mem.disptype == TMS320C64X_MEM_DISP_INVALID) { |
| add_str(&result, "Invalid"); |
| add_str(&result, " ; operands[%u].mem.disp: %u", i, op->mem.disp); |
| } |
| if (op->mem.disptype == TMS320C64X_MEM_DISP_CONSTANT) { |
| add_str(&result, "Constant"); |
| add_str(&result, " ; operands[%u].mem.disp: %u", i, op->mem.disp); |
| } |
| if (op->mem.disptype == TMS320C64X_MEM_DISP_REGISTER) { |
| add_str(&result, "Register"); |
| add_str(&result, " ; operands[%u].mem.disp: %s", i, cs_reg_name(*handle, op->mem.disp)); |
| } |
| add_str(&result, " ; operands[%u].mem.unit: %u", i, op->mem.unit); |
| add_str(&result, " ; operands[%u].mem.direction: ", i); |
| if (op->mem.direction == TMS320C64X_MEM_DIR_INVALID) |
| add_str(&result, "Invalid"); |
| if (op->mem.direction == TMS320C64X_MEM_DIR_FW) |
| add_str(&result, "Forward"); |
| if (op->mem.direction == TMS320C64X_MEM_DIR_BW) |
| add_str(&result, "Backward"); |
| add_str(&result, " ; operands[%u].mem.modify: ", i); |
| if (op->mem.modify == TMS320C64X_MEM_MOD_INVALID) |
| add_str(&result, "Invalid"); |
| if (op->mem.modify == TMS320C64X_MEM_MOD_NO) |
| add_str(&result, "No"); |
| if (op->mem.modify == TMS320C64X_MEM_MOD_PRE) |
| add_str(&result, "Pre"); |
| if (op->mem.modify == TMS320C64X_MEM_MOD_POST) |
| add_str(&result, "Post"); |
| add_str(&result, " ; operands[%u].mem.scaled: %u", i, op->mem.scaled); |
| |
| break; |
| case TMS320C64X_OP_REGPAIR: |
| add_str(&result, " ; operands[%u].type: REGPAIR = %s:%s", i, cs_reg_name(*handle, op->reg + 1), cs_reg_name(*handle, op->reg)); |
| break; |
| } |
| } |
| |
| add_str(&result, " ; Functional unit: "); |
| switch(tms320c64x->funit.unit) { |
| case TMS320C64X_FUNIT_D: |
| add_str(&result, "D%u", tms320c64x->funit.side); |
| break; |
| case TMS320C64X_FUNIT_L: |
| add_str(&result, "L%u", tms320c64x->funit.side); |
| break; |
| case TMS320C64X_FUNIT_M: |
| add_str(&result, "M%u", tms320c64x->funit.side); |
| break; |
| case TMS320C64X_FUNIT_S: |
| add_str(&result, "S%u", tms320c64x->funit.side); |
| break; |
| case TMS320C64X_FUNIT_NO: |
| add_str(&result, "No Functional Unit"); |
| break; |
| default: |
| add_str(&result, "Unknown (Unit %u, Side %u)", tms320c64x->funit.unit, tms320c64x->funit.side); |
| break; |
| } |
| if (tms320c64x->funit.crosspath == 1) |
| add_str(&result, " ; Crosspath: 1"); |
| |
| if (tms320c64x->condition.reg != TMS320C64X_REG_INVALID) |
| add_str(&result, " ; Condition: [%c%s]", (tms320c64x->condition.zero == 1) ? '!' : ' ', cs_reg_name(*handle, tms320c64x->condition.reg)); |
| add_str(&result, " ; Parallel: %s", (tms320c64x->parallel == 1) ? "true" : "false"); |
| |
| return result; |
| } |
| |