Какие 32-битные глазки x86 выполняет GCC?
Я просматривал исходный код GCC, и я был озадачен тем, как извлечь их. Кто-нибудь может предоставить список или информацию о том, как извлечь эти глазки (оптимизация перезаписи сборки)?
Код GCC: https://github.com/gcc-mirror/gcc
Редактировать: Чтобы уточнить, "глазок" определен как шаблон поиска и замены с некоторыми связанными побочными условиями для перезаписи, чтобы быть действительным (часто только некоторая информация о живучести регистра / флагов).
2 ответа
Посмотри в различных *.md
файлы и поиск define_peephole
,
Например: gcc/config/i386/i386.md
содержит (среди многих других):
;; For HI, SI and DI modes, or $-1,reg is smaller than mov $-1,reg.
(define_peephole2
[(set (match_operand:SWI248 0 "register_operand")
(const_int -1))]
"(optimize_insn_for_size_p () || TARGET_MOVE_M1_VIA_OR)
&& GENERAL_REGNO_P (REGNO (operands[0]))
&& peep2_regno_dead_p (0, FLAGS_REG)"
[(parallel [(set (match_dup 0) (const_int -1))
(clobber (reg:CC FLAGS_REG))])]
{
if (<MODE_SIZE> < GET_MODE_SIZE (SImode))
operands[0] = gen_lowpart (SImode, operands[0]);
})
Соответствующая документация содержится в Руководстве по внутренним компонентам GCC.
https://gcc.gnu.org/onlinedocs/gccint/Peephole-Definitions.html
Это действительно не по теме, так как здесь слишком широк.
Вы можете заглянуть на мою страницу документации MELT; у него есть несколько полезных ссылок (в частности, ресурсный центр GCC в Индии), и большинство слайдов, которые я написал, содержат справочные и учебные материалы...
Большинство оптимизаций GCC происходит в промежуточных слоях (нейтральных по отношению к целевому и исходному), а не во внутреннем.
И оптимизация глазка не значит много (точно) в наши дни, и большая часть возможностей оптимизации GCC не проистекает из этого.