diff options
author | Geoffrey Keating <geoffk@apple.com> | 2005-05-18 20:36:02 +0000 |
---|---|---|
committer | Geoffrey Keating <geoffk@gcc.gnu.org> | 2005-05-18 20:36:02 +0000 |
commit | 045a8eb38895adbd97913affd35ab1ac450d8871 (patch) | |
tree | e5936d85783b1d4a0283e2f0c5db8f7fcc95bb87 | |
parent | 5ac7af02eacac7a2e00d9fd2fa4e35459f9ca3f4 (diff) | |
download | gcc-045a8eb38895adbd97913affd35ab1ac450d8871.zip gcc-045a8eb38895adbd97913affd35ab1ac450d8871.tar.gz gcc-045a8eb38895adbd97913affd35ab1ac450d8871.tar.bz2 |
predicates.md (fix_trunc_dest_operand): New.
* rs6000/predicates.md (fix_trunc_dest_operand): New.
* rs6000/rs6000.md (fix_truncdfsi2): Use fix_trunc_dest_operand.
Check that a memory operand is valid before trying to use it.
From-SVN: r99927
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/config/rs6000/predicates.md | 9 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 6 |
3 files changed, 15 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e0b453..625fa6a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2005-05-18 Geoffrey Keating <geoffk@apple.com> + * rs6000/predicates.md (fix_trunc_dest_operand): New. + * rs6000/rs6000.md (fix_truncdfsi2): Use fix_trunc_dest_operand. + Check that a memory operand is valid before trying to use it. + * tree-cfg.c (pass_remove_useless): This pass works on trees. 2005-05-18 Richard Guenther <rguenth@gcc.gnu.org> diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index 05db033..570f59d 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -364,6 +364,15 @@ || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT || INTVAL (XEXP (XEXP (op, 0), 1)) % 4 == 0"))) +;; Used for the destination of the fix_truncdfsi2 expander. +;; If stfiwx will be used, the result goes to memory; otherwise, +;; we're going to emit a store and a load of a subreg, so the dest is a +;; register. +(define_predicate "fix_trunc_dest_operand" + (if_then_else (match_test "! TARGET_E500_DOUBLE && TARGET_PPC_GFXOPT") + (match_operand 0 "memory_operand") + (match_operand 0 "gpc_reg_operand"))) + ;; Return 1 if the operand is either a non-special register or can be used ;; as the operand of a `mode' add insn. (define_predicate "add_operand" diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index c627daf..b53792c 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -5329,10 +5329,8 @@ }" [(set_attr "length" "20")]) -; In the TARGET_PPC_GFXOPT case, this could and probably should -; take a memory destination; but actually making this work is hard. (define_expand "fix_truncdfsi2" - [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "") + [(parallel [(set (match_operand:SI 0 "fix_trunc_dest_operand" "") (fix:SI (match_operand:DF 1 "gpc_reg_operand" ""))) (clobber (match_dup 2)) (clobber (match_dup 3))])] @@ -5349,7 +5347,7 @@ if (TARGET_PPC_GFXOPT) { rtx orig_dest = operands[0]; - if (GET_CODE (orig_dest) != MEM) + if (! memory_operand (orig_dest, GET_MODE (orig_dest))) operands[0] = assign_stack_temp (SImode, GET_MODE_SIZE (SImode), 0); emit_insn (gen_fix_truncdfsi2_internal_gfxopt (operands[0], operands[1], operands[2])); |