Конференция "FreePascal" » Не Inline-ятся функции
 
  • cyborg © (14.06.05 12:13) [0]
    Версия компилятора 2.0 почему-то ни одна функция не инлайнится :(


    {$INLINE ON}
    Program Test1;

    Procedure EMMS; assembler; Inline;
    asm
     FEMMS;
    end;

    Function GetCPUTick : int64; assembler; inline;
    asm
     rdtsc;
    end;

    Function Num : int64; inline;
    begin
     Result:=1+2;
    end;

    VAR
     T : Int64;

    BEGIN
     T := GetCPUTick;
     T:=T+2;
     T := Num;
     EMMS;

     ReadLn;
    END.



    Получается обычный вызов функций:


    .globl    P$TEST1_EMMS
    P$TEST1_EMMS:
    # Temps allocated between esp+0 and esp+0
    # [6] FEMMS;
       femms
       ret

    .section .text
       .balign 4
       .balign 4
    # [12] end;
    .globl    P$TEST1_GETCPUTICK$$INT64
    P$TEST1_GETCPUTICK$$INT64:
    # Temps allocated between esp-8 and esp-8
       subl    $8,%esp
    # Var $result located at esp-8
    # [11] rdtsc;
       rdtsc
       addl    $8,%esp
       ret

    .section .text
       .balign 4
       .balign 4
    # [15] begin
    .globl    P$TEST1_NUM$$INT64
    P$TEST1_NUM$$INT64:
    # Temps allocated between ebp-4 and ebp+0
       pushl    %ebp
       movl    %esp,%ebp
       subl    $4,%esp
       movl    %ebx,-4(%ebp)
    # Var $result located in register
    # [16] Result:=1+2;
       movl    $3,%ecx
       movl    $0,%ebx
    # [17] end;
       movl    %ecx,%eax
       movl    %ebx,%edx
       movl    -4(%ebp),%ebx
       leave
       ret



    В чём дело, не поддерживается чтоли, игнорируется?
  • cyborg © (14.06.05 14:05) [1]
    Функция Num вроде инлайнится, в коде сразу значение стоит, а вот ассамблерные функции почему не инлайнятся?

    # [23] T := GetCPUTick;
       call    P$TEST1_GETCPUTICK$$INT64
       # Register %ecx released
       movl    %eax,%esi
       # Register %eax released
       movl    %edx,%ebx

  • Иван Шихалев © (15.06.05 20:22) [2]
    Num вообще оптимизатором съедается... А ассемблерные процедуры/функции пока не инлайнятся. Цитирую из fpc-devel:


    Assembler procedures/functions/operators can't be inlined.
    For the near future there are no plans to get it working.
    It is full of pitfalls. Also Delphi 2005 doesn'
    t allow
    inlining of assembler procedures.
    ------------
    Peter Vreman

  • thaddy (23.06.05 17:27) [3]
    But emms is a keyword in FP, so write simply - efficient!- pascal and everything should be OK. I have DSP Audio examples that make you laugh about the poor Delphi ;)
    You have to think about your algo's though! This is always far more important than optimizing to assembler.
  • cyborg © (24.06.05 06:47) [4]
    [3] thaddy   (23.06.05 17:27)
    Можно по русски повторить? :)
    На emms я всего лишь проверял как работают инлайны.
 
Конференция "FreePascal" » Не Inline-ятся функции
Есть новые Нет новых   [119319   +85][b:0][p:0.002]