(так что, подозреваю, с самой первой версии компилятора, в которой появилась поддержка целевой архитектуры x86_64).
Если подумать, то это ведь часть ABI. Если, например, функция принимает аргумент типа double, то его надо передавать либо в регистре st(0), либо в регистре XMM0. Соответственно, есть какой-то вариант, принятый для данной целевой архитектуры по умолчанию (для i686 это st(0) а для x86_64 это XMM0), а если пользователь начинает задавать какие-то нестандартные флаги компиляции для данной единицы трансляции, например играться с -mfpmath, то компилятору нужно вставить инструкцию выгрузки аргумента в другой регистр при вызове функции из другого модуля, или по указателю. Во-первых, это лишняя трата времени выполнения. Во-вторых, такие вещи нельзя легко изменить в новой версии компилятора, их закладывают раз и навсегда, как часть ABI, при добавлении в компилятор поддержки новой целевой архитектуры.
no subject
Date: 2022-07-27 22:17 (UTC)см. "-mfpmath=unit", ‘sse’: For the x86-64 compiler, these extensions are enabled by default.
(так что, подозреваю, с самой первой версии компилятора, в которой появилась поддержка целевой архитектуры x86_64).
Если подумать, то это ведь часть ABI. Если, например, функция принимает аргумент типа double, то его надо передавать либо в регистре st(0), либо в регистре XMM0. Соответственно, есть какой-то вариант, принятый для данной целевой архитектуры по умолчанию (для i686 это st(0) а для x86_64 это XMM0), а если пользователь начинает задавать какие-то нестандартные флаги компиляции для данной единицы трансляции, например играться с -mfpmath, то компилятору нужно вставить инструкцию выгрузки аргумента в другой регистр при вызове функции из другого модуля, или по указателю. Во-первых, это лишняя трата времени выполнения. Во-вторых, такие вещи нельзя легко изменить в новой версии компилятора, их закладывают раз и навсегда, как часть ABI, при добавлении в компилятор поддержки новой целевой архитектуры.