@@ -499,42 +499,6 @@ (define_insn "*fuse_xor_and"
(set_attr "cost" "6")
(set_attr "length" "8")])
-;; add-logical fusion pattern generated by gen_logical_addsubf
-;; scalar add -> and
-(define_insn "*fuse_add_and"
- [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
- (and:GPR (plus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
- (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))
- (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r")))
- (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
- "(TARGET_P10_FUSION)"
- "@
- add %3,%1,%0\;and %3,%3,%2
- add %3,%1,%0\;and %3,%3,%2
- add %3,%1,%0\;and %3,%3,%2
- add %4,%1,%0\;and %3,%4,%2"
- [(set_attr "type" "fused_arith_logical")
- (set_attr "cost" "6")
- (set_attr "length" "8")])
-
-;; add-logical fusion pattern generated by gen_logical_addsubf
-;; scalar subf -> and
-(define_insn "*fuse_subf_and"
- [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
- (and:GPR (minus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
- (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))
- (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r")))
- (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
- "(TARGET_P10_FUSION)"
- "@
- subf %3,%1,%0\;and %3,%3,%2
- subf %3,%1,%0\;and %3,%3,%2
- subf %3,%1,%0\;and %3,%3,%2
- subf %4,%1,%0\;and %3,%4,%2"
- [(set_attr "type" "fused_arith_logical")
- (set_attr "cost" "6")
- (set_attr "length" "8")])
-
;; logical-logical fusion pattern generated by gen_logical_addsubf
;; scalar and -> andc
(define_insn "*fuse_and_andc"
@@ -967,42 +931,6 @@ (define_insn "*fuse_xor_nand"
(set_attr "cost" "6")
(set_attr "length" "8")])
-;; add-logical fusion pattern generated by gen_logical_addsubf
-;; scalar add -> nand
-(define_insn "*fuse_add_nand"
- [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
- (ior:GPR (not:GPR (plus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
- (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r")))
- (not:GPR (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))))
- (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
- "(TARGET_P10_FUSION)"
- "@
- add %3,%1,%0\;nand %3,%3,%2
- add %3,%1,%0\;nand %3,%3,%2
- add %3,%1,%0\;nand %3,%3,%2
- add %4,%1,%0\;nand %3,%4,%2"
- [(set_attr "type" "fused_arith_logical")
- (set_attr "cost" "6")
- (set_attr "length" "8")])
-
-;; add-logical fusion pattern generated by gen_logical_addsubf
-;; scalar subf -> nand
-(define_insn "*fuse_subf_nand"
- [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
- (ior:GPR (not:GPR (minus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
- (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r")))
- (not:GPR (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))))
- (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
- "(TARGET_P10_FUSION)"
- "@
- subf %3,%1,%0\;nand %3,%3,%2
- subf %3,%1,%0\;nand %3,%3,%2
- subf %3,%1,%0\;nand %3,%3,%2
- subf %4,%1,%0\;nand %3,%4,%2"
- [(set_attr "type" "fused_arith_logical")
- (set_attr "cost" "6")
- (set_attr "length" "8")])
-
;; logical-logical fusion pattern generated by gen_logical_addsubf
;; scalar and -> nor
(define_insn "*fuse_and_nor"
@@ -1147,42 +1075,6 @@ (define_insn "*fuse_xor_nor"
(set_attr "cost" "6")
(set_attr "length" "8")])
-;; add-logical fusion pattern generated by gen_logical_addsubf
-;; scalar add -> nor
-(define_insn "*fuse_add_nor"
- [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
- (and:GPR (not:GPR (plus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
- (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r")))
- (not:GPR (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))))
- (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
- "(TARGET_P10_FUSION)"
- "@
- add %3,%1,%0\;nor %3,%3,%2
- add %3,%1,%0\;nor %3,%3,%2
- add %3,%1,%0\;nor %3,%3,%2
- add %4,%1,%0\;nor %3,%4,%2"
- [(set_attr "type" "fused_arith_logical")
- (set_attr "cost" "6")
- (set_attr "length" "8")])
-
-;; add-logical fusion pattern generated by gen_logical_addsubf
-;; scalar subf -> nor
-(define_insn "*fuse_subf_nor"
- [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
- (and:GPR (not:GPR (minus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
- (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r")))
- (not:GPR (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))))
- (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
- "(TARGET_P10_FUSION)"
- "@
- subf %3,%1,%0\;nor %3,%3,%2
- subf %3,%1,%0\;nor %3,%3,%2
- subf %3,%1,%0\;nor %3,%3,%2
- subf %4,%1,%0\;nor %3,%4,%2"
- [(set_attr "type" "fused_arith_logical")
- (set_attr "cost" "6")
- (set_attr "length" "8")])
-
;; logical-logical fusion pattern generated by gen_logical_addsubf
;; scalar and -> or
(define_insn "*fuse_and_or"
@@ -1327,42 +1219,6 @@ (define_insn "*fuse_xor_or"
(set_attr "cost" "6")
(set_attr "length" "8")])
-;; add-logical fusion pattern generated by gen_logical_addsubf
-;; scalar add -> or
-(define_insn "*fuse_add_or"
- [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
- (ior:GPR (plus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
- (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))
- (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r")))
- (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
- "(TARGET_P10_FUSION)"
- "@
- add %3,%1,%0\;or %3,%3,%2
- add %3,%1,%0\;or %3,%3,%2
- add %3,%1,%0\;or %3,%3,%2
- add %4,%1,%0\;or %3,%4,%2"
- [(set_attr "type" "fused_arith_logical")
- (set_attr "cost" "6")
- (set_attr "length" "8")])
-
-;; add-logical fusion pattern generated by gen_logical_addsubf
-;; scalar subf -> or
-(define_insn "*fuse_subf_or"
- [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
- (ior:GPR (minus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
- (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))
- (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r")))
- (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
- "(TARGET_P10_FUSION)"
- "@
- subf %3,%1,%0\;or %3,%3,%2
- subf %3,%1,%0\;or %3,%3,%2
- subf %3,%1,%0\;or %3,%3,%2
- subf %4,%1,%0\;or %3,%4,%2"
- [(set_attr "type" "fused_arith_logical")
- (set_attr "cost" "6")
- (set_attr "length" "8")])
-
;; logical-logical fusion pattern generated by gen_logical_addsubf
;; scalar and -> orc
(define_insn "*fuse_and_orc"
@@ -1651,6 +1507,150 @@ (define_insn "*fuse_xor_xor"
(set_attr "cost" "6")
(set_attr "length" "8")])
+;; add-logical fusion pattern generated by gen_logical_addsubf
+;; scalar add -> and
+(define_insn "*fuse_add_and"
+ [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
+ (and:GPR (plus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
+ (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))
+ (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r")))
+ (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
+ "(TARGET_P10_FUSION)"
+ "@
+ add %3,%1,%0\;and %3,%3,%2
+ add %3,%1,%0\;and %3,%3,%2
+ add %3,%1,%0\;and %3,%3,%2
+ add %4,%1,%0\;and %3,%4,%2"
+ [(set_attr "type" "fused_arith_logical")
+ (set_attr "cost" "6")
+ (set_attr "length" "8")])
+
+;; add-logical fusion pattern generated by gen_logical_addsubf
+;; scalar subf -> and
+(define_insn "*fuse_subf_and"
+ [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
+ (and:GPR (minus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
+ (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))
+ (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r")))
+ (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
+ "(TARGET_P10_FUSION)"
+ "@
+ subf %3,%1,%0\;and %3,%3,%2
+ subf %3,%1,%0\;and %3,%3,%2
+ subf %3,%1,%0\;and %3,%3,%2
+ subf %4,%1,%0\;and %3,%4,%2"
+ [(set_attr "type" "fused_arith_logical")
+ (set_attr "cost" "6")
+ (set_attr "length" "8")])
+
+;; add-logical fusion pattern generated by gen_logical_addsubf
+;; scalar add -> nand
+(define_insn "*fuse_add_nand"
+ [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
+ (ior:GPR (not:GPR (plus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
+ (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r")))
+ (not:GPR (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))))
+ (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
+ "(TARGET_P10_FUSION)"
+ "@
+ add %3,%1,%0\;nand %3,%3,%2
+ add %3,%1,%0\;nand %3,%3,%2
+ add %3,%1,%0\;nand %3,%3,%2
+ add %4,%1,%0\;nand %3,%4,%2"
+ [(set_attr "type" "fused_arith_logical")
+ (set_attr "cost" "6")
+ (set_attr "length" "8")])
+
+;; add-logical fusion pattern generated by gen_logical_addsubf
+;; scalar subf -> nand
+(define_insn "*fuse_subf_nand"
+ [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
+ (ior:GPR (not:GPR (minus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
+ (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r")))
+ (not:GPR (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))))
+ (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
+ "(TARGET_P10_FUSION)"
+ "@
+ subf %3,%1,%0\;nand %3,%3,%2
+ subf %3,%1,%0\;nand %3,%3,%2
+ subf %3,%1,%0\;nand %3,%3,%2
+ subf %4,%1,%0\;nand %3,%4,%2"
+ [(set_attr "type" "fused_arith_logical")
+ (set_attr "cost" "6")
+ (set_attr "length" "8")])
+
+;; add-logical fusion pattern generated by gen_logical_addsubf
+;; scalar add -> nor
+(define_insn "*fuse_add_nor"
+ [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
+ (and:GPR (not:GPR (plus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
+ (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r")))
+ (not:GPR (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))))
+ (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
+ "(TARGET_P10_FUSION)"
+ "@
+ add %3,%1,%0\;nor %3,%3,%2
+ add %3,%1,%0\;nor %3,%3,%2
+ add %3,%1,%0\;nor %3,%3,%2
+ add %4,%1,%0\;nor %3,%4,%2"
+ [(set_attr "type" "fused_arith_logical")
+ (set_attr "cost" "6")
+ (set_attr "length" "8")])
+
+;; add-logical fusion pattern generated by gen_logical_addsubf
+;; scalar subf -> nor
+(define_insn "*fuse_subf_nor"
+ [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
+ (and:GPR (not:GPR (minus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
+ (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r")))
+ (not:GPR (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))))
+ (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
+ "(TARGET_P10_FUSION)"
+ "@
+ subf %3,%1,%0\;nor %3,%3,%2
+ subf %3,%1,%0\;nor %3,%3,%2
+ subf %3,%1,%0\;nor %3,%3,%2
+ subf %4,%1,%0\;nor %3,%4,%2"
+ [(set_attr "type" "fused_arith_logical")
+ (set_attr "cost" "6")
+ (set_attr "length" "8")])
+
+;; add-logical fusion pattern generated by gen_logical_addsubf
+;; scalar add -> or
+(define_insn "*fuse_add_or"
+ [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
+ (ior:GPR (plus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
+ (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))
+ (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r")))
+ (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
+ "(TARGET_P10_FUSION)"
+ "@
+ add %3,%1,%0\;or %3,%3,%2
+ add %3,%1,%0\;or %3,%3,%2
+ add %3,%1,%0\;or %3,%3,%2
+ add %4,%1,%0\;or %3,%4,%2"
+ [(set_attr "type" "fused_arith_logical")
+ (set_attr "cost" "6")
+ (set_attr "length" "8")])
+
+;; add-logical fusion pattern generated by gen_logical_addsubf
+;; scalar subf -> or
+(define_insn "*fuse_subf_or"
+ [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r")
+ (ior:GPR (minus:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")
+ (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))
+ (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r")))
+ (clobber (match_scratch:GPR 4 "=X,X,X,&r"))]
+ "(TARGET_P10_FUSION)"
+ "@
+ subf %3,%1,%0\;or %3,%3,%2
+ subf %3,%1,%0\;or %3,%3,%2
+ subf %3,%1,%0\;or %3,%3,%2
+ subf %4,%1,%0\;or %3,%4,%2"
+ [(set_attr "type" "fused_arith_logical")
+ (set_attr "cost" "6")
+ (set_attr "length" "8")])
+
;; logical-add fusion pattern generated by gen_logical_addsubf
;; scalar and -> add
(define_insn "*fuse_and_add"
@@ -335,22 +335,30 @@ sub gen_logical_addsubf_scalar
my $constraint = 'r';
my @logicals = ( 'and', 'andc', 'eqv', 'nand', 'nor', 'or', 'orc', 'xor' );
+
+ # logical-logical
+ foreach my $outer_op ( @logicals ) {
+ foreach my $inner_op ( @logicals ) {
+ my $exp = logical_addsubf_make_exp ($outer_op, $inner_op, $mode,
+ $pred, $constraint);
+ logical_addsubf_emit_define ('logical-logical', 'scalar', $outer_op,
+ $inner_op, $mode, $pred, $constraint,
+ $exp, $fuse_type);
+ }
+ }
+
# logical ops which can fuse with add/subf/rsubf
my @logicals2 = ( 'and', 'nand', 'nor', 'or' );
my @add_subf = ( 'add', 'subf' );
- # {logical, add}-logical
- foreach my $outer_op ( @logicals ) {
- foreach my $inner_op ( @logicals, @add_subf ) {
- my $ftype = 'logical-logical';
- if (grep (/^$inner_op$/, @add_subf)) {
- next unless grep (/^$outer_op$/, @logicals2);
- $ftype = 'add-logical';
- }
+ # add-logical
+ foreach my $outer_op ( @logicals2 ) {
+ foreach my $inner_op ( @add_subf ) {
my $exp = logical_addsubf_make_exp ($outer_op, $inner_op, $mode,
$pred, $constraint);
- logical_addsubf_emit_define ($ftype, 'scalar', $outer_op, $inner_op,
- $mode, $pred, $constraint, $exp, $fuse_type);
+ logical_addsubf_emit_define ('add-logical', 'scalar', $outer_op,
+ $inner_op, $mode, $pred, $constraint,
+ $exp, $fuse_type);
}
}