опция компилятора gcc для сохранения структуры циклов - PullRequest
0 голосов
/ 29 ноября 2018

компилируя следующий код:

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:

Сгенерированный код сборки выглядит запутанным, два выхода из цикла:jbe .L18 и ja .L6

Как заставить компилятор (какие параметры компиляции указать) генерировать цикл сборки, который «похож» на цикл ввода кода C:

oneвход, один выход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...