Я пишу компилятор JIT с бэкэндом x86 и изучаю ассемблер x86 и машинный код, когда я иду. Я использовал ARM-ассемблер около 20 лет назад и удивлен различием моделей затрат между этими архитектурами.
В частности, обращения к памяти и ветки дороги в ARM, но эквивалентные операции стека и скачки дешевы на x86. Я считаю, что современные процессоры x86 делают гораздо более динамическую оптимизацию, чем ядра ARM, и мне трудно предвидеть их эффект.
Что такое хорошая модель затрат, которую нужно учитывать при написании ассемблера x86? Какие комбинации инструкций дешевы и дороги?
Например, мой компилятор будет проще, если он всегда генерирует длинную форму для загрузки целых чисел или перехода к смещениям, даже если целые числа были маленькими или смещения закрываются, но будет ли это влиять на производительность?
Я еще не делал плавающей запятой, но я хотел бы скоро перейти к ней. Есть ли что-то неявное в отношении взаимодействия нормального и плавающего кода?
Я знаю, что есть множество ссылок (например, Майкл Абраш) на оптимизацию x86, но у меня есть предчувствие, чем что-то большее, чем несколько лет, не будет применяться к современным процессорам x86, потому что они в последнее время сильно изменились. Правильно ли я?