[LLVMdev] [x86] Compiling in 32-bit mode causes 64-bit asm source to be silently converted to its 32-bit equavilent

Craig Topper craig.topper at gmail.com
Fri Jul 3 17:01:47 PDT 2015


Fixed in r241381

On Thu, Jul 2, 2015 at 4:35 PM, Craig Topper <craig.topper at gmail.com> wrote:

> Forgot to copy llvmdev.
>
> I think this part of the diff was a mistake. That Requires check still
> needs to be there.
>
>    let Uses = [RCX] in
>      def JRCXZ : Ii8PCRel<0xE3, RawFrm, (outs), (ins brtarget8:$dst),
> -                           "jrcxz\t$dst", [], IIC_JCXZ>, AdSize64, Requires<[In64BitMode]>;
> +                           "jrcxz\t$dst", [], IIC_JCXZ>, AdSize64;
>
>
> I'll fix sometime this weekend.
>
>
> On Thu, Jul 2, 2015 at 3:55 PM, Li, Charles <
> charles_li at playstation.sony.com> wrote:
>
>>  Hi Craig,
>>
>>
>>
>> I am Charles Li from Sony Playstation.
>>
>>
>>
>> We are doing x86 code gen testing and, by chance, we noticed that
>> compiling the 64-bit assembly instruction
>> <https://msdn.microsoft.com/en-us/library/windows/hardware/ff561499(v=vs.85).aspx>
>> “jrcxz” in 32-bit mode “-m32”
>>
>> previously resulted in an error,
>>
>> now gets silently converted into the 32-bit equivalent instruction “jecxz
>> ”.
>> I have bisected this change in behavior down to r225075 - [X86] Make the
>> instructions that use AdSize16/32/64 co-exist together without using mode
>> predicates.
>> <http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20141229/250681.html>
>>
>> I am curious if this change in behavior was an intended feature or
>> perhaps a side effect.
>>
>>
>>
>>
>>
>> Here is my methodology.
>>
>> The asm test case.
>>
>> $ cat j64.s
>>
>>         jrcxz   foo
>>
>> foo:
>>
>>
>>
>> Compiling the test case in 32-bit mode with Clang r225039.
>>
>> $ r225039/clang.exe  j64.s -c -m32  -target x86_64-pc-linux-gnu
>>
>> j64.s:1:9: error: instruction requires: 64-bit mode
>>
>>         jrcxz   foo
>>
>>         ^
>>
>>
>>
>> Compiling the test case in 32-bit mode with Clang r225079 then
>> disassembling the obj file to look for the jump instruction.
>>
>> $ r225079/clang.exe  j64.s -c -m32  -target x86_64-pc-linux-gnu
>>
>> (No Error)
>>
>>
>>
>> $ objdump j64.o -d | grep j
>>
>> j64.o:     file format elf32-i386
>>
>>    0:   e3 00                   jecxz  2 <foo>
>>
>>
>> Just FYI, this is not blocking us in any way. I found this to be a very
>> interesting discovery so I want to share it in the hopes of determining if
>> it was intentional or not.
>>
>>
>>
>> Sincerely,
>>
>> Charles Li
>>
>
>
>
> --
> ~Craig
>



-- 
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150703/fb65ec26/attachment.html>


More information about the llvm-dev mailing list