sparc: fix relative branch target for Sparc64

This commit is contained in:
Nguyen Anh Quynh 2017-12-27 14:24:18 +08:00
parent 1790ccdb1e
commit cbdea7ce19
1 changed files with 6 additions and 16 deletions

View File

@ -164,7 +164,7 @@ static bool printSparcAliasInstr(MCInst *MI, SStream *O)
static void printOperand(MCInst *MI, int opNum, SStream *O)
{
int Imm;
int64_t Imm;
unsigned reg;
MCOperand *MO = MCInst_getOperand(MI, opNum);
@ -200,7 +200,7 @@ static void printOperand(MCInst *MI, int opNum, SStream *O)
switch (MI->Opcode) {
case SP_CALL:
// Imm = SignExtend32(Imm, 30);
Imm += (uint32_t)MI->address;
Imm += MI->address;
break;
// Branch on integer condition with prediction (BPcc)
@ -218,7 +218,7 @@ static void printOperand(MCInst *MI, int opNum, SStream *O)
case SP_BPFCCANT:
case SP_BPFCCNT:
Imm = SignExtend32(Imm, 19);
Imm = (uint32_t)MI->address + Imm * 4;
Imm = MI->address + Imm * 4;
break;
// Branch on integer condition (Bicc)
@ -229,7 +229,7 @@ static void printOperand(MCInst *MI, int opNum, SStream *O)
case SP_FBCOND:
case SP_FBCONDA:
Imm = SignExtend32(Imm, 22);
Imm = (uint32_t)MI->address + Imm * 4;
Imm = MI->address + Imm * 4;
break;
// Branch on integer register with prediction (BPr)
@ -258,21 +258,11 @@ static void printOperand(MCInst *MI, int opNum, SStream *O)
case SP_BPZnapn:
case SP_BPZnapt:
Imm = SignExtend32(Imm, 16);
Imm = (uint32_t)MI->address + Imm * 4;
Imm = MI->address + Imm * 4;
break;
}
if (Imm >= 0) {
if (Imm > HEX_THRESHOLD)
SStream_concat(O, "0x%x", Imm);
else
SStream_concat(O, "%u", Imm);
} else {
if (Imm < -HEX_THRESHOLD)
SStream_concat(O, "-0x%x", -Imm);
else
SStream_concat(O, "-%u", -Imm);
}
printInt64(O, Imm);
if (MI->csh->detail) {
if (MI->csh->doing_mem) {