]> gcc.gnu.org Git - gcc.git/commitdiff
i386.md (UNSPEC_C2_FLAG): New constant.
authorUros Bizjak <ubizjak@gmail.com>
Sat, 10 Mar 2007 12:52:52 +0000 (13:52 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Sat, 10 Mar 2007 12:52:52 +0000 (13:52 +0100)
        * config/i386/i386.md (UNSPEC_C2_FLAG): New constant.
        (fpremxf4_i387, fprem1xf4_i387): Use UNSPEC_C2_FLAG.
        (fmodxf3, fmod<mode>3, remainderxf3, remainder<mode>3):
        Add LABEL_NUSES to emmitted label.
        * config/i386/i386.c (ix86_emit_fp_unordered_jump): Add
        branch probability value to emmitted jump insn.
        * reg-stack.c (subst_stack_regs_pat)[UNSPEC]: Handle UNSPEC_C2_FLAG.
        Do not check life information and do not re-arrange input operands
        for UNSPEC_FSCALE_EXP, UNSPEC_FPREM_U and UNSPEC_FPREM1_U.

From-SVN: r122793

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.md
gcc/reg-stack.c

index 5e2f3ea58167d46678449a60fe296311321a7104..497177eb3e1e14e3bbbdc79cba95456a66663cc0 100644 (file)
@@ -1,3 +1,16 @@
+2007-03-10  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/31101
+       * config/i386/i386.md (UNSPEC_C2_FLAG): New constant.
+       (fpremxf4_i387, fprem1xf4_i387): Use UNSPEC_C2_FLAG.
+       (fmodxf3, fmod<mode>3, remainderxf3, remainder<mode>3):
+       Add LABEL_NUSES to emmitted label.
+       * config/i386/i386.c (ix86_emit_fp_unordered_jump): Add
+       branch probability value to emmitted jump insn.
+       * reg-stack.c (subst_stack_regs_pat)[UNSPEC]: Handle UNSPEC_C2_FLAG.
+       Do not check life information and do not re-arrange input operands
+       for UNSPEC_FSCALE_EXP, UNSPEC_FPREM_U and UNSPEC_FPREM1_U.
+
 2007-03-10  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        * config/sh/sh.c (sh_insn_length_adjustment): Adjust for
index 469d909b983a4b57a5ecccec7fced2c325a6c949..b4928ab5c7117328b8a66f6b7f9ae468df49e0f7 100644 (file)
@@ -21032,7 +21032,9 @@ ix86_emit_fp_unordered_jump (rtx label)
                              gen_rtx_LABEL_REF (VOIDmode, label),
                              pc_rtx);
   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
+
   emit_jump_insn (temp);
+  predict_jump (REG_BR_PROB_BASE * 10 / 100);
 }
 
 /* Output code to perform a log1p XFmode calculation.  */
index c0d447ef3939e10f24e0ffaf8eead5f3ff139a36..4ec12fa5c3681610a6546c6dbc3ab367f0b37677 100644 (file)
    (UNSPEC_FPREM1_F            90)
    (UNSPEC_FPREM1_U            91)
 
