[RFA PATCH, i386]: Warn for 64-bit values in general-reg asm operands and error out for 8-bit values in invalid GR asm operand

Richard Biener rguenther@suse.de
Tue Feb 28 10:48:00 GMT 2017


On Tue, 28 Feb 2017, Uros Bizjak wrote:

> Hello!
> 
> Attached patch:
> 
> a) warns for 64-bit values in GR asm operand on 32bit targets
> 
> It is impossible to pass 64-bit (long long) value in 32bit register.
> We should warn for this situation, since only 32bit lowpart value is
> passed. The warning can be omitted by explicitly casting asm operand
> to int.
> 
> b) errors out for 8-bit values in invalid GR asm operand
> 
> We can detect invalid %sil, %dil and %bpl asm operands early, and
> terminate compilation in the compiler, not later in the assembler.
> 
> 2017-02-28  Uros Bizjak  <ubizjak@gmail.com>
> 
>     * config/i386/i386.c (print_reg): Warn for values of 64-bit size
>     in integer register on 32-bit targets.  Error out for values of
>     8-bit size in invalid integer register.
> 
> testsuite/ChangeLog:
> 
> 2017-02-28  Uros Bizjak  <ubizjak@gmail.com>
> 
>     * gcc.target/i386/invsize-1.c: New test.
>     * gcc.target/i386/invsize-2.c: Ditto.
> 
> OK for mainline in stage 4?

Yes.

Richard.

> Uros.
> 
> --cut here--
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 14ac189..e64bbe7 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -17641,6 +17641,9 @@ print_reg (rtx x, int code, FILE *file)
>    switch (msize)
>      {
>      case 8:
> +      if (LEGACY_INT_REGNO_P (regno) && !TARGET_64BIT)
> +       warning (0, "unsupported size for integer register in 32-bit mode");
> +      /* FALLTHRU */
>      case 4:
>        if (LEGACY_INT_REGNO_P (regno))
>         putc (msize == 8 && TARGET_64BIT ? 'r' : 'e', file);
> @@ -17654,6 +17657,8 @@ print_reg (rtx x, int code, FILE *file)
>      case 1:
>        if (regno >= ARRAY_SIZE (qi_reg_name))
>         goto normal;
> +      if (!ANY_QI_REGNO_P (regno))
> +       error ("unsupported size for integer register in 32-bit mode");
>        reg = qi_reg_name[regno];
>        break;
>      case 0:
> --cut here--
> 
> /* { dg-do compile { target ia32 } } */
> 
> void foo (long long x)
> {
>   __asm__ volatile ("# %0" : : "r" (x));   /* { dg-warning
> "unsupported size" }  */
> }
> 
> /* { dg-do compile { target ia32 } } */
> 
> void foo (char x)
> {
>   register char rx  __asm ("si") = x;
> 
>   __asm__ volatile ("# %0" : : "r" (rx));   /* { dg-error "unsupported
> size" }  */
> }
> 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)



More information about the Gcc-patches mailing list