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

📄 hdefs.c

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