summaryrefslogtreecommitdiff
path: root/gcc/reg-stack.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2001-04-11 14:10:22 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2001-04-11 12:10:22 +0000
commit037f20f16831bf88dfc5c459cd4299f925ee0df9 (patch)
tree661dac474986ac3c9041f90b5c8d52b65f6f5dae /gcc/reg-stack.c
parent01ef656387da241b1f72fde4f174c9cb3fae0e27 (diff)
downloadgcc-037f20f16831bf88dfc5c459cd4299f925ee0df9.tar.gz
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
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r--gcc/reg-stack.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index 6c204467423..e31338a37d4 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -906,6 +906,23 @@ emit_pop_insn (insn, regstack, reg, where)
rtx pop_insn, pop_rtx;
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);
if (hard_regno < FIRST_STACK_REG)
@@ -1129,9 +1146,12 @@ move_for_stack_reg (insn, regstack, pat)
stack is not full, and then write the value to memory via
a pop. */
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);
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD, top_stack_reg,
REG_NOTES (insn));
@@ -1447,6 +1467,15 @@ subst_stack_regs_pat (insn, regstack, pat)
PATTERN (insn) = 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;