如果使用适当的寄存器重命名对32位进行编译,则下面的代码可以正常工作。但是如果执行时会出现错误(并在编译时显示“警告:对象文件“project1.o”包含32位绝对重定位到符号“.data.n_tc_p $ project1_orbitkeyheader64 $ int64 $ longint $$ int64_shufidx”。)
function SwapBytes64(const Val: Int64): Int64;
{$A 16}
const
SHUFIDX : array [0..1] of Int64 = ($0001020304050607, 0);
begin
asm
movq xmm0, rcx
pshufb xmm0, SHUFIDX // throws
movq rax, xmm0
end;
end;
我该如何纠正这个问题(最好能够对齐常量)。
编辑 我还尝试了使用movdqu。
回答 这是@Jester答案的结果:
function SwapBytes64(const Val: Int64): Int64;
const
SHUFIDX : array [0..1] of Int64 = ($0001020304050607, 0);
begin
asm
movq xmm0, rcx
movdqu xmm1, [rip+SHUFIDX]
pshufb xmm0, xmm1
movq rax, xmm0
end;
end;
这样也有效果,但似乎没有明显的速度优势:
function SwapBytes64(const Val: Int64): Int64;
const
SHUFIDX : array [0..1] of Int64 = ($0001020304050607, 0);
begin
asm
movq xmm0, rcx
pshufb xmm0, [rip+SHUFIDX]
movq rax, xmm0
end;
end;
[rbp-8]
这样来寻址本地变量吗? - wilx