📄 hdefs.c
字号:
i->Xin.SseLdSt.isLoad = isLoad; i->Xin.SseLdSt.reg = reg; i->Xin.SseLdSt.addr = addr; return i;}X86Instr* X86Instr_SseLdzLO ( Int sz, HReg reg, X86AMode* addr ){ X86Instr* i = LibVEX_Alloc(sizeof(X86Instr)); i->tag = Xin_SseLdzLO; i->Xin.SseLdzLO.sz = toUChar(sz); i->Xin.SseLdzLO.reg = reg; i->Xin.SseLdzLO.addr = addr; vassert(sz == 4 || sz == 8); return i;}X86Instr* X86Instr_Sse32Fx4 ( X86SseOp op, HReg src, HReg dst ) { X86Instr* i = LibVEX_Alloc(sizeof(X86Instr)); i->tag = Xin_Sse32Fx4; i->Xin.Sse32Fx4.op = op; i->Xin.Sse32Fx4.src = src; i->Xin.Sse32Fx4.dst = dst; vassert(op != Xsse_MOV); return i;}X86Instr* X86Instr_Sse32FLo ( X86SseOp op, HReg src, HReg dst ) { X86Instr* i = LibVEX_Alloc(sizeof(X86Instr)); i->tag = Xin_Sse32FLo; i->Xin.Sse32FLo.op = op; i->Xin.Sse32FLo.src = src; i->Xin.Sse32FLo.dst = dst; vassert(op != Xsse_MOV); return i;}X86Instr* X86Instr_Sse64Fx2 ( X86SseOp op, HReg src, HReg dst ) { X86Instr* i = LibVEX_Alloc(sizeof(X86Instr)); i->tag = Xin_Sse64Fx2; i->Xin.Sse64Fx2.op = op; i->Xin.Sse64Fx2.src = src; i->Xin.Sse64Fx2.dst = dst; vassert(op != Xsse_MOV); return i;}X86Instr* X86Instr_Sse64FLo ( X86SseOp op, HReg src, HReg dst ) { X86Instr* i = LibVEX_Alloc(sizeof(X86Instr)); i->tag = Xin_Sse64FLo; i->Xin.Sse64FLo.op = op; i->Xin.Sse64FLo.src = src; i->Xin.Sse64FLo.dst = dst; vassert(op != Xsse_MOV); return i;}X86Instr* X86Instr_SseReRg ( X86SseOp op, HReg re, HReg rg ) { X86Instr* i = LibVEX_Alloc(sizeof(X86Instr)); i->tag = Xin_SseReRg; i->Xin.SseReRg.op = op; i->Xin.SseReRg.src = re; i->Xin.SseReRg.dst = rg; return i;}X86Instr* X86Instr_SseCMov ( X86CondCode cond, HReg src, HReg dst ) { X86Instr* i = LibVEX_Alloc(sizeof(X86Instr)); i->tag = Xin_SseCMov; i->Xin.SseCMov.cond = cond; i->Xin.SseCMov.src = src; i->Xin.SseCMov.dst = dst; vassert(cond != Xcc_ALWAYS); return i;}X86Instr* X86Instr_SseShuf ( Int order, HReg src, HReg dst ) { X86Instr* i = LibVEX_Alloc(sizeof(X86Instr)); i->tag = Xin_SseShuf; i->Xin.SseShuf.order = order; i->Xin.SseShuf.src = src; i->Xin.SseShuf.dst = dst; vassert(order >= 0 && order <= 0xFF); return i;}void ppX86Instr ( X86Instr* i, Bool mode64 ) { vassert(mode64 == False); switch (i->tag) { case Xin_Alu32R: vex_printf("%sl ", showX86AluOp(i->Xin.Alu32R.op)); ppX86RMI(i->Xin.Alu32R.src); vex_printf(","); ppHRegX86(i->Xin.Alu32R.dst); return; case Xin_Alu32M: vex_printf("%sl ", showX86AluOp(i->Xin.Alu32M.op)); ppX86RI(i->Xin.Alu32M.src); vex_printf(","); ppX86AMode(i->Xin.Alu32M.dst); return; case Xin_Sh32: vex_printf("%sl ", showX86ShiftOp(i->Xin.Sh32.op)); if (i->Xin.Sh32.src == 0) vex_printf("%%cl,"); else vex_printf("$%d,", (Int)i->Xin.Sh32.src); ppHRegX86(i->Xin.Sh32.dst); return; case Xin_Test32: vex_printf("testl $%d,", (Int)i->Xin.Test32.imm32); ppHRegX86(i->Xin.Test32.dst); return; case Xin_Unary32: vex_printf("%sl ", showX86UnaryOp(i->Xin.Unary32.op)); ppHRegX86(i->Xin.Unary32.dst); return; case Xin_MulL: vex_printf("%cmull ", i->Xin.MulL.syned ? 's' : 'u'); ppX86RM(i->Xin.MulL.src); return; case Xin_Div: vex_printf("%cdivl ", i->Xin.Div.syned ? 's' : 'u'); ppX86RM(i->Xin.Div.src); return; case Xin_Sh3232: vex_printf("%sdl ", showX86ShiftOp(i->Xin.Sh3232.op)); if (i->Xin.Sh3232.amt == 0) vex_printf(" %%cl,"); else vex_printf(" $%d,", (Int)i->Xin.Sh3232.amt); ppHRegX86(i->Xin.Sh3232.src); vex_printf(","); ppHRegX86(i->Xin.Sh3232.dst); return; case Xin_Push: vex_printf("pushl "); ppX86RMI(i->Xin.Push.src); return; case Xin_Call: vex_printf("call%s[%d] ", i->Xin.Call.cond==Xcc_ALWAYS ? "" : showX86CondCode(i->Xin.Call.cond), i->Xin.Call.regparms); vex_printf("0x%x", i->Xin.Call.target); break; case Xin_Goto: if (i->Xin.Goto.cond != Xcc_ALWAYS) { vex_printf("if (%%eflags.%s) { ", showX86CondCode(i->Xin.Goto.cond)); } if (i->Xin.Goto.jk != Ijk_Boring && i->Xin.Goto.jk != Ijk_Call && i->Xin.Goto.jk != Ijk_Ret) { vex_printf("movl $"); ppIRJumpKind(i->Xin.Goto.jk); vex_printf(",%%ebp ; "); } vex_printf("movl "); ppX86RI(i->Xin.Goto.dst); vex_printf(",%%eax ; movl $dispatcher_addr,%%edx ; jmp *%%edx"); if (i->Xin.Goto.cond != Xcc_ALWAYS) { vex_printf(" }"); } return; case Xin_CMov32: vex_printf("cmov%s ", showX86CondCode(i->Xin.CMov32.cond)); ppX86RM(i->Xin.CMov32.src); vex_printf(","); ppHRegX86(i->Xin.CMov32.dst); return; case Xin_LoadEX: vex_printf("mov%c%cl ", i->Xin.LoadEX.syned ? 's' : 'z', i->Xin.LoadEX.szSmall==1 ? 'b' : 'w'); ppX86AMode(i->Xin.LoadEX.src); vex_printf(","); ppHRegX86(i->Xin.LoadEX.dst); return; case Xin_Store: vex_printf("mov%c ", i->Xin.Store.sz==1 ? 'b' : 'w'); ppHRegX86(i->Xin.Store.src); vex_printf(","); ppX86AMode(i->Xin.Store.dst); return; case Xin_Set32: vex_printf("setl%s ", showX86CondCode(i->Xin.Set32.cond)); ppHRegX86(i->Xin.Set32.dst); return; case Xin_Bsfr32: vex_printf("bs%cl ", i->Xin.Bsfr32.isFwds ? 'f' : 'r'); ppHRegX86(i->Xin.Bsfr32.src); vex_printf(","); ppHRegX86(i->Xin.Bsfr32.dst); return; case Xin_MFence: vex_printf("mfence(%s)", LibVEX_ppVexHwCaps(VexArchX86,i->Xin.MFence.hwcaps)); return; case Xin_FpUnary: vex_printf("g%sD ", showX86FpOp(i->Xin.FpUnary.op)); ppHRegX86(i->Xin.FpUnary.src); vex_printf(","); ppHRegX86(i->Xin.FpUnary.dst); break; case Xin_FpBinary: vex_printf("g%sD ", showX86FpOp(i->Xin.FpBinary.op)); ppHRegX86(i->Xin.FpBinary.srcL); vex_printf(","); ppHRegX86(i->Xin.FpBinary.srcR); vex_printf(","); ppHRegX86(i->Xin.FpBinary.dst); break; case Xin_FpLdSt: if (i->Xin.FpLdSt.isLoad) { vex_printf("gld%c " , i->Xin.FpLdSt.sz==8 ? 'D' : 'F'); ppX86AMode(i->Xin.FpLdSt.addr); vex_printf(", "); ppHRegX86(i->Xin.FpLdSt.reg); } else { vex_printf("gst%c " , i->Xin.FpLdSt.sz==8 ? 'D' : 'F'); ppHRegX86(i->Xin.FpLdSt.reg); vex_printf(", "); ppX86AMode(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"); ppX86AMode(i->Xin.FpLdStI.addr); vex_printf(", "); ppHRegX86(i->Xin.FpLdStI.reg); } else { vex_printf("gist%s ", i->Xin.FpLdStI.sz==8 ? "ll" : i->Xin.FpLdStI.sz==4 ? "l" : "w"); ppHRegX86(i->Xin.FpLdStI.reg); vex_printf(", "); ppX86AMode(i->Xin.FpLdStI.addr); } return; case Xin_Fp64to32: vex_printf("gdtof "); ppHRegX86(i->Xin.Fp64to32.src); vex_printf(","); ppHRegX86(i->Xin.Fp64to32.dst); return; case Xin_FpCMov: vex_printf("gcmov%s ", showX86CondCode(i->Xin.FpCMov.cond)); ppHRegX86(i->Xin.FpCMov.src); vex_printf(","); ppHRegX86(i->Xin.FpCMov.dst); return; case Xin_FpLdCW: vex_printf("fldcw "); ppX86AMode(i->Xin.FpLdCW.addr); return; case Xin_FpStSW_AX: vex_printf("fstsw %%ax"); return; case Xin_FpCmp: vex_printf("gcmp "); ppHRegX86(i->Xin.FpCmp.srcL); vex_printf(","); ppHRegX86(i->Xin.FpCmp.srcR); vex_printf(","); ppHRegX86(i->Xin.FpCmp.dst); break; case Xin_SseConst: vex_printf("const $0x%04x,", (Int)i->Xin.SseConst.con); ppHRegX86(i->Xin.SseConst.dst); break; case Xin_SseLdSt: vex_printf("movups "); if (i->Xin.SseLdSt.isLoad) { ppX86AMode(i->Xin.SseLdSt.addr); vex_printf(","); ppHRegX86(i->Xin.SseLdSt.reg); } else { ppHRegX86(i->Xin.SseLdSt.reg); vex_printf(","); ppX86AMode(i->Xin.SseLdSt.addr); } return; case Xin_SseLdzLO: vex_printf("movs%s ", i->Xin.SseLdzLO.sz==4 ? "s" : "d"); ppX86AMode(i->Xin.SseLdzLO.addr); vex_printf(","); ppHRegX86(i->Xin.SseLdzLO.reg); return; case Xin_Sse32Fx4: vex_printf("%sps ", showX86SseOp(i->Xin.Sse32Fx4.op)); ppHRegX86(i->Xin.Sse32Fx4.src); vex_printf(","); ppHRegX86(i->Xin.Sse32Fx4.dst); return; case Xin_Sse32FLo: vex_printf("%sss ", showX86SseOp(i->Xin.Sse32FLo.op)); ppHRegX86(i->Xin.Sse32FLo.src); vex_printf(","); ppHRegX86(i->Xin.Sse32FLo.dst); return; case Xin_Sse64Fx2: vex_printf("%spd ", showX86SseOp(i->Xin.Sse64Fx2.op)); ppHRegX86(i->Xin.Sse64Fx2.src); vex_printf(","); ppHRegX86(i->Xin.Sse64Fx2.dst); return; case Xin_Sse64FLo: vex_printf("%ssd ", showX86SseOp(i->Xin.Sse64FLo.op)); ppHRegX86(i->Xin.Sse64FLo.src); vex_printf(","); ppHRegX86(i->Xin.Sse64FLo.dst); return; case Xin_SseReRg: vex_printf("%s ", showX86SseOp(i->Xin.SseReRg.op)); ppHRegX86(i->Xin.SseReRg.src); vex_printf(","); ppHRegX86(i->Xin.SseReRg.dst); return; case Xin_SseCMov: vex_printf("cmov%s ", showX86CondCode(i->Xin.SseCMov.cond)); ppHRegX86(i->Xin.SseCMov.src); vex_printf(","); ppHRegX86(i->Xin.SseCMov.dst); return; case Xin_SseShuf: vex_printf("pshufd $0x%x,", i->Xin.SseShuf.order); ppHRegX86(i->Xin.SseShuf.src); vex_printf(","); ppHRegX86(i->Xin.SseShuf.dst); return; default: vpanic("ppX86Instr"); }}/* --------- Helpers for register allocation. --------- */void getRegUsage_X86Instr (HRegUsage* u, X86Instr* i, Bool mode64){ Bool unary; vassert(mode64 == False); initHRegUsage(u); switch (i->tag) { case Xin_Alu32R: addRegUsage_X86RMI(u, i->Xin.Alu32R.src); if (i->Xin.Alu32R.op == Xalu_MOV) { addHRegUse(u, HRmWrite, i->Xin.Alu32R.dst); return; } if (i->Xin.Alu32R.op == Xalu_CMP) { addHRegUse(u, HRmRead, i->Xin.Alu32R.dst); return; } addHRegUse(u, HRmModify, i->Xin.Alu32R.dst); return; case Xin_Alu32M: addRegUsage_X86RI(u, i->Xin.Alu32M.src); addRegUsage_X86AMode(u, i->Xin.Alu32M.dst); return; case Xin_Sh32: addHRegUse(u, HRmModify, i->Xin.Sh32.dst); if (i->Xin.Sh32.src == 0) addHRegUse(u, HRmRead, hregX86_ECX()); return; case Xin_Test32: addHRegUse(u, HRmRead, i->Xin.Test32.dst); return; case Xin_Unary32: addHRegUse(u, HRmModify, i->Xin.Unary32.dst); return; case Xin_MulL: addRegUsage_X86RM(u, i->Xin.MulL.src, HRmRead); addHRegUse(u, HRmModify, hregX86_EAX()); addHRegUse(u, HRmWrite, hregX86_EDX()); return; case Xin_Div: addRegUsage_X86RM(u, i->Xin.Div.src, HRmRead); addHRegUse(u, HRmModify, hregX86_EAX()); addHRegUse(u, HRmModify, hregX86_EDX()); 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, hregX86_ECX()); return; case Xin_Push: addRegUsage_X86RMI(u, i->Xin.Push.src); addHRegUse(u, HRmModify, hregX86_ESP()); return; case Xin_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 %eax,%ecx,%edx. */ addHRegUse(u, HRmWrite, hregX86_EAX()); addHRegUse(u, HRmWrite, hregX86_ECX()); addHRegUse(u, HRmWrite, hregX86_EDX()); /* Now we have to state any parameter-carrying registers which might be read. This depends on the regparmness. */ switch (i->Xin.Call.regparms) { case 3: addHRegUse(u, HRmRead, hregX86_ECX()); /*fallthru*/ case 2: addHRegUse(u, HRmRead, hregX86_EDX()); /*fallthru*/ case 1: addHRegUse(u, HRmRead, hregX86_EAX()); break; case 0: break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -