diff options
author | Uros Bizjak <uros@kss-loka.si> | 2005-03-29 07:46:46 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2005-03-29 07:46:46 +0200 |
commit | 6e858d450b5a9774494ce68c5084f7dc9a9d2138 (patch) | |
tree | 6d42464074095f61a71de55b917919194d52861a /gcc/reg-stack.c | |
parent | 2fa330b29a650365d4d88e4407fdbc2934dcb1b4 (diff) | |
download | gcc-6e858d450b5a9774494ce68c5084f7dc9a9d2138.zip gcc-6e858d450b5a9774494ce68c5084f7dc9a9d2138.tar.gz gcc-6e858d450b5a9774494ce68c5084f7dc9a9d2138.tar.bz2 |
reg-stack.c (subst_stack_regs_pat): Handle <UNSPEC_FIST> case.
* reg-stack.c (subst_stack_regs_pat): Handle <UNSPEC_FIST> case.
* config/i386/i386.c (output_fix_trunc): Add new round_mode
variable. Output "fldcw" depending on round_mode.
* config/i386/i386.md (UNSPEC_FIST): New.
(fistdi2, fistdi2_with_temp, fist<mode>2, fist<mode>2_with_temp):
New isns patterns to implement lrint and llrint built-ins as x87
intrinsic function.
(fistdi2, fist<mode>2 splitters): New splitters.
(lrint<mode>2): New expanders.
From-SVN: r97151
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r-- | gcc/reg-stack.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index e92e73c..6f58341 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -1672,6 +1672,27 @@ subst_stack_regs_pat (rtx insn, stack regstack, rtx pat) case UNSPEC: switch (XINT (pat_src, 1)) { + case UNSPEC_FIST: + /* These insns only operate on the top of the stack. */ + + src1 = get_true_reg (&XVECEXP (pat_src, 0, 0)); + emit_swap_insn (insn, regstack, *src1); + + src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1)); + + if (STACK_REG_P (*dest)) + replace_reg (dest, FIRST_STACK_REG); + + if (src1_note) + { + replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG); + regstack->top--; + CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (*src1)); + } + + replace_reg (src1, FIRST_STACK_REG); + break; + case UNSPEC_SIN: case UNSPEC_COS: case UNSPEC_FRNDINT: |