]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
predicates.md (fix_trunc_dest_operand): New.
authorGeoffrey Keating <geoffk@apple.com>
Wed, 18 May 2005 20:36:02 +0000 (20:36 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Wed, 18 May 2005 20:36:02 +0000 (20:36 +0000)
* 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

gcc/ChangeLog
gcc/config/rs6000/predicates.md
gcc/config/rs6000/rs6000.md

index 5e0b4534b2ec2e6269b73b244357857e732b7b42..625fa6ac20ba8f13dd8e5f96e57683a7b2ec10e7 100644 (file)
@@ -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>
index 05db033089afb7045294719412d9798ca348dea4..570f59d3f0ce7e27511a29453b4e1d1345acfb58 100644 (file)
                    || 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"
index c627daf2d7774f1346b5d91a3026c39f96d7e071..b53792c32ae2fc1efc3ec9137f3171c12e8da52f 100644 (file)
 }"
   [(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))])]
   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]));