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

📄 ghelpers.c

📁 The Valgrind distribution has multiple tools. The most popular is the memory checking tool (called M
💻 C
📖 第 1 页 / 共 5 页
字号:
     return cf | pf | af | zf | sf | of;			\   }								\}/*-------------------------------------------------------------*/#define ACTIONS_SHR(DATA_BITS,DATA_UTYPE)			\{								\   PREAMBLE(DATA_BITS);  					\   { Long cf, pf, af, zf, sf, of;				\     cf = CC_DEP2 & 1;						\     pf = parity_table[(UChar)CC_DEP1];				\     af = 0; /* undefined */					\     zf = ((DATA_UTYPE)CC_DEP1 == 0) << 6;			\     sf = lshift(CC_DEP1, 8 - DATA_BITS) & 0x80;		\     /* of is defined if shift count == 1 */			\     of = lshift(CC_DEP2 ^ CC_DEP1, 12 - DATA_BITS)		\          & AMD64G_CC_MASK_O;					\     return cf | pf | af | zf | sf | of;			\   }								\}/*-------------------------------------------------------------*//* ROL: cf' = lsb(result).  of' = msb(result) ^ lsb(result). *//* DEP1 = result, NDEP = old flags */#define ACTIONS_ROL(DATA_BITS,DATA_UTYPE)			\{								\   PREAMBLE(DATA_BITS);						\   { Long fl 							\        = (CC_NDEP & ~(AMD64G_CC_MASK_O | AMD64G_CC_MASK_C))	\          | (AMD64G_CC_MASK_C & CC_DEP1)			\          | (AMD64G_CC_MASK_O & (lshift(CC_DEP1,  		\                                      11-(DATA_BITS-1)) 	\                     ^ lshift(CC_DEP1, 11)));			\     return fl;							\   }								\}/*-------------------------------------------------------------*//* ROR: cf' = msb(result).  of' = msb(result) ^ msb-1(result). *//* DEP1 = result, NDEP = old flags */#define ACTIONS_ROR(DATA_BITS,DATA_UTYPE)			\{								\   PREAMBLE(DATA_BITS);						\   { Long fl 							\        = (CC_NDEP & ~(AMD64G_CC_MASK_O | AMD64G_CC_MASK_C))	\          | (AMD64G_CC_MASK_C & (CC_DEP1 >> (DATA_BITS-1)))	\          | (AMD64G_CC_MASK_O & (lshift(CC_DEP1, 		\                                      11-(DATA_BITS-1)) 	\                     ^ lshift(CC_DEP1, 11-(DATA_BITS-1)+1)));	\     return fl;							\   }								\}/*-------------------------------------------------------------*/#define ACTIONS_UMUL(DATA_BITS, DATA_UTYPE,  NARROWtoU,         \                                DATA_U2TYPE, NARROWto2U)        \{                                                               \   PREAMBLE(DATA_BITS);                                         \   { Long cf, pf, af, zf, sf, of;                               \     DATA_UTYPE  hi;                                            \     DATA_UTYPE  lo                                             \        = NARROWtoU( ((DATA_UTYPE)CC_DEP1)                      \                     * ((DATA_UTYPE)CC_DEP2) );                 \     DATA_U2TYPE rr                                             \        = NARROWto2U(                                           \             ((DATA_U2TYPE)((DATA_UTYPE)CC_DEP1))               \             * ((DATA_U2TYPE)((DATA_UTYPE)CC_DEP2)) );          \     hi = NARROWtoU(rr >>/*u*/ DATA_BITS);                      \     cf = (hi != 0);                                            \     pf = parity_table[(UChar)lo];                              \     af = 0; /* undefined */                                    \     zf = (lo == 0) << 6;                                       \     sf = lshift(lo, 8 - DATA_BITS) & 0x80;                     \     of = cf << 11;                                             \     return cf | pf | af | zf | sf | of;                        \   }								\}/*-------------------------------------------------------------*/#define ACTIONS_SMUL(DATA_BITS, DATA_STYPE,  NARROWtoS,         \                                DATA_S2TYPE, NARROWto2S)        \{                                                               \   PREAMBLE(DATA_BITS);                                         \   { Long cf, pf, af, zf, sf, of;                               \     DATA_STYPE  hi;                                            \     DATA_STYPE  lo                                             \        = NARROWtoS( ((DATA_STYPE)CC_DEP1)                      \                     * ((DATA_STYPE)CC_DEP2) );                 \     DATA_S2TYPE rr                                             \        = NARROWto2S(                                           \             ((DATA_S2TYPE)((DATA_STYPE)CC_DEP1))               \             * ((DATA_S2TYPE)((DATA_STYPE)CC_DEP2)) );          \     hi = NARROWtoS(rr >>/*s*/ DATA_BITS);                      \     cf = (hi != (lo >>/*s*/ (DATA_BITS-1)));                   \     pf = parity_table[(UChar)lo];                              \     af = 0; /* undefined */                                    \     zf = (lo == 0) << 6;                                       \     sf = lshift(lo, 8 - DATA_BITS) & 0x80;                     \     of = cf << 11;                                             \     return cf | pf | af | zf | sf | of;                        \   }								\}/*-------------------------------------------------------------*/#define ACTIONS_UMULQ                                           \{                                                               \   PREAMBLE(64);                                                \   { Long cf, pf, af, zf, sf, of;                               \     ULong lo, hi;                                              \     mullU64( (ULong)CC_DEP1, (ULong)CC_DEP2, &hi, &lo );       \     cf = (hi != 0);                                            \     pf = parity_table[(UChar)lo];                              \     af = 0; /* undefined */                                    \     zf = (lo == 0) << 6;                                       \     sf = lshift(lo, 8 - 64) & 0x80;                            \     of = cf << 11;                                             \     return cf | pf | af | zf | sf | of;                        \   }								\}/*-------------------------------------------------------------*/#define ACTIONS_SMULQ                                           \{                                                               \   PREAMBLE(64);                                                \   { Long cf, pf, af, zf, sf, of;                               \     Long lo, hi;                                               \     mullS64( (Long)CC_DEP1, (Long)CC_DEP2, &hi, &lo );         \     cf = (hi != (lo >>/*s*/ (64-1)));                          \     pf = parity_table[(UChar)lo];                              \     af = 0; /* undefined */                                    \     zf = (lo == 0) << 6;                                       \     sf = lshift(lo, 8 - 64) & 0x80;                            \     of = cf << 11;                                             \     return cf | pf | af | zf | sf | of;                        \   }								\}#if PROFILE_RFLAGSstatic Bool initted     = False;/* C flag, fast route */static UInt tabc_fast[AMD64G_CC_OP_NUMBER];/* C flag, slow route */static UInt tabc_slow[AMD64G_CC_OP_NUMBER];/* table for calculate_cond */static UInt tab_cond[AMD64G_CC_OP_NUMBER][16];/* total entry counts for calc_all, calc_c, calc_cond. */static UInt n_calc_all  = 0;static UInt n_calc_c    = 0;static UInt n_calc_cond = 0;#define SHOW_COUNTS_NOW (0 == (0x3FFFFF & (n_calc_all+n_calc_c+n_calc_cond)))static void showCounts ( void ){   Int op, co;   Char ch;   vex_printf("\nTotal calls: calc_all=%u   calc_cond=%u   calc_c=%u\n",              n_calc_all, n_calc_cond, n_calc_c);   vex_printf("      cSLOW  cFAST    O   NO    B   NB    Z   NZ   BE  NBE"              "    S   NS    P   NP    L   NL   LE  NLE\n");   vex_printf("     -----------------------------------------------------"              "----------------------------------------\n");   for (op = 0; op < AMD64G_CC_OP_NUMBER; op++) {      ch = ' ';      if (op > 0 && (op-1) % 4 == 0)          ch = 'B';      if (op > 0 && (op-1) % 4 == 1)          ch = 'W';      if (op > 0 && (op-1) % 4 == 2)          ch = 'L';      if (op > 0 && (op-1) % 4 == 3)          ch = 'Q';      vex_printf("%2d%c: ", op, ch);      vex_printf("%6u ", tabc_slow[op]);      vex_printf("%6u ", tabc_fast[op]);      for (co = 0; co < 16; co++) {         Int n = tab_cond[op][co];         if (n >= 1000) {            vex_printf(" %3dK", n / 1000);         } else          if (n >= 0) {            vex_printf(" %3d ", n );         } else {            vex_printf("     ");         }      }      vex_printf("\n");   }   vex_printf("\n");}static void initCounts ( void ){   Int op, co;   initted = True;   for (op = 0; op < AMD64G_CC_OP_NUMBER; op++) {      tabc_fast[op] = tabc_slow[op] = 0;      for (co = 0; co < 16; co++)         tab_cond[op][co] = 0;   }}#endif /* PROFILE_RFLAGS *//* CALLED FROM GENERATED CODE: CLEAN HELPER *//* Calculate all the 6 flags from the supplied thunk parameters.   Worker function, not directly called from generated code. */staticULong amd64g_calculate_rflags_all_WRK ( ULong cc_op,                                         ULong cc_dep1_formal,                                         ULong cc_dep2_formal,                                        ULong cc_ndep_formal ){   switch (cc_op) {      case AMD64G_CC_OP_COPY:         return cc_dep1_formal                & (AMD64G_CC_MASK_O | AMD64G_CC_MASK_S | AMD64G_CC_MASK_Z                    | AMD64G_CC_MASK_A | AMD64G_CC_MASK_C | AMD64G_CC_MASK_P);      case AMD64G_CC_OP_ADDB:   ACTIONS_ADD( 8,  UChar  );      case AMD64G_CC_OP_ADDW:   ACTIONS_ADD( 16, UShort );      case AMD64G_CC_OP_ADDL:   ACTIONS_ADD( 32, UInt   );      case AMD64G_CC_OP_ADDQ:   ACTIONS_ADD( 64, ULong  );      case AMD64G_CC_OP_ADCB:   ACTIONS_ADC( 8,  UChar  );      case AMD64G_CC_OP_ADCW:   ACTIONS_ADC( 16, UShort );      case AMD64G_CC_OP_ADCL:   ACTIONS_ADC( 32, UInt   );      case AMD64G_CC_OP_ADCQ:   ACTIONS_ADC( 64, ULong  );      case AMD64G_CC_OP_SUBB:   ACTIONS_SUB(  8, UChar  );      case AMD64G_CC_OP_SUBW:   ACTIONS_SUB( 16, UShort );      case AMD64G_CC_OP_SUBL:   ACTIONS_SUB( 32, UInt   );      case AMD64G_CC_OP_SUBQ:   ACTIONS_SUB( 64, ULong  );      case AMD64G_CC_OP_SBBB:   ACTIONS_SBB(  8, UChar  );      case AMD64G_CC_OP_SBBW:   ACTIONS_SBB( 16, UShort );      case AMD64G_CC_OP_SBBL:   ACTIONS_SBB( 32, UInt   );      case AMD64G_CC_OP_SBBQ:   ACTIONS_SBB( 64, ULong  );      case AMD64G_CC_OP_LOGICB: ACTIONS_LOGIC(  8, UChar  );      case AMD64G_CC_OP_LOGICW: ACTIONS_LOGIC( 16, UShort );      case AMD64G_CC_OP_LOGICL: ACTIONS_LOGIC( 32, UInt   );      case AMD64G_CC_OP_LOGICQ: ACTIONS_LOGIC( 64, ULong  );      case AMD64G_CC_OP_INCB:   ACTIONS_INC(  8, UChar  );      case AMD64G_CC_OP_INCW:   ACTIONS_INC( 16, UShort );      case AMD64G_CC_OP_INCL:   ACTIONS_INC( 32, UInt   );      case AMD64G_CC_OP_INCQ:   ACTIONS_INC( 64, ULong  );      case AMD64G_CC_OP_DECB:   ACTIONS_DEC(  8, UChar  );      case AMD64G_CC_OP_DECW:   ACTIONS_DEC( 16, UShort );      case AMD64G_CC_OP_DECL:   ACTIONS_DEC( 32, UInt   );      case AMD64G_CC_OP_DECQ:   ACTIONS_DEC( 64, ULong  );      case AMD64G_CC_OP_SHLB:   ACTIONS_SHL(  8, UChar  );      case AMD64G_CC_OP_SHLW:   ACTIONS_SHL( 16, UShort );      case AMD64G_CC_OP_SHLL:   ACTIONS_SHL( 32, UInt   );      case AMD64G_CC_OP_SHLQ:   ACTIONS_SHL( 64, ULong  );      case AMD64G_CC_OP_SHRB:   ACTIONS_SHR(  8, UChar  );      case AMD64G_CC_OP_SHRW:   ACTIONS_SHR( 16, UShort );      case AMD64G_CC_OP_SHRL:   ACTIONS_SHR( 32, UInt   );      case AMD64G_CC_OP_SHRQ:   ACTIONS_SHR( 64, ULong  );      case AMD64G_CC_OP_ROLB:   ACTIONS_ROL(  8, UChar  );      case AMD64G_CC_OP_ROLW:   ACTIONS_ROL( 16, UShort );      case AMD64G_CC_OP_ROLL:   ACTIONS_ROL( 32, UInt   );      case AMD64G_CC_OP_ROLQ:   ACTIONS_ROL( 64, ULong  );      case AMD64G_CC_OP_RORB:   ACTIONS_ROR(  8, UChar  );      case AMD64G_CC_OP_RORW:   ACTIONS_ROR( 16, UShort );      case AMD64G_CC_OP_RORL:   ACTIONS_ROR( 32, UInt   );      case AMD64G_CC_OP_RORQ:   ACTIONS_ROR( 64, ULong  );      case AMD64G_CC_OP_UMULB:  ACTIONS_UMUL(  8, UChar,  toUChar,                                                  UShort, toUShort );      case AMD64G_CC_OP_UMULW:  ACTIONS_UMUL( 16, UShort, toUShort,                                                  UInt,   toUInt );      case AMD64G_CC_OP_UMULL:  ACTIONS_UMUL( 32, UInt,   toUInt,                                                  ULong,  idULong );      case AMD64G_CC_OP_UMULQ:  ACTIONS_UMULQ;      case AMD64G_CC_OP_SMULB:  ACTIONS_SMUL(  8, Char,   toUChar,                                                  Short,  toUShort );      case AMD64G_CC_OP_SMULW:  ACTIONS_SMUL( 16, Short,  toUShort,                                                   Int,    toUInt   );      case AMD64G_CC_OP_SMULL:  ACTIONS_SMUL( 32, Int,    toUInt,                                                  Long,   idULong );      case AMD64G_CC_OP_SMULQ:  ACTIONS_SMULQ;      default:         /* shouldn't really make these calls from generated code */         vex_printf("amd64g_calculate_rflags_all_WRK(AMD64)"                    "( %llu, 0x%llx, 0x%llx, 0x%llx )\n",                    cc_op, cc_dep1_formal, cc_dep2_formal, cc_ndep_formal );         vpanic("amd64g_calculate_rflags_all_WRK(AMD64)");   }}/* CALLED FROM GENERATED CODE: CLEAN HELPER *//* Calculate all the 6 flags from the supplied thunk parameters. */ULong amd64g_calculate_rflags_all ( ULong cc_op,                                     ULong cc_dep1,                                     ULong cc_dep2,                                    ULong cc_ndep ){#  if PROFILE_RFLAGS   if (!initted) initCounts();   n_calc_all++;   if (SHOW_COUNTS_NOW) showCounts();#  endif   return      amd64g_calculate_rflags_all_WRK ( cc_op, cc_dep1, cc_dep2, cc_ndep );}/* CALLED FROM GENERATED CODE: CLEAN HELPER *//* Calculate just the carry flag from the supplied thunk parameters. */ULong amd64g_calculate_rflags_c ( ULong cc_op,                                   ULong cc_dep1,                                   ULong cc_dep2,                                  ULong cc_ndep ){#  if PROFILE_RFLAGS   if (!initted) initCounts();   n_calc_c++;   tabc_fast[cc_op]++;   if (SHOW_COUNTS_NOW) showCounts();#  endif   /* Fast-case some common ones. */   switch (cc_op) {      case AMD64G_CC_OP_COPY:         return (cc_dep1 >> AMD64G_CC_SHIFT_C) & 1;      case AMD64G_CC_OP_LOGICQ:       case AMD64G_CC_OP_LOGICL:       case AMD64G_CC_OP_LOGICW:       case AMD64G_CC_OP_LOGICB:         return 0;	 //      case AMD64G_CC_OP_SUBL:	 //         return ((UInt)cc_dep1) < ((UInt)cc_dep2)	 //                   ? AMD64G_CC_MASK_C : 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -