示例#1
0
/*
 * --------------------- 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;
        }
    }
}