Why is the rex.w prefix not generated for certain instructions in inline assembler blocks?
Brad Roberts
braddr at puremagic.com
Wed Sep 11 10:08:59 PDT 2013
On 9/11/13 9:59 AM, Joseph Cassman wrote:
> On Monday, 9 September 2013 at 20:37:47 UTC, Joseph Cassman wrote:
>> So I'm out of ideas on where the error is coming from. Anyone got any ideas on what's going on here?
>
> Still not sure what is going on but I found a work-around that somebody else might find useful.
>
> The mov instruction is able to work with 64-bit values successfully so the value that is larger than
> 32 bits can be placed in a register and the register used for the operation. Here are few examples.
>
> void main()
> {
> asm
> {
> mov RAX,0x1ffffffffUL;
> mov R8,0xFFFFFFFFFFFFFFFFUL;
> and R8,RAX;
> xor R8,RAX;
> or R8,RAX;
> add R8,RAX;
> sub R8,RAX;
> cmp R8,RAX;
> }
> }
>
> And their disassembly (excluding the nonessentials).
>
> mov RAX,01FFFFFFFFh
> mov R8,0FFFFFFFFFFFFFFFFh
> and R8,RAX
> xor R8,RAX
> or R8,RAX
> add R8,RAX
> sub R8,RAX
> cmp R8,RAX
>
> The only downside of the work-around is that there is already pressure on the limited number of
> registers in x64. Some shuffling might be required.
>
> Joseph
Please file a bug for this. http://d.puremagic.com/issues/
More information about the Digitalmars-d-learn
mailing list