gcc编译器选项可保持循环结构

时间:2018-11-29 11:31:12

标签: gcc

编译以下代码:

for ( i = 0; i < cnt; )
   {
    x1 = 2.0 * x - 1.;
    if ( x1 <  1.0 )
     {
     b[i] = exp( x1 ) * cos( x1 );
      i = i + 3;
      x = x*2.;
     }
    else  // if ( x1 >= 1. )
     {
     a[i] = sqrt( x1 ) * log( 1 / x1 );
      i = i + 2;
      x = x/2.;
     }
   }

生成“ gcc -O2 -S”

    jmp    .L6
.L19:
    movapd    %xmm3, %xmm0
    movsd    %xmm3, 24(%rsp)
    addl    $3, %ebx
    call    __exp_finite
    movsd    24(%rsp), %xmm3
    movsd    %xmm0, 16(%rsp)
    movapd    %xmm3, %xmm0
    call    cos
    mulsd    16(%rsp), %xmm0
    cmpl    %ebx, %r12d
    movsd    8(%rsp), %xmm2
    movapd    %xmm2, %xmm1
    movsd    %xmm0, (%r14,%rbp,8)
    jbe    .L18
.L6:
    movapd    %xmm1, %xmm2
    movsd    .LC1(%rip), %xmm4
    movl    %ebx, %ebp
    addsd    %xmm1, %xmm2
    comisd    %xmm2, %xmm4
    movapd    %xmm2, %xmm3
    movsd    %xmm2, 8(%rsp)
    subsd    .LC0(%rip), %xmm3
    ja    .L19
    movsd    .LC0(%rip), %xmm0
    sqrtsd    %xmm3, %xmm6
    movsd    %xmm1, 16(%rsp)
    addl    $2, %ebx
    divsd    %xmm3, %xmm0
    movsd    %xmm6, 8(%rsp)
    call    __log_finite
    mulsd    8(%rsp), %xmm0
    cmpl    %ebx, %r12d
    movsd    16(%rsp), %xmm1
    mulsd    .LC2(%rip), %xmm1
    movsd    %xmm0, 0(%r13,%rbp,8)
    ja    .L6
.L18:

生成的汇编代码似乎很复杂,循环中有两个出口:      杰贝·L18 和     ja .L6

如何强制编译器(指定哪些编译选项)生成与输入C代码中的“类似于”的汇编循环:

一个入口,一个出口。

0 个答案:

没有答案