aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2010-09-04 11:51:33 +0200
committerUros Bizjak <uros@gcc.gnu.org>2010-09-04 11:51:33 +0200
commit770b37b9e49d8c338a290a076f4281964fecc817 (patch)
tree07487f3f6ade846bbbb4d956d435b51fe67d3a6c /gcc
parentb6ff8128de0583a91126718e81c48320aad243ce (diff)
downloadgcc-770b37b9e49d8c338a290a076f4281964fecc817.zip
gcc-770b37b9e49d8c338a290a076f4281964fecc817.tar.gz
gcc-770b37b9e49d8c338a290a076f4281964fecc817.tar.bz2
predicates.md (sse_reg_operand): New predicate.
* config/i386/predicates.md (sse_reg_operand): New predicate. * config/i386/i386.md (TFmode push splitter): Use sse_reg_operand predicate for operand 1. (XFmode push splitter): Use fp_register_operand predicate for operand 1. (*dummy_extendsfdf2, *dummy_extendsfxf2): Remove disabled patterns. (SF-DF float_extend push splitter): Add reload_completed insn predicate. ({SF,DF}-XF float_extend_push splitter): Macroize splitter using MODEF mode macro. Add reload_completed insn predicate. From-SVN: r163857
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/config/i386/i386.md50
-rw-r--r--gcc/config/i386/predicates.md5
3 files changed, 34 insertions, 37 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 34ef139..4922fa7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2010-09-04 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/predicates.md (sse_reg_operand): New predicate.
+ * config/i386/i386.md (TFmode push splitter): Use sse_reg_operand
+ predicate for operand 1.
+ (XFmode push splitter): Use fp_register_operand predicate
+ for operand 1.
+ (*dummy_extendsfdf2, *dummy_extendsfxf2): Remove disabled patterns.
+ (SF-DF float_extend push splitter): Add reload_completed insn
+ predicate.
+ ({SF,DF}-XF float_extend_push splitter): Macroize splitter using
+ MODEF mode macro. Add reload_completed insn predicate.
+
2010-09-04 Paolo Bonzini <bonzini@gnu.org>
* df.h (enum df_ref_class): Remove DF_REF_EXTRACT.
@@ -58,8 +71,7 @@
-mno-data-in-code and -mcode-xonly here.
* defaults.h (DEFAULT_SWITCH_TAKES_ARG): Add 'd'.
* gcc.c (option_map): Add "j" to --dump entry.
- (translate_options): Don't translate -d to -foutput-class-dir=
- here.
+ (translate_options): Don't translate -d to -foutput-class-dir= here.
2010-09-03 Sebastian Pop <sebastian.pop@amd.com>
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 56c2722..c2fd671 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -1685,7 +1685,7 @@
;; "push a byte/word". But actually we use pushl, which has the effect
;; of rounding the amount pushed up to a word.
-;; For 64BIT abi we always round up to 8 bytes.
+;; For TARGET_64BIT we always round up to 8 bytes.
(define_insn "*push<mode>2_rex64"
[(set (match_operand:SWI124 0 "push_operand" "=X")
(match_operand:SWI124 1 "nonmemory_no_elim_operand" "r<i>"))]
@@ -2588,19 +2588,19 @@
(define_split
[(set (match_operand:TF 0 "push_operand" "")
+ (match_operand:TF 1 "sse_reg_operand" ""))]
+ "TARGET_SSE2 && reload_completed"
+ [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -16)))
+ (set (mem:TF (reg:P SP_REG)) (match_dup 1))])
+
+(define_split
+ [(set (match_operand:TF 0 "push_operand" "")
(match_operand:TF 1 "general_operand" ""))]
"TARGET_SSE2 && reload_completed
&& !SSE_REG_P (operands[1])"
[(const_int 0)]
"ix86_split_long_move (operands); DONE;")
-(define_split
- [(set (match_operand:TF 0 "push_operand" "")
- (match_operand:TF 1 "any_fp_register_operand" ""))]
- "TARGET_SSE2"
- [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -16)))
- (set (mem:TF (reg:P SP_REG)) (match_dup 1))])
-
(define_insn "*pushxf"
[(set (match_operand:XF 0 "push_operand" "=<,<")
(match_operand:XF 1 "general_no_elim_operand" "f,ro"))]
@@ -2633,7 +2633,7 @@
(define_split
[(set (match_operand:XF 0 "push_operand" "")
- (match_operand:XF 1 "any_fp_register_operand" ""))]
+ (match_operand:XF 1 "fp_register_operand" ""))]
"reload_completed"
[(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
(set (mem:XF (reg:P SP_REG)) (match_dup 1))]
@@ -2643,7 +2643,7 @@
[(set (match_operand:XF 0 "push_operand" "")
(match_operand:XF 1 "general_operand" ""))]
"reload_completed
- && !ANY_FP_REG_P (operands[1])"
+ && !FP_REG_P (operands[1])"
[(const_int 0)]
"ix86_split_long_move (operands); DONE;")
@@ -3970,45 +3970,25 @@
;; Conversions between float and double.
-;; These are all no-ops in the model used for the 80387. So just
-;; emit moves.
+;; These are all no-ops in the model used for the 80387.
+;; So just emit moves.
;; %%% Kill these when call knows how to work out a DFmode push earlier.
-(define_insn "*dummy_extendsfdf2"
- [(set (match_operand:DF 0 "push_operand" "=<")
- (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "fY2")))]
- "0"
- "#")
-
(define_split
[(set (match_operand:DF 0 "push_operand" "")
(float_extend:DF (match_operand:SF 1 "fp_register_operand" "")))]
- ""
+ "reload_completed"
[(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -8)))
(set (mem:DF (reg:P SP_REG)) (float_extend:DF (match_dup 1)))])
-(define_insn "*dummy_extendsfxf2"
- [(set (match_operand:XF 0 "push_operand" "=<")
- (float_extend:XF (match_operand:SF 1 "nonimmediate_operand" "f")))]
- "0"
- "#")
-
(define_split
[(set (match_operand:XF 0 "push_operand" "")
- (float_extend:XF (match_operand:SF 1 "fp_register_operand" "")))]
- ""
+ (float_extend:XF (match_operand:MODEF 1 "fp_register_operand" "")))]
+ "reload_completed"
[(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
(set (mem:XF (reg:P SP_REG)) (float_extend:XF (match_dup 1)))]
"operands[2] = GEN_INT (-GET_MODE_SIZE (XFmode));")
-(define_split
- [(set (match_operand:XF 0 "push_operand" "")
- (float_extend:XF (match_operand:DF 1 "fp_register_operand" "")))]
- ""
- [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
- (set (mem:DF (reg:P SP_REG)) (float_extend:XF (match_dup 1)))]
- "operands[2] = GEN_INT (-GET_MODE_SIZE (XFmode));")
-
(define_expand "extendsfdf2"
[(set (match_operand:DF 0 "nonimmediate_operand" "")
(float_extend:DF (match_operand:SF 1 "general_operand" "")))]
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index e5fea4a..2f09f64 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -43,6 +43,11 @@
(and (match_code "reg")
(match_test "MMX_REGNO_P (REGNO (op))")))
+;; True if the operand is an SSE register.
+(define_predicate "sse_reg_operand"
+ (and (match_code "reg")
+ (match_test "SSE_REGNO_P (REGNO (op))")))
+
;; True if the operand is a Q_REGS class register.
(define_predicate "q_regs_operand"
(match_operand 0 "register_operand")