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