| How about rather than counting down you keep a variable to count up? Like this: .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
Which generates: 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
Update: Oops, that only works for the first macro usage in the file. If you need to use it more than once in the same file, it looks like using the .altmacro syntax is the way to go (it can be turned off again with .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
|