📄 hdefs.c
字号:
i->Ain.LoadEX.syned ? 's' : 'z', i->Ain.LoadEX.szSmall==1 ? 'b' : (i->Ain.LoadEX.szSmall==2 ? 'w' : 'l')); ppAMD64AMode(i->Ain.LoadEX.src); vex_printf(","); ppHRegAMD64(i->Ain.LoadEX.dst); } return; case Ain_Store: vex_printf("mov%c ", i->Ain.Store.sz==1 ? 'b' : (i->Ain.Store.sz==2 ? 'w' : 'l')); ppHRegAMD64(i->Ain.Store.src); vex_printf(","); ppAMD64AMode(i->Ain.Store.dst); return; case Ain_Set64: vex_printf("setq%s ", showAMD64CondCode(i->Ain.Set64.cond)); ppHRegAMD64(i->Ain.Set64.dst); return; case Ain_Bsfr64: vex_printf("bs%cq ", i->Ain.Bsfr64.isFwds ? 'f' : 'r'); ppHRegAMD64(i->Ain.Bsfr64.src); vex_printf(","); ppHRegAMD64(i->Ain.Bsfr64.dst); return; case Ain_MFence: vex_printf("mfence" ); return; case Ain_A87Free: vex_printf("ffree %%st(7..%d)", 8 - i->Ain.A87Free.nregs ); break; case Ain_A87PushPop: vex_printf(i->Ain.A87PushPop.isPush ? "fldl " : "fstpl "); ppAMD64AMode(i->Ain.A87PushPop.addr); break; case Ain_A87FpOp: vex_printf("f%s", showA87FpOp(i->Ain.A87FpOp.op)); break; case Ain_A87LdCW: vex_printf("fldcw "); ppAMD64AMode(i->Ain.A87LdCW.addr); break; case Ain_A87StSW: vex_printf("fstsw "); ppAMD64AMode(i->Ain.A87StSW.addr); break;//.. case Xin_FpUnary://.. vex_printf("g%sD ", showAMD64FpOp(i->Xin.FpUnary.op));//.. ppHRegAMD64(i->Xin.FpUnary.src);//.. vex_printf(",");//.. ppHRegAMD64(i->Xin.FpUnary.dst);//.. break;//.. case Xin_FpBinary://.. vex_printf("g%sD ", showAMD64FpOp(i->Xin.FpBinary.op));//.. ppHRegAMD64(i->Xin.FpBinary.srcL);//.. vex_printf(",");//.. ppHRegAMD64(i->Xin.FpBinary.srcR);//.. vex_printf(",");//.. ppHRegAMD64(i->Xin.FpBinary.dst);//.. break;//.. case Xin_FpLdSt://.. if (i->Xin.FpLdSt.isLoad) {//.. vex_printf("gld%c " , i->Xin.FpLdSt.sz==8 ? 'D' : 'F');//.. ppAMD64AMode(i->Xin.FpLdSt.addr);//.. vex_printf(", ");//.. ppHRegAMD64(i->Xin.FpLdSt.reg);//.. } else {//.. vex_printf("gst%c " , i->Xin.FpLdSt.sz==8 ? 'D' : 'F');//.. ppHRegAMD64(i->Xin.FpLdSt.reg);//.. vex_printf(", ");//.. ppAMD64AMode(i->Xin.FpLdSt.addr);//.. }//.. return;//.. case Xin_FpLdStI://.. if (i->Xin.FpLdStI.isLoad) {//.. vex_printf("gild%s ", i->Xin.FpLdStI.sz==8 ? "ll" : //.. i->Xin.FpLdStI.sz==4 ? "l" : "w");//.. ppAMD64AMode(i->Xin.FpLdStI.addr);//.. vex_printf(", ");//.. ppHRegAMD64(i->Xin.FpLdStI.reg);//.. } else {//.. vex_printf("gist%s ", i->Xin.FpLdStI.sz==8 ? "ll" : //.. i->Xin.FpLdStI.sz==4 ? "l" : "w");//.. ppHRegAMD64(i->Xin.FpLdStI.reg);//.. vex_printf(", ");//.. ppAMD64AMode(i->Xin.FpLdStI.addr);//.. }//.. return;//.. case Xin_Fp64to32://.. vex_printf("gdtof ");//.. ppHRegAMD64(i->Xin.Fp64to32.src);//.. vex_printf(",");//.. ppHRegAMD64(i->Xin.Fp64to32.dst);//.. return;//.. case Xin_FpCMov://.. vex_printf("gcmov%s ", showAMD64CondCode(i->Xin.FpCMov.cond));//.. ppHRegAMD64(i->Xin.FpCMov.src);//.. vex_printf(",");//.. ppHRegAMD64(i->Xin.FpCMov.dst);//.. return;//.. case Xin_FpLdStCW://.. vex_printf(i->Xin.FpLdStCW.isLoad ? "fldcw " : "fstcw ");//.. ppAMD64AMode(i->Xin.FpLdStCW.addr);//.. return;//.. case Xin_FpStSW_AX://.. vex_printf("fstsw %%ax");//.. return; case Ain_LdMXCSR: vex_printf("ldmxcsr "); ppAMD64AMode(i->Ain.LdMXCSR.addr); break; case Ain_SseUComIS: vex_printf("ucomis%s ", i->Ain.SseUComIS.sz==4 ? "s" : "d"); ppHRegAMD64(i->Ain.SseUComIS.srcL); vex_printf(","); ppHRegAMD64(i->Ain.SseUComIS.srcR); vex_printf(" ; pushfq ; popq "); ppHRegAMD64(i->Ain.SseUComIS.dst); break; case Ain_SseSI2SF: vex_printf("cvtsi2s%s ", i->Ain.SseSI2SF.szD==4 ? "s" : "d"); (i->Ain.SseSI2SF.szS==4 ? ppHRegAMD64_lo32 : ppHRegAMD64) (i->Ain.SseSI2SF.src); vex_printf(","); ppHRegAMD64(i->Ain.SseSI2SF.dst); break; case Ain_SseSF2SI: vex_printf("cvts%s2si ", i->Ain.SseSF2SI.szS==4 ? "s" : "d"); ppHRegAMD64(i->Ain.SseSF2SI.src); vex_printf(","); (i->Ain.SseSF2SI.szD==4 ? ppHRegAMD64_lo32 : ppHRegAMD64) (i->Ain.SseSF2SI.dst); break; case Ain_SseSDSS: vex_printf(i->Ain.SseSDSS.from64 ? "cvtsd2ss " : "cvtss2sd "); ppHRegAMD64(i->Ain.SseSDSS.src); vex_printf(","); ppHRegAMD64(i->Ain.SseSDSS.dst); break;//.. case Xin_SseConst://.. vex_printf("const $0x%04x,", (Int)i->Xin.SseConst.con);//.. ppHRegAMD64(i->Xin.SseConst.dst);//.. break; case Ain_SseLdSt: switch (i->Ain.SseLdSt.sz) { case 4: vex_printf("movss "); break; case 8: vex_printf("movsd "); break; case 16: vex_printf("movups "); break; default: vassert(0); } if (i->Ain.SseLdSt.isLoad) { ppAMD64AMode(i->Ain.SseLdSt.addr); vex_printf(","); ppHRegAMD64(i->Ain.SseLdSt.reg); } else { ppHRegAMD64(i->Ain.SseLdSt.reg); vex_printf(","); ppAMD64AMode(i->Ain.SseLdSt.addr); } return; case Ain_SseLdzLO: vex_printf("movs%s ", i->Ain.SseLdzLO.sz==4 ? "s" : "d"); ppAMD64AMode(i->Ain.SseLdzLO.addr); vex_printf(","); ppHRegAMD64(i->Ain.SseLdzLO.reg); return; case Ain_Sse32Fx4: vex_printf("%sps ", showAMD64SseOp(i->Ain.Sse32Fx4.op)); ppHRegAMD64(i->Ain.Sse32Fx4.src); vex_printf(","); ppHRegAMD64(i->Ain.Sse32Fx4.dst); return; case Ain_Sse32FLo: vex_printf("%sss ", showAMD64SseOp(i->Ain.Sse32FLo.op)); ppHRegAMD64(i->Ain.Sse32FLo.src); vex_printf(","); ppHRegAMD64(i->Ain.Sse32FLo.dst); return; case Ain_Sse64Fx2: vex_printf("%spd ", showAMD64SseOp(i->Ain.Sse64Fx2.op)); ppHRegAMD64(i->Ain.Sse64Fx2.src); vex_printf(","); ppHRegAMD64(i->Ain.Sse64Fx2.dst); return; case Ain_Sse64FLo: vex_printf("%ssd ", showAMD64SseOp(i->Ain.Sse64FLo.op)); ppHRegAMD64(i->Ain.Sse64FLo.src); vex_printf(","); ppHRegAMD64(i->Ain.Sse64FLo.dst); return; case Ain_SseReRg: vex_printf("%s ", showAMD64SseOp(i->Ain.SseReRg.op)); ppHRegAMD64(i->Ain.SseReRg.src); vex_printf(","); ppHRegAMD64(i->Ain.SseReRg.dst); return; case Ain_SseCMov: vex_printf("cmov%s ", showAMD64CondCode(i->Ain.SseCMov.cond)); ppHRegAMD64(i->Ain.SseCMov.src); vex_printf(","); ppHRegAMD64(i->Ain.SseCMov.dst); return; case Ain_SseShuf: vex_printf("pshufd $0x%x,", i->Ain.SseShuf.order); ppHRegAMD64(i->Ain.SseShuf.src); vex_printf(","); ppHRegAMD64(i->Ain.SseShuf.dst); return; default: vpanic("ppAMD64Instr"); }}/* --------- Helpers for register allocation. --------- */void getRegUsage_AMD64Instr ( HRegUsage* u, AMD64Instr* i, Bool mode64 ){ Bool unary; vassert(mode64 == True); initHRegUsage(u); switch (i->tag) { case Ain_Imm64: addHRegUse(u, HRmWrite, i->Ain.Imm64.dst); return; case Ain_Alu64R: addRegUsage_AMD64RMI(u, i->Ain.Alu64R.src); if (i->Ain.Alu64R.op == Aalu_MOV) { addHRegUse(u, HRmWrite, i->Ain.Alu64R.dst); return; } if (i->Ain.Alu64R.op == Aalu_CMP) { addHRegUse(u, HRmRead, i->Ain.Alu64R.dst); return; } addHRegUse(u, HRmModify, i->Ain.Alu64R.dst); return; case Ain_Alu64M: addRegUsage_AMD64RI(u, i->Ain.Alu64M.src); addRegUsage_AMD64AMode(u, i->Ain.Alu64M.dst); return; case Ain_Sh64: addHRegUse(u, HRmModify, i->Ain.Sh64.dst); if (i->Ain.Sh64.src == 0) addHRegUse(u, HRmRead, hregAMD64_RCX()); return; case Ain_Test64: addHRegUse(u, HRmRead, i->Ain.Test64.dst); return; case Ain_Unary64: addHRegUse(u, HRmModify, i->Ain.Unary64.dst); return; case Ain_MulL: addRegUsage_AMD64RM(u, i->Ain.MulL.src, HRmRead); addHRegUse(u, HRmModify, hregAMD64_RAX()); addHRegUse(u, HRmWrite, hregAMD64_RDX()); return; case Ain_Div: addRegUsage_AMD64RM(u, i->Ain.Div.src, HRmRead); addHRegUse(u, HRmModify, hregAMD64_RAX()); addHRegUse(u, HRmModify, hregAMD64_RDX()); return;//.. case Xin_Sh3232://.. addHRegUse(u, HRmRead, i->Xin.Sh3232.src);//.. addHRegUse(u, HRmModify, i->Xin.Sh3232.dst);//.. if (i->Xin.Sh3232.amt == 0)//.. addHRegUse(u, HRmRead, hregAMD64_ECX());//.. return; case Ain_Push: addRegUsage_AMD64RMI(u, i->Ain.Push.src); addHRegUse(u, HRmModify, hregAMD64_RSP()); return; case Ain_Call: /* This is a bit subtle. */ /* First off, claim it trashes all the caller-saved regs which fall within the register allocator's jurisdiction. These I believe to be: rax rcx rdx rsi rdi r8 r9 r10 r11 and all the xmm registers. */ addHRegUse(u, HRmWrite, hregAMD64_RAX()); addHRegUse(u, HRmWrite, hregAMD64_RCX()); addHRegUse(u, HRmWrite, hregAMD64_RDX()); addHRegUse(u, HRmWrite, hregAMD64_RSI()); addHRegUse(u, HRmWrite, hregAMD64_RDI()); addHRegUse(u, HRmWrite, hregAMD64_R8()); addHRegUse(u, HRmWrite, hregAMD64_R9()); addHRegUse(u, HRmWrite, hregAMD64_R10()); addHRegUse(u, HRmWrite, hregAMD64_R11()); addHRegUse(u, HRmWrite, hregAMD64_XMM0()); addHRegUse(u, HRmWrite, hregAMD64_XMM1()); addHRegUse(u, HRmWrite, hregAMD64_XMM2()); addHRegUse(u, HRmWrite, hregAMD64_XMM3()); addHRegUse(u, HRmWrite, hregAMD64_XMM4()); addHRegUse(u, HRmWrite, hregAMD64_XMM5()); addHRegUse(u, HRmWrite, hregAMD64_XMM6()); addHRegUse(u, HRmWrite, hregAMD64_XMM7()); addHRegUse(u, HRmWrite, hregAMD64_XMM8()); addHRegUse(u, HRmWrite, hregAMD64_XMM9()); addHRegUse(u, HRmWrite, hregAMD64_XMM10()); addHRegUse(u, HRmWrite, hregAMD64_XMM11()); addHRegUse(u, HRmWrite, hregAMD64_XMM12()); addHRegUse(u, HRmWrite, hregAMD64_XMM13()); addHRegUse(u, HRmWrite, hregAMD64_XMM14()); addHRegUse(u, HRmWrite, hregAMD64_XMM15()); /* Now we have to state any parameter-carrying registers which might be read. This depends on the regparmness. */ switch (i->Ain.Call.regparms) { case 6: addHRegUse(u, HRmRead, hregAMD64_R9()); /*fallthru*/ case 5: addHRegUse(u, HRmRead, hregAMD64_R8()); /*fallthru*/ case 4: addHRegUse(u, HRmRead, hregAMD64_RCX()); /*fallthru*/ case 3: addHRegUse(u, HRmRead, hregAMD64_RDX()); /*fallthru*/ case 2: addHRegUse(u, HRmRead, hregAMD64_RSI()); /*fallthru*/ case 1: addHRegUse(u, HRmRead, hregAMD64_RDI()); break; case 0: break; default: vpanic("getRegUsage_AMD64Instr:Call:regparms"); } /* Finally, there is the issue that the insn trashes a register because the literal target address has to be loaded into a register. Fortunately, r11 is stated in the ABI as a scratch register, and so seems a suitable victim. */ addHRegUse(u, HRmWrite, hregAMD64_R11()); /* Upshot of this is that the assembler really must use r11, and no other, as a destination temporary. */ return; case Ain_Goto: addRegUsage_AMD64RI(u, i->Ain.Goto.dst); addHRegUse(u, HRmWrite, hregAMD64_RAX()); /* used for next guest addr */ addHRegUse(u, HRmWrite, hregAMD64_RDX()); /* used for dispatcher addr */ if (i->Ain.Goto.jk != Ijk_Boring && i->Ain.Goto.jk != Ijk_Call && i->Ain.Goto.jk != Ijk_Ret) /* note, this is irrelevant since rbp is not actually available to the allocator. But still .. */ addHRegUse(u, HRmWrite, hregAMD64_RBP()); return; case Ain_CMov64: addRegUsage_AMD64RM(u, i->Ain.CMov64.src, HRmRead); addHRegUse(u, HRmModify, i->Ain.CMov64.dst); return; case Ain_MovZLQ: addHRegUse(u, HRmRead, i->Ain.MovZLQ.src); addHRegUse(u, HRmWrite, i->Ain.MovZLQ.dst); return; case Ain_LoadEX: addRegUsage_AMD64AMode(u, i->Ain.LoadEX.src); addHRegUse(u, HRmWrite, i->Ain.LoadEX.dst); return; case Ain_Store: addHRegUse(u, HRmRead, i->Ain.Store.src); addRegUsage_AMD64AMode(u, i->Ain.Store.dst); return; case Ain_Set64: addHRegUse(u, HRmWrite, i->Ain.Set64.dst); return; case Ain_Bsfr64: addHRegUse(u, HRmRead, i->Ain.Bsfr64.src); addHRegUse(u, HRmWrite, i->Ain.Bsfr64.dst); return; case Ain_MFence: return; case Ain_A87Free: return; case Ain_A87PushPop: addRegUsage_AMD64AMode(u, i->Ain.A87PushPop.addr); return; case Ain_A87FpOp: return; case Ain_A87LdCW: addRegUsage_AMD64AMode(u, i->Ain.A87LdCW.addr); return; case Ain_A87StSW: addRegUsage_AMD64AMode(u, i->Ain.A87StSW.addr); return;//.. case Xin_FpUnary://.. addHRegUse(u, HRmRead, i->Xin.FpUnary.src);//.. addHRegUse(u, HRmWrite, i->Xin.FpUnary.dst);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -