查看gcc计划(计划)如何按滴答级别指示

时间:2011-06-07 15:16:02

标签: gcc code-generation

我记得,使用gcc for Pentium可以查看高级转储编译过程,其中gcc显示了它如何计划(调度)U和V管道的汇编指令,还显示了多少滴答(CPU时钟)接受每条指令。

你能说,哪个版本的gcc可以显示这样的转储,以及启用此选项的选项是什么?

E.g。对于Core2,有core2.md定义了解码器和执行端口,每个指令都有延迟。我想看看,gcc如何使用它以及在指令调度中做了什么决定。

换句话说:例如程序:

int main() {
    int i; int j=0;
    for(i=0;i<1000000;i++)
        j+=i^((i+5)&(i>>2)&(i>>5) + (i>>2)&(i>>5))-(i+5);
    return j%250;
}

我怎样才能得到gcc如何为每次迭代计划滴答?

2 个答案:

答案 0 :(得分:2)

我不确定你的意思,但是-fsched-verbose=n(尝试使用n = 6)会转储一些看起来像你所追求的调度信息。

答案 1 :(得分:0)

.sched2转储(可通过-fsched-verbose=1-fdump-rtl-all-fdump-rtl-all-all获取)包含所需信息。例如。 for gcc 4.6.0 with -Ofast -march=native -mtune=native):

注意正确的部分:c2_decoder# - 是Core2计划的解码器; c2_p#是使用的端口数。

;;   ======================================================
;;   -- basic block 4 from 65 to 79 -- after reload
;;   ======================================================

;;        0-->    78 {sp=bp+0x4;bp=[bp];clobber [scratc:c2_decoder0,(c2_p2+(c2_p0|c2_p1)),c2_p0|c2_p1
;;        0-->    65 xmm0=xmm4                         :c2_decodern,c2_p0|c2_p1|c2_p5
;;        0-->    36 dx=0x10624dd3                     :c2_decodern,c2_p0|c2_p1|c2_p5
;;        1-->    31 xmm0=xmm0 0>>0x40                 :c2_decodern,c2_p1
;;        2-->    32 xmm4=xmm4+xmm0                    :c2_decodern,c2_p0|c2_p5
;;        3-->    67 xmm0=xmm4                         :c2_decodern,c2_p0|c2_p1|c2_p5
;;        4-->    33 xmm0=xmm0 0>>0x20                 :c2_decodern,c2_p1
;;        5-->    34 xmm4=xmm4+xmm0                    :c2_decodern,c2_p0|c2_p5
;;        6-->    72 cx=xmm4                           :c2_decodern,c2_p0|c2_p1|c2_p5
;;        7-->    69 ax=cx                             :c2_decodern,c2_p0|c2_p1|c2_p5
;;        8-->    37 {dx=trn(sxn(ax)*sxn(dx) 0>>0x20);c:c2_decodern,c2_p1
;;        8-->    70 ax=cx                             :c2_decodern,c2_p0|c2_p1|c2_p5
;;        9-->    39 {ax=ax>>0x1f;clobber flags;}      :c2_decodern,c2_p0|c2_p5
;;       11-->    38 {dx=dx>>0x4;clobber flags;}       :c2_decodern,c2_p0|c2_p5
;;       12-->    40 {dx=dx-ax;clobber flags;}         :c2_decodern,c2_p0|c2_p1|c2_p5
;;       13-->    41 {dx=dx*0xfa;clobber flags;}       :c2_decodern,c2_p1
;;       16-->    42 {cx=cx-dx;clobber flags;}         :c2_decodern,c2_p0|c2_p1|c2_p5
;;       17-->    47 ax=cx                             :c2_decodern,c2_p0|c2_p1|c2_p5
;;       17-->    50 use ax                            :nothing
;;       18-->    79 return                            :c2_decoder0
;;      Ready list (final):
;;   total time = 18