From 537426e7ad1ba6345c152bb935999f7146df09d6 Mon Sep 17 00:00:00 2001 From: Kaz Kojima Date: Thu, 2 Nov 2006 22:57:13 +0000 Subject: [PATCH] re PR target/27405 (gcc.c-torture/execute/960209-1.c ICEs on sh64-* with -O3) PR target/27405 * config/sh/sh.md (cmp{eq,gt,gtu}{si,di}_media): Remove. (cmpsi{eq,gt,gtu}{si,di}_media): Rename to cmp{eq,gt,gtu}{si,di}_media. (*cmpne0si_media): Remove. (*movsicc_umin): Adjust gen_cmp*_media call. (unordered): Change the mode of unordered and operands[1] to SImode. (seq): Adjust gen_cmp*_media calls. Make the mode of a temporary result of compare SImode if needed. If the mode of operands[0] is DImode, extend the temporary result to DImode. (slt, sle, sgt, sge, sgtu, sltu, sleu, sgue, sne): Likewise. (sunorderd): Change the mode of match_operand and unorderd to SImode. (cmpeq{sf,df}_media): Remove. (cmpsieq{sf,df}_media): Rename to cmpeq{sf,df}_media. (cmp{gt,ge,un}{sf,df}_media): Change the mode of match_operand and compare operation to SImode. From-SVN: r118435 --- gcc/ChangeLog | 21 ++++ gcc/config/sh/sh.md | 301 ++++++++++++++++++++++---------------------- 2 files changed, 169 insertions(+), 153 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ba32bc9fa37..383ce954b56 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2006-11-02 Kaz Kojima + + PR target/27405 + * config/sh/sh.md (cmp{eq,gt,gtu}{si,di}_media): Remove. + (cmpsi{eq,gt,gtu}{si,di}_media): Rename to + cmp{eq,gt,gtu}{si,di}_media. + (*cmpne0si_media): Remove. + (*movsicc_umin): Adjust gen_cmp*_media call. + (unordered): Change the mode of unordered and operands[1] to + SImode. + (seq): Adjust gen_cmp*_media calls. Make the mode of + a temporary result of compare SImode if needed. If the mode + of operands[0] is DImode, extend the temporary result to DImode. + (slt, sle, sgt, sge, sgtu, sltu, sleu, sgue, sne): Likewise. + (sunorderd): Change the mode of match_operand and unorderd to + SImode. + (cmpeq{sf,df}_media): Remove. + (cmpsieq{sf,df}_media): Rename to cmpeq{sf,df}_media. + (cmp{gt,ge,un}{sf,df}_media): Change the mode of match_operand + and compare operation to SImode. + 2006-11-02 Eric Botcazou * doc/install.texi (sparc-sun-solaris2*): Update GMP/MPFR build diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index ca112ef8dd0..d091dfe0eff 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -751,54 +751,6 @@ (set_attr "type" "arith3")]) (define_insn "cmpeqsi_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (eq:DI (match_operand:SI 1 "logical_operand" "%r") - (match_operand:SI 2 "cmp_operand" "Nr")))] - "TARGET_SHMEDIA" - "cmpeq %1, %N2, %0" - [(set_attr "type" "cmp_media")]) - -(define_insn "cmpeqdi_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (eq:DI (match_operand:DI 1 "register_operand" "%r") - (match_operand:DI 2 "cmp_operand" "Nr")))] - "TARGET_SHMEDIA" - "cmpeq %1, %N2, %0" - [(set_attr "type" "cmp_media")]) - -(define_insn "cmpgtsi_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (gt:DI (match_operand:SI 1 "cmp_operand" "Nr") - (match_operand:SI 2 "cmp_operand" "rN")))] - "TARGET_SHMEDIA" - "cmpgt %N1, %N2, %0" - [(set_attr "type" "cmp_media")]) - -(define_insn "cmpgtdi_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (gt:DI (match_operand:DI 1 "arith_reg_or_0_operand" "Nr") - (match_operand:DI 2 "arith_reg_or_0_operand" "rN")))] - "TARGET_SHMEDIA" - "cmpgt %N1, %N2, %0" - [(set_attr "type" "cmp_media")]) - -(define_insn "cmpgtusi_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (gtu:DI (match_operand:SI 1 "cmp_operand" "Nr") - (match_operand:SI 2 "cmp_operand" "rN")))] - "TARGET_SHMEDIA" - "cmpgtu %N1, %N2, %0" - [(set_attr "type" "cmp_media")]) - -(define_insn "cmpgtudi_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (gtu:DI (match_operand:DI 1 "arith_reg_or_0_operand" "Nr") - (match_operand:DI 2 "arith_reg_or_0_operand" "rN")))] - "TARGET_SHMEDIA" - "cmpgtu %N1, %N2, %0" - [(set_attr "type" "cmp_media")]) - -(define_insn "cmpsieqsi_media" [(set (match_operand:SI 0 "register_operand" "=r") (eq:SI (match_operand:SI 1 "logical_operand" "%r") (match_operand:SI 2 "cmp_operand" "Nr")))] @@ -806,7 +758,7 @@ "cmpeq %1, %N2, %0" [(set_attr "type" "cmp_media")]) -(define_insn "cmpsieqdi_media" +(define_insn "cmpeqdi_media" [(set (match_operand:SI 0 "register_operand" "=r") (eq:SI (match_operand:DI 1 "register_operand" "%r") (match_operand:DI 2 "cmp_operand" "Nr")))] @@ -814,7 +766,7 @@ "cmpeq %1, %N2, %0" [(set_attr "type" "cmp_media")]) -(define_insn "cmpsigtsi_media" +(define_insn "cmpgtsi_media" [(set (match_operand:SI 0 "register_operand" "=r") (gt:SI (match_operand:SI 1 "cmp_operand" "Nr") (match_operand:SI 2 "cmp_operand" "rN")))] @@ -822,7 +774,7 @@ "cmpgt %N1, %N2, %0" [(set_attr "type" "cmp_media")]) -(define_insn "cmpsigtdi_media" +(define_insn "cmpgtdi_media" [(set (match_operand:SI 0 "register_operand" "=r") (gt:SI (match_operand:DI 1 "arith_reg_or_0_operand" "Nr") (match_operand:DI 2 "arith_reg_or_0_operand" "rN")))] @@ -830,7 +782,7 @@ "cmpgt %N1, %N2, %0" [(set_attr "type" "cmp_media")]) -(define_insn "cmpsigtusi_media" +(define_insn "cmpgtusi_media" [(set (match_operand:SI 0 "register_operand" "=r") (gtu:SI (match_operand:SI 1 "cmp_operand" "Nr") (match_operand:SI 2 "cmp_operand" "rN")))] @@ -838,7 +790,7 @@ "cmpgtu %N1, %N2, %0" [(set_attr "type" "cmp_media")]) -(define_insn "cmpsigtudi_media" +(define_insn "cmpgtudi_media" [(set (match_operand:SI 0 "register_operand" "=r") (gtu:SI (match_operand:DI 1 "arith_reg_or_0_operand" "Nr") (match_operand:DI 2 "arith_reg_or_0_operand" "rN")))] @@ -847,13 +799,6 @@ [(set_attr "type" "cmp_media")]) ; These two patterns are for combine. -(define_insn "*cmpne0si_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (ne:DI (match_operand:SI 1 "arith_reg_operand" "r") (const_int 0)))] - "TARGET_SHMEDIA" - "cmpgtu %1,r63,%0" - [(set_attr "type" "cmp_media")]) - (define_insn "*cmpne0sisi_media" [(set (match_operand:SI 0 "register_operand" "=r") (ne:SI (match_operand:SI 1 "arith_reg_operand" "r") (const_int 0)))] @@ -1178,7 +1123,7 @@ { emit_insn (gen_movsicc_false (operands[0], operands[1], operands[2], operands[3])); - emit_insn (gen_cmpsigtusi_media (operands[5], operands[4], operands[0])); + emit_insn (gen_cmpgtusi_media (operands[5], operands[4], operands[0])); emit_insn (gen_movsicc_false (operands[0], operands[5], operands[4], operands[0])); DONE; @@ -7201,7 +7146,7 @@ label: }") (define_expand "bunordered" - [(set (match_dup 1) (unordered:DI (match_dup 2) (match_dup 3))) + [(set (match_dup 1) (unordered:SI (match_dup 2) (match_dup 3))) (set (pc) (if_then_else (ne (match_dup 1) (const_int 0)) (match_operand 0 "" "") @@ -7210,7 +7155,7 @@ label: " { operands[0] = gen_rtx_LABEL_REF (Pmode, operands[0]); - operands[1] = gen_reg_rtx (DImode); + operands[1] = gen_reg_rtx (SImode); operands[2] = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0); operands[3] = force_reg (GET_MODE (sh_compare_op1), sh_compare_op1); }") @@ -9113,6 +9058,8 @@ mov.l\\t1f,r0\\n\\ { if (TARGET_SHMEDIA) { + rtx reg; + sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0); if (sh_compare_op1 != const0_rtx) sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode @@ -9127,26 +9074,26 @@ mov.l\\t1f,r0\\n\\ switch (GET_MODE (sh_compare_op0)) { case SImode: - emit_insn (gen_cmpsieqsi_media (operands[0], + emit_insn (gen_cmpeqsi_media (operands[0], sh_compare_op0, sh_compare_op1)); break; case DImode: - emit_insn (gen_cmpsieqdi_media (operands[0], + emit_insn (gen_cmpeqdi_media (operands[0], sh_compare_op0, sh_compare_op1)); break; case SFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpsieqsf_media (operands[0], + emit_insn (gen_cmpeqsf_media (operands[0], sh_compare_op0, sh_compare_op1)); break; case DFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpsieqdf_media (operands[0], + emit_insn (gen_cmpeqdf_media (operands[0], sh_compare_op0, sh_compare_op1)); break; @@ -9156,38 +9103,44 @@ mov.l\\t1f,r0\\n\\ DONE; } - if (GET_MODE (operands[0]) != DImode) - operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0); + reg = operands[0]; + if (GET_MODE (operands[0]) != SImode) + reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0) + : gen_reg_rtx (SImode); switch (GET_MODE (sh_compare_op0)) { case SImode: - emit_insn (gen_cmpeqsi_media (operands[0], + emit_insn (gen_cmpeqsi_media (reg, sh_compare_op0, sh_compare_op1)); break; case DImode: - emit_insn (gen_cmpeqdi_media (operands[0], + emit_insn (gen_cmpeqdi_media (reg, sh_compare_op0, sh_compare_op1)); break; case SFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpeqsf_media (operands[0], + emit_insn (gen_cmpeqsf_media (reg, sh_compare_op0, sh_compare_op1)); break; case DFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpeqdf_media (operands[0], + emit_insn (gen_cmpeqdf_media (reg, sh_compare_op0, sh_compare_op1)); break; default: FAIL; } + + if (GET_MODE (operands[0]) == DImode) + emit_insn (gen_extendsidi2 (operands[0], reg)); + DONE; } if (sh_expand_t_scc (EQ, operands[0])) @@ -9205,8 +9158,8 @@ mov.l\\t1f,r0\\n\\ { if (TARGET_SHMEDIA) { - if (GET_MODE (operands[0]) != DImode) - operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0); + rtx reg; + sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0); if (sh_compare_op1 != const0_rtx) sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode @@ -9214,35 +9167,44 @@ mov.l\\t1f,r0\\n\\ : GET_MODE (sh_compare_op1), sh_compare_op1); + reg = operands[0]; + if (GET_MODE (operands[0]) != SImode) + reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0) + : gen_reg_rtx (SImode); + switch (GET_MODE (sh_compare_op0)) { case SImode: - emit_insn (gen_cmpgtsi_media (operands[0], + emit_insn (gen_cmpgtsi_media (reg, sh_compare_op1, sh_compare_op0)); break; case DImode: - emit_insn (gen_cmpgtdi_media (operands[0], + emit_insn (gen_cmpgtdi_media (reg, sh_compare_op1, sh_compare_op0)); break; case SFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpgtsf_media (operands[0], + emit_insn (gen_cmpgtsf_media (reg, sh_compare_op1, sh_compare_op0)); break; case DFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpgtdf_media (operands[0], + emit_insn (gen_cmpgtdf_media (reg, sh_compare_op1, sh_compare_op0)); break; default: FAIL; } + + if (GET_MODE (operands[0]) == DImode) + emit_insn (gen_extendsidi2 (operands[0], reg)); + DONE; } if (! currently_expanding_to_rtl) @@ -9259,8 +9221,8 @@ mov.l\\t1f,r0\\n\\ if (TARGET_SHMEDIA) { - if (GET_MODE (operands[0]) != DImode) - operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0); + rtx reg; + sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0); if (sh_compare_op1 != const0_rtx) sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode @@ -9268,45 +9230,54 @@ mov.l\\t1f,r0\\n\\ : GET_MODE (sh_compare_op1), sh_compare_op1); + reg = operands[0]; + if (GET_MODE (operands[0]) != SImode) + reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0) + : gen_reg_rtx (SImode); + switch (GET_MODE (sh_compare_op0)) { case SImode: { - tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode); + tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode); emit_insn (gen_cmpgtsi_media (tmp, sh_compare_op0, sh_compare_op1)); - emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx)); + emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx)); break; } case DImode: { - tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode); + tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode); emit_insn (gen_cmpgtdi_media (tmp, sh_compare_op0, sh_compare_op1)); - emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx)); + emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx)); break; } case SFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpgesf_media (operands[0], + emit_insn (gen_cmpgesf_media (reg, sh_compare_op1, sh_compare_op0)); break; case DFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpgedf_media (operands[0], + emit_insn (gen_cmpgedf_media (reg, sh_compare_op1, sh_compare_op0)); break; default: FAIL; } + + if (GET_MODE (operands[0]) == DImode) + emit_insn (gen_extendsidi2 (operands[0], reg)); + DONE; } @@ -9324,8 +9295,12 @@ mov.l\\t1f,r0\\n\\ { if (TARGET_SHMEDIA) { - if (GET_MODE (operands[0]) != DImode) - operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0); + rtx reg; + + reg = operands[0]; + if (GET_MODE (operands[0]) != SImode) + reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0) + : gen_reg_rtx (SImode); sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0); if (sh_compare_op1 != const0_rtx) sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode @@ -9336,32 +9311,36 @@ mov.l\\t1f,r0\\n\\ switch (GET_MODE (sh_compare_op0)) { case SImode: - emit_insn (gen_cmpgtsi_media (operands[0], + emit_insn (gen_cmpgtsi_media (reg, sh_compare_op0, sh_compare_op1)); break; case DImode: - emit_insn (gen_cmpgtdi_media (operands[0], + emit_insn (gen_cmpgtdi_media (reg, sh_compare_op0, sh_compare_op1)); break; case SFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpgtsf_media (operands[0], + emit_insn (gen_cmpgtsf_media (reg, sh_compare_op0, sh_compare_op1)); break; case DFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpgtdf_media (operands[0], + emit_insn (gen_cmpgtdf_media (reg, sh_compare_op0, sh_compare_op1)); break; default: FAIL; } + + if (GET_MODE (operands[0]) == DImode) + emit_insn (gen_extendsidi2 (operands[0], reg)); + DONE; } if (! currently_expanding_to_rtl) @@ -9377,12 +9356,15 @@ mov.l\\t1f,r0\\n\\ { if (TARGET_SHMEDIA) { + rtx reg; enum machine_mode mode = GET_MODE (sh_compare_op0); if ((mode) == VOIDmode) mode = GET_MODE (sh_compare_op1); - if (GET_MODE (operands[0]) != DImode) - operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0); + reg = operands[0]; + if (GET_MODE (operands[0]) != SImode) + reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0) + : gen_reg_rtx (SImode); sh_compare_op0 = force_reg (mode, sh_compare_op0); if (sh_compare_op1 != const0_rtx) sh_compare_op1 = force_reg (mode, sh_compare_op1); @@ -9391,41 +9373,45 @@ mov.l\\t1f,r0\\n\\ { case SImode: { - rtx tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode); + rtx tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode); emit_insn (gen_cmpgtsi_media (tmp, sh_compare_op1, sh_compare_op0)); - emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx)); + emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx)); break; } case DImode: { - rtx tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode); + rtx tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode); emit_insn (gen_cmpgtdi_media (tmp, sh_compare_op1, sh_compare_op0)); - emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx)); + emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx)); break; } case SFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpgesf_media (operands[0], + emit_insn (gen_cmpgesf_media (reg, sh_compare_op0, sh_compare_op1)); break; case DFmode: if (! TARGET_SHMEDIA_FPU) FAIL; - emit_insn (gen_cmpgedf_media (operands[0], + emit_insn (gen_cmpgedf_media (reg, sh_compare_op0, sh_compare_op1)); break; default: FAIL; } + + if (GET_MODE (operands[0]) == DImode) + emit_insn (gen_extendsidi2 (operands[0], reg)); + DONE; } @@ -9457,8 +9443,12 @@ mov.l\\t1f,r0\\n\\ { if (TARGET_SHMEDIA) { - if (GET_MODE (operands[0]) != DImode) - operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0); + rtx reg; + + reg = operands[0]; + if (GET_MODE (operands[0]) == DImode) + reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0) + : gen_reg_rtx (SImode); sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0); if (sh_compare_op1 != const0_rtx) sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode @@ -9466,8 +9456,11 @@ mov.l\\t1f,r0\\n\\ : GET_MODE (sh_compare_op1), sh_compare_op1); - emit_insn (gen_cmpgtudi_media (operands[0], + emit_insn (gen_cmpgtudi_media (reg, sh_compare_op0, sh_compare_op1)); + if (GET_MODE (operands[0]) == DImode) + emit_insn (gen_extendsidi2 (operands[0], reg)); + DONE; } if (! currently_expanding_to_rtl) @@ -9483,8 +9476,12 @@ mov.l\\t1f,r0\\n\\ { if (TARGET_SHMEDIA) { - if (GET_MODE (operands[0]) != DImode) - operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0); + rtx reg; + + reg = operands[0]; + if (GET_MODE (operands[0]) == DImode) + reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0) + : gen_reg_rtx (SImode); sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0); if (sh_compare_op1 != const0_rtx) sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode @@ -9492,8 +9489,11 @@ mov.l\\t1f,r0\\n\\ : GET_MODE (sh_compare_op1), sh_compare_op1); - emit_insn (gen_cmpgtudi_media (operands[0], + emit_insn (gen_cmpgtudi_media (reg, sh_compare_op1, sh_compare_op0)); + if (GET_MODE (operands[0]) == DImode) + emit_insn (gen_extendsidi2 (operands[0], reg)); + DONE; } if (! currently_expanding_to_rtl) @@ -9509,10 +9509,12 @@ mov.l\\t1f,r0\\n\\ { if (TARGET_SHMEDIA) { - rtx tmp; + rtx tmp, reg; - if (GET_MODE (operands[0]) != DImode) - operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0); + reg = operands[0]; + if (GET_MODE (operands[0]) != SImode) + reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0) + : gen_reg_rtx (SImode); sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0); if (sh_compare_op1 != const0_rtx) sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode @@ -9520,10 +9522,12 @@ mov.l\\t1f,r0\\n\\ : GET_MODE (sh_compare_op1), sh_compare_op1); - tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode); + tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode); emit_insn (gen_cmpgtudi_media (tmp, sh_compare_op0, sh_compare_op1)); - emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx)); + emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx)); + if (GET_MODE (operands[0]) == DImode) + emit_insn (gen_extendsidi2 (operands[0], reg)); DONE; } @@ -9540,10 +9544,12 @@ mov.l\\t1f,r0\\n\\ { if (TARGET_SHMEDIA) { - rtx tmp; + rtx tmp, reg; - if (GET_MODE (operands[0]) != DImode) - operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0); + reg = operands[0]; + if (GET_MODE (operands[0]) != SImode) + reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0) + : gen_reg_rtx (SImode); sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0); if (sh_compare_op1 != const0_rtx) sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode @@ -9551,10 +9557,12 @@ mov.l\\t1f,r0\\n\\ : GET_MODE (sh_compare_op1), sh_compare_op1); - tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode); + tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (SImode); emit_insn (gen_cmpgtudi_media (tmp, sh_compare_op1, sh_compare_op0)); - emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx)); + emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx)); + if (GET_MODE (operands[0]) == DImode) + emit_insn (gen_extendsidi2 (operands[0], reg)); DONE; } @@ -9585,11 +9593,12 @@ mov.l\\t1f,r0\\n\\ { if (TARGET_SHMEDIA) { - rtx tmp; - - if (GET_MODE (operands[0]) != DImode) - operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0); + rtx tmp, reg; + reg = operands[0]; + if (GET_MODE (operands[0]) != SImode) + reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0) + : gen_reg_rtx (SImode); if (! TARGET_SHMEDIA_FPU && GET_MODE (sh_compare_op0) != DImode && GET_MODE (sh_compare_op0) != SImode) @@ -9602,10 +9611,12 @@ mov.l\\t1f,r0\\n\\ : GET_MODE (sh_compare_op1), sh_compare_op1); - tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode); + tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode); emit_insn (gen_seq (tmp)); - emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx)); + emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx)); + if (GET_MODE (operands[0]) == DImode) + emit_insn (gen_extendsidi2 (operands[0], reg)); DONE; } @@ -9619,8 +9630,8 @@ mov.l\\t1f,r0\\n\\ }") (define_expand "sunordered" - [(set (match_operand:DI 0 "arith_reg_operand" "") - (unordered:DI (match_dup 1) (match_dup 2)))] + [(set (match_operand:SI 0 "arith_reg_operand" "") + (unordered:SI (match_dup 1) (match_dup 2)))] "TARGET_SHMEDIA_FPU" " { @@ -10379,14 +10390,6 @@ mov.l\\t1f,r0\\n\\ (set_attr "fp_mode" "single")]) (define_insn "cmpeqsf_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (eq:DI (match_operand:SF 1 "fp_arith_reg_operand" "f") - (match_operand:SF 2 "fp_arith_reg_operand" "f")))] - "TARGET_SHMEDIA_FPU" - "fcmpeq.s %1, %2, %0" - [(set_attr "type" "fcmp_media")]) - -(define_insn "cmpsieqsf_media" [(set (match_operand:SI 0 "register_operand" "=r") (eq:SI (match_operand:SF 1 "fp_arith_reg_operand" "f") (match_operand:SF 2 "fp_arith_reg_operand" "f")))] @@ -10395,24 +10398,24 @@ mov.l\\t1f,r0\\n\\ [(set_attr "type" "fcmp_media")]) (define_insn "cmpgtsf_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (gt:DI (match_operand:SF 1 "fp_arith_reg_operand" "f") + [(set (match_operand:SI 0 "register_operand" "=r") + (gt:SI (match_operand:SF 1 "fp_arith_reg_operand" "f") (match_operand:SF 2 "fp_arith_reg_operand" "f")))] "TARGET_SHMEDIA_FPU" "fcmpgt.s %1, %2, %0" [(set_attr "type" "fcmp_media")]) (define_insn "cmpgesf_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (ge:DI (match_operand:SF 1 "fp_arith_reg_operand" "f") + [(set (match_operand:SI 0 "register_operand" "=r") + (ge:SI (match_operand:SF 1 "fp_arith_reg_operand" "f") (match_operand:SF 2 "fp_arith_reg_operand" "f")))] "TARGET_SHMEDIA_FPU" "fcmpge.s %1, %2, %0" [(set_attr "type" "fcmp_media")]) (define_insn "cmpunsf_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (unordered:DI (match_operand:SF 1 "fp_arith_reg_operand" "f") + [(set (match_operand:SI 0 "register_operand" "=r") + (unordered:SI (match_operand:SF 1 "fp_arith_reg_operand" "f") (match_operand:SF 2 "fp_arith_reg_operand" "f")))] "TARGET_SHMEDIA_FPU" "fcmpun.s %1, %2, %0" @@ -10885,14 +10888,6 @@ mov.l\\t1f,r0\\n\\ (set_attr "fp_mode" "double")]) (define_insn "cmpeqdf_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (eq:DI (match_operand:DF 1 "fp_arith_reg_operand" "f") - (match_operand:DF 2 "fp_arith_reg_operand" "f")))] - "TARGET_SHMEDIA_FPU" - "fcmpeq.d %1,%2,%0" - [(set_attr "type" "fcmp_media")]) - -(define_insn "cmpsieqdf_media" [(set (match_operand:SI 0 "register_operand" "=r") (eq:SI (match_operand:DF 1 "fp_arith_reg_operand" "f") (match_operand:DF 2 "fp_arith_reg_operand" "f")))] @@ -10901,24 +10896,24 @@ mov.l\\t1f,r0\\n\\ [(set_attr "type" "fcmp_media")]) (define_insn "cmpgtdf_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (gt:DI (match_operand:DF 1 "fp_arith_reg_operand" "f") + [(set (match_operand:SI 0 "register_operand" "=r") + (gt:SI (match_operand:DF 1 "fp_arith_reg_operand" "f") (match_operand:DF 2 "fp_arith_reg_operand" "f")))] "TARGET_SHMEDIA_FPU" "fcmpgt.d %1,%2,%0" [(set_attr "type" "fcmp_media")]) (define_insn "cmpgedf_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (ge:DI (match_operand:DF 1 "fp_arith_reg_operand" "f") + [(set (match_operand:SI 0 "register_operand" "=r") + (ge:SI (match_operand:DF 1 "fp_arith_reg_operand" "f") (match_operand:DF 2 "fp_arith_reg_operand" "f")))] "TARGET_SHMEDIA_FPU" "fcmpge.d %1,%2,%0" [(set_attr "type" "fcmp_media")]) (define_insn "cmpundf_media" - [(set (match_operand:DI 0 "register_operand" "=r") - (unordered:DI (match_operand:DF 1 "fp_arith_reg_operand" "f") + [(set (match_operand:SI 0 "register_operand" "=r") + (unordered:SI (match_operand:DF 1 "fp_arith_reg_operand" "f") (match_operand:DF 2 "fp_arith_reg_operand" "f")))] "TARGET_SHMEDIA_FPU" "fcmpun.d %1,%2,%0"