""
"")
+(define_insn "*negdi2_sign_cc"
+ [(set (reg 33)
+ (compare (neg:DI (ashiftrt:DI (ashift:DI (subreg:DI
+ (match_operand:SI 1 "register_operand" "d") 0)
+ (const_int 32)) (const_int 32)))
+ (const_int 0)))
+ (set (match_operand:DI 0 "register_operand" "=d")
+ (neg:DI (sign_extend:DI (match_dup 1))))]
+ "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
+ "lcgfr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
+(define_insn "*negdi2_sign"
+ [(set (match_operand:DI 0 "register_operand" "=d")
+ (neg:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
+ (clobber (reg:CC 33))]
+ "TARGET_64BIT"
+ "lcgfr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
+(define_insn "*negdi2_cc"
+ [(set (reg 33)
+ (compare (neg:DI (match_operand:DI 1 "register_operand" "d"))
+ (const_int 0)))
+ (set (match_operand:DI 0 "register_operand" "=d")
+ (neg:DI (match_dup 1)))]
+ "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
+ "lcgr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
+(define_insn "*negdi2_cconly"
+ [(set (reg 33)
+ (compare (neg:DI (match_operand:DI 1 "register_operand" "d"))
+ (const_int 0)))
+ (clobber (match_scratch:DI 0 "=d"))]
+ "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
+ "lcgr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
(define_insn "*negdi2_64"
[(set (match_operand:DI 0 "register_operand" "=d")
(neg:DI (match_operand:DI 1 "register_operand" "d")))
(clobber (reg:CC 33))]
"TARGET_64BIT"
"lcgr\t%0,%1"
- [(set_attr "op_type" "RR")])
+ [(set_attr "op_type" "RRE")])
-(define_insn "*negdi2_31"
+(define_insn_and_split "*negdi2_31"
[(set (match_operand:DI 0 "register_operand" "=d")
(neg:DI (match_operand:DI 1 "register_operand" "d")))
(clobber (reg:CC 33))]
"!TARGET_64BIT"
-{
- rtx xop[1];
- xop[0] = gen_label_rtx ();
- output_asm_insn ("lcr\t%0,%1", operands);
- output_asm_insn ("lcr\t%N0,%N1", operands);
- output_asm_insn ("je\t%l0", xop);
- output_asm_insn ("bctr\t%0,0", operands);
- targetm.asm_out.internal_label (asm_out_file, "L",
- CODE_LABEL_NUMBER (xop[0]));
- return "";
-}
- [(set_attr "length" "10")])
+ "#"
+ "&& reload_completed"
+ [(parallel
+ [(set (match_dup 2) (neg:SI (match_dup 3)))
+ (clobber (reg:CC 33))])
+ (parallel
+ [(set (reg:CCAP 33)
+ (compare:CCAP (neg:SI (match_dup 5)) (const_int 0)))
+ (set (match_dup 4) (neg:SI (match_dup 5)))])
+ (set (pc)
+ (if_then_else (ne (reg:CCAP 33) (const_int 0))
+ (pc)
+ (label_ref (match_dup 6))))
+ (parallel
+ [(set (match_dup 2) (plus:SI (match_dup 2) (const_int -1)))
+ (clobber (reg:CC 33))])
+ (match_dup 6)]
+ "operands[2] = operand_subword (operands[0], 0, 0, DImode);
+ operands[3] = operand_subword (operands[1], 0, 0, DImode);
+ operands[4] = operand_subword (operands[0], 1, 0, DImode);
+ operands[5] = operand_subword (operands[1], 1, 0, DImode);
+ operands[6] = gen_label_rtx ();")
;
; negsi2 instruction pattern(s).
;
+(define_insn "*negsi2_cc"
+ [(set (reg 33)
+ (compare (neg:SI (match_operand:SI 1 "register_operand" "d"))
+ (const_int 0)))
+ (set (match_operand:SI 0 "register_operand" "=d")
+ (neg:SI (match_dup 1)))]
+ "s390_match_ccmode (insn, CCAmode)"
+ "lcr\t%0,%1"
+ [(set_attr "op_type" "RR")])
+
+(define_insn "*negsi2_cconly"
+ [(set (reg 33)
+ (compare (neg:SI (match_operand:SI 1 "register_operand" "d"))
+ (const_int 0)))
+ (clobber (match_scratch:SI 0 "=d"))]
+ "s390_match_ccmode (insn, CCAmode)"
+ "lcr\t%0,%1"
+ [(set_attr "op_type" "RR")])
+
(define_insn "negsi2"
[(set (match_operand:SI 0 "register_operand" "=d")
(neg:SI (match_operand:SI 1 "register_operand" "d")))
"TARGET_HARD_FLOAT"
"")
+(define_insn "*negdf2_cc"
+ [(set (reg 33)
+ (compare (neg:DF (match_operand:DF 1 "register_operand" "f"))
+ (match_operand:DF 2 "const0_operand" "")))
+ (set (match_operand:DF 0 "register_operand" "=f")
+ (neg:DF (match_dup 1)))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lcdbr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimpd")])
+
+(define_insn "*negdf2_cconly"
+ [(set (reg 33)
+ (compare (neg:DF (match_operand:DF 1 "register_operand" "f"))
+ (match_operand:DF 2 "const0_operand" "")))
+ (clobber (match_scratch:DF 0 "=f"))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lcdbr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimpd")])
+
(define_insn "*negdf2"
[(set (match_operand:DF 0 "register_operand" "=f")
(neg:DF (match_operand:DF 1 "register_operand" "f")))
"TARGET_HARD_FLOAT"
"")
+(define_insn "*negsf2_cc"
+ [(set (reg 33)
+ (compare (neg:SF (match_operand:SF 1 "register_operand" "f"))
+ (match_operand:SF 2 "const0_operand" "")))
+ (set (match_operand:SF 0 "register_operand" "=f")
+ (neg:SF (match_dup 1)))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lcebr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimps")])
+
+(define_insn "*negsf2_cconly"
+ [(set (reg 33)
+ (compare (neg:SF (match_operand:SF 1 "register_operand" "f"))
+ (match_operand:SF 2 "const0_operand" "")))
+ (clobber (match_scratch:SF 0 "=f"))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lcebr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimps")])
+
(define_insn "*negsf2"
[(set (match_operand:SF 0 "register_operand" "=f")
(neg:SF (match_operand:SF 1 "register_operand" "f")))
; absdi2 instruction pattern(s).
;
+(define_insn "*absdi2_sign_cc"
+ [(set (reg 33)
+ (compare (abs:DI (ashiftrt:DI (ashift:DI (subreg:DI
+ (match_operand:SI 1 "register_operand" "d") 0)
+ (const_int 32)) (const_int 32)))
+ (const_int 0)))
+ (set (match_operand:DI 0 "register_operand" "=d")
+ (abs:DI (sign_extend:DI (match_dup 1))))]
+ "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
+ "lpgfr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
+(define_insn "*absdi2_sign"
+ [(set (match_operand:DI 0 "register_operand" "=d")
+ (abs:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
+ (clobber (reg:CC 33))]
+ "TARGET_64BIT"
+ "lpgfr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
+(define_insn "*absdi2_cc"
+ [(set (reg 33)
+ (compare (abs:DI (match_operand:DI 1 "register_operand" "d"))
+ (const_int 0)))
+ (set (match_operand:DI 0 "register_operand" "=d")
+ (abs:DI (match_dup 1)))]
+ "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
+ "lpgr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
+(define_insn "*absdi2_cconly"
+ [(set (reg 33)
+ (compare (abs:DI (match_operand:DI 1 "register_operand" "d"))
+ (const_int 0)))
+ (clobber (match_scratch:DI 0 "=d"))]
+ "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
+ "lpgr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
(define_insn "absdi2"
[(set (match_operand:DI 0 "register_operand" "=d")
(abs:DI (match_operand:DI 1 "register_operand" "d")))
; abssi2 instruction pattern(s).
;
+(define_insn "*abssi2_cc"
+ [(set (reg 33)
+ (compare (abs:SI (match_operand:SI 1 "register_operand" "d"))
+ (const_int 0)))
+ (set (match_operand:SI 0 "register_operand" "=d")
+ (abs:SI (match_dup 1)))]
+ "s390_match_ccmode (insn, CCAmode)"
+ "lpr\t%0,%1"
+ [(set_attr "op_type" "RR")])
+
+(define_insn "*abssi2_cconly"
+ [(set (reg 33)
+ (compare (abs:SI (match_operand:SI 1 "register_operand" "d"))
+ (const_int 0)))
+ (clobber (match_scratch:SI 0 "=d"))]
+ "s390_match_ccmode (insn, CCAmode)"
+ "lpr\t%0,%1"
+ [(set_attr "op_type" "RR")])
+
(define_insn "abssi2"
[(set (match_operand:SI 0 "register_operand" "=d")
(abs:SI (match_operand:SI 1 "register_operand" "d")))
"TARGET_HARD_FLOAT"
"")
+(define_insn "*absdf2_cc"
+ [(set (reg 33)
+ (compare (abs:DF (match_operand:DF 1 "register_operand" "f"))
+ (match_operand:DF 2 "const0_operand" "")))
+ (set (match_operand:DF 0 "register_operand" "=f")
+ (abs:DF (match_dup 1)))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lpdbr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimpd")])
+
+(define_insn "*absdf2_cconly"
+ [(set (reg 33)
+ (compare (abs:DF (match_operand:DF 1 "register_operand" "f"))
+ (match_operand:DF 2 "const0_operand" "")))
+ (clobber (match_scratch:DF 0 "=f"))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lpdbr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimpd")])
+
(define_insn "*absdf2"
[(set (match_operand:DF 0 "register_operand" "=f")
(abs:DF (match_operand:DF 1 "register_operand" "f")))
"TARGET_HARD_FLOAT"
"")
+(define_insn "*abssf2_cc"
+ [(set (reg 33)
+ (compare (abs:SF (match_operand:SF 1 "register_operand" "f"))
+ (match_operand:SF 2 "const0_operand" "")))
+ (set (match_operand:SF 0 "register_operand" "=f")
+ (abs:SF (match_dup 1)))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lpebr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimps")])
+
+(define_insn "*abssf2_cconly"
+ [(set (reg 33)
+ (compare (abs:SF (match_operand:SF 1 "register_operand" "f"))
+ (match_operand:SF 2 "const0_operand" "")))
+ (clobber (match_scratch:SF 0 "=f"))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lpebr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimps")])
+
(define_insn "*abssf2"
[(set (match_operand:SF 0 "register_operand" "=f")
(abs:SF (match_operand:SF 1 "register_operand" "f")))
; Integer
;
-(define_insn "*negabssi2"
- [(set (match_operand:SI 0 "register_operand" "=d")
- (neg:SI (abs:SI (match_operand:SI 1 "register_operand" "d"))))
+(define_insn "*negabsdi2_sign_cc"
+ [(set (reg 33)
+ (compare (neg:DI (abs:DI (ashiftrt:DI (ashift:DI (subreg:DI
+ (match_operand:SI 1 "register_operand" "d") 0)
+ (const_int 32)) (const_int 32))))
+ (const_int 0)))
+ (set (match_operand:DI 0 "register_operand" "=d")
+ (neg:DI (abs:DI (sign_extend:DI (match_dup 1)))))]
+ "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
+ "lngfr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
+(define_insn "*negabsdi2_sign"
+ [(set (match_operand:DI 0 "register_operand" "=d")
+ (neg:DI (abs:DI (sign_extend:DI
+ (match_operand:SI 1 "register_operand" "d")))))
(clobber (reg:CC 33))]
- ""
- "lnr\t%0,%1"
- [(set_attr "op_type" "RR")])
+ "TARGET_64BIT"
+ "lngfr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+(define_insn "*negabsdi2_cc"
+ [(set (reg 33)
+ (compare (neg:DI (abs:DI (match_operand:DI 1 "register_operand" "d")))
+ (const_int 0)))
+ (set (match_operand:DI 0 "register_operand" "=d")
+ (neg:DI (abs:DI (match_dup 1))))]
+ "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
+ "lngr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
+(define_insn "*negabsdi2_cconly"
+ [(set (reg 33)
+ (compare (neg:DI (abs:DI (match_operand:DI 1 "register_operand" "d")))
+ (const_int 0)))
+ (clobber (match_scratch:DI 0 "=d"))]
+ "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
+ "lngr\t%0,%1"
+ [(set_attr "op_type" "RRE")])
+
(define_insn "*negabsdi2"
[(set (match_operand:DI 0 "register_operand" "=d")
(neg:DI (abs:DI (match_operand:DI 1 "register_operand" "d"))))
"lngr\t%0,%1"
[(set_attr "op_type" "RRE")])
+(define_insn "*negabssi2_cc"
+ [(set (reg 33)
+ (compare (neg:SI (abs:SI (match_operand:SI 1 "register_operand" "d")))
+ (const_int 0)))
+ (set (match_operand:SI 0 "register_operand" "=d")
+ (neg:SI (abs:SI (match_dup 1))))]
+ "s390_match_ccmode (insn, CCAmode)"
+ "lnr\t%0,%1"
+ [(set_attr "op_type" "RR")])
+
+(define_insn "*negabssi2_cconly"
+ [(set (reg 33)
+ (compare (neg:SI (abs:SI (match_operand:SI 1 "register_operand" "d")))
+ (const_int 0)))
+ (clobber (match_scratch:SI 0 "=d"))]
+ "s390_match_ccmode (insn, CCAmode)"
+ "lnr\t%0,%1"
+ [(set_attr "op_type" "RR")])
+
+(define_insn "*negabssi2"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (neg:SI (abs:SI (match_operand:SI 1 "register_operand" "d"))))
+ (clobber (reg:CC 33))]
+ ""
+ "lnr\t%0,%1"
+ [(set_attr "op_type" "RR")])
+
;
; Floating point
;
-(define_insn "*negabssf2"
- [(set (match_operand:SF 0 "register_operand" "=f")
- (neg:SF (abs:SF (match_operand:SF 1 "register_operand" "f"))))
- (clobber (reg:CC 33))]
- "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
- "lnebr\t%0,%1"
+(define_insn "*negabsdf2_cc"
+ [(set (reg 33)
+ (compare (neg:DF (abs:DF (match_operand:DF 1 "register_operand" "f")))
+ (match_operand:DF 2 "const0_operand" "")))
+ (set (match_operand:DF 0 "register_operand" "=f")
+ (neg:DF (abs:DF (match_dup 1))))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lndbr\t%0,%1"
[(set_attr "op_type" "RRE")
- (set_attr "type" "fsimps")])
-
+ (set_attr "type" "fsimpd")])
+
+(define_insn "*negabsdf2_cconly"
+ [(set (reg 33)
+ (compare (neg:DF (abs:DF (match_operand:DF 1 "register_operand" "f")))
+ (match_operand:DF 2 "const0_operand" "")))
+ (clobber (match_scratch:DF 0 "=f"))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lndbr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimpd")])
+
(define_insn "*negabsdf2"
[(set (match_operand:DF 0 "register_operand" "=f")
(neg:DF (abs:DF (match_operand:DF 1 "register_operand" "f"))))
[(set_attr "op_type" "RRE")
(set_attr "type" "fsimpd")])
+(define_insn "*negabssf2_cc"
+ [(set (reg 33)
+ (compare (neg:SF (abs:SF (match_operand:SF 1 "register_operand" "f")))
+ (match_operand:SF 2 "const0_operand" "")))
+ (set (match_operand:SF 0 "register_operand" "=f")
+ (neg:SF (abs:SF (match_dup 1))))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lnebr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimps")])
+
+(define_insn "*negabssf2_cconly"
+ [(set (reg 33)
+ (compare (neg:SF (abs:SF (match_operand:SF 1 "register_operand" "f")))
+ (match_operand:SF 2 "const0_operand" "")))
+ (clobber (match_scratch:SF 0 "=f"))]
+ "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lnebr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimps")])
+
+(define_insn "*negabssf2"
+ [(set (match_operand:SF 0 "register_operand" "=f")
+ (neg:SF (abs:SF (match_operand:SF 1 "register_operand" "f"))))
+ (clobber (reg:CC 33))]
+ "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
+ "lnebr\t%0,%1"
+ [(set_attr "op_type" "RRE")
+ (set_attr "type" "fsimps")])
+
;;
;;- Square root instructions.
;;