Per this page, MOVQ can accept the following:
MOVQ mm, mm/m64
Move quadword from mm/m64 to mm.
MOVQ mm/m64, mm
Move quadword from mm to mm/m64.
MOVQ xmm1, xmm2/m64
Move quadword from xmm2/mem64 to xmm1.
MOVQ xmm2/m64, xmm1
Move quadword from xmm1 to xmm2/mem64.
However, my Free Pascal compiler is accepting this:
MOVQ xmm1, rcx
This is a move from a register, which is supported my MOVD, not MOVQ.
Agner Fog's instruction tables concurs with the above definition.
Why is the compiler accepting this (and it's working)?
When in doubt always consult the official reference, not some obscure web page. This is what the Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2 (2A, 2B & 2C): Instruction Set Reference, A-Z says:
66 REX.W 0F 6E /r MOVQ xmm, r/m64 SSE2 Move quadword from r/m64 to xmm.
So it's valid.
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments