Commit 604e3ff3 by Richard Henderson Committed by Richard Henderson

predicates.md (pmpyshr_operand): New.

        * config/ia64/predicates.md (pmpyshr_operand): New.
        * config/ia64/ia64.c (ia64_expand_unpack): New.
        (ia64_expand_widen_mul_v4hi): New.
        (ia64_expand_widen_sum): Update for pattern renames.
        (ia64_expand_dot_prod_v8qi): Likewise.
        * config/ia64/ia64-protos.h: Update.
        * config/ia64/vect.md (vecwider): New mode attribute.
        (vec_widen_umult_lo_v8qi, vec_widen_umult_hi_v8qi): New.
        (vec_widen_smult_lo_v8qi, vec_widen_smult_hi_v8qi): New.
        (pmpyshr2, pmpyshr2_u): New.
        (vec_widen_smult_lo_v4hi, vec_widen_smult_hi_v4hi): New.
        (vec_widen_umult_lo_v4hi, vec_widen_umult_hi_v4hi): New.
        (mulv2si3): New.
        (vec_pack_ssat_v4hi): Rename from pack2_sss.
        (vec_pack_usat_v4hi): Rename from *pack2_uss.
        (vec_pack_ssat_v2si): Rename from pack4_sss.
        (vec_interleave_lowv8qi): Rename from unpack1_l, use the correct
        vec_select operation.
        (vec_interleave_highv8qi): Similarly.
        (mux1_alt): Rename from *mux1_alt.
        (vec_extract_evenv8qi, vec_extract_oddv8qi): New.
        (vec_interleave_lowv4hi): Rename from unpack2_l.
        (vec_interleave_highv4hi): Rename from unpack2_h.
        (mix2_r): Rename from *mix2_r.
        (mix2_l): Similarly.
        (vec_extract_evenodd_helper): New.
        (vec_extract_evenv4hi, vec_extract_oddv4hi): New.
        (vec_interleave_lowv2si): Rename from *unpack4_l.
        (vec_interleave_highv2si): Rename from *unpack4_h.
        (vec_extract_evenv2si, vec_extract_oddv2si): New.
        (vec_interleave_lowv2sf): Rename from fmix_r.
        (vec_interleave_highv2sf): Rename from *fmix_l.
        (vec_extract_evenv2sf, vec_extract_oddv2sf): New.
        (vec_unpacku_lo_<VECINT12>, vec_unpacku_hi_<VECINT12>): New.
        (vec_unpacks_lo_<VECINT12>, vec_unpacks_hi_<VECINT12>): New.
        (vec_pack_trunc_v4hi, vec_pack_trunc_v2si): New.

testsuite:
        * lib/target-supports.exp (vect_widen_sum_hi_to_si_pattern,
        vect_widen_mult_hi_to_si, vect_sdot_qi, vect_udot_qi, vect_sdot_hi,
        vect_unpack, vect_int_mult, vect_extract_even_odd,
        vect_extract_even_odd_wide, vect_interleave): Enable for ia64.

From-SVN: r167136
parent 5eee6908
2010-11-24 Richard Henderson <rth@redhat.com>
* config/ia64/predicates.md (pmpyshr_operand): New.
* config/ia64/ia64.c (ia64_expand_unpack): New.
(ia64_expand_widen_mul_v4hi): New.
(ia64_expand_widen_sum): Update for pattern renames.
(ia64_expand_dot_prod_v8qi): Likewise.
* config/ia64/ia64-protos.h: Update.
* config/ia64/vect.md (vecwider): New mode attribute.
(vec_widen_umult_lo_v8qi, vec_widen_umult_hi_v8qi): New.
(vec_widen_smult_lo_v8qi, vec_widen_smult_hi_v8qi): New.
(pmpyshr2, pmpyshr2_u): New.
(vec_widen_smult_lo_v4hi, vec_widen_smult_hi_v4hi): New.
(vec_widen_umult_lo_v4hi, vec_widen_umult_hi_v4hi): New.
(mulv2si3): New.
(vec_pack_ssat_v4hi): Rename from pack2_sss.
(vec_pack_usat_v4hi): Rename from *pack2_uss.
(vec_pack_ssat_v2si): Rename from pack4_sss.
(vec_interleave_lowv8qi): Rename from unpack1_l, use the correct
vec_select operation.
(vec_interleave_highv8qi): Similarly.
(mux1_alt): Rename from *mux1_alt.
(vec_extract_evenv8qi, vec_extract_oddv8qi): New.
(vec_interleave_lowv4hi): Rename from unpack2_l.
(vec_interleave_highv4hi): Rename from unpack2_h.
(mix2_r): Rename from *mix2_r.
(mix2_l): Similarly.
(vec_extract_evenodd_helper): New.
(vec_extract_evenv4hi, vec_extract_oddv4hi): New.
(vec_interleave_lowv2si): Rename from *unpack4_l.
(vec_interleave_highv2si): Rename from *unpack4_h.
(vec_extract_evenv2si, vec_extract_oddv2si): New.
(vec_interleave_lowv2sf): Rename from fmix_r.
(vec_interleave_highv2sf): Rename from *fmix_l.
(vec_extract_evenv2sf, vec_extract_oddv2sf): New.
(vec_unpacku_lo_<VECINT12>, vec_unpacku_hi_<VECINT12>): New.
(vec_unpacks_lo_<VECINT12>, vec_unpacks_hi_<VECINT12>): New.
(vec_pack_trunc_v4hi, vec_pack_trunc_v2si): New.
2010-11-24 Nathan Froyd <froydnj@codesourcery.com>
* targhooks.c (default_except_unwind_info): Remove
......@@ -39,7 +39,9 @@ extern bool ia64_expand_movxf_movrf (enum machine_mode, rtx[]);
extern void ia64_expand_compare (rtx *, rtx *, rtx *);
extern void ia64_expand_vecint_cmov (rtx[]);
extern bool ia64_expand_vecint_minmax (enum rtx_code, enum machine_mode, rtx[]);
extern void ia64_expand_unpack (rtx [], bool, bool);
extern void ia64_expand_widen_sum (rtx[], bool);
extern void ia64_expand_widen_mul_v4hi (rtx [], bool, bool);
extern void ia64_expand_dot_prod_v8qi (rtx[], bool);
extern void ia64_expand_call (rtx, rtx, rtx, int);
extern void ia64_split_call (rtx, rtx, rtx, rtx, rtx, int, int);
......
......@@ -1972,6 +1972,44 @@ ia64_expand_vecint_minmax (enum rtx_code code, enum machine_mode mode,
return true;
}
/* Emit an integral vector unpack operation. */
void
ia64_expand_unpack (rtx operands[3], bool unsignedp, bool highp)
{
enum machine_mode mode = GET_MODE (operands[1]);
rtx (*gen) (rtx, rtx, rtx);
rtx x;
switch (mode)
{
case V8QImode:
gen = highp ? gen_vec_interleave_highv8qi : gen_vec_interleave_lowv8qi;
break;
case V4HImode:
gen = highp ? gen_vec_interleave_highv4hi : gen_vec_interleave_lowv4hi;
break;
default:
gcc_unreachable ();
}
/* Fill in x with the sign extension of each element in op1. */
if (unsignedp)
x = CONST0_RTX (mode);
else
{
bool neg;
x = gen_reg_rtx (mode);
neg = ia64_expand_vecint_compare (LT, mode, x, operands[1],
CONST0_RTX (mode));
gcc_assert (!neg);
}
emit_insn (gen (gen_lowpart (mode, operands[0]), operands[1], x));
}
/* Emit an integral vector widening sum operations. */
void
......@@ -1989,13 +2027,13 @@ ia64_expand_widen_sum (rtx operands[3], bool unsignedp)
switch (mode)
{
case V8QImode:
unpack_l = gen_unpack1_l;
unpack_h = gen_unpack1_h;
unpack_l = gen_vec_interleave_lowv8qi;
unpack_h = gen_vec_interleave_highv8qi;
plus = gen_addv4hi3;
break;
case V4HImode:
unpack_l = gen_unpack2_l;
unpack_h = gen_unpack2_h;
unpack_l = gen_vec_interleave_lowv4hi;
unpack_h = gen_vec_interleave_highv4hi;
plus = gen_addv2si3;
break;
default:
......@@ -2026,6 +2064,27 @@ ia64_expand_widen_sum (rtx operands[3], bool unsignedp)
emit_insn (plus (operands[0], h, s));
}
void
ia64_expand_widen_mul_v4hi (rtx operands[3], bool unsignedp, bool highp)
{
rtx l = gen_reg_rtx (V4HImode);
rtx h = gen_reg_rtx (V4HImode);
rtx (*mulhigh)(rtx, rtx, rtx, rtx);
rtx (*interl)(rtx, rtx, rtx);
emit_insn (gen_mulv4hi3 (l, operands[1], operands[2]));
/* For signed, pmpy2.r would appear to more closely match this operation.
However, the vectorizer is more likely to use the LO and HI patterns
in pairs. At which point, with this formulation, the first two insns
of each can be CSEd. */
mulhigh = unsignedp ? gen_pmpyshr2_u : gen_pmpyshr2;
emit_insn (mulhigh (h, operands[1], operands[2], GEN_INT (16)));
interl = highp ? gen_vec_interleave_highv4hi : gen_vec_interleave_lowv4hi;
emit_insn (interl (gen_lowpart (V4HImode, operands[0]), l, h));
}
/* Emit a signed or unsigned V8QI dot product operation. */
void
......@@ -2056,10 +2115,14 @@ ia64_expand_dot_prod_v8qi (rtx operands[4], bool unsignedp)
h1 = gen_reg_rtx (V4HImode);
h2 = gen_reg_rtx (V4HImode);
emit_insn (gen_unpack1_l (gen_lowpart (V8QImode, l1), operands[1], x1));
emit_insn (gen_unpack1_l (gen_lowpart (V8QImode, l2), operands[2], x2));
emit_insn (gen_unpack1_h (gen_lowpart (V8QImode, h1), operands[1], x1));
emit_insn (gen_unpack1_h (gen_lowpart (V8QImode, h2), operands[2], x2));
emit_insn (gen_vec_interleave_lowv8qi
(gen_lowpart (V8QImode, l1), operands[1], x1));
emit_insn (gen_vec_interleave_lowv8qi
(gen_lowpart (V8QImode, l2), operands[2], x2));
emit_insn (gen_vec_interleave_highv8qi
(gen_lowpart (V8QImode, h1), operands[1], x1));
emit_insn (gen_vec_interleave_highv8qi
(gen_lowpart (V8QImode, h2), operands[2], x2));
p1 = gen_reg_rtx (V2SImode);
p2 = gen_reg_rtx (V2SImode);
......
......@@ -526,6 +526,12 @@
INTVAL (op) == 1 || INTVAL (op) == 4 ||
INTVAL (op) == 8 || INTVAL (op) == 16")))
;; True if OP is one of the immediate values 0, 7, 15, 16
(define_predicate "pmpyshr_operand"
(and (match_code "const_int")
(match_test "INTVAL (op) == 0 || INTVAL (op) == 7
|| INTVAL (op) == 15 || INTVAL (op) == 16")))
;; True if OP is 0..3.
(define_predicate "const_int_2bit_operand"
(and (match_code "const_int")
......
2010-11-24 Richard Henderson <rth@redhat.com>
* lib/target-supports.exp (vect_widen_sum_hi_to_si_pattern,
vect_widen_mult_hi_to_si, vect_sdot_qi, vect_udot_qi, vect_sdot_hi,
vect_unpack, vect_int_mult, vect_extract_even_odd,
vect_extract_even_odd_wide, vect_interleave): Enable for ia64.
2010-11-24 H.J. Lu <hongjiu.lu@intel.com>
PR target/46519
......
......@@ -2518,7 +2518,8 @@ proc check_effective_target_vect_widen_sum_hi_to_si_pattern { } {
verbose "check_effective_target_vect_widen_sum_hi_to_si_pattern: using cached result" 2
} else {
set et_vect_widen_sum_hi_to_si_pattern_saved 0
if { [istarget powerpc*-*-*] } {
if { [istarget powerpc*-*-*]
|| [istarget ia64-*-*] } {
set et_vect_widen_sum_hi_to_si_pattern_saved 1
}
}
......@@ -2644,6 +2645,7 @@ proc check_effective_target_vect_widen_mult_hi_to_si { } {
}
if { [istarget powerpc*-*-*]
|| [istarget spu-*-*]
|| [istarget ia64-*-*]
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*] } {
set et_vect_widen_mult_hi_to_si_saved 1
......@@ -2665,6 +2667,9 @@ proc check_effective_target_vect_sdot_qi { } {
verbose "check_effective_target_vect_sdot_qi: using cached result" 2
} else {
set et_vect_sdot_qi_saved 0
if { [istarget ia64-*-*] } {
set et_vect_udot_qi_saved 1
}
}
verbose "check_effective_target_vect_sdot_qi: returning $et_vect_sdot_qi_saved" 2
return $et_vect_sdot_qi_saved
......@@ -2682,7 +2687,8 @@ proc check_effective_target_vect_udot_qi { } {
verbose "check_effective_target_vect_udot_qi: using cached result" 2
} else {
set et_vect_udot_qi_saved 0
if { [istarget powerpc*-*-*] } {
if { [istarget powerpc*-*-*]
|| [istarget ia64-*-*] } {
set et_vect_udot_qi_saved 1
}
}
......@@ -2703,6 +2709,7 @@ proc check_effective_target_vect_sdot_hi { } {
} else {
set et_vect_sdot_hi_saved 0
if { ([istarget powerpc*-*-*] && ![istarget powerpc-*-linux*paired*])
|| [istarget ia64-*-*]
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*] } {
set et_vect_sdot_hi_saved 1
......@@ -2774,6 +2781,7 @@ proc check_effective_target_vect_unpack { } {
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*]
|| [istarget spu-*-*]
|| [istarget ia64-*-*]
|| ([istarget arm*-*-*] && [check_effective_target_arm_neon]) } {
set et_vect_unpack_saved 1
}
......@@ -3050,6 +3058,7 @@ proc check_effective_target_vect_int_mult { } {
|| [istarget spu-*-*]
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*]
|| [istarget ia64-*-*]
|| [check_effective_target_arm32] } {
set et_vect_int_mult_saved 1
}
......@@ -3071,6 +3080,7 @@ proc check_effective_target_vect_extract_even_odd { } {
if { [istarget powerpc*-*-*]
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*]
|| [istarget ia64-*-*]
|| [istarget spu-*-*] } {
set et_vect_extract_even_odd_saved 1
}
......@@ -3093,6 +3103,7 @@ proc check_effective_target_vect_extract_even_odd_wide { } {
if { [istarget powerpc*-*-*]
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*]
|| [istarget ia64-*-*]
|| [istarget spu-*-*] } {
set et_vect_extract_even_odd_wide_saved 1
}
......@@ -3114,6 +3125,7 @@ proc check_effective_target_vect_interleave { } {
if { [istarget powerpc*-*-*]
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*]
|| [istarget ia64-*-*]
|| [istarget spu-*-*] } {
set et_vect_interleave_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