Commit 037f20f1 by Jan Hubicka Committed by Jan Hubicka

i386.md (floatsisf_sse): Fix output template

	* i386.md (floatsisf_sse): Fix output template
	* i386.c (ix86_expand_fp_movcc)

	* reg-stack.c (emit_pop_insn): Handle complex modes.
	(move_for_stack_reg): Emit proper move mode.
	(subst_stack_regs_pat): Handle complex modes.

From-SVN: r41250
parent 01ef6563
Wed Apr 11 14:06:10 CEST 2001 Jan Hubicka <jh@suse.cz>
* i386.md (floatsisf_sse): Fix output template
* i386.c (ix86_expand_fp_movcc)
* reg-stack.c (emit_pop_insn): Handle complex modes.
(move_for_stack_reg): Emit proper move mode.
(subst_stack_regs_pat): Handle complex modes.
2001-04-11 Jakub Jelinek <jakub@redhat.com> 2001-04-11 Jakub Jelinek <jakub@redhat.com>
* cpplex.c (_cpp_lex_token): Only warn if -Wcomment. * cpplex.c (_cpp_lex_token): Only warn if -Wcomment.
......
...@@ -6664,8 +6664,9 @@ ix86_expand_fp_movcc (operands) ...@@ -6664,8 +6664,9 @@ ix86_expand_fp_movcc (operands)
/* Similary try to manage result to be first operand of conditional /* Similary try to manage result to be first operand of conditional
move. We also don't support the NE comparison on SSE, so try to move. We also don't support the NE comparison on SSE, so try to
avoid it. */ avoid it. */
if (rtx_equal_p (operands[0], operands[3]) if ((rtx_equal_p (operands[0], operands[3])
|| GET_CODE (operands[1]) == NE) && (!TARGET_IEEE_FP || GET_CODE (operands[1]) != EQ))
|| (GET_CODE (operands[1]) == NE && TARGET_IEEE_FP))
{ {
rtx tmp = operands[2]; rtx tmp = operands[2];
operands[2] = operands[3]; operands[2] = operands[3];
......
...@@ -5117,7 +5117,7 @@ ...@@ -5117,7 +5117,7 @@
[(set (match_operand:DF 0 "register_operand" "=Y") [(set (match_operand:DF 0 "register_operand" "=Y")
(float:DF (match_operand:DI 1 "nonimmediate_operand" "mr")))] (float:DF (match_operand:DI 1 "nonimmediate_operand" "mr")))]
"TARGET_SSE2" "TARGET_SSE2"
"cvtsi2sd\\t{%1, %0|%0, %1}" "cvtsi2sd{q}\\t{%1, %0|%0, %1}"
[(set_attr "type" "sse") [(set_attr "type" "sse")
(set_attr "mode" "DF") (set_attr "mode" "DF")
(set_attr "fp_int_src" "true")]) (set_attr "fp_int_src" "true")])
......
...@@ -906,6 +906,23 @@ emit_pop_insn (insn, regstack, reg, where) ...@@ -906,6 +906,23 @@ emit_pop_insn (insn, regstack, reg, where)
rtx pop_insn, pop_rtx; rtx pop_insn, pop_rtx;
int hard_regno; int hard_regno;
/* For complex types take care to pop both halves. These may survive in
CLOBBER and USE expressions. */
if (COMPLEX_MODE_P (GET_MODE (reg)))
{
rtx reg1 = FP_MODE_REG (REGNO (reg), DFmode);
rtx reg2 = FP_MODE_REG (REGNO (reg) + 1, DFmode);
pop_insn = NULL_RTX;
if (get_hard_regnum (regstack, reg1) >= 0)
pop_insn = emit_pop_insn (insn, regstack, reg1, where);
if (get_hard_regnum (regstack, reg2) >= 0)
pop_insn = emit_pop_insn (insn, regstack, reg2, where);
if (!pop_insn)
abort ();
return pop_insn;
}
hard_regno = get_hard_regnum (regstack, reg); hard_regno = get_hard_regnum (regstack, reg);
if (hard_regno < FIRST_STACK_REG) if (hard_regno < FIRST_STACK_REG)
...@@ -1129,9 +1146,12 @@ move_for_stack_reg (insn, regstack, pat) ...@@ -1129,9 +1146,12 @@ move_for_stack_reg (insn, regstack, pat)
stack is not full, and then write the value to memory via stack is not full, and then write the value to memory via
a pop. */ a pop. */
rtx push_rtx, push_insn; rtx push_rtx, push_insn;
rtx top_stack_reg = FP_MODE_REG (FIRST_STACK_REG, XFmode); rtx top_stack_reg = FP_MODE_REG (FIRST_STACK_REG, GET_MODE (src));
push_rtx = gen_movxf (top_stack_reg, top_stack_reg); if (GET_MODE (src) == TFmode)
push_rtx = gen_movtf (top_stack_reg, top_stack_reg);
else
push_rtx = gen_movxf (top_stack_reg, top_stack_reg);
push_insn = emit_insn_before (push_rtx, insn); push_insn = emit_insn_before (push_rtx, insn);
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD, top_stack_reg, REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD, top_stack_reg,
REG_NOTES (insn)); REG_NOTES (insn));
...@@ -1447,6 +1467,15 @@ subst_stack_regs_pat (insn, regstack, pat) ...@@ -1447,6 +1467,15 @@ subst_stack_regs_pat (insn, regstack, pat)
PATTERN (insn) = pat; PATTERN (insn) = pat;
move_for_stack_reg (insn, regstack, pat); move_for_stack_reg (insn, regstack, pat);
} }
if (! note && COMPLEX_MODE_P (GET_MODE (*dest))
&& get_hard_regnum (regstack, FP_MODE_REG (REGNO (*dest), DFmode)) == -1)
{
pat = gen_rtx_SET (VOIDmode,
FP_MODE_REG (REGNO (*dest) + 1, SFmode),
nan);
PATTERN (insn) = pat;
move_for_stack_reg (insn, regstack, pat);
}
} }
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment