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 <ubiz...@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 <ubiz...@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 <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)