Commit 69d3d957 by Jakub Jelinek Committed by Jakub Jelinek

vector.md (vcondv4sfv4si, [...]): New patterns.

	* config/rs6000/vector.md (vcondv4sfv4si, vcondv4siv4sf,
	vconduv4sfv4si): New patterns.
	* config/rs6000/rs6000.c (rs6000_emit_vector_cond_expr): Handle
	different dest_mode from comparison mode.

	* lib/target-supports.exp (check_effective_target_vect_cond_mixed):
	Enable also for powerpc*-*-*.

From-SVN: r181202
parent 7298eef3
2011-11-09 Jakub Jelinek <jakub@redhat.com>
* config/rs6000/vector.md (vcondv4sfv4si, vcondv4siv4sf,
vconduv4sfv4si): New patterns.
* config/rs6000/rs6000.c (rs6000_emit_vector_cond_expr): Handle
different dest_mode from comparison mode.
2011-11-09 Richard Guenther <rguenther@suse.de> 2011-11-09 Richard Guenther <rguenther@suse.de>
* gimple-fold.c (canonicalize_constructor_val): Mark * gimple-fold.c (canonicalize_constructor_val): Mark
...@@ -16775,6 +16775,7 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false, ...@@ -16775,6 +16775,7 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
rtx cond, rtx cc_op0, rtx cc_op1) rtx cond, rtx cc_op0, rtx cc_op1)
{ {
enum machine_mode dest_mode = GET_MODE (dest); enum machine_mode dest_mode = GET_MODE (dest);
enum machine_mode mask_mode = GET_MODE (cc_op0);
enum rtx_code rcode = GET_CODE (cond); enum rtx_code rcode = GET_CODE (cond);
enum machine_mode cc_mode = CCmode; enum machine_mode cc_mode = CCmode;
rtx mask; rtx mask;
...@@ -16785,6 +16786,9 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false, ...@@ -16785,6 +16786,9 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
if (VECTOR_UNIT_NONE_P (dest_mode)) if (VECTOR_UNIT_NONE_P (dest_mode))
return 0; return 0;
gcc_assert (GET_MODE_SIZE (dest_mode) == GET_MODE_SIZE (mask_mode)
&& GET_MODE_NUNITS (dest_mode) == GET_MODE_NUNITS (mask_mode));
switch (rcode) switch (rcode)
{ {
/* Swap operands if we can, and fall back to doing the operation as /* Swap operands if we can, and fall back to doing the operation as
...@@ -16815,7 +16819,7 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false, ...@@ -16815,7 +16819,7 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
} }
/* Get the vector mask for the given relational operations. */ /* Get the vector mask for the given relational operations. */
mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode); mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, mask_mode);
if (!mask) if (!mask)
return 0; return 0;
...@@ -16827,7 +16831,8 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false, ...@@ -16827,7 +16831,8 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
op_false = tmp; op_false = tmp;
} }
cond2 = gen_rtx_fmt_ee (NE, cc_mode, mask, CONST0_RTX (dest_mode)); cond2 = gen_rtx_fmt_ee (NE, cc_mode, gen_lowpart (dest_mode, mask),
CONST0_RTX (dest_mode));
emit_insn (gen_rtx_SET (VOIDmode, emit_insn (gen_rtx_SET (VOIDmode,
dest, dest,
gen_rtx_IF_THEN_ELSE (dest_mode, gen_rtx_IF_THEN_ELSE (dest_mode,
......
...@@ -406,6 +406,44 @@ ...@@ -406,6 +406,44 @@
FAIL; FAIL;
}") }")
(define_expand "vcondv4sfv4si"
[(set (match_operand:V4SF 0 "vfloat_operand" "")
(if_then_else:V4SF
(match_operator 3 "comparison_operator"
[(match_operand:V4SI 4 "vint_operand" "")
(match_operand:V4SI 5 "vint_operand" "")])
(match_operand:V4SF 1 "vfloat_operand" "")
(match_operand:V4SF 2 "vfloat_operand" "")))]
"VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
&& VECTOR_UNIT_ALTIVEC_P (V4SImode)"
"
{
if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2],
operands[3], operands[4], operands[5]))
DONE;
else
FAIL;
}")
(define_expand "vcondv4siv4sf"
[(set (match_operand:V4SI 0 "vint_operand" "")
(if_then_else:V4SI
(match_operator 3 "comparison_operator"
[(match_operand:V4SF 4 "vfloat_operand" "")
(match_operand:V4SF 5 "vfloat_operand" "")])
(match_operand:V4SI 1 "vint_operand" "")
(match_operand:V4SI 2 "vint_operand" "")))]
"VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
&& VECTOR_UNIT_ALTIVEC_P (V4SImode)"
"
{
if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2],
operands[3], operands[4], operands[5]))
DONE;
else
FAIL;
}")
(define_expand "vcondu<mode><mode>" (define_expand "vcondu<mode><mode>"
[(set (match_operand:VEC_I 0 "vint_operand" "") [(set (match_operand:VEC_I 0 "vint_operand" "")
(if_then_else:VEC_I (if_then_else:VEC_I
...@@ -424,6 +462,25 @@ ...@@ -424,6 +462,25 @@
FAIL; FAIL;
}") }")
(define_expand "vconduv4sfv4si"
[(set (match_operand:V4SF 0 "vfloat_operand" "")
(if_then_else:V4SF
(match_operator 3 "comparison_operator"
[(match_operand:V4SI 4 "vint_operand" "")
(match_operand:V4SI 5 "vint_operand" "")])
(match_operand:V4SF 1 "vfloat_operand" "")
(match_operand:V4SF 2 "vfloat_operand" "")))]
"VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
&& VECTOR_UNIT_ALTIVEC_P (V4SImode)"
"
{
if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2],
operands[3], operands[4], operands[5]))
DONE;
else
FAIL;
}")
(define_expand "vector_eq<mode>" (define_expand "vector_eq<mode>"
[(set (match_operand:VEC_C 0 "vlogical_operand" "") [(set (match_operand:VEC_C 0 "vlogical_operand" "")
(eq:VEC_C (match_operand:VEC_C 1 "vlogical_operand" "") (eq:VEC_C (match_operand:VEC_C 1 "vlogical_operand" "")
......
2011-11-09 Jakub Jelinek <jakub@redhat.com>
* lib/target-supports.exp (check_effective_target_vect_cond_mixed):
Enable also for powerpc*-*-*.
2011-11-09 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> 2011-11-09 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/50540 PR fortran/50540
......
...@@ -3354,7 +3354,8 @@ proc check_effective_target_vect_cond_mixed { } { ...@@ -3354,7 +3354,8 @@ proc check_effective_target_vect_cond_mixed { } {
} else { } else {
set et_vect_cond_mixed_saved 0 set et_vect_cond_mixed_saved 0
if { [istarget i?86-*-*] if { [istarget i?86-*-*]
|| [istarget x86_64-*-*] } { || [istarget x86_64-*-*]
|| [istarget powerpc*-*-*] } {
set et_vect_cond_mixed_saved 1 set et_vect_cond_mixed_saved 1
} }
} }
......
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