Автоматически LTORGing каждые 510 инструкций

avatar
Bailey Parker
8 апреля 2018 в 06:22
93
0
1

У меня есть навороченный участок кода, который значительно использует пул констант. Я знаю, что при этом я должен LTORG по крайней мере каждые 511 инструкций (относительная адресация ПК ограничена 4 КБ, инструкции имеют 4 байта, а адресация подписана, поэтому абсолютное расстояние меньше половины), чтобы обеспечить постоянные пулы достаточно близки к их использованию.

Я мог бы, конечно, следить за этим сам, но это вручную и немного мучительно (особенно при наличии макросов). Существуют ли какие-либо специальные функции gcc/gas (или трюки с макросами и т. д.), которые автоматически LTORG каждые 511 инструкций для меня? В идеале я хотел бы вставить:

b lxxx
    .ltorg
lxxx:

(Где lxxx — уникальная метка)

Бонусные баллы, если только LTORGс после 510 инструкций, следующих за последней инструкцией, в которой используется литерал выражения (который не находится в постоянном пуле). Например, если есть 1024 последовательных инструкции, в которых не используются литералы выражений, после них не следует помещать LTORG. Но если сразу после этого идет одна инструкция, использующая литерал выражения, то она будет LTORG через 510 инструкций (и после этого счетчик сбрасывается до тех пор, пока не будет достигнута следующая инструкция, использующая литерал выражения).

Бонусные бонусные очки, если указано выше, но не сбрасывает счетчик, если не используется постоянный пул (т.е. =1 не использует его, поэтому не сбрасывает счетчик, а <93666662294147> делает поэтому инструкция, использующая этот литерал выражения, запустит/продолжит обратный отсчет с 510).

edit: Сначала я подумал, что если бы вы обернули каждую инструкцию в макрос, который вычитает единицу из глобальной арифметической переменной (начиная с 510). Как только он достигает 0, LTORG опускается (неясно, сможете ли вы заставить ассемблер дать вам уникальную метку для ветвления вокруг LTORG). Вы можете получить «бонусные очки» с этим решением, заключив в оболочку для LDR специальный корпус, чтобы только он мог перезапустить счетчик, если он отрицательный. Если бы существовал способ проверки литералов выражений (чтобы узнать, нужен ли им пул констант), то вы могли бы в особом случае сбросить значение только при использовании пула констант.

edit: edit: Неясно, можете ли вы сделать то, что я предложил в общем, потому что label-expression могут быть разрешены во время компоновки (после того, как ассемблер запустит все макросы). Но меня все равно интересует решение, которое работает только для выражений (например, ldr r0, =12345678).

Источник

Ответы (0)