непонятки с intrinsic-функциями в msvs2005

Тема в разделе "WASM.WIN32", создана пользователем Avoidik, 17 янв 2007.

  1. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Такой код инлайнится даже без __inline:
    int is9x(void){
    __asm{
    mov ax,cs
    xor al,al
    movzx eax,ax
    }
    }

    И ряд других более сложных функций (с использованием FPU) тоже инлайнятся.

    У меня Express с обновлениями - любой memset > 4 байт приводит к вызову CRT.
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Quantum
    Похоже, обнаружился очередной баг в компиляторе :-(

    Следующий код компилируется неправильно:
    Код (Text):
    1. /* 
    2.     Compiler switches:
    3.     /O2 /Ob1 /Oi /Ot /GF /FD /MD /GS- /fp:fast /GR- /FAs /Fa".\Release/" /Fo".\Release/" /Fd".\Release/" /W3 /c /Gz /TP
    4. */
    5. #pragma optimize("y", off)
    6. inline int Identity(int x){
    7.    __asm{
    8.         mov eax, [ebp+8]
    9.    }
    10. }
    11. #pragma optimize("", on)
    12.  
    13. int GetZero()
    14. {
    15.     return Identity(0);
    16. }
    Вот выдержка из asm-файла:
    Код (Text):
    1. _TEXT   SEGMENT
    2. _x$ = 8                         ; size = 4
    3. ?Identity@@YGHH@Z PROC                  ; Identity, COMDAT
    4.  
    5. ; 6    : inline int Identity(int x){
    6.  
    7.     push    ebp
    8.     mov ebp, esp
    9.  
    10. ; 7    :    __asm{
    11. ; 8    :        mov eax, [ebp+8]
    12.  
    13.     mov eax, DWORD PTR [ebp+8]
    14.  
    15. ; 9    :    }
    16. ; 10   : }
    17.  
    18.     pop ebp
    19.     ret 4
    20. ?Identity@@YGHH@Z ENDP                  ; Identity
    21. _TEXT   ENDS
    22.  
    23. _TEXT   SEGMENT
    24. ?GetZero@@YGHXZ PROC                    ; GetZero, COMDAT
    25.  
    26. ; 15   :    return Identity(0);
    27.  
    28.     mov eax, DWORD PTR [ebp+8]
    29.  
    30. ; 16   : }
    31.  
    32.     ret 0
    33. ?GetZero@@YGHXZ ENDP                    ; GetZero
    34. _TEXT   ENDS
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    green
    Почему неправильно? x не используется, а ebp+8 он вставил как есть.
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    IceStudent
    GetZero() должна возвратить 0, а возвращает "случайное" число по адресу ebp+8.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Напиши mov eax,[x], если хочешь обращение именно к параметру.
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    IceStudent
    Это просто иллюстрация некорректного инлайна. Я хотел показать, что инлайн ф-ции с асм-вставками требует продвинутого анализа этих вставок.
    Видимо, компилятор всё-таки анализирует код асм-вставок, т.к. в примере Quantum отказался инлайнить xalloca из-за "нетривиального" jmp, но заинлайнил простую is9x. А здесь просто не смог разобраться в ситуации.
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    green
    То, что он анализирует код ассемблерной вставки - это, конечно, факт, ведь он таким образом узнаёт какие регистры нужно сохранять в прологе. Тем не менее, в том конкретном примере xalloca дело не в jmp, т.к. я уже пробовал его убирать - не помогло. Вообще, jmp там нужен только потому, что код в конечном счёте не инлайнится.
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Quantum
    Странно... У меня xalloca без jmp инлайнится.
    Код (Text):
    1. __forceinline void* __fastcall xalloca(int x){
    2.     __asm{
    3.         add ecx,3
    4.         pop edx
    5.         and ecx,-4
    6.         sub esp,ecx
    7.         mov eax,esp
    8.     }
    9. }
    VS2005 Pro SP1. Версия файлов компилятора 14.00.50727.762.

    P.S. IMHO, асм-вставки лучше не использовать, легче будет на х64 портировать.