diff options
author | Uros Bizjak <uros@kss-loka.si> | 2005-03-29 05:46:46 +0000 |
---|---|---|
committer | Uros Bizjak <uros@kss-loka.si> | 2005-03-29 05:46:46 +0000 |
commit | b0bfb2075c9d04428821d13f0f2432fa2b4c2267 (patch) | |
tree | 6d42464074095f61a71de55b917919194d52861a /gcc/reg-stack.c | |
parent | 3860ae204b48c036801c8262031ad25418007be3 (diff) |
* 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.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@97151 138bc75d-0d04-0410-961f-82ee72b054a4
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 e92e73cbf54..6f58341ba27 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: |