在64位x86 CPU下,我们通常加载数字-1来注册如下:
mov rdx, -1 // 48BAFFFFFFFFFFFFFFFF..。这个操作码需要10个字节。
的另一种方式是:
xor rdx, rdx // 4831D2
dec rdx // 48FFCA ..。这个操作码只需要6个字节。
编辑
正如Jens Bj rnhager所说(我已经测试过),xor edx, edx操作码应该清除整个rdx寄存器:
xor edx, edx // 31D2
dec rdx // 48FFCA ..。此操作码只需5个字节。
编辑:
Alex找到了另一个解决方案:
mov rdx, -1 // 48C7C2FFFFFFFF..。这个操作码只需要7个字节。但是,如何告诉编译器使用更短的操作码(而不使用DB)?
..。
什么更快,什么更经济?
发布于 2011-12-14 19:39:52
还有另一种7字节的mov rdx, -1编码: 48C7C2FFFFFFFF.
您可以尝试在代码中以mov rdx, dword -1的形式编写指令,以帮助编译器/汇编程序使用这种较短的编码。
发布于 2011-12-28 13:17:41
有一个比所有提到的都短的:4883CAFF OR rdx,-1
它的缺点是对我所知道的所有体系结构都有错误的依赖,但它不应该被忽略。使用它是有正当理由的。例如,如果结果直到很晚才需要,并且处于一个循环中,否则将不适合于四个16字节的块。此外,如果速度与特定代码无关,则最好不要浪费宝贵的缓存空间。它也可以用于对齐的原因,但它几乎肯定会更快的垫到下一个更高的对齐代替。
至于告诉编译器这个,我一点线索都没有。
发布于 2011-12-14 10:27:23
第一个要好得多。第一个完全没有依赖项。第二种依赖关系是最糟糕的一种--指令在开始之前就需要指令的最终结果。但是,如果您有一些其他说明,说明您可以在xor和dec之间切换,这将消除依赖关系,那么第二个选项可能会胜出。
第二个错误依赖于rdx的值,而第一个不依赖这个值。有些CPU可能足够聪明,能够识别这种错误的依赖关系,并且不会在知道rdx值之前暂停第一条指令(不管输出是零的)。有些x86 CPU有逻辑来忽略一些错误的依赖项。
比较代码字节的数量不是很有用。在大多数实际情况下,代码占用的字节数不太可能非常大。
https://stackoverflow.com/questions/8502839
复制相似问题