Assembly 转换和添加的最有效方式是什么

Assembly 转换和添加的最有效方式是什么,assembly,x86-64,simd,Assembly,X86 64,Simd,我有一个64位内存值,前16位是一个偏移量,将16位添加到其他48位的最有效方法是什么。显而易见的逻辑是 ab = *ptr >> 48 result = *ptr & 0x0000 ffff ffff ffff + ab; 如果它是20/44位,它会是什么呢 SIMD/Asm答案很好 Im也可以在末尾存储偏移量,仅供参考,主要值是对象地址,偏移量是对象的偏移量。将这些位放在起始位置可以让收集器使用寄存器来屏蔽它,但对于突变子来说,这是更好的优化 任何一个半体面的编译器都

我有一个64位内存值,前16位是一个偏移量,将16位添加到其他48位的最有效方法是什么。显而易见的逻辑是

ab = *ptr >> 48
result = *ptr & 0x0000 ffff ffff ffff + ab; 
如果它是20/44位,它会是什么呢

SIMD/Asm答案很好


Im也可以在末尾存储偏移量,仅供参考,主要值是对象地址,偏移量是对象的偏移量。将这些位放在起始位置可以让收集器使用寄存器来屏蔽它,但对于突变子来说,这是更好的优化

任何一个半体面的编译器都应该已经为这种表达式生成了高效的代码,这并没有给进一步的优化留下太多的空间。这是一种非常奇怪的编码方法,它的基是低48位,偏移量是高16位。但是,如果这确实是结构,那么您编写的代码就是要走的路。我能看到的唯一优化是,如果您可以专门使用一个寄存器来保存值
0x0000ffffffffffff
,那么您的ASM可以对寄存器执行
指令,而不是立即值。当然,这只会在你经常这样做的情况下对你有帮助,比如在循环中。你能转换格式吗?将偏移量设置在最低16位更方便。这样你就可以
movzx\shr\add
,这并不是更好(虽然不应该更糟),但由于消除了巨大的掩码,代码尺寸更小。我闻到了微优化的味道。此操作是否是真正的性能瓶颈所在?顺便说一下,这是适合64位寄存器的标量操作;SIMD是完全不需要的。假设这是一个常规的x86-64 48位逻辑地址,使用低16甚至更好,因为您可以在harold的方法中使用
sar
而不是
shr
,这样地址会自动规范(假设偏移量不会导致它溢出到间隙中)。