2011-08-25 79 views
6

我想写气体宏生成包含根据所述参数n的各种MOVDQU指令xmm寄存器中的代码。在气体宏自动生成XMM寄存器的名字吗?

.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 

一旦编译,反汇编代码,

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 

然而,当我替换上面xxmov宏%XMM \ n%XMM0,我得到了编译错误,

$ 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)' 

因此,它有反正我可以操纵我的宏XMM寄存器名称(从%XMM0到%xmm_ {N-1})?我曾尝试\ @(%XMM \ @)在http://sourceware.org/binutils/docs/as/Macro.html#Macro提及。然而,它没有很好地工作,因为我想用这个宏多的时间,而\ @似乎单调递增..

回答

2

怎么样,而不是倒计时你保持一个变量来计算呢?就像这样:

.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 

产生:

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 

更新:哎呀,只适用于文件中的第一个宏使用。如果你需要使用它不止一次在同一个文件,它看起来像使用.altmacro语法的路要走(也可以用.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

没错,.altmacro确实有助于在这里。谢谢。 – 0xa5a5