QString QRegisterSet::output(QString pfx, TSIport p, uint8_t id) { QString str; QString hex; hex.sprintf("%04X",getregvalue(pfx, p, id)); str = getregname(pfx, p, id) + " = 0x" + hex; return str; }
static void print_arg (argument *a, bfd_vma memaddr, struct disassemble_info *info) { LONGLONG longdisp, mask; int sign_flag = 0; int relative = 0; bfd_vma number; int op_index = 0; char string[200]; PTR stream = info->stream; fprintf_ftype func = info->fprintf_func; switch (a->type) { case arg_copr: func (stream, "%s", getcopregname (a->cr, CRX_C_REGTYPE)); break; case arg_copsr: func (stream, "%s", getcopregname (a->cr, CRX_CS_REGTYPE)); break; case arg_r: if (IS_INSN_MNEMONIC ("mtpr") || IS_INSN_MNEMONIC ("mfpr")) func (stream, "%s", getprocregname (a->r)); else func (stream, "%s", getregname (a->r)); break; case arg_ic: if (IS_INSN_MNEMONIC ("excp")) func (stream, "%s", gettrapstring (a->constant)); else if (IS_INSN_MNEMONIC ("cinv")) func (stream, "%s", getcinvstring (a->constant)); else if (INST_HAS_REG_LIST) { REG_ARG_TYPE reg_arg_type = IS_INSN_TYPE (COP_REG_INS) ? COP_ARG : IS_INSN_TYPE (COPS_REG_INS) ? COPS_ARG : (instruction->flags & USER_REG) ? USER_REG_ARG : REG_ARG; if ((reg_arg_type == COP_ARG) || (reg_arg_type == COPS_ARG)) { /* Check for proper argument number. */ if (processing_argument_number == 2) { getregliststring (a->constant, string, reg_arg_type); func (stream, "%s", string); } else func (stream, "$0x%lx", a->constant); } else { getregliststring (a->constant, string, reg_arg_type); func (stream, "%s", string); } } else func (stream, "$0x%lx", a->constant); break; case arg_idxr: func (stream, "0x%lx(%s,%s,%d)", a->constant, getregname (a->r), getregname (a->i_r), powerof2 (a->scale)); break; case arg_rbase: func (stream, "(%s)", getregname (a->r)); break; case arg_cr: func (stream, "0x%lx(%s)", a->constant, getregname (a->r)); if (IS_INSN_TYPE (LD_STOR_INS_INC)) func (stream, "+"); break; case arg_c: /* Removed the *2 part as because implicit zeros are no more required. Have to fix this as this needs a bit of extension in terms of branchins. Have to add support for cmp and branch instructions. */ if (IS_INSN_TYPE (BRANCH_INS) || IS_INSN_MNEMONIC ("bal") || IS_INSN_TYPE (CMPBR_INS) || IS_INSN_TYPE (DCR_BRANCH_INS) || IS_INSN_TYPE (COP_BRANCH_INS)) { relative = 1; longdisp = a->constant; longdisp <<= 1; switch (a->size) { case 8: case 16: case 24: case 32: mask = ((LONGLONG)1 << a->size) - 1; if (longdisp & ((LONGLONG)1 << a->size)) { sign_flag = 1; longdisp = ~(longdisp) + 1; } a->constant = (unsigned long int) (longdisp & mask); break; default: func (stream, "Wrong offset used in branch/bal instruction"); break; } } /* For branch Neq instruction it is 2*offset + 2. */ else if (IS_INSN_TYPE (BRANCH_NEQ_INS)) a->constant = 2 * a->constant + 2; else if (IS_INSN_TYPE (LD_STOR_INS_INC) || IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (STOR_IMM_INS) || IS_INSN_TYPE (CSTBIT_INS)) { op_index = instruction->flags & REVERSE_MATCH ? 0 : 1; if (instruction->operands[op_index].op_type == abs16) a->constant |= 0xFFFF0000; } func (stream, "%s", "0x"); number = (relative ? memaddr : 0) + (sign_flag ? -a->constant : a->constant); (*info->print_address_func) (number, info); break; default: break; } }