diff options
author | Jan Hubicka <hubicka@freesoft.cz> | 1999-11-21 01:04:15 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 1999-11-21 00:04:15 +0000 |
commit | 1ce485ec4316107f1e03d147471accd1ddf9a0d2 (patch) | |
tree | 012f60e71358ee620c783ef8c1914d8d033f2484 /gcc | |
parent | 65c93378bc163bca5ad0eb887d065c905d862132 (diff) | |
download | gcc-1ce485ec4316107f1e03d147471accd1ddf9a0d2.zip gcc-1ce485ec4316107f1e03d147471accd1ddf9a0d2.tar.gz gcc-1ce485ec4316107f1e03d147471accd1ddf9a0d2.tar.bz2 |
i386.md (negs?2): Rewrite to expanders...
* i386.md (negs?2): Rewrite to expanders, new patterns and splitters
to support integer registers and memory.
(abss?2_integer): Likewise.
From-SVN: r30596
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 218 |
2 files changed, 211 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3e1552b..5be7711 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,7 @@ Fri Nov 19 06:32:19 CET 1999 Jan Hubicka <hubicka@freesoft.cz> + * i386.md (negs?2): Rewrite to expanders, new patterns and splitters + to support integer registers and memory. + (abss?2_integer): Likewise. * i386.h (enum reg_class): Add FLOAT_INT_REGS. (REG_CLASS_NAMES): Likewise. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index bd429b8..eae220a 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -4931,18 +4931,120 @@ "neg{b}\\t%0" [(set_attr "type" "negnot")]) +;; Changing of sign for FP values is duable using integer unit too. + (define_insn "negsf2" + [(set (match_operand:SF 0 "nonimmediate_operand" "=frm") + (neg:SF (match_operand:SF 1 "nonimmediate_operand" "0"))) + (clobber (reg:CC 17))] + "TARGET_80387" + "#") + +(define_split + [(set (match_operand:SF 0 "register_operand" "") + (neg:SF (match_operand:SF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed" + [(set (match_dup 0) + (neg:SF (match_dup 1)))] + "") + +(define_split + [(set (match_operand:SF 0 "register_operand" "") + (neg:SF (match_operand:SF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))" + [(parallel [(set (match_dup 0) (xor:SI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 17))])] + "operands[1] = GEN_INT (0x80000000); + operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));") + +(define_split + [(set (match_operand 0 "memory_operand" "") + (neg (match_operand 1 "memory_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && reload_completed && FLOAT_MODE_P (GET_MODE (operands[0]))" + [(parallel [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 17))])] + " +{ + int size = GET_MODE_SIZE (GET_MODE (operands[1])); + + /* XFmode's size is 12, but only 10 bytes are used. */ + if (size == 12) + size = 10; + operands[0] = gen_rtx_MEM (QImode, XEXP (operands[0], 0)); + operands[0] = adj_offsettable_operand (operands[0], size - 1); + operands[1] = GEN_INT (0x80); +}") + +(define_insn "negdf2" + [(set (match_operand:DF 0 "nonimmediate_operand" "=frm") + (neg:DF (match_operand:DF 1 "nonimmediate_operand" "0"))) + (clobber (reg:CC 17))] + "TARGET_80387" + "#") + +(define_split + [(set (match_operand:DF 0 "register_operand" "") + (neg:DF (match_operand:DF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed" + [(set (match_dup 0) + (neg:DF (match_dup 1)))] + "") + +(define_split + [(set (match_operand:DF 0 "register_operand" "") + (neg:DF (match_operand:DF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))" + [(parallel [(set (match_dup 3) (xor:SI (match_dup 3) (match_dup 4))) + (clobber (reg:CC 17))])] + "operands[4] = GEN_INT (0x80000000); + split_di (operands+0, 1, operands+2, operands+3);") + +(define_insn "negxf2" + [(set (match_operand:XF 0 "nonimmediate_operand" "=frm") + (neg:XF (match_operand:XF 1 "nonimmediate_operand" "0"))) + (clobber (reg:CC 17))] + "TARGET_80387" + "#") + +(define_split + [(set (match_operand:XF 0 "register_operand" "") + (neg:XF (match_operand:XF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed" + [(set (match_dup 0) + (neg:XF (match_dup 1)))] + "") + +(define_split + [(set (match_operand:XF 0 "register_operand" "") + (neg:XF (match_operand:XF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))" + [(parallel [(set (match_dup 0) (xor:SI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 17))])] + "operands[1] = GEN_INT (0x8000); + operands[0] = gen_rtx_REG (SImode, true_regnum (operands[0]) + 2);") + +;; Conditionize these after reload. If they matches before reload, we +;; lose the clobber and ability to use integer instructions. + +(define_insn "*negsf2_1" [(set (match_operand:SF 0 "register_operand" "=f") (neg:SF (match_operand:SF 1 "register_operand" "0")))] - "TARGET_80387" + "TARGET_80387 && reload_completed" "fchs" [(set_attr "type" "fsgn") (set_attr "ppro_uops" "few")]) -(define_insn "negdf2" +(define_insn "*negdf2_1" [(set (match_operand:DF 0 "register_operand" "=f") (neg:DF (match_operand:DF 1 "register_operand" "0")))] - "TARGET_80387" + "TARGET_80387 && reload_completed" "fchs" [(set_attr "type" "fsgn") (set_attr "ppro_uops" "few")]) @@ -4956,10 +5058,10 @@ [(set_attr "type" "fsgn") (set_attr "ppro_uops" "few")]) -(define_insn "negxf2" +(define_insn "*negxf2_1" [(set (match_operand:XF 0 "register_operand" "=f") (neg:XF (match_operand:XF 1 "register_operand" "0")))] - "TARGET_80387" + "TARGET_80387 && reload_completed" "fchs" [(set_attr "type" "fsgn") (set_attr "ppro_uops" "few")]) @@ -4985,16 +5087,112 @@ ;; Absolute value instructions (define_insn "abssf2" + [(set (match_operand:SF 0 "nonimmediate_operand" "=frm") + (abs:SF (match_operand:SF 1 "nonimmediate_operand" "0"))) + (clobber (reg:CC 17))] + "TARGET_80387" + "#") + +(define_split + [(set (match_operand:SF 0 "register_operand" "") + (abs:SF (match_operand:SF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && FP_REGNO_P (REGNO (operands[0]))" + [(set (match_dup 0) + (abs:SF (match_dup 1)))] + "") + +(define_split + [(set (match_operand:SF 0 "register_operand" "") + (abs:SF (match_operand:SF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))" + [(parallel [(set (match_dup 0) (and:SI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 17))])] + "operands[1] = GEN_INT (~0x80000000); + operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));") + +(define_split + [(set (match_operand 0 "memory_operand" "") + (abs (match_operand 1 "memory_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && reload_completed && FLOAT_MODE_P (GET_MODE (operands[0]))" + [(parallel [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 17))])] + " +{ + int size = GET_MODE_SIZE (GET_MODE (operands[1])); + + /* XFmode's size is 12, but only 10 bytes are used. */ + if (size == 12) + size = 10; + operands[0] = gen_rtx_MEM (QImode, XEXP (operands[0], 0)); + operands[0] = adj_offsettable_operand (operands[0], size - 1); + operands[1] = GEN_INT (~0x80); +}") + +(define_insn "absdf2" + [(set (match_operand:DF 0 "nonimmediate_operand" "=frm") + (abs:DF (match_operand:DF 1 "nonimmediate_operand" "0")))] + "TARGET_80387" + "#") + +(define_split + [(set (match_operand:DF 0 "register_operand" "") + (abs:DF (match_operand:DF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed" + [(set (match_dup 0) + (abs:DF (match_dup 1)))] + "") + +(define_split + [(set (match_operand:DF 0 "register_operand" "") + (abs:DF (match_operand:DF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))" + [(parallel [(set (match_dup 3) (and:SI (match_dup 3) (match_dup 4))) + (clobber (reg:CC 17))])] + "operands[4] = GEN_INT (~0x80000000); + split_di (operands+0, 1, operands+2, operands+3);") + +(define_insn "absxf2" + [(set (match_operand:XF 0 "nonimmediate_operand" "=frm") + (abs:XF (match_operand:XF 1 "nonimmediate_operand" "0"))) + (clobber (reg:CC 17))] + "TARGET_80387" + "#") + +(define_split + [(set (match_operand:XF 0 "register_operand" "") + (abs:XF (match_operand:XF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed" + [(set (match_dup 0) + (abs:XF (match_dup 1)))] + "") + +(define_split + [(set (match_operand:XF 0 "register_operand" "") + (abs:XF (match_operand:XF 1 "register_operand" ""))) + (clobber (reg:CC 17))] + "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))" + [(parallel [(set (match_dup 0) (and:SI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 17))])] + "operands[1] = GEN_INT (~0x8000); + operands[0] = gen_rtx_REG (SImode, true_regnum (operands[0]) + 2);") + +(define_insn "*abssf2_1" [(set (match_operand:SF 0 "register_operand" "=f") (abs:SF (match_operand:SF 1 "register_operand" "0")))] - "TARGET_80387" + "TARGET_80387 && reload_completed" "fabs" [(set_attr "type" "fsgn")]) -(define_insn "absdf2" +(define_insn "*absdf2_1" [(set (match_operand:DF 0 "register_operand" "=f") (abs:DF (match_operand:DF 1 "register_operand" "0")))] - "TARGET_80387" + "TARGET_80387 && reload_completed" "fabs" [(set_attr "type" "fsgn")]) @@ -5006,10 +5204,10 @@ "fabs" [(set_attr "type" "fsgn")]) -(define_insn "absxf2" +(define_insn "*absxf2_1" [(set (match_operand:XF 0 "register_operand" "=f") (abs:XF (match_operand:XF 1 "register_operand" "0")))] - "TARGET_80387" + "TARGET_80387 && reload_completed" "fabs" [(set_attr "type" "fsgn")]) |