Оптимизация используемых регистров при использовании встроенной сборки ARM в GCC

Я хочу написать некоторую встроенную сборку ARM в моем коде C. Для этого кода мне нужно использовать регистр или два больше, чем только те, которые объявлены как входы и выходы функции. Я знаю, как использовать список clobber, чтобы сообщить GCC, что я буду использовать несколько дополнительных регистров для выполнения своих вычислений.

Однако я уверен, что GCC может свободно выбирать, какие регистры и для чего используются при оптимизации. То есть я чувствую, что использовать фиксированный регистр для моих вычислений - плохая идея.

Как лучше всего использовать дополнительный регистр, который не является ни вводом, ни выводом моей встроенной сборки, без использования фиксированного регистра?

P.S. Я думал, что использование фиктивной выходной переменной может помочь, но я не уверен, какие еще странные эффекты будут иметь ...


person Madcowswe    schedule 04.01.2012    source источник
comment
Готов поспорить, что это возможно прямо, но я позволю гуру Си ответить на этот вопрос. :-)   -  person Noldorin    schedule 04.01.2012
comment
Я знаю, что вы можете использовать псевдонимы регистров и позволить компилятору выбирать, какие регистры он хочет использовать, но не могу запомнить синтаксис для этого. Или вы можете укусить пулю и просто написать файл .s и собрать его отдельно для большей гибкости.   -  person Michael Dorgan    schedule 04.01.2012
comment
@MichaelDorgan Спасибо за ваш вклад. Я знаю, что регистры ввода и вывода работают подобным образом, но я не видел, чтобы он использовался для временных регистров. Ваше второе решение делает обратное тому, что мне нужно, оно удаляет еще больше вариантов оптимизации (обозначение ввода и регистры вывода) ...   -  person Madcowswe    schedule 04.01.2012
comment
Если вы напишете свой собственный файл .s, вы сделаете свою оптимизацию. Вы контролируете нажатие и выталкивание, а также то, что и где используется, просто убедитесь, что вы следуете правилам ARM для сохранения регистров.   -  person Michael Dorgan    schedule 04.01.2012
comment
Вы имеете в виду, если я напишу всю программу на ассемблере? Хе-хе, это определенно будет крайним средством; D   -  person Madcowswe    schedule 05.01.2012


Ответы (1)


Хорошо, я нашел источник, который поддерживает идею использования фиктивных выходов вместо жестких регистров:

4.8 Временные регистры: люди также иногда по ошибке используют клобберы для временных регистров. Правильный способ - создать фиктивный выход и использовать «= r» или «= & r» в зависимости от разрешенного перекрытия с входами. GCC выделяет регистр для фиктивного значения. Разница в том, что GCC может выбрать удобный регистр, поэтому он имеет большую гибкость.

со страницы 20 этого pdf.

Для всех, кто интересуется дополнительной информацией о встроенной сборке с помощью GCC, это Сайт оказался очень поучительным.

person Madcowswe    schedule 04.01.2012
comment
На прошлой неделе на AArch64 я обнаружил, что gcc сгенерировал лучший код, завершающий и завершающий мою сборку, когда я жестко закодировал (например, на самом деле написал add w2, %[input1], %[input2]) временные файлы и затирал их, чем при выполнении упомянутого вами трюка (например, add %[fakeoutputastemp], %[input1], %[input2]). YMMV конечно. Мой случай: stackoverflow.com/questions/28325569/. Если вы знаете соглашение о вызовах, вы можете выбрать временные регистры, которые не будут вызывать передачу аргументов, а также не будут слишком высокими. - person ahcox; 07.02.2015