diff options
author | Kelvin Nilsen <kelvin@gcc.gnu.org> | 2020-05-11 10:04:03 -0500 |
---|---|---|
committer | Bill Schmidt <wschmidt@linux.ibm.com> | 2020-05-11 10:04:03 -0500 |
commit | 894ac7bce590dc5036c7f1477b881dc767ce2e5a (patch) | |
tree | d9db3eeb9215e08be7f2d60f934326d31d29ad9a /gcc/config | |
parent | a1821a249d998894dd38b14d5298647e8d7b5dc8 (diff) |
rs6000: Add vector pdep/pext
Add support for the vpdepd and vpextd instructions that perform
vector parallel bit deposit and vector parallel bit extract.
[gcc]
2020-05-11 Kelvin Nilsen <kelvin@gcc.gnu.org>
Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/altivec.h (vec_pdep): New macro implementing new
built-in function.
(vec_pext): Likewise.
* config/rs6000/altivec.md (UNSPEC_VPDEPD): New constant.
(UNSPEC_VPEXTD): Likewise.
(vpdepd): New insn.
(vpextd): Likewise.
* config/rs6000/rs6000-builtin.def (__builtin_altivec_vpdepd): New
built-in function.
(__builtin_altivec_vpextd): Likewise.
* config/rs6000/rs6000-call.c (builtin_function_type): Add
handling for FUTURE_BUILTIN_VPDEPD and FUTURE_BUILTIN_VPEXTD
cases.
* doc/extend.texi (PowerPC Altivec Built-in Functions Available
for a Future Architecture): Add description of vec_pdep and
vec_pext built-in functions.
[gcc/testsuite]
2020-05-11 Kelvin Nilsen <kelvin@gcc.gnu.org>
* gcc.target/powerpc/vec-pdep-0.c: New.
* gcc.target/powerpc/vec-pdep-1.c: New.
* gcc.target/powerpc/vec-pext-0.c: New.
* gcc.target/powerpc/vec-pext-1.c: New.
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/rs6000/altivec.h | 3 | ||||
-rw-r--r-- | gcc/config/rs6000/altivec.md | 20 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000-builtin.def | 2 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000-call.c | 2 |
4 files changed, 27 insertions, 0 deletions
diff --git a/gcc/config/rs6000/altivec.h b/gcc/config/rs6000/altivec.h index e1e75ad0f1e..12dfcd8d2bf 100644 --- a/gcc/config/rs6000/altivec.h +++ b/gcc/config/rs6000/altivec.h @@ -691,6 +691,9 @@ __altivec_scalar_pred(vec_any_nle, with support for different vector argument and result types. */ #define vec_clzm(a, b) __builtin_altivec_vclzdm (a, b) #define vec_ctzm(a, b) __builtin_altivec_vctzdm (a, b) +#define vec_pdep(a, b) __builtin_altivec_vpdepd (a, b) +#define vec_pext(a, b) __builtin_altivec_vpextd (a, b) + #endif #endif /* _ALTIVEC_H */ diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index 5ef4889ba55..33ba57855bc 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -162,6 +162,8 @@ UNSPEC_VRLNM UNSPEC_VCLZDM UNSPEC_VCTZDM + UNSPEC_VPDEPD + UNSPEC_VPEXTD ]) (define_c_enum "unspecv" @@ -4116,6 +4118,24 @@ "vctzdm %0,%1,%2" [(set_attr "type" "vecsimple")]) +(define_insn "vpdepd" + [(set (match_operand:V2DI 0 "altivec_register_operand" "=v") + (unspec:V2DI [(match_operand:V2DI 1 "altivec_register_operand" "v") + (match_operand:V2DI 2 "altivec_register_operand" "v")] + UNSPEC_VPDEPD))] + "TARGET_FUTURE" + "vpdepd %0,%1,%2" + [(set_attr "type" "vecsimple")]) + +(define_insn "vpextd" + [(set (match_operand:V2DI 0 "altivec_register_operand" "=v") + (unspec:V2DI [(match_operand:V2DI 1 "altivec_register_operand" "v") + (match_operand:V2DI 2 "altivec_register_operand" "v")] + UNSPEC_VPEXTD))] + "TARGET_FUTURE" + "vpextd %0,%1,%2" + [(set_attr "type" "vecsimple")]) + (define_expand "bcd<bcd_add_sub>_<code>" [(parallel [(set (reg:CCFP CR6_REGNO) diff --git a/gcc/config/rs6000/rs6000-builtin.def b/gcc/config/rs6000/rs6000-builtin.def index 9293e7cf4fb..776fc542ebf 100644 --- a/gcc/config/rs6000/rs6000-builtin.def +++ b/gcc/config/rs6000/rs6000-builtin.def @@ -2518,6 +2518,8 @@ BU_P9_OVERLOAD_2 (CMPEQB, "byte_in_set") /* Future architecture vector built-ins. */ BU_FUTURE_V_2 (VCLZDM, "vclzdm", CONST, vclzdm) BU_FUTURE_V_2 (VCTZDM, "vctzdm", CONST, vctzdm) +BU_FUTURE_V_2 (VPDEPD, "vpdepd", CONST, vpdepd) +BU_FUTURE_V_2 (VPEXTD, "vpextd", CONST, vpextd) /* 1 argument crypto functions. */ BU_CRYPTO_1 (VSBOX, "vsbox", CONST, crypto_vsbox_v2di) diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c index 2a4ce5bd340..ab6ba576605 100644 --- a/gcc/config/rs6000/rs6000-call.c +++ b/gcc/config/rs6000/rs6000-call.c @@ -12928,6 +12928,8 @@ builtin_function_type (machine_mode mode_ret, machine_mode mode_arg0, case P8V_BUILTIN_ORC_V1TI_UNS: case FUTURE_BUILTIN_VCLZDM: case FUTURE_BUILTIN_VCTZDM: + case FUTURE_BUILTIN_VPDEPD: + case FUTURE_BUILTIN_VPEXTD: h.uns_p[0] = 1; h.uns_p[1] = 1; h.uns_p[2] = 1; |