VC++ не хочет передавать вещественные параметры через FPU :-(

Тема в разделе "WASM.RESEARCH", создана пользователем Quantum, 8 янв 2005.

  1. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Допустим, есть функция с таким прототипом:
    Код (Text):
    1. float f1(double x){ /* тут произвольный код */ }


    Вижуал вызывает эту функцию примерно так:
    Код (Text):
    1. <font color="800000]fstp</font><!--color--> [esp+XXX]
    2. call _f1


    Сама функция f1, чтобы загрузить параметр X в FPU делает так:
    Код (Text):
    1. <font color="800000]fld</font><!--color--> QWORD PTR [esp + 4]


    Как можно заметить, fstp и fld уместно было бы сократить, но как???



    Причём VC умеет делать сабж для некоторых функций CRT, если объявить директиву #pragma (intrinsic). Как заставить его сделать это для моей f1, т.е. передать вещественный(е) параметр(ы) прямо через FPU?



    Уже перепробовал все возможные соглашения (__fastcall,__stdcall и т.д.), смотрел исходники CRT, даже получил ошибку INTERNAL_COMPILER_ERROR :) Одна надежда на специалистов...
     
  2. andruha123

    andruha123 New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2004
    Сообщения:
    15
    Адрес:
    USA, CA
    пиши на ASMe..
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    andruha123

    Вопрос был про VC++
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Quantum

    Intel-овский компиллер пробовал?
     
  5. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    IMHO в данном случае компилятор не может использовать ST(0) для передачи параметра в ф-цию, т.к. ST(0) используется для возвращаемого значения (float).



    Если это MSVC 7+, то думаю может помочь "Whole Program Optimization"

    (оптимизация на этапе линковки). В этом случае возможна оптимизация с использованием нестандартных конвенций вызовов ф-ций.



    можно ещё inline-ить эту ф-цию.

    будет эффект как от #pragma(intrinsic) для стд. ф-ций
     
  6. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    andruha123

    В общем, Asterix уже уточнил.



    _DEN_

    Даже в сабже указано, что нужен именно VC.



    green



    У меня 6-ая студия.



    Вот тут как раз и происходит INTERNAL_COMPILER_ERROR



    Нет, intrinsic и inline принципиально отличаются. Я хотел эффект как в intrinsic, т.е. без копирования тела функции.



    Вопрос остаётся открытым, хотя проблема уже решена.
     
  7. andruha123

    andruha123 New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2004
    Сообщения:
    15
    Адрес:
    USA, CA
    а была ли проблема?
     
  8. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    andruha123

    "Дааааа, вопрос из бронхов" (C) Сборная Пятигорска
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Quantum



    А можно примерный код - может что нибудь удастся придумать для частного случая.

    INTERNAL_COMPILER_ERROR довольно частая ошибка :)))))



    Есть ещё "дубовая" альтернатива "Whole Program Optimization" (которая иногда может работать лучше) - все файлы включить в один, таким образом будет генерироваться один объектник, и линкеру не придётся ничего оптимизировать.
     
  10. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    S_T_A_S_

    Частный случай уже решён (пришлось все 4 вызова этой функции переписать на асм).



    Раньше меня VC так не подводил.
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Quantum



    А всё-таки я думаю, это проблема компилятора из 6й студии. Сам её не использовал, но глянул сорцы одной демы от Farbrausch - они тоже делают вот что:
    Код (Text):
    1.  
    2. global      _sin@8
    3. _sin@8:
    4.         fld             qword [esp+4]
    5.         fsin
    6.         ret             8


    А компилятор от .NET запросто эти fsin прямо в код помещает, если ему не указать /Op
     
  12. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Мне кажется, вопрос только в том, почему нет такой стандартной конвенции вызова (или MS specific модификаторов) предусматривающей передачу double-параметра ф-ции через ST(0).

    Компилятор должен сгенерировать код ф-ции в соответствии с конвенцией, независимо от контекста, в котором будет вызвана эта ф-ция - это может быть другой obj.



    Правда, странно, что компилятор не использует явное указание о недоступности ф-ции вне компилируемого модуля (static в С, анонимный namespace в C++) чтобы позволить себе вольность типа custom calling convention.

    Даже из 8-й студии.