aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@wasabisystems.com>2003-10-14 02:17:47 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2003-10-14 02:17:47 +0000
commit4d4f9f195db9db1341c79713785f33b6aa5a06c9 (patch)
tree227dcb809424e63f93eb4a99b6e791c2707d036e /gcc
parentc92c2a28c90fd62b031cbcee994038458afe7f90 (diff)
downloadgcc-4d4f9f195db9db1341c79713785f33b6aa5a06c9.zip
gcc-4d4f9f195db9db1341c79713785f33b6aa5a06c9.tar.gz
gcc-4d4f9f195db9db1341c79713785f33b6aa5a06c9.tar.bz2
iwmmxt.md (cond_iwmmxt_movsi_insn): New pattern.
* config/arm/iwmmxt.md (cond_iwmmxt_movsi_insn): New pattern. * config/arm/arm.md: For splits which rely on conditional moves, remove ! TARGET_IWMMXT condition. From-SVN: r72456
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/arm.md20
-rw-r--r--gcc/config/arm/iwmmxt.md31
3 files changed, 40 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 81d9bd9..61ce6a8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2003-10-13 Ian Lance Taylor <ian@wasabisystems.com>
+
+ * config/arm/iwmmxt.md (cond_iwmmxt_movsi_insn): New pattern.
+ * config/arm/arm.md: For splits which rely on conditional moves,
+ remove ! TARGET_IWMMXT condition.
+
2003-10-13 David S. Miller <davem@redhat.com>
* ifcvt.c (num_removed_blocks): Rename to num_true_changes.
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 177d54b..7ef928e 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -8522,10 +8522,7 @@
(match_dup 0)
(match_operand 4 "" "")))
(clobber (reg:CC CC_REGNUM))]
- ;; Note we have to suppress this split for the iwmmxt because it
- ;; creates a conditional movsi and the iwmmxt_movsi_insn pattern
- ;; is not predicable. This sucks.
- "TARGET_ARM && reload_completed && ! TARGET_IWMMXT"
+ "TARGET_ARM && reload_completed"
[(set (match_dup 5) (match_dup 6))
(cond_exec (match_dup 7)
(set (match_dup 0) (match_dup 4)))]
@@ -8553,10 +8550,7 @@
(match_operand 4 "" "")
(match_dup 0)))
(clobber (reg:CC CC_REGNUM))]
- ;; Note we have to suppress this split for the iwmmxt because it
- ;; creates a conditional movsi and the iwmmxt_movsi_insn pattern
- ;; is not predicable. This sucks.
- "TARGET_ARM && reload_completed && ! TARGET_IWMMXT"
+ "TARGET_ARM && reload_completed"
[(set (match_dup 5) (match_dup 6))
(cond_exec (match_op_dup 1 [(match_dup 5) (const_int 0)])
(set (match_dup 0) (match_dup 4)))]
@@ -8577,10 +8571,7 @@
(match_operand 4 "" "")
(match_operand 5 "" "")))
(clobber (reg:CC CC_REGNUM))]
- ;; Note we have to suppress this split for the iwmmxt because it
- ;; creates a conditional movsi and the iwmmxt_movsi_insn pattern
- ;; is not predicable. This sucks.
- "TARGET_ARM && reload_completed && ! TARGET_IWMMXT"
+ "TARGET_ARM && reload_completed"
[(set (match_dup 6) (match_dup 7))
(cond_exec (match_op_dup 1 [(match_dup 6) (const_int 0)])
(set (match_dup 0) (match_dup 4)))
@@ -8612,10 +8603,7 @@
(not:SI
(match_operand:SI 5 "s_register_operand" ""))))
(clobber (reg:CC CC_REGNUM))]
- ;; Note we have to suppress this split for the iwmmxt because it
- ;; creates a conditional movsi and the iwmmxt_movsi_insn pattern
- ;; is not predicable. This sucks.
- "TARGET_ARM && reload_completed && ! TARGET_IWMMXT"
+ "TARGET_ARM && reload_completed"
[(set (match_dup 6) (match_dup 7))
(cond_exec (match_op_dup 1 [(match_dup 6) (const_int 0)])
(set (match_dup 0) (match_dup 4)))
diff --git a/gcc/config/arm/iwmmxt.md b/gcc/config/arm/iwmmxt.md
index f9ef521..f8070a8 100644
--- a/gcc/config/arm/iwmmxt.md
+++ b/gcc/config/arm/iwmmxt.md
@@ -116,7 +116,8 @@
(set_attr "neg_pool_range" "*,*,4084, *,*,*, *, 1012,*")
;; Note - the "predicable" attribute is not allowed to have alternatives.
;; Since the wSTRw wCx instruction is not predicable, we cannot support
- ;; predicating any of the alternatives in this template. This sucks.
+ ;; predicating any of the alternatives in this template. Instead,
+ ;; we do the predication ourselves, in cond_iwmmxt_movsi_insn.
(set_attr "predicable" "no")
;; Also - we have to pretend that these insns clobber the condition code
;; bits as otherwise arm_final_prescan_insn() will try to conditionalize
@@ -124,6 +125,34 @@
(set_attr "conds" "clob")]
)
+;; Because iwmmxt_movsi_insn is not predicable, we provide the
+;; cond_exec version explicitly, with appropriate constraints.
+
+(define_insn "*cond_iwmmxt_movsi_insn"
+ [(cond_exec
+ (match_operator 2 "arm_comparison_operator"
+ [(match_operand 3 "cc_register" "")
+ (const_int 0)])
+ (set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r, m,z,r")
+ (match_operand:SI 1 "general_operand" "rI,K,mi,r,r,z")))]
+ "TARGET_REALLY_IWMMXT
+ && ( register_operand (operands[0], SImode)
+ || register_operand (operands[1], SImode))"
+ "*
+ switch (which_alternative)
+ {
+ case 0: return \"mov%?\\t%0, %1\";
+ case 1: return \"mvn%?\\t%0, #%B1\";
+ case 2: return \"ldr%?\\t%0, %1\";
+ case 3: return \"str%?\\t%1, %0\";
+ case 4: return \"tmcr%?\\t%0, %1\";
+ default: return \"tmrc%?\\t%0, %1\";
+ }"
+ [(set_attr "type" "*,*,load,store1,*,*")
+ (set_attr "pool_range" "*,*,4096, *,*,*")
+ (set_attr "neg_pool_range" "*,*,4084, *,*,*")]
+)
+
(define_insn "movv8qi_internal"
[(set (match_operand:V8QI 0 "nonimmediate_operand" "=y,m,y,?r,?y,?r")
(match_operand:V8QI 1 "general_operand" "y,y,m,y,r,i"))]