> This piece code is wrong for x32:
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59929

Though an independent bug ;)
> 
> I am testing:
> 
> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> index ddc3be6..92e8fd0 100644
> --- a/gcc/config/i386/i386.md
> +++ b/gcc/config/i386/i386.md
> @@ -2765,7 +2765,20 @@
>    "reload_completed"
>    [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
>     (set (mem:SF (reg:P SP_REG)) (match_dup 1))]
> -  "operands[2] = GEN_INT (-<P:MODE_SIZE>);")
> +{
> +  rtx op = XEXP (operands[0], 0);
> +  if (GET_CODE (op) == PRE_DEC)
> +    {
> +      gcc_assert (!TARGET_64BIT);
> +      op = GEN_INT (-4);
> +    }
> +  else
> +    {
> +      op = XEXP (XEXP (op, 1), 1);
> +      gcc_assert (CONST_INT_P (op));
> +    }
> +  operands[2] = op;
> +})

Not pretty, but I can not think of much more compact way, so OK
if it passes.
> 
>  (define_split
>    [(set (match_operand:SF 0 "push_operand")
> 
> 
> -- 
> H.J.

Reply via email to