Commit b565a316 by Richard Kenner

*** empty log message ***

From-SVN: r1213
parent 7c0891a1
...@@ -1170,7 +1170,7 @@ while (0) ...@@ -1170,7 +1170,7 @@ while (0)
For floating-point equality comparisons, CCFPEQmode should be used. For floating-point equality comparisons, CCFPEQmode should be used.
VOIDmode should be used in all other cases. */ VOIDmode should be used in all other cases. */
#define SELECT_CC_MODE(OP,X) \ #define SELECT_CC_MODE(OP,X,Y) \
(GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \ (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
&& ((OP) == EQ || (OP) == NE) ? CCFPEQmode : CCmode) && ((OP) == EQ || (OP) == NE) ? CCFPEQmode : CCmode)
......
...@@ -1631,7 +1631,7 @@ gen_compare_reg (code, x, y) ...@@ -1631,7 +1631,7 @@ gen_compare_reg (code, x, y)
enum rtx_code code; enum rtx_code code;
rtx x, y; rtx x, y;
{ {
enum machine_mode mode = SELECT_CC_MODE (code, x); enum machine_mode mode = SELECT_CC_MODE (code, x, y);
rtx cc_reg = gen_rtx (REG, mode, 0); rtx cc_reg = gen_rtx (REG, mode, 0);
emit_insn (gen_rtx (SET, VOIDmode, cc_reg, emit_insn (gen_rtx (SET, VOIDmode, cc_reg,
......
...@@ -1288,7 +1288,7 @@ while (0) ...@@ -1288,7 +1288,7 @@ while (0)
should be used. CC_NOOVmode should be used when the first operand is a should be used. CC_NOOVmode should be used when the first operand is a
PLUS, MINUS, or NEG. CCmode should be used when no special processing is PLUS, MINUS, or NEG. CCmode should be used when no special processing is
needed. */ needed. */
#define SELECT_CC_MODE(OP,X) \ #define SELECT_CC_MODE(OP,X,Y) \
(GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT ? CCFPmode : CCmode) \ (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT ? CCFPmode : CCmode) \
/* A function address in a call instruction /* A function address in a call instruction
......
...@@ -1268,7 +1268,7 @@ struct rs6000_args {int words, fregno, nargs_prototype; }; ...@@ -1268,7 +1268,7 @@ struct rs6000_args {int words, fregno, nargs_prototype; };
CCEQmode should be used when we are doing an inequality comparison on CCEQmode should be used when we are doing an inequality comparison on
the result of a comparison. CCmode should be used in all other cases. */ the result of a comparison. CCmode should be used in all other cases. */
#define SELECT_CC_MODE(OP,X) \ #define SELECT_CC_MODE(OP,X,Y) \
(GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT ? CCFPmode \ (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT ? CCFPmode \
: (OP) == GTU || (OP) == LTU || (OP) == GEU || (OP) == LEU ? CCUNSmode \ : (OP) == GTU || (OP) == LTU || (OP) == GEU || (OP) == LEU ? CCUNSmode \
: (((OP) == EQ || (OP) == NE) && GET_RTX_CLASS (GET_CODE (X)) == '<' \ : (((OP) == EQ || (OP) == NE) && GET_RTX_CLASS (GET_CODE (X)) == '<' \
......
...@@ -2376,6 +2376,11 @@ subst_constants (loc, insn, map) ...@@ -2376,6 +2376,11 @@ subst_constants (loc, insn, map)
op_mode = GET_MODE (XEXP (x, 1)); op_mode = GET_MODE (XEXP (x, 1));
new = simplify_relational_operation (code, op_mode, new = simplify_relational_operation (code, op_mode,
XEXP (x, 0), XEXP (x, 1)); XEXP (x, 0), XEXP (x, 1));
#ifdef FLOAT_STORE_FLAG_VALUE
if (new != 0 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
new = ((new == const0_rtx) ? CONST0_RTX (GET_MODE (x))
: immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, GET_MODE (x)));
#endif
break; break;
} }
......
...@@ -6254,18 +6254,32 @@ get_condition (jump, earliest) ...@@ -6254,18 +6254,32 @@ get_condition (jump, earliest)
enum machine_mode inner_mode = GET_MODE (SET_SRC (set)); enum machine_mode inner_mode = GET_MODE (SET_SRC (set));
if ((GET_CODE (SET_SRC (set)) == COMPARE if ((GET_CODE (SET_SRC (set)) == COMPARE
|| ((code == NE || (((code == NE
|| (code == LT || (code == LT
&& GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_INT && GET_MODE_CLASS (inner_mode) == MODE_INT
&& (STORE_FLAG_VALUE && GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_INT
& (1 << (GET_MODE_BITSIZE (inner_mode) - 1))))) && (STORE_FLAG_VALUE
& (1 << (GET_MODE_BITSIZE (inner_mode) - 1))))
#ifdef FLOAT_STORE_FLAG_VALUE
|| (code == LT
&& GET_MODE_CLASS (inner_mode) == MODE_FLOAT
&& FLOAT_STORE_FLAG_VALUE < 0)
#endif
))
&& GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'))) && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<')))
x = SET_SRC (set); x = SET_SRC (set);
else if ((code == EQ else if (((code == EQ
|| (code == GE || (code == GE
&& GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_INT && GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_INT
&& (STORE_FLAG_VALUE && GET_MODE_CLASS (inner_mode) == MODE_INT
& (1 << (GET_MODE_BITSIZE (inner_mode) - 1))))) && (STORE_FLAG_VALUE
& (1 << (GET_MODE_BITSIZE (inner_mode) - 1))))
#ifdef FLOAT_STORE_FLAG_VALUE
|| (code == GE
&& GET_MODE_CLASS (inner_mode) == MODE_FLOAT
&& FLOAT_STORE_FLAG_VALUE < 0)
#eneif
))
&& GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<') && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<')
{ {
/* We might have reversed a LT to get a GE here. But this wasn't /* We might have reversed a LT to get a GE here. But this wasn't
......
...@@ -194,15 +194,6 @@ extern char * strrchr (); ...@@ -194,15 +194,6 @@ extern char * strrchr ();
#define STRINGIFY(STRING) "STRING" #define STRINGIFY(STRING) "STRING"
#endif #endif
/* POSIX systems will not have definitions for WIFEXITED or WEXITSTATUS.
Define them correctly and so that they work for all environments. */
#undef WIFEXITED
#define WIFEXITED(status_word) ((*((int *)&status_word) & 0xff) == 0x00)
#undef WEXITSTATUS
#define WEXITSTATUS(status_word) ((*((int *)&status_word) & 0xff00) >> 8)
/* Define a default place to find the SYSCALLS.X file. */ /* Define a default place to find the SYSCALLS.X file. */
#ifndef STD_PROTO_DIR #ifndef STD_PROTO_DIR
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment