⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hdefs.c

📁 The Valgrind distribution has multiple tools. The most popular is the memory checking tool (called M
💻 C
📖 第 1 页 / 共 5 页
字号:
   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 + -