This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/85344] Constant constraint check sign extends unsigned constant input operands
- From: "thopre01 at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 13 Apr 2018 22:08:11 +0000
- Subject: [Bug middle-end/85344] Constant constraint check sign extends unsigned constant input operands
- Auto-submitted: auto-generated
- References: <bug-85344-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85344
--- Comment #5 from Thomas Preud'homme <thopre01 at gcc dot gnu.org> ---
(In reply to Thomas Preud'homme from comment #4)
> (In reply to Thomas Preud'homme from comment #3)
> > More worrying is that this code compiles without error when it should error
> > out:
> >
> > void
> > foo (void)
> > {
> > __asm( "%0" :: "J" ((unsigned char) 0x80));
> > }
>
> In which case we end up with #-128 in the assembly which is not what the
> user wrote. Thus adding wrong-code tag.
I have difficulty to make up my mind about what is the expected behavior for
constant input in inline asm, esp. for immediate constraint. But first let's
look at register constraint:
asm ("mov %0, %0" : "=r"(result) : "0"((signed char) -128));
will put 0x00000080 in the register holding result. It basically set the
register in the mode of the immediate, so QImode here. I would have expected
for a 32bit register to have the immediate as 2-complement 32bit value, ie
0xFFFFFF80 in this case. The documentation says that a general register should
be used which is true in both case.
Now what about asm ("%0" :: "i"((unsigned char) 128));
This gives -128 in the assembly code, on at least ARM and x86_64 targets but I
would expect likewise on all targets. Likewise:
asm ("%0" :: "i"(0x80000000));
gives #-2147483648 in assembly for the similar reason. Here my expectation is
that provided that the constant can be represented in a const_int its value as
a C level constant is what should be printed in assembly and the constraint
check (eg for constraint I in ARM backend) should be based on that value as
well.
Thoughts?