Допустим, есть функция с таким прототипом: Код (Text): float f1(double x){ /* тут произвольный код */ } Вижуал вызывает эту функцию примерно так: Код (Text): <font color="800000]fstp</font><!--color--> [esp+XXX] call _f1 Сама функция f1, чтобы загрузить параметр X в FPU делает так: Код (Text): <font color="800000]fld</font><!--color--> QWORD PTR [esp + 4] Как можно заметить, fstp и fld уместно было бы сократить, но как??? Причём VC умеет делать сабж для некоторых функций CRT, если объявить директиву #pragma (intrinsic). Как заставить его сделать это для моей f1, т.е. передать вещественный(е) параметр(ы) прямо через FPU? Уже перепробовал все возможные соглашения (__fastcall,__stdcall и т.д.), смотрел исходники CRT, даже получил ошибку INTERNAL_COMPILER_ERROR Одна надежда на специалистов...
IMHO в данном случае компилятор не может использовать ST(0) для передачи параметра в ф-цию, т.к. ST(0) используется для возвращаемого значения (float). Если это MSVC 7+, то думаю может помочь "Whole Program Optimization" (оптимизация на этапе линковки). В этом случае возможна оптимизация с использованием нестандартных конвенций вызовов ф-ций. можно ещё inline-ить эту ф-цию. будет эффект как от #pragma(intrinsic) для стд. ф-ций
andruha123 В общем, Asterix уже уточнил. _DEN_ Даже в сабже указано, что нужен именно VC. green У меня 6-ая студия. Вот тут как раз и происходит INTERNAL_COMPILER_ERROR Нет, intrinsic и inline принципиально отличаются. Я хотел эффект как в intrinsic, т.е. без копирования тела функции. Вопрос остаётся открытым, хотя проблема уже решена.
Quantum А можно примерный код - может что нибудь удастся придумать для частного случая. INTERNAL_COMPILER_ERROR довольно частая ошибка )))) Есть ещё "дубовая" альтернатива "Whole Program Optimization" (которая иногда может работать лучше) - все файлы включить в один, таким образом будет генерироваться один объектник, и линкеру не придётся ничего оптимизировать.
S_T_A_S_ Частный случай уже решён (пришлось все 4 вызова этой функции переписать на асм). Раньше меня VC так не подводил.
Quantum А всё-таки я думаю, это проблема компилятора из 6й студии. Сам её не использовал, но глянул сорцы одной демы от Farbrausch - они тоже делают вот что: Код (Text): global _sin@8 _sin@8: fld qword [esp+4] fsin ret 8 А компилятор от .NET запросто эти fsin прямо в код помещает, если ему не указать /Op
Мне кажется, вопрос только в том, почему нет такой стандартной конвенции вызова (или MS specific модификаторов) предусматривающей передачу double-параметра ф-ции через ST(0). Компилятор должен сгенерировать код ф-ции в соответствии с конвенцией, независимо от контекста, в котором будет вызвана эта ф-ция - это может быть другой obj. Правда, странно, что компилятор не использует явное указание о недоступности ф-ции вне компилируемого модуля (static в С, анонимный namespace в C++) чтобы позволить себе вольность типа custom calling convention. Даже из 8-й студии.