aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2023-04-12 16:53:23 +0200
committerJakub Jelinek <jakub@redhat.com>2023-04-12 16:53:23 +0200
commit4073ce2c4e5584c1be58fbe76dd66285de2529bb (patch)
tree086630be3d58c3d7d0c01952019573ba0e92d291
parent3beeebd6934654f3453209730b98c7a1fd0305b6 (diff)
downloadgcc-4073ce2c4e5584c1be58fbe76dd66285de2529bb.zip
gcc-4073ce2c4e5584c1be58fbe76dd66285de2529bb.tar.gz
gcc-4073ce2c4e5584c1be58fbe76dd66285de2529bb.tar.bz2
i386: Fix up z operand modifier diagnostics on inline-asm [PR109458]
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. 2023-04-12 Jakub Jelinek <jakub@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.
-rw-r--r--gcc/config/i386/i386.cc14
-rw-r--r--gcc/testsuite/gcc.target/i386/pr109458.c13
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 2581b80..fbd33a6 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -96,6 +96,7 @@ along with GCC; see the file COPYING3. If not see
#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, int code)
}
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, int code)
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':
diff --git a/gcc/testsuite/gcc.target/i386/pr109458.c b/gcc/testsuite/gcc.target/i386/pr109458.c
new file mode 100644
index 0000000..abd0ed2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr109458.c
@@ -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'" } */
+}