Отправляет email-рассылки с помощью сервиса Sendsay

Ассемблерные вставки в gcc

Здравствуйте!

Подскажите, что делает этот код, где можно почитать про формат таких ассемблерных
вставок?

#define mad_f_scale64(hi, lo) \
({ mad_fixed_t __result; \

mad_fixed64hi_t __hi_; \

mad_fixed64lo_t __lo_; \

asm __volatile__ ("addc %0, %2, %4\n\t" \

"addze %1, %3" \

: "=r" (__lo_), "=r" (__hi_) \

: "r" (lo), "r" (hi), "r" (1 << (MAD_F_SCALEBITS - 1))); \

asm __volatile__ ("rlwinm %0, %2,32-%3,0,%3-1\n\t" \

"rlwimi %0, %1,32-%3,%3,31" \

: "=&r" (__result) \

: "r" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS)); \

__result; \

})

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 23065; Возраст листа: 867; Участников: 1468
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/487078

Ответить   "Denis Silin" Thu, 8 Dec 2005 15:01:40 +0300 (#487078)

 

Ответы:

Доброе утро!

8 декабря 2005 15:01 | Denis Silin:

Красиво... Макрос с ассемблерной вставкой. Судя по инструкциям, ассемблер
PowerPC. Формат довольно простой, попробую потренировать память:

Собственно, ассемблерный код (ну это и так видно). Фишка, особенно
интересная для привыкших к синтаксису Intel (NASM) - здесь все пишется в
синтаксисе AT&T.

Входные переменные (в коде на ассемблере они видны как %0, %1...),
передаются через регистры (естественно, никто еще не знает какие)

Выходные переменные (используются также).

Если в чем ошибся - поправляйте!

Одного не скажу - чего он делает, поскольку с PowerPC практически не
знаком. Как говорится, Google в помощь. :)

Ответить   Roman I Khimov Thu, 8 Dec 2005 21:24:49 +0300 (#487096)

 

Есть такая вставка
asm __volatile__ ("addc %0, %2, %4\n\t" \

"addze %1, %3" \

: "=r" (__lo_), "=r" (__hi_) \

: "r" (lo), "r" (hi), "r" (1 << (MAD_F_SCALEBITS - 1)));

Входные переменные - "=r" (__lo_), "=r" (__hi_) , т.е. в %0 пойдет __lo_, в
%1 пойдет __hi_.
Это так или нет?

А что подставится в %2, %3, %4 ?

Чем отличаются "r" , "=r" , "=&r" , "I" ?

Что означает \n\t в первой строке ассемблерной вставки "addc %0, %2,
%4\n\t"?
Что означает последняя строка __result;?

#define mad_f_scale64(hi, lo) \
({ mad_fixed_t __result; \

mad_fixed64hi_t __hi_; \

mad_fixed64lo_t __lo_; \

asm __volatile__ ("addc %0, %2, %4\n\t" \

"addze %1, %3" \

: "=r" (__lo_), "=r" (__hi_) \

: "r" (lo), "r" (hi), "r" (1 << (MAD_F_SCALEBITS - 1))); \

asm __volatile__ ("rlwinm %0, %2,32-%3,0,%3-1\n\t" \

"rlwimi %0, %1,32-%3,%3,31" \

: "=&r" (__result) \

: "r" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS)); \

__result; \

})

Original Message From: "Roman I Khimov" <rik@o*****.info>
To: "comp.soft.linux.discuss (8508234)" <denis.sil***@s*****.ru>
Sent: Thursday, December 08, 2005 9:24 PM

Доброе утро!

8 декабря 2005 15:01 | Denis Silin:

Красиво... Макрос с ассемблерной вставкой. Судя по инструкциям, ассемблер
PowerPC. Формат довольно простой, попробую потренировать память:

Собственно, ассемблерный код (ну это и так видно). Фишка, особенно
интересная для привыкших к синтаксису Intel (NASM) - здесь все пишется в
синтаксисе AT&T.

Входные переменные (в коде на ассемблере они видны как %0, %1...),
передаются через регистры (естественно, никто еще не знает какие)

Выходные переменные (используются также).

Если в чем ошибся - поправляйте!

Одного не скажу - чего он делает, поскольку с PowerPC практически не
знаком. Как говорится, Google в помощь. :)

Ответить   "Denis Silin" Fri, 9 Dec 2005 13:58:19 +0300 (#487325)

 

Доброе утро.

- Потому что никто не привык так читать.
- Почему это плохо?
- Это когда пишут ответ в начале письма, оставляя цитированный текст в
конце.
- Что такое top-posting?
- top-posting
- Самое отвратительное явление в переписке?

Не надо делать top-posting, это неудобно. :)

9 декабря 2005 13:58 | Denis Silin:

И так и нет. %0 - это __lo_, %1 - __hi_, это так. Но я все-таки
перепутал, это *выходные* переменные. Правда, используются они как-то не
очень здраво в этом коде, или мне так кажется?..

lo, hi и результат (1 << (MAD_F_SCALEBITS - 1)), соответственно.

Методами передачи. "r" и "=r" означают использование регистров (по одному
на параметр) общего назначения, но первый используется для описания
входных значений, а второй для выходных, поскольку модификатор "="
подсказывает GCC, что предыдущее значение этой переменной не имеет значения.

Модификатор "&" говорит о том, что значение регистра будет изменяться по
ходу функции, то есть, еще до ее завершения.

"I" - просто 32-разрядная целочисленная константа.

Это последствия попытки упихать inline ассемблер в макрос. По идее, в коде
можно делать куда как красивше, по принципу:

asm __volatile__ ("addc %0, %2, %4;
addze %1, %3;
call smth"

Но тут-то макрос, с кавычками сильно не побалуешься, и так приходится
бэкслэши писать! Потому получается, что в ассемблерный текст приходится
вставлять переводы строк "\n". Табуляцию "\t" уже по желанию, можно и
убрать.

Она уже не имеет отношения к ассемблеру, это уже часть макроса.

Откуда, кстати, код?

И вот еще, вроде бы, неплохой справочник по командам PowerPC:
http://pds.twi.tudelft.nl/vakken/in1200/labcourse/instruction-set/

Ответить   Roman I Khimov Fri, 9 Dec 2005 19:30:09 +0300 (#487396)