This adds support for 5 new builtins. gcc/ChangeLog:
* config/s390/s390-builtin-types.def (BT_FN_V4SF_V8HI_UINT): New builtin signature. (BT_FN_V8HI_V8HI_UINT): Likewise. (BT_FN_V8HI_V4SF_V4SF_UINT): Likewise. * config/s390/s390-builtins.def (B_NNPA): New macro definition. (s390_vclfnhs, s390_vclfnls, s390_vcrnfs, s390_vcfn, s390_vcnf): New builtin definitions. * config/s390/s390-c.c (s390_cpu_cpp_builtins_internal): Bump vector extension version. * config/s390/s390.c (s390_expand_builtin): Check if builtins are available with current -march level. * config/s390/s390.md (UNSPEC_NNPA_VCLFNHS_V8HI) (UNSPEC_NNPA_VCLFNLS_V8HI, UNSPEC_NNPA_VCRNFS_V8HI) (UNSPEC_NNPA_VCFN_V8HI, UNSPEC_NNPA_VCNF_V8HI): New constants. * config/s390/vecintrin.h (vec_extend_to_fp32_hi): New macro. (vec_extend_to_fp32_lo): Likewise. (vec_round_from_fp32): Likewise. (vec_convert_to_fp16): Likewise. (vec_convert_from_fp16): Likewise. * config/s390/vx-builtins.md (vclfnhs_v8hi): New insn pattern. (vclfnls_v8hi): Likewise. (vcrnfs_v8hi): Likewise. (vcfn_v8hi): Likewise. (vcnf_v8hi): Likewise. gcc/testsuite/ChangeLog: * gcc.target/s390/zvector/vec-nnpa-fp16-convert.c: New test. * gcc.target/s390/zvector/vec-nnpa-fp32-convert-1.c: New test. * gcc.target/s390/zvector/vec_convert_from_fp16.c: New test. * gcc.target/s390/zvector/vec_convert_to_fp16.c: New test. * gcc.target/s390/zvector/vec_extend_to_fp32_hi.c: New test. * gcc.target/s390/zvector/vec_extend_to_fp32_lo.c: New test. * gcc.target/s390/zvector/vec_round_from_fp32.c: New test. --- gcc/config/s390/s390-builtin-types.def | 3 + gcc/config/s390/s390-builtins.def | 12 ++++ gcc/config/s390/s390-c.c | 2 +- gcc/config/s390/s390.c | 6 ++ gcc/config/s390/s390.md | 7 +++ gcc/config/s390/vecintrin.h | 6 ++ gcc/config/s390/vx-builtins.md | 55 +++++++++++++++++++ .../s390/zvector/vec-nnpa-fp16-convert.c | 34 ++++++++++++ .../s390/zvector/vec-nnpa-fp32-convert-1.c | 27 +++++++++ .../s390/zvector/vec_convert_from_fp16.c | 12 ++++ .../s390/zvector/vec_convert_to_fp16.c | 12 ++++ .../s390/zvector/vec_extend_to_fp32_hi.c | 12 ++++ .../s390/zvector/vec_extend_to_fp32_lo.c | 12 ++++ .../s390/zvector/vec_round_from_fp32.c | 12 ++++ 14 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/s390/zvector/vec-nnpa-fp16-convert.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/vec-nnpa-fp32-convert-1.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/vec_convert_from_fp16.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/vec_convert_to_fp16.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/vec_extend_to_fp32_hi.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/vec_extend_to_fp32_lo.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/vec_round_from_fp32.c diff --git a/gcc/config/s390/s390-builtin-types.def b/gcc/config/s390/s390-builtin-types.def index a2b7d4a9a32..52ef5728539 100644 --- a/gcc/config/s390/s390-builtin-types.def +++ b/gcc/config/s390/s390-builtin-types.def @@ -267,6 +267,7 @@ DEF_FN_TYPE_2 (BT_FN_V2DI_V4SI_V4SI, BT_V2DI, BT_V4SI, BT_V4SI) DEF_FN_TYPE_2 (BT_FN_V4SF_FLT_INT, BT_V4SF, BT_FLT, BT_INT) DEF_FN_TYPE_2 (BT_FN_V4SF_V4SF_UCHAR, BT_V4SF, BT_V4SF, BT_UCHAR) DEF_FN_TYPE_2 (BT_FN_V4SF_V4SF_V4SF, BT_V4SF, BT_V4SF, BT_V4SF) +DEF_FN_TYPE_2 (BT_FN_V4SF_V8HI_UINT, BT_V4SF, BT_V8HI, BT_UINT) DEF_FN_TYPE_2 (BT_FN_V4SI_BV4SI_V4SI, BT_V4SI, BT_BV4SI, BT_V4SI) DEF_FN_TYPE_2 (BT_FN_V4SI_INT_VOIDCONSTPTR, BT_V4SI, BT_INT, BT_VOIDCONSTPTR) DEF_FN_TYPE_2 (BT_FN_V4SI_UV4SI_UV4SI, BT_V4SI, BT_UV4SI, BT_UV4SI) @@ -278,6 +279,7 @@ DEF_FN_TYPE_2 (BT_FN_V8HI_BV8HI_V8HI, BT_V8HI, BT_BV8HI, BT_V8HI) DEF_FN_TYPE_2 (BT_FN_V8HI_UV8HI_UV8HI, BT_V8HI, BT_UV8HI, BT_UV8HI) DEF_FN_TYPE_2 (BT_FN_V8HI_V16QI_V16QI, BT_V8HI, BT_V16QI, BT_V16QI) DEF_FN_TYPE_2 (BT_FN_V8HI_V4SI_V4SI, BT_V8HI, BT_V4SI, BT_V4SI) +DEF_FN_TYPE_2 (BT_FN_V8HI_V8HI_UINT, BT_V8HI, BT_V8HI, BT_UINT) DEF_FN_TYPE_2 (BT_FN_V8HI_V8HI_V8HI, BT_V8HI, BT_V8HI, BT_V8HI) DEF_FN_TYPE_2 (BT_FN_VOID_UINT64PTR_UINT64, BT_VOID, BT_UINT64PTR, BT_UINT64) DEF_FN_TYPE_2 (BT_FN_VOID_V2DF_FLTPTR, BT_VOID, BT_V2DF, BT_FLTPTR) @@ -345,6 +347,7 @@ DEF_FN_TYPE_3 (BT_FN_V4SI_V4SI_V4SI_V4SI, BT_V4SI, BT_V4SI, BT_V4SI, BT_V4SI) DEF_FN_TYPE_3 (BT_FN_V4SI_V8HI_V8HI_V4SI, BT_V4SI, BT_V8HI, BT_V8HI, BT_V4SI) DEF_FN_TYPE_3 (BT_FN_V8HI_UV8HI_UV8HI_INTPTR, BT_V8HI, BT_UV8HI, BT_UV8HI, BT_INTPTR) DEF_FN_TYPE_3 (BT_FN_V8HI_V16QI_V16QI_V8HI, BT_V8HI, BT_V16QI, BT_V16QI, BT_V8HI) +DEF_FN_TYPE_3 (BT_FN_V8HI_V4SF_V4SF_UINT, BT_V8HI, BT_V4SF, BT_V4SF, BT_UINT) DEF_FN_TYPE_3 (BT_FN_V8HI_V4SI_V4SI_INTPTR, BT_V8HI, BT_V4SI, BT_V4SI, BT_INTPTR) DEF_FN_TYPE_3 (BT_FN_V8HI_V8HI_V8HI_INTPTR, BT_V8HI, BT_V8HI, BT_V8HI, BT_INTPTR) DEF_FN_TYPE_3 (BT_FN_V8HI_V8HI_V8HI_V8HI, BT_V8HI, BT_V8HI, BT_V8HI, BT_V8HI) diff --git a/gcc/config/s390/s390-builtins.def b/gcc/config/s390/s390-builtins.def index deb205bce78..129d7124cba 100644 --- a/gcc/config/s390/s390-builtins.def +++ b/gcc/config/s390/s390-builtins.def @@ -273,6 +273,7 @@ #undef B_VXE #undef B_VXE2 #undef B_DEP +#undef B_NNPA #undef BFLAGS_MASK_INIT #define BFLAGS_MASK_INIT (B_INT) @@ -283,6 +284,7 @@ #define B_VXE (1 << 3) /* Builtins requiring the z14 vector extensions. */ #define B_VXE2 (1 << 4) /* Builtins requiring the z15 vector extensions. */ #define B_DEP (1 << 5) /* Builtin has been deprecated and a warning should be issued. */ +#define B_NNPA (1 << 6) /* Builtins requiring the NNPA Facility. */ /* B_DEF defines a standard (not overloaded) builtin B_DEF (<builtin name>, <RTL expander name>, <function attributes>, <builtin flags>, <operand flags, see above>, <fntype>) @@ -3005,3 +3007,13 @@ OB_DEF_VAR (s390_vstrsz_u32, s390_vstrszf, 0, B_DEF (s390_vstrszb, vstrszv16qi, 0, B_VXE2, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI_INTPTR) B_DEF (s390_vstrszh, vstrszv8hi, 0, B_VXE2, 0, BT_FN_UV8HI_UV8HI_UV8HI_UV8HI_INTPTR) B_DEF (s390_vstrszf, vstrszv4si, 0, B_VXE2, 0, BT_FN_UV4SI_UV4SI_UV4SI_UV8HI_INTPTR) + +/* arch 14 builtins */ + +B_DEF (s390_vclfnhs, vclfnhs_v8hi, 0, B_NNPA, O3_U4, BT_FN_V4SF_V8HI_UINT) +B_DEF (s390_vclfnls, vclfnls_v8hi, 0, B_NNPA, O3_U4, BT_FN_V4SF_V8HI_UINT) + +B_DEF (s390_vcrnfs, vcrnfs_v8hi, 0, B_NNPA, O4_U4, BT_FN_V8HI_V4SF_V4SF_UINT) + +B_DEF (s390_vcfn, vcfn_v8hi, 0, B_NNPA, O3_U4, BT_FN_V8HI_V8HI_UINT) +B_DEF (s390_vcnf, vcnf_v8hi, 0, B_NNPA, O3_U4, BT_FN_V8HI_V8HI_UINT) diff --git a/gcc/config/s390/s390-c.c b/gcc/config/s390/s390-c.c index a5f5f56311a..7dbd8bf5da3 100644 --- a/gcc/config/s390/s390-c.c +++ b/gcc/config/s390/s390-c.c @@ -339,7 +339,7 @@ s390_cpu_cpp_builtins_internal (cpp_reader *pfile, s390_def_or_undef_macro (pfile, target_flag_set_p (MASK_OPT_VX), old_opts, opts, "__VX__", "__VX__"); s390_def_or_undef_macro (pfile, target_flag_set_p (MASK_ZVECTOR), old_opts, - opts, "__VEC__=10303", "__VEC__"); + opts, "__VEC__=10304", "__VEC__"); s390_def_or_undef_macro (pfile, target_flag_set_p (MASK_ZVECTOR), old_opts, opts, "__vector=__attribute__((vector_size(16)))", "__vector__"); diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index fcb26316632..f3d0d1ba596 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -827,6 +827,12 @@ s390_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, error ("Builtin %qF requires z15 or higher.", fndecl); return const0_rtx; } + + if ((bflags & B_NNPA) && !TARGET_NNPA) + { + error ("Builtin %qF requires arch14 or higher.", fndecl); + return const0_rtx; + } } if (fcode >= S390_OVERLOADED_BUILTIN_VAR_OFFSET && fcode < S390_ALL_BUILTIN_MAX) diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 1e17a77cce6..c10f25b2472 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -246,6 +246,13 @@ (define_c_enum "unspec" [ UNSPEC_VEC_VFMAX UNSPEC_VEC_ELTSWAP + + UNSPEC_NNPA_VCLFNHS_V8HI + UNSPEC_NNPA_VCLFNLS_V8HI + UNSPEC_NNPA_VCRNFS_V8HI + + UNSPEC_NNPA_VCFN_V8HI + UNSPEC_NNPA_VCNF_V8HI ]) ;; diff --git a/gcc/config/s390/vecintrin.h b/gcc/config/s390/vecintrin.h index cbc8f4d142a..6bd26f8a240 100644 --- a/gcc/config/s390/vecintrin.h +++ b/gcc/config/s390/vecintrin.h @@ -173,6 +173,12 @@ __lcbb(const void *ptr, int bndry) #define vec_vsterg vec_vlerh #define vec_vsterf_flt vec_vlerf_flt #define vec_vsterg_dbl vec_vlerg_dbl + +#define vec_extend_to_fp32_hi __builtin_s390_vclfnhs +#define vec_extend_to_fp32_lo __builtin_s390_vclfnls +#define vec_round_from_fp32 __builtin_s390_vcrnfs +#define vec_convert_to_fp16 __builtin_s390_vcfn +#define vec_convert_from_fp16 __builtin_s390_vcnf #define vec_gather_element __builtin_s390_vec_gather_element #define vec_xl __builtin_s390_vec_xl #define vec_xld2 __builtin_s390_vec_xld2 diff --git a/gcc/config/s390/vx-builtins.md b/gcc/config/s390/vx-builtins.md index 816786f3cca..3df501b562c 100644 --- a/gcc/config/s390/vx-builtins.md +++ b/gcc/config/s390/vx-builtins.md @@ -2312,3 +2312,58 @@ (define_insn "*vec_extract_bswap_elem<mode>" "TARGET_VXE2 && UINTVAL (operands[2]) < GET_MODE_NUNITS (<V_HW_HSD:MODE>mode)" "vstebr<bhfgq>\t%v1,%0,%2" [(set_attr "op_type" "VRX")]) + + +;; +;; NNPA Facility +;; + +(define_insn "vclfnhs_v8hi" + [(set (match_operand:V4SF 0 "register_operand" "=v") + (unspec:V4SF [(vec_select:V4HI + (match_operand:V8HI 1 "register_operand" "v") + (parallel [(const_int 0) (const_int 1) (const_int 2) (const_int 3)])) + (match_operand:QI 2 "const_mask_operand" "C")] + UNSPEC_NNPA_VCLFNHS_V8HI))] + "TARGET_NNPA" + "vclfnh\t%v0,%v1,2,%2" + [(set_attr "op_type" "VRR")]) + +(define_insn "vclfnls_v8hi" + [(set (match_operand:V4SF 0 "register_operand" "=v") + (unspec:V4SF [(vec_select:V4HI + (match_operand:V8HI 1 "register_operand" "v") + (parallel [(const_int 4) (const_int 5) (const_int 6) (const_int 7)])) + (match_operand:QI 2 "const_mask_operand" "C")] + UNSPEC_NNPA_VCLFNLS_V8HI))] + "TARGET_NNPA" + "vclfnl\t%v0,%v1,2,%2" + [(set_attr "op_type" "VRR")]) + +(define_insn "vcrnfs_v8hi" + [(set (match_operand:V8HI 0 "register_operand" "=v") + (unspec:V8HI [(match_operand:V4SF 1 "register_operand" "v") + (match_operand:V4SF 2 "register_operand" "v") + (match_operand:QI 3 "const_mask_operand" "C")] + UNSPEC_NNPA_VCRNFS_V8HI))] + "TARGET_NNPA" + "vcrnf\t%v0,%v1,%v2,%3,2" + [(set_attr "op_type" "VRR")]) + +(define_insn "vcfn_v8hi" + [(set (match_operand:V8HI 0 "register_operand" "=v") + (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v") + (match_operand:QI 2 "const_mask_operand" "C")] + UNSPEC_NNPA_VCFN_V8HI))] + "TARGET_NNPA" + "vcfn\t%v0,%v1,1,%2" + [(set_attr "op_type" "VRR")]) + +(define_insn "vcnf_v8hi" + [(set (match_operand:V8HI 0 "register_operand" "=v") + (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v") + (match_operand:QI 2 "const_mask_operand" "C")] + UNSPEC_NNPA_VCNF_V8HI))] + "TARGET_NNPA" + "vcnf\t%v0,%v1,%2,1" + [(set_attr "op_type" "VRR")]) diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec-nnpa-fp16-convert.c b/gcc/testsuite/gcc.target/s390/zvector/vec-nnpa-fp16-convert.c new file mode 100644 index 00000000000..5ed7e050194 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/zvector/vec-nnpa-fp16-convert.c @@ -0,0 +1,34 @@ +/* { dg-do run } */ +/* { dg-require-effective-target s390_nnpa } */ +/* { dg-options "-O3 -mzarch -march=arch14 -mzvector --save-temps" } */ + +#include <vecintrin.h> + +int +main () +{ + vector float fp1 = (vector float){ 1.0f, 2.0f, 3.0f, 4.0f }; + vector float fp2 = (vector float){ 5.0f, 6.0f, 7.0f, 8.0f }; + + vector short int tmp1 = vec_round_from_fp32 (fp1, fp2, 0); + + vector short int tmp2 = vec_convert_to_fp16 (tmp1, 0); + vector short int tmp3 = vec_convert_from_fp16 (tmp2, 0); + + vector float fp1_ret = vec_extend_to_fp32_hi (tmp3, 0); + vector float fp2_ret = vec_extend_to_fp32_lo (tmp3, 0); + + if (vec_any_ne (fp1, fp1_ret)) + __builtin_abort (); + + if (vec_any_ne (fp2, fp2_ret)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-assembler-times "vcrnf\t" 1 } } */ +/* { dg-final { scan-assembler-times "vcfn\t" 1 } } */ +/* { dg-final { scan-assembler-times "vcnf\t" 1 } } */ +/* { dg-final { scan-assembler-times "vclfnh\t" 1 } } */ +/* { dg-final { scan-assembler-times "vclfnl\t" 1 } } */ diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec-nnpa-fp32-convert-1.c b/gcc/testsuite/gcc.target/s390/zvector/vec-nnpa-fp32-convert-1.c new file mode 100644 index 00000000000..321488a09ac --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/zvector/vec-nnpa-fp32-convert-1.c @@ -0,0 +1,27 @@ +/* { dg-do run } */ +/* { dg-require-effective-target s390_nnpa } */ +/* { dg-options "-O3 -mzarch -march=arch14 -mzvector --save-temps" } */ + +#include <vecintrin.h> + +int +main () +{ + vector float fp1 = (vector float){ 1.0f, 2.0f, 3.0f, 4.0f }; + vector float fp2 = (vector float){ 5.0f, 6.0f, 7.0f, 8.0f }; + vector short int conv = vec_round_from_fp32 (fp1, fp2, 0); + vector float fp1_ret = vec_extend_to_fp32_hi (conv, 0); + vector float fp2_ret = vec_extend_to_fp32_lo (conv, 0); + + if (vec_any_ne (fp1, fp1_ret)) + __builtin_abort (); + + if (vec_any_ne (fp2, fp2_ret)) + __builtin_abort (); + + return 0; +} + +/* { dg-final { scan-assembler-times "vcrnf\t" 1 } } */ +/* { dg-final { scan-assembler-times "vclfnh\t" 1 } } */ +/* { dg-final { scan-assembler-times "vclfnl\t" 1 } } */ diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec_convert_from_fp16.c b/gcc/testsuite/gcc.target/s390/zvector/vec_convert_from_fp16.c new file mode 100644 index 00000000000..fc7ccf0ebaa --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/zvector/vec_convert_from_fp16.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -march=arch14 -mzvector" } */ + +#include <vecintrin.h> + +vector short int +test_vec_convert_from_fp16 (vector short int a) +{ + return vec_convert_from_fp16 (a, 0); +} + +/* { dg-final { scan-assembler-times "vcnf\t" 1 } } */ diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec_convert_to_fp16.c b/gcc/testsuite/gcc.target/s390/zvector/vec_convert_to_fp16.c new file mode 100644 index 00000000000..7232643f063 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/zvector/vec_convert_to_fp16.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -march=arch14 -mzvector" } */ + +#include <vecintrin.h> + +vector short int +test_vec_convert_to_fp16 (vector short int a) +{ + return vec_convert_to_fp16 (a, 0); +} + +/* { dg-final { scan-assembler-times "vcfn\t" 1 } } */ diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec_extend_to_fp32_hi.c b/gcc/testsuite/gcc.target/s390/zvector/vec_extend_to_fp32_hi.c new file mode 100644 index 00000000000..feb5e784e0c --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/zvector/vec_extend_to_fp32_hi.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -march=arch14 -mzvector" } */ + +#include <vecintrin.h> + +vector float +test_vec_extend_to_fp32_hi (vector short int a) +{ + return vec_extend_to_fp32_hi (a, 0); +} + +/* { dg-final { scan-assembler-times "vclfnh\t" 1 } } */ diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec_extend_to_fp32_lo.c b/gcc/testsuite/gcc.target/s390/zvector/vec_extend_to_fp32_lo.c new file mode 100644 index 00000000000..179de17de9e --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/zvector/vec_extend_to_fp32_lo.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -march=arch14 -mzvector" } */ + +#include <vecintrin.h> + +vector float +test_vec_extend_to_fp32_lo (vector short int a) +{ + return vec_extend_to_fp32_lo (a, 0); +} + +/* { dg-final { scan-assembler-times "vclfnl\t" 1 } } */ diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec_round_from_fp32.c b/gcc/testsuite/gcc.target/s390/zvector/vec_round_from_fp32.c new file mode 100644 index 00000000000..839245228b9 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/zvector/vec_round_from_fp32.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -march=arch14 -mzvector" } */ + +#include <vecintrin.h> + +vector short int +test_vec_round_from_fp32 (vector float hi, vector float lo) +{ + return vec_round_from_fp32 (hi, lo, 0); +} + +/* { dg-final { scan-assembler-times "vcrnf\t" 1 } } */ -- 2.29.2