/* * --------------------- OP DERIVED FUNCTION */ void CaPerfTranslator::trans_ibs_op(struct ibs_op_sample* trans_op, gtUInt32 selected_flag, CpuProfileProcess* pProc, gtUInt64 ldAddr, gtUInt32 funcSize, CpuProfileModule* pMod, gtUInt64 ip, gtUInt32 pid, gtUInt32 tid, gtUInt32 cpu, gtUInt32 os, gtUInt32 usr, gtUInt32 count, const FunctionSymbolInfo* pFuncInfo) { // In per-process mode, ignore this sample if it does not belong to the target pid if (! _isTargetPid(pid)) { return; } if ((selected_flag) == 0) { return; } CHECK_OP_SELECTED_FLAG(DE_IBS_OP_ALL) { /* All IBS op samples */ AGG_IBS_COUNT(DE_IBS_OP_ALL, count); } CHECK_OP_SELECTED_FLAG(DE_IBS_OP_TAG_TO_RETIRE) { /* Tally retire cycle counts for all sampled macro-ops * IBS tag to retire cycles */ if (IBS_OP_TAG_TO_RETIRE_CYCLES(trans_op)) AGG_IBS_COUNT(DE_IBS_OP_TAG_TO_RETIRE, IBS_OP_TAG_TO_RETIRE_CYCLES(trans_op)); } CHECK_OP_SELECTED_FLAG(DE_IBS_OP_COMP_TO_RETIRE) { /* IBS completion to retire cycles */ if (IBS_OP_COM_TO_RETIRE_CYCLES(trans_op)) AGG_IBS_COUNT(DE_IBS_OP_COMP_TO_RETIRE, IBS_OP_COM_TO_RETIRE_CYCLES(trans_op)); } CHECK_OP_SELECTED_FLAG(DE_IBS_BRANCH_RETIRED) { if (IBS_OP_BRANCH_RETIRED(trans_op)) /* IBS Branch retired op */ { AGG_IBS_COUNT(DE_IBS_BRANCH_RETIRED, count) ; } } CHECK_OP_SELECTED_FLAG(DE_IBS_BRANCH_MISP) { if (IBS_OP_BRANCH_RETIRED(trans_op) /* Test branch-specific event flags */ /* IBS mispredicted Branch op */ && IBS_OP_BRANCH_MISPREDICT(trans_op)) { AGG_IBS_COUNT(DE_IBS_BRANCH_MISP, count) ; } } CHECK_OP_SELECTED_FLAG(DE_IBS_BRANCH_TAKEN) { if (IBS_OP_BRANCH_RETIRED(trans_op) /* IBS taken Branch op */ && IBS_OP_BRANCH_TAKEN(trans_op)) { AGG_IBS_COUNT(DE_IBS_BRANCH_TAKEN, count); } } CHECK_OP_SELECTED_FLAG(DE_IBS_BRANCH_MISP_TAKEN) { if (IBS_OP_BRANCH_RETIRED(trans_op) /* IBS mispredicted taken branch op */ && IBS_OP_BRANCH_TAKEN(trans_op) && IBS_OP_BRANCH_MISPREDICT(trans_op)) { AGG_IBS_COUNT(DE_IBS_BRANCH_MISP_TAKEN, count); } } CHECK_OP_SELECTED_FLAG(DE_IBS_RETURN) { if (IBS_OP_BRANCH_RETIRED(trans_op) /* IBS return op */ && IBS_OP_RETURN(trans_op)) { AGG_IBS_COUNT(DE_IBS_RETURN, count); } } CHECK_OP_SELECTED_FLAG(DE_IBS_RETURN_MISP) { if (IBS_OP_BRANCH_RETIRED(trans_op) /* IBS mispredicted return op */ && IBS_OP_RETURN(trans_op) && IBS_OP_BRANCH_MISPREDICT(trans_op)) { AGG_IBS_COUNT(DE_IBS_RETURN_MISP, count); } } CHECK_OP_SELECTED_FLAG(DE_IBS_RESYNC) { /* Test for a resync macro-op */ if (IBS_OP_BRANCH_RESYNC(trans_op)) { AGG_IBS_COUNT(DE_IBS_RESYNC, count); } } }
/* * --------------------- OP DERIVED FUNCTION */ void trans_ibs_op (struct transient * trans, unsigned int selected_flag, unsigned int size) { struct ibs_op_sample * trans_op = ((struct ibs_sample*)(trans->ext))->op; unsigned int i, j, mask = 1; for (i = IBS_OP_BASE, j =0 ; i <= IBS_OP_END && j < size ; i++, mask = mask << 1) { if ((selected_flag & mask) == 0) continue; j++; switch (i) { case DE_IBS_OP_ALL: /* All IBS op samples */ AGG_IBS_EVENT(DE_IBS_OP_ALL); break; case DE_IBS_OP_TAG_TO_RETIRE: /* Tally retire cycle counts for all sampled macro-ops * IBS tag to retire cycles */ if (IBS_OP_TAG_TO_RETIRE_CYCLES(trans_op)) AGG_IBS_COUNT(DE_IBS_OP_TAG_TO_RETIRE, IBS_OP_TAG_TO_RETIRE_CYCLES(trans_op)); break; case DE_IBS_OP_COMP_TO_RETIRE: /* IBS completion to retire cycles */ if (IBS_OP_COM_TO_RETIRE_CYCLES(trans_op)) AGG_IBS_COUNT(DE_IBS_OP_COMP_TO_RETIRE, IBS_OP_COM_TO_RETIRE_CYCLES(trans_op)); break; case DE_IBS_BRANCH_RETIRED: if (IBS_OP_OP_BRANCH_RETIRED(trans_op)) /* IBS Branch retired op */ AGG_IBS_EVENT(DE_IBS_BRANCH_RETIRED) ; break; case DE_IBS_BRANCH_MISP: if (IBS_OP_OP_BRANCH_RETIRED(trans_op) /* Test branch-specific event flags */ /* IBS mispredicted Branch op */ && IBS_OP_OP_BRANCH_MISPREDICT(trans_op)) AGG_IBS_EVENT(DE_IBS_BRANCH_MISP) ; break; case DE_IBS_BRANCH_TAKEN: if (IBS_OP_OP_BRANCH_RETIRED(trans_op) /* IBS taken Branch op */ && IBS_OP_OP_BRANCH_TAKEN(trans_op)) AGG_IBS_EVENT(DE_IBS_BRANCH_TAKEN); break; case DE_IBS_BRANCH_MISP_TAKEN: if (IBS_OP_OP_BRANCH_RETIRED(trans_op) /* IBS mispredicted taken branch op */ && IBS_OP_OP_BRANCH_TAKEN(trans_op) && IBS_OP_OP_BRANCH_MISPREDICT(trans_op)) AGG_IBS_EVENT(DE_IBS_BRANCH_MISP_TAKEN); break; case DE_IBS_RETURN: if (IBS_OP_OP_BRANCH_RETIRED(trans_op) /* IBS return op */ && IBS_OP_OP_RETURN(trans_op)) AGG_IBS_EVENT(DE_IBS_RETURN); break; case DE_IBS_RETURN_MISP: if (IBS_OP_OP_BRANCH_RETIRED(trans_op) /* IBS mispredicted return op */ && IBS_OP_OP_RETURN(trans_op) && IBS_OP_OP_BRANCH_MISPREDICT(trans_op)) AGG_IBS_EVENT(DE_IBS_RETURN_MISP); break; case DE_IBS_RESYNC: /* Test for a resync macro-op */ if (IBS_OP_OP_BRANCH_RESYNC(trans_op)) AGG_IBS_EVENT(DE_IBS_RESYNC); break; default: break; } } }