aarch64: Fix up aarch64_print_operand xzr/wzr case

This adjusts aarch64_print_operand to recognize zero rtxes in modes other than
VOIDmode.  This allows us to use xzr/wzr for zero vectors, for example.

We extract the test into a helper function, aarch64_const_zero_rtx_p, since this
predicate is needed by later patches.

gcc/ChangeLog:

	* config/aarch64/aarch64-protos.h (aarch64_const_zero_rtx_p): New.
	* config/aarch64/aarch64.cc (aarch64_const_zero_rtx_p): New.
	Use it ...
	(aarch64_print_operand): ... here.  Recognize CONST0_RTXes in
	modes other than VOIDmode.
This commit is contained in:
Alex Coplan 2023-11-02 22:53:44 +00:00
parent 0bd6f7a749
commit 94415eb7a4
2 changed files with 11 additions and 2 deletions

View file

@ -774,6 +774,7 @@ bool aarch64_expand_cpymem (rtx *, bool);
bool aarch64_expand_setmem (rtx *);
bool aarch64_float_const_zero_rtx_p (rtx);
bool aarch64_float_const_rtx_p (rtx);
bool aarch64_const_zero_rtx_p (rtx);
bool aarch64_function_arg_regno_p (unsigned);
bool aarch64_fusion_enabled_p (enum aarch64_fusion_pairs);
bool aarch64_gen_cpymemqi (rtx *);

View file

@ -10851,6 +10851,15 @@ aarch64_float_const_zero_rtx_p (rtx x)
return real_equal (CONST_DOUBLE_REAL_VALUE (x), &dconst0);
}
/* Return true if X is any kind of constant zero rtx. */
bool
aarch64_const_zero_rtx_p (rtx x)
{
return (x == CONST0_RTX (GET_MODE (x))
|| (CONST_DOUBLE_P (x) && aarch64_float_const_zero_rtx_p (x)));
}
/* Return TRUE if rtx X is immediate constant that fits in a single
MOVI immediate operation. */
bool
@ -12054,8 +12063,7 @@ aarch64_print_operand (FILE *f, rtx x, int code)
case 'w':
case 'x':
if (x == const0_rtx
|| (CONST_DOUBLE_P (x) && aarch64_float_const_zero_rtx_p (x)))
if (aarch64_const_zero_rtx_p (x))
{
asm_fprintf (f, "%czr", code);
break;