From 3148ad6d93bbe2414b3c973adc501337a9de91d3 Mon Sep 17 00:00:00 2001 From: Dale Johannesen Date: Tue, 16 Apr 2002 15:25:30 +0000 Subject: [PATCH] rs6000.c (rs6000_emit_cmove): Fail if modes of comparison operands do not match each other or if... 2002-04-16 Dale Johannesen * config/rs6000/rs6000.c (rs6000_emit_cmove): Fail if modes of comparison operands do not match each other or if modes of conditions do not match result. From-SVN: r52367 --- gcc/ChangeLog | 6 +++++ gcc/config/rs6000/rs6000.c | 49 ++++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 99828fd41c7..0ff5bff7d7f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-04-16 Dale Johannesen + + * config/rs6000/rs6000.c (rs6000_emit_cmove): Fail if modes of + comparison operands do not match each other or if modes of + conditions do not match result. + 2002-04-16 Hartmut Penner PR target/6305 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 04098107f75..efd3a0b837c 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -7245,9 +7245,18 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond) rtx op0 = rs6000_compare_op0; rtx op1 = rs6000_compare_op1; REAL_VALUE_TYPE c1; - enum machine_mode mode = GET_MODE (op0); + enum machine_mode compare_mode = GET_MODE (op0); + enum machine_mode result_mode = GET_MODE (dest); rtx temp; + /* These modes should always match. */ + if ( GET_MODE (op1) != compare_mode ) + return 0; + if ( GET_MODE (true_cond) != result_mode ) + return 0; + if ( GET_MODE (false_cond) != result_mode ) + return 0; + /* First, work out if the hardware can do this at all, or if it's too slow... */ /* If the comparison is an integer one, since we only have fsel @@ -7290,11 +7299,11 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond) /* At this point we know we can use fsel. */ /* Reduce the comparison to a comparison against zero. */ - temp = gen_reg_rtx (mode); + temp = gen_reg_rtx (compare_mode); emit_insn (gen_rtx_SET (VOIDmode, temp, - gen_rtx_MINUS (mode, op0, op1))); + gen_rtx_MINUS (compare_mode, op0, op1))); op0 = temp; - op1 = CONST0_RTX (mode); + op1 = CONST0_RTX (compare_mode); /* If we don't care about NaNs we can reduce some of the comparisons down to faster ones. */ @@ -7324,52 +7333,52 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond) break; case LE: - temp = gen_reg_rtx (mode); - emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (mode, op0))); + temp = gen_reg_rtx (compare_mode); + emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0))); op0 = temp; break; case ORDERED: - temp = gen_reg_rtx (mode); - emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (mode, op0))); + temp = gen_reg_rtx (compare_mode); + emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0))); op0 = temp; break; case EQ: - temp = gen_reg_rtx (mode); + temp = gen_reg_rtx (compare_mode); emit_insn (gen_rtx_SET (VOIDmode, temp, - gen_rtx_NEG (mode, - gen_rtx_ABS (mode, op0)))); + gen_rtx_NEG (compare_mode, + gen_rtx_ABS (compare_mode, op0)))); op0 = temp; break; case UNGE: - temp = gen_reg_rtx (mode); + temp = gen_reg_rtx (result_mode); emit_insn (gen_rtx_SET (VOIDmode, temp, - gen_rtx_IF_THEN_ELSE (mode, + gen_rtx_IF_THEN_ELSE (result_mode, gen_rtx_GE (VOIDmode, op0, op1), true_cond, false_cond))); false_cond = temp; true_cond = false_cond; - temp = gen_reg_rtx (mode); - emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (mode, op0))); + temp = gen_reg_rtx (compare_mode); + emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0))); op0 = temp; break; case GT: - temp = gen_reg_rtx (mode); + temp = gen_reg_rtx (result_mode); emit_insn (gen_rtx_SET (VOIDmode, temp, - gen_rtx_IF_THEN_ELSE (mode, + gen_rtx_IF_THEN_ELSE (result_mode, gen_rtx_GE (VOIDmode, op0, op1), true_cond, false_cond))); true_cond = temp; false_cond = true_cond; - temp = gen_reg_rtx (mode); - emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (mode, op0))); + temp = gen_reg_rtx (compare_mode); + emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0))); op0 = temp; break; @@ -7378,7 +7387,7 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond) } emit_insn (gen_rtx_SET (VOIDmode, dest, - gen_rtx_IF_THEN_ELSE (GET_MODE (dest), + gen_rtx_IF_THEN_ELSE (result_mode, gen_rtx_GE (VOIDmode, op0, op1), true_cond, false_cond)));