+   (UNSPEC_C2_FLAG             95)
+
    ; SSP patterns
    (UNSPEC_SP_SET              100)
    (UNSPEC_SP_TEST             101)
        (unspec:XF [(match_dup 2) (match_dup 3)]
                   UNSPEC_FPREM_U))
    (set (reg:CCFP FPSR_REG)
-       (unspec:CCFP [(const_int 0)] UNSPEC_NOP))]
+       (unspec:CCFP [(match_dup 2) (match_dup 3)]
+                    UNSPEC_C2_FLAG))]
   "TARGET_USE_FANCY_MATH_387"
   "fprem"
   [(set_attr "type" "fpspc")
   emit_insn (gen_fpremxf4_i387 (operands[1], operands[2],
                                operands[1], operands[2]));
   ix86_emit_fp_unordered_jump (label);
+  LABEL_NUSES (label) = 1;
 
   emit_move_insn (operands[0], operands[1]);
   DONE;
   emit_label (label);
   emit_insn (gen_fpremxf4_i387 (op1, op2, op1, op2));
   ix86_emit_fp_unordered_jump (label);
+  LABEL_NUSES (label) = 1;
 
   /* Truncate the result properly for strict SSE math.  */
   if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
        (unspec:XF [(match_dup 2) (match_dup 3)]
                   UNSPEC_FPREM1_U))
    (set (reg:CCFP FPSR_REG)
-       (unspec:CCFP [(const_int 0)] UNSPEC_NOP))]
+       (unspec:CCFP [(match_dup 2) (match_dup 3)]
+                    UNSPEC_C2_FLAG))]
   "TARGET_USE_FANCY_MATH_387"
   "fprem1"
   [(set_attr "type" "fpspc")
   emit_insn (gen_fprem1xf4_i387 (operands[1], operands[2],
                                 operands[1], operands[2]));
   ix86_emit_fp_unordered_jump (label);
+  LABEL_NUSES (label) = 1;
 
   emit_move_insn (operands[0], operands[1]);
   DONE;
 
   emit_insn (gen_fprem1xf4_i387 (op1, op2, op1, op2));
   ix86_emit_fp_unordered_jump (label);
+  LABEL_NUSES (label) = 1;
 
   /* Truncate the result properly for strict SSE math.  */
   if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
index 8413ca3a399eda04d1156b7d7d3ea3990b3690cf..0103a2f0475612856e764201fd152366ad8e11fc 100644 (file)
@@ -1759,7 +1759,7 @@ subst_stack_regs_pat (rtx insn, stack regstack, rtx pat)
              case UNSPEC_FSCALE_FRACT:
              case UNSPEC_FPREM_F:
              case UNSPEC_FPREM1_F:
-               /* These insns operate on the top two stack slots.
+               /* These insns operate on the top two stack slots,
                   first part of double input, double output insn.  */
 
                src1 = get_true_reg (&XVECEXP (pat_src, 0, 0));
@@ -1791,22 +1791,12 @@ subst_stack_regs_pat (rtx insn, stack regstack, rtx pat)
              case UNSPEC_FSCALE_EXP:
              case UNSPEC_FPREM_U:
              case UNSPEC_FPREM1_U:
-               /* These insns operate on the top two stack slots./
+               /* These insns operate on the top two stack slots,
                   second part of double input, double output insn.  */
 
                src1 = get_true_reg (&XVECEXP (pat_src, 0, 0));
                src2 = get_true_reg (&XVECEXP (pat_src, 0, 1));
 
-               src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
-               src2_note = find_regno_note (insn, REG_DEAD, REGNO (*src2));
-
-               /* Inputs should never die, they are
-                  replaced with outputs.  */
-               gcc_assert (!src1_note);
-               gcc_assert (!src2_note);
-
-               swap_to_top (insn, regstack, *src1, *src2);
-
                /* Push the result back onto stack. Fill empty slot from
                   first part of insn and fix top of stack pointer.  */
                if (STACK_REG_P (*dest))
@@ -1820,6 +1810,17 @@ subst_stack_regs_pat (rtx insn, stack regstack, rtx pat)
                replace_reg (src2, FIRST_STACK_REG + 1);
                break;
 
+             case UNSPEC_C2_FLAG:
+               /* This insn operates on the top two stack slots,
+                  third part of C2 setting double input insn.  */
+
+               src1 = get_true_reg (&XVECEXP (pat_src, 0, 0));
+               src2 = get_true_reg (&XVECEXP (pat_src, 0, 1));
+
+               replace_reg (src1, FIRST_STACK_REG);
+               replace_reg (src2, FIRST_STACK_REG + 1);
+               break;
+
              case UNSPEC_SAHF:
                /* (unspec [(unspec [(compare)] UNSPEC_FNSTSW)] UNSPEC_SAHF)
                   The combination matches the PPRO fcomi instruction.  */
This page took 0.153612 seconds and 5 git commands to generate.