📄 ghelpers.c
字号:
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 + -