Оптимизиране на използваните регистри при използване на вградено ARM асемблиране в GCC

Искам да напиша някакъв вграден ARM асембли в моя C код. За този код трябва да използвам регистър или два повече от тези, декларирани като входове и изходи на функцията. Знам как да използвам clobber списъка, за да кажа на GCC, че ще използвам някои допълнителни регистри, за да направя изчислението си.

Сигурен съм обаче, че GCC се радва на свободата да разбърква кои регистри за какво да се използват при оптимизиране. Тоест имам чувството, че е лоша идея да използвам фиксиран регистър за моите изчисления.

Какъв е най-добрият начин да използвам някакъв допълнителен регистър, който не е нито вход, нито изход на моя вграден асембли, без да използвам фиксиран регистър?

P.S. Мислех си, че използването на фиктивна изходна променлива може да свърши работа, но не съм сигурен какви странни други ефекти ще има...


person Madcowswe    schedule 04.01.2012    source източник
comment
Обзалагам се, че това е възможно съвсем директно, но ще оставя C гуру да отговори на това. :-)   -  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 Временни регистри: Хората също понякога погрешно използват clobbers за временни регистри. Правилният начин е да създадете фиктивен изход и да използвате „=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