📄 sparc_disas.cpp
字号:
int i = 0;
int simm = 0;
PC_OP_TYPE insn;
int tmpAddr = 0;
int tmpAddr1 = 0;
// initialize local parameter
strcpy(bl2, " ");
strcpy(bb, " ");
op1 = (op >> 30) & 0x00000003; // op( 31 downto 30 )
op2 = (op >> 22) & 0x00000007; // op( 24 downto 22 )
op3 = (op >> 19) & 0x0000003f; // op( 24 downto 19 )
opf = (op >> 5) & 0x000001ff; // op( 13 downto 5 )
cond = (op >> 25) & 0x0000000f; // op( 28 downto 25 )
annul= (op >> 29) & 0x00000001; // op( 29 )
rs1 = (op >> 14) & 0x0000001f; // op( 18 downto 14 )
rs2 = (op >> 0) & 0x0000001f; // op( 4 downto 0 )
rd = (op >> 25) & 0x0000001f; // op( 29 downto 25 )
i = (op >> 13) & 0x00000001; // op( 13 )
simm = (op >> 0) & 0x00001fff; // op (12 downto 0 )
insn.op = op;
insn.pc = pc;
switch (op1)
{
case CALL:
tmpAddr = pc + (op << 2);
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "call");
strcat(dis_info, bl2);
tost(tmpAddr);
return dis_info;
case FMT2:
switch (op2)
{
case SETHI:
if (rd == 0)
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "nop");
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "sethi");
strcat(dis_info, bl2);
strcat(dis_info, "%hi(0x");
tost(op << 10);
strcat(dis_info, "), ");
ireg2st(rd);
}
return dis_info;
case BICC:
case FBFCC:
tmpAddr1 = 0;
tmpAddr1 = tmpAddr1 | ((op & 0x3fffff) << 2);
if ((tmpAddr1 >> 23) & 0x1)
{
tmpAddr1 = tmpAddr1 | 0xff000000;
}
else
{
tmpAddr1 = tmpAddr1 & 0x00ffffff;
}
tmpAddr1 = tmpAddr1 + pc;
if (op2 == BICC)
{
if ((op >> 29) & 0x1)
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "b");
branchop(insn);
strcat(dis_info, ",a");
strcat(dis_info, bl2);
tost(tmpAddr1);
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "b");
branchop(insn);
strcat(dis_info, bl2);
tost(tmpAddr1);
}
}
else
{
if ((op >> 29) & 0x1)
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "fb");
fbranchop(insn);
strcat(dis_info, ",a");
strcat(dis_info, bl2);
tost(tmpAddr1);
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "fb");
fbranchop(insn);
strcat(dis_info, bl2);
tost(tmpAddr1);
}
}
return dis_info;
default:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "unimp");
strcat(dis_info, bl2);
strcat(dis_info, "0");
return dis_info;
}
case FMT3:
switch (op3)
{
case IAND:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "and");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case IADD:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "add");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case IOR:
// if ((i == 0) && (rs1 == 0) && (rs2 == 0))
// {
// tostf(pc);
// strcat(dis_info, bb);
// strcat(dis_info, "clr");
// strcat(dis_info, bl2);
// ireg2st(rd);
// }
// else if ( ((i == 1) && (simm == 0)) || (rs1 == 0))
// {
// tostf(pc);
// strcat(dis_info, bb);
// strcat(dis_info, "mov");
// strcat(dis_info, bl2);
// regres(insn, HEX);
// }
// change postion to fix "clr" and "mov" priority
if ( (((i == 1) && (simm == 0)) || (rs1 == 0)) && ((insn.op & 0xffffff) != 0x00102000) )
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "mov");
strcat(dis_info, bl2);
regres(insn, HEX);
}
else if ((rs1 == 0) && (rs2 == 0))
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "clr");
strcat(dis_info, bl2);
ireg2st(rd);
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "or");
strcat(dis_info, bl2);
regres(insn, HEX);
}
return dis_info;
case IXOR:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "xor");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case ISUB:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "sub");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case ANDN:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "andn");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case ORN:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "orn");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case IXNOR:
if ((i == 0) && ( (rs1 == rd) || (rs2 == 0)))
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "not");
strcat(dis_info, bl2);
ireg2st(rd);
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "xnor");
strcat(dis_info, bl2);
ireg2st(rd);
}
return dis_info;
case ADDX:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "addx");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case SUBX:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "subx");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case ADDCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "addcc");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case ANDCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "andcc");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case ORCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "orcc");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case XORCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "xorcc");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case SUBCC:
tostf(pc);
strcat(dis_info, bb);
if (((insn.op >> 28) & 0x0f) == 0xa)
strcat(dis_info, "subcc");
else
strcat(dis_info, "cmp");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case ANDNCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "andncc");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case ORNCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "orncc");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case XNORCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "xnorcc");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case ADDXCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "addxcc");
strcat(dis_info, bl2);
regres(insn, HEX);
return dis_info;
case UMAC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "umac");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case SMAC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "smac");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case UMUL:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "umul");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case SMUL:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "smul");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case UMULCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "umulcc");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case SMULCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "smulcc");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case SUBXCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "subxcc");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case UDIV:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "udiv");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case SDIV:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "sdiv");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case UDIVCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "udivcc");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case SDIVCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "sdivcc");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case TADDCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "taddcc");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case TSUBCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "tsubcc");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case TADDCCTV:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "taddcctv");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case TSUBCCTV:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "tsubcctv");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case MULSCC:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "mulscc");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case ISLL:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "sll");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case ISRL:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "srl");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case ISRA:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "sra");
strcat(dis_info, bl2);
regres(insn, DEC);
return dis_info;
case RDY:
if (rs1 != 0)
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "rd");
strcat(dis_info, bl2);
strcat(dis_info, "%asr");
tostd(rs1);
strcat(dis_info, ", ");
ireg2st(rd);
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "rd");
strcat(dis_info, bl2);
strcat(dis_info, "%tbr, ");
ireg2st(rd);
}
return dis_info;
case RDPSR:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "rd");
strcat(dis_info, bl2);
strcat(dis_info, "%psr, ");
ireg2st(rd);
return dis_info;
case RDWIM:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "rd");
strcat(dis_info, bl2);
strcat(dis_info, "%win, ");
ireg2st(rd);
return dis_info;
case RDTBR:
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "rd");
strcat(dis_info, bl2);
strcat(dis_info, "%tbr, ");
ireg2st(rd);
return dis_info;
case WRY:
if ((rs1 == 0) || (rs2 == 0))
{
if (rd != 0)
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "mov");
strcat(dis_info, bl2);
regimm(insn, HEX, false);
strcat(dis_info, ", %asr");
tostd(rd);
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "mov");
strcat(dis_info, bl2);
regimm(insn, HEX, false);
strcat(dis_info, ", %y");
}
}
else
{
if (rd != 0)
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "wr ");
strcat(dis_info, bl2);
strcat(dis_info, "%asr");
regimm(insn, HEX, false);
strcat(dis_info, ", %asr");
tostd(rd);
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "wr ");
strcat(dis_info, bl2);
regimm(insn, HEX, false);
strcat(dis_info, ", %y");
}
}
return dis_info;
case WRPSR:
if ((rs1 == 0) || (rs2 == 0))
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "mov");
strcat(dis_info, bl2);
regimm(insn, HEX, false);
strcat(dis_info, ", %psr");
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "wr ");
strcat(dis_info, bl2);
regimm(insn, HEX, false);
strcat(dis_info, ", %psr");
}
return dis_info;
case WRWIM:
if ((rs1 == 0) || (rs2 == 0))
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "mov");
strcat(dis_info, bl2);
regimm(insn, HEX, false);
strcat(dis_info, ", %wim");
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "wr ");
strcat(dis_info, bl2);
regimm(insn, HEX, false);
strcat(dis_info, ", %wim");
}
return dis_info;
case WRTBR:
if ((rs1 == 0) || (rs2 == 0))
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "mov");
strcat(dis_info, bl2);
regimm(insn, HEX, false);
strcat(dis_info, ", %tbr");
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "mr ");
strcat(dis_info, bl2);
regimm(insn, HEX, false);
strcat(dis_info, ", %tbr");
}
return dis_info;
case JMPL:
if (rd == 0)
{
if ((i==1)&&(simm == 0x8))
{
if (rs1 == 0x1f)
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "ret");
}
else if (rs1 == 0x0f)
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "retl");
}
else
{
tostf(pc);
strcat(dis_info, bb);
strcat(dis_info, "jmp");
strcat(dis_info, bl2);
regimm(insn, DEC, true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -