Hi! On the following testcase, we emit weird diagnostics. User used the z modifier, but diagnostics talks about Z instead. This is because z is implemented by doing some stuff and then falling through into the Z case.
The following patch adjusts the Z diagnostics, such that it prints whatever modifier user actually uses in places which could happen with either modifier. Furthermore, in case of the non-integer operand used with operand code %<z%> warning the warning location was incorrect (and of function), so I've used warning_for_asm to get it a proper location in case it is a user inline-asm. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2023-04-12 Jakub Jelinek <ja...@redhat.com> PR target/109458 * config/i386/i386.cc: Include rtl-error.h. (ix86_print_operand): For z modifier warning, use warning_for_asm if this_is_asm_operands. For Z modifier errors, use %c and code instead of hardcoded Z. * gcc.target/i386/pr109458.c: New test. --- gcc/config/i386/i386.cc.jj 2023-03-31 09:26:47.970219929 +0200 +++ gcc/config/i386/i386.cc 2023-04-10 10:21:39.506793959 +0200 @@ -96,6 +96,7 @@ along with GCC; see the file COPYING3. #include "i386-expand.h" #include "i386-features.h" #include "function-abi.h" +#include "rtl-error.h" /* This file should be included last. */ #include "target-def.h" @@ -13218,7 +13219,13 @@ ix86_print_operand (FILE *file, rtx x, i } if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT) - warning (0, "non-integer operand used with operand code %<z%>"); + { + if (this_is_asm_operands) + warning_for_asm (this_is_asm_operands, + "non-integer operand used with operand code %<z%>"); + else + warning (0, "non-integer operand used with operand code %<z%>"); + } /* FALLTHRU */ case 'Z': @@ -13281,11 +13288,12 @@ ix86_print_operand (FILE *file, rtx x, i else { output_operand_lossage ("invalid operand type used with " - "operand code 'Z'"); + "operand code '%c'", code); return; } - output_operand_lossage ("invalid operand size for operand code 'Z'"); + output_operand_lossage ("invalid operand size for operand code '%c'", + code); return; case 'd': --- gcc/testsuite/gcc.target/i386/pr109458.c.jj 2023-04-10 10:30:44.950822263 +0200 +++ gcc/testsuite/gcc.target/i386/pr109458.c 2023-04-10 10:30:22.257153906 +0200 @@ -0,0 +1,13 @@ +/* PR target/109458 */ +/* { dg-do compile } */ +/* { dg-options "-msse2" } */ + +void +foo (_Float16 x) +{ + asm volatile ("# %z0" : : "i" (42)); /* { dg-error "invalid 'asm': invalid operand type used with operand code 'z'" } */ + asm volatile ("# %Z0" : : "i" (42)); /* { dg-error "invalid 'asm': invalid operand type used with operand code 'Z'" } */ + asm volatile ("# %z0" : : "x" (x)); /* { dg-error "invalid 'asm': invalid operand size for operand code 'z'" } */ + /* { dg-warning "non-integer operand used with operand code 'z'" "" { target *-*-* } .-1 } */ + asm volatile ("# %Z0" : : "x" (x)); /* { dg-error "invalid 'asm': invalid operand size for operand code 'Z'" } */ +} Jakub