This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
fix target/16974
- From: Richard Henderson <rth at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 26 Aug 2004 03:05:58 -0700
- Subject: fix target/16974
The problem here is that we refuse to split PLUS patterns that satisfy
add_operand, since that would split every insn that is already correct.
But failing to split means that something that once resolved to
adddi_fp_hack cannot be redirected to adddi_internal.
So give in and replicate the two instructions. It's definitely easier
than any other possible solution.
r~
PR target/16974
* config/alpha/alpha.md (adddi_fp_hack): Don't rely on splitting
if the constant satisfies add_operand.
Index: alpha.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/alpha/alpha.md,v
retrieving revision 1.215.6.4
diff -c -p -d -u -r1.215.6.4 alpha.md
--- alpha.md 20 Feb 2004 22:25:31 -0000 1.215.6.4
+++ alpha.md 26 Aug 2004 09:59:02 -0000
@@ -438,9 +438,9 @@
;; and if we split before reload, we will require additional instructions.
(define_insn "*adddi_fp_hack"
- [(set (match_operand:DI 0 "register_operand" "=r")
- (plus:DI (match_operand:DI 1 "reg_no_subreg_operand" "r")
- (match_operand:DI 2 "const_int_operand" "n")))]
+ [(set (match_operand:DI 0 "register_operand" "=r,r,r")
+ (plus:DI (match_operand:DI 1 "reg_no_subreg_operand" "r,r,r")
+ (match_operand:DI 2 "const_int_operand" "K,L,n")))]
"NONSTRICT_REG_OK_FP_BASE_P (operands[1])
&& INTVAL (operands[2]) >= 0
/* This is the largest constant an lda+ldah pair can add, minus
@@ -454,7 +454,10 @@
+ max_reg_num () * UNITS_PER_WORD
+ current_function_pretend_args_size)
- current_function_pretend_args_size))"
- "#")
+ "@
+ lda %0,%2(%1)
+ ldah %0,%h2(%1)
+ #")
;; Don't do this if we are adjusting SP since we don't want to do it
;; in two steps. Don't split FP sources for the reason listed above.