aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/ia64/ia64.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/ia64/ia64.c')
-rw-r--r--gcc/config/ia64/ia64.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index 7b42235..57de975 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -397,6 +397,26 @@ gr_nonimmediate_operand (op, mode)
return 1;
}
+/* Return 1 if OP is a nonimmediate operand that is (or could be) a FR reg. */
+
+int
+fr_nonimmediate_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ if (! nonimmediate_operand (op, mode))
+ return 0;
+ if (GET_CODE (op) == SUBREG)
+ op = SUBREG_REG (op);
+ if (GET_CODE (op) == REG)
+ {
+ unsigned int regno = REGNO (op);
+ if (regno < FIRST_PSEUDO_REGISTER)
+ return FR_REGNO_P (regno);
+ }
+ return 1;
+}
+
/* Return 1 if OP is a nonimmediate operand that is a GR/FR reg. */
int
@@ -3484,6 +3504,12 @@ ia64_override_options ()
if (TARGET_AUTO_PIC)
target_flags |= MASK_CONST_GP;
+ if (TARGET_INLINE_DIV_LAT && TARGET_INLINE_DIV_THR)
+ {
+ warning ("cannot optimize division for both latency and throughput");
+ target_flags &= ~MASK_INLINE_DIV_THR;
+ }
+
if (ia64_fixed_range_string)
fix_range (ia64_fixed_range_string);
@@ -3971,6 +3997,11 @@ rtx_needs_barrier (x, flags, pred)
case 21: /* flushrs */
break;
+ case 5: /* recip_approx */
+ need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
+ need_barrier |= rtx_needs_barrier (XVECEXP (x, 0, 1), flags, pred);
+ break;
+
case 13: /* cmpxchg_acq */
need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 1), flags, pred);
need_barrier |= rtx_needs_barrier (XVECEXP (x, 0, 2), flags, pred);