2011-08-25 12 views
6

Me gustaría escribir una macro de gas para generar código que contenga varias instrucciones movdqu para registrar xmm dependiendo del parámetro n.¿Genera automáticamente el nombre de registro xmm en una macro de gas?

.macro xxmov n, p1 
      .if (\n == 1) 
      xor %eax, %eax 
      .endif 
      .if (\n - 1) 
      xxmov (\n - 1), \p1 
      .endif 
      movdqu ((\n - 1)*0x10)(\p1), %xmm0 
    .endm 

    xxmov 14, %rsi 

Una vez compilado, el código desensamblado es,

0000000000000000 <.text>: 
    0:    31 c0     xor %eax,%eax 
    2:    f3 0f 6f 06    movdqu (%rsi),%xmm0 
    6:    f3 0f 6f 46 10   movdqu 0x10(%rsi),%xmm0 
    b:    f3 0f 6f 46 20   movdqu 0x20(%rsi),%xmm0 
    10:    f3 0f 6f 46 30   movdqu 0x30(%rsi),%xmm0 
    15:    f3 0f 6f 46 40   movdqu 0x40(%rsi),%xmm0 
    1a:    f3 0f 6f 46 50   movdqu 0x50(%rsi),%xmm0 
    1f:    f3 0f 6f 46 60   movdqu 0x60(%rsi),%xmm0 
    24:    f3 0f 6f 46 70   movdqu 0x70(%rsi),%xmm0 
    29:    f3 0f 6f 86 80 00 00 movdqu 0x80(%rsi),%xmm0 
    30:    00 
    31:    f3 0f 6f 86 90 00 00 movdqu 0x90(%rsi),%xmm0 
    38:    00 
    39:    f3 0f 6f 86 a0 00 00 movdqu 0xa0(%rsi),%xmm0 
    40:    00 
    41:    f3 0f 6f 86 b0 00 00 movdqu 0xb0(%rsi),%xmm0 
    48:    00 
    49:    f3 0f 6f 86 c0 00 00 movdqu 0xc0(%rsi),%xmm0 
    50:    00 
    51:    f3 0f 6f 86 d0 00 00 movdqu 0xd0(%rsi),%xmm0 
    58:    00 

Sin embargo, cuando reemplacé% xmm0 con% XMM \ n en la macro xxmov anterior, me error de compilación,

$ gcc -c mac.s 
mac.s: Assembler messages: 
mac.s:17: Error: bad register name `%xmm(((((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((14 - 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((14 - 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((14 - 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((14 - 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((14 - 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(14 - 1)' 

Así que, de todos modos, puedo manipular mi nombre de registro de macro a xmm (de% xmm0 a% xmm_ {n-1})? He intentado \ @ (% xmm \ @) mencionado en http://sourceware.org/binutils/docs/as/Macro.html#Macro. Sin embargo, no funcionó muy bien porque me gustaría utilizar esta macro varias veces, mientras que \ @ parece estar aumentando monótonamente ...

Respuesta

2

¿Qué hay de más en lugar de contar una variable para contar? De esta manera:

.macro xxmov n, p1, cnt=0 
    .if (\cnt == 0) 
     xor %eax, %eax 
    .endif 
    .if (\cnt != \n) 
     movdqu \@*0x10(\p1), %xmm\@ 
     xxmov \n, \p1, (\cnt + 1) 
    .endif 
.endm 

    xxmov 14, %rsi 

que genera:

0000000000000000 <.text>: 
    0: 31 c0      xor %eax,%eax 
    2: f3 0f 6f 06     movdqu (%rsi),%xmm0 
    6: f3 0f 6f 4e 10    movdqu 0x10(%rsi),%xmm1 
    b: f3 0f 6f 56 20    movdqu 0x20(%rsi),%xmm2 
    10: f3 0f 6f 5e 30    movdqu 0x30(%rsi),%xmm3 
    15: f3 0f 6f 66 40    movdqu 0x40(%rsi),%xmm4 
    1a: f3 0f 6f 6e 50    movdqu 0x50(%rsi),%xmm5 
    1f: f3 0f 6f 76 60    movdqu 0x60(%rsi),%xmm6 
    24: f3 0f 6f 7e 70    movdqu 0x70(%rsi),%xmm7 
    29: f3 44 0f 6f 86 80 00 00 00 movdqu 0x80(%rsi),%xmm8 
    32: f3 44 0f 6f 8e 90 00 00 00 movdqu 0x90(%rsi),%xmm9 
    3b: f3 44 0f 6f 96 a0 00 00 00 movdqu 0xa0(%rsi),%xmm10 
    44: f3 44 0f 6f 9e b0 00 00 00 movdqu 0xb0(%rsi),%xmm11 
    4d: f3 44 0f 6f a6 c0 00 00 00 movdqu 0xc0(%rsi),%xmm12 
    56: f3 44 0f 6f ae d0 00 00 00 movdqu 0xd0(%rsi),%xmm13 

Actualización: Vaya, que sólo funciona para el primer uso de macros en el archivo. Si es necesario utilizar más de una vez en el mismo archivo, parece que el uso de la sintaxis .altmacro es el camino a seguir (que se puede desactivar de nuevo con .noaltmacro):

.altmacro 
.macro xxmov n, p 
    .if (\n == 1) 
     xor %eax, %eax 
    .endif 
    .if (\n > 1) 
     xxmov %(\n - 1), \p 
    .endif 
    movdqu (\n - 1)*0x10 (%\p) , %xmm\n 
.endm 
    xxmov 4, rsi 
    xxmov 14, rsi 
+0

sí, sí ayuda .altmacro aquí . Gracias. – 0xa5a5

Cuestiones relacionadas