您的位置:首页 > 其它

在网上找到一个有用的macro

2016-02-03 00:00 525 查看
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
&nb
7fe0
sp;  xxmov 4, rsi
xxmov 14, rsi

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: