From 810cfbebfad8981bd8e4aea6a247ad4ee1c24ec0 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 6 Oct 2011 10:12:44 -0700 Subject: [PATCH] i386: Use the proper mode for blend in vshuffle. From-SVN: r179625 --- gcc/ChangeLog | 6 ++++++ gcc/config/i386/i386.c | 28 +++++++++++++++++++++------- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 89905f5..19516c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -7,6 +7,12 @@ (vshuffle): Use it. (avx_vec_concat): Rename from *vec_concat_avx. + * config/i386/i386.c (ix86_expand_sse_movcc): Use correct mode + for vector_all_ones_operand. + (ix86_expand_int_vcond): Distinguish between comparison mode + and data mode. Allow them to differ. + (ix86_expand_vshuffle): Don't force data mode to match maskmode. + 2001-10-06 Richard Henderson * optabs.c (expand_vec_shuffle_expr): Use the proper mode for the diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 9960fd2..2fdf540 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -18941,7 +18941,7 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false) enum machine_mode mode = GET_MODE (dest); rtx t2, t3, x; - if (vector_all_ones_operand (op_true, GET_MODE (op_true)) + if (vector_all_ones_operand (op_true, mode) && rtx_equal_p (op_false, CONST0_RTX (mode))) { emit_insn (gen_rtx_SET (VOIDmode, dest, cmp)); @@ -19170,7 +19170,8 @@ ix86_expand_fp_vcond (rtx operands[]) bool ix86_expand_int_vcond (rtx operands[]) { - enum machine_mode mode = GET_MODE (operands[0]); + enum machine_mode data_mode = GET_MODE (operands[0]); + enum machine_mode mode = GET_MODE (operands[4]); enum rtx_code code = GET_CODE (operands[3]); bool negate = false; rtx x, cop0, cop1; @@ -19297,8 +19298,21 @@ ix86_expand_int_vcond (rtx operands[]) } } - x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1, - operands[1+negate], operands[2-negate]); + /* Allow the comparison to be done in one mode, but the movcc to + happen in another mode. */ + if (data_mode == mode) + { + x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1, + operands[1+negate], operands[2-negate]); + } + else + { + gcc_assert (GET_MODE_SIZE (data_mode) == GET_MODE_SIZE (mode)); + x = ix86_expand_sse_cmp (gen_lowpart (mode, operands[0]), + code, cop0, cop1, + operands[1+negate], operands[2-negate]); + x = gen_lowpart (data_mode, x); + } ix86_expand_sse_movcc (operands[0], x, operands[1+negate], operands[2-negate]); @@ -19533,9 +19547,9 @@ ix86_expand_vshuffle (rtx operands[]) mask = expand_simple_binop (maskmode, AND, mask, vt, NULL_RTX, 0, OPTAB_DIRECT); - xops[0] = gen_lowpart (maskmode, operands[0]); - xops[1] = gen_lowpart (maskmode, t2); - xops[2] = gen_lowpart (maskmode, t1); + xops[0] = operands[0]; + xops[1] = gen_lowpart (mode, t2); + xops[2] = gen_lowpart (mode, t1); xops[3] = gen_rtx_EQ (maskmode, mask, vt); xops[4] = mask; xops[5] = vt; -- 2.7.4