diff options
author | phython <phython@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-11-23 00:35:38 +0000 |
---|---|---|
committer | phython <phython@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-11-23 00:35:38 +0000 |
commit | 5e8cda9b52853ea899614b0d1a334bd3911ea76f (patch) | |
tree | f8e466895eabdaea724ca0e1612370f5426f38db /gcc | |
parent | c2340cd6d14d8df5345f9849c909a618e1c0710c (diff) |
2004-11-22 James A. Morrison <phython@gcc.gnu.org
* config/sparc/sparc.c: Include insn-codes.h and langhooks.h.
(sparc_init_builtins): New function.
(sparc_init_vis_builtins): Create builtin functions for VIS
instructions.
(sparc_expand_builtin): Expand builtin functions for VIS instructions.
(TARGET_INIT_BUILTINS): Define to sparc_init_builtins.
(TARGET_EXPAND_BUILTIN): Define to sparc_expand_builtin.
(def_builtin): New macro for creating builtin functions.
(P): New mode macro for pointer types.
(UNSPEC_FPACK16, UNSPEC_FPACK32, UNSPEC_FPACKFIX, UNSPEC_FEXPAND,
UNSPEC_FPMERGE, UNSPEC_MUL16AL, UNSPEC_MUL8UL, UNSPEC_MULDUL,
UNSPEC_ALIGNDATA, UNSPEC_ALIGNADDR, UNSPEC_PDIST): New constants.
(fpack16_vis, fpackfix_vis, fpack32_vis, fexpand_vis, fpmerge_vis,
fmul8x16_vis, fmul8x16au_vis, fmul8x16al_vis, fmul8sux16_vis,
fmul8ulx16_vis, fmuld8sux16_vis, fmuld8ulx16_vis, pdist_vis,
faligndata<V64:mode>_vis, alignaddr<P:mode>_vis): New patterns.
testsuite:
* gcc.target/sparc/align.c, gcc.target/sparc/combined-2.c,
gcc.target/sparc/fpack16.c, gcc.target/sparc/fpack32.c,
gcc.target/sparc/fpackfix.c, gcc.target/fexpand.c,
gcc.target/sparc/fpmerge.c, gcc.target/sparc/fpmul.c,
gcc.target/sparc/pdist.c: New tests.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@91057 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 19 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.c | 167 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.md | 170 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/align.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/combined-2.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/fexpand.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/fpack16.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/fpack32.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/fpackfix.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/fpmerge.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/fpmul.c | 43 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/pdist.c | 23 |
13 files changed, 532 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d42d66d6e45..ca6009f69d1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,22 @@ +2004-11-22 James A. Morrison <phython@gcc.gnu.org + + * config/sparc/sparc.c: Include insn-codes.h and langhooks.h. + (sparc_init_builtins): New function. + (sparc_init_vis_builtins): Create builtin functions for VIS + instructions. + (sparc_expand_builtin): Expand builtin functions for VIS instructions. + (TARGET_INIT_BUILTINS): Define to sparc_init_builtins. + (TARGET_EXPAND_BUILTIN): Define to sparc_expand_builtin. + (def_builtin): New macro for creating builtin functions. + (P): New mode macro for pointer types. + (UNSPEC_FPACK16, UNSPEC_FPACK32, UNSPEC_FPACKFIX, UNSPEC_FEXPAND, + UNSPEC_FPMERGE, UNSPEC_MUL16AL, UNSPEC_MUL8UL, UNSPEC_MULDUL, + UNSPEC_ALIGNDATA, UNSPEC_ALIGNADDR, UNSPEC_PDIST): New constants. + (fpack16_vis, fpackfix_vis, fpack32_vis, fexpand_vis, fpmerge_vis, + fmul8x16_vis, fmul8x16au_vis, fmul8x16al_vis, fmul8sux16_vis, + fmul8ulx16_vis, fmuld8sux16_vis, fmuld8ulx16_vis, pdist_vis, + faligndata<V64:mode>_vis, alignaddr<P:mode>_vis): New patterns. + 2004-11-22 Devang Patel <dpatel@apple.com> * tree-if-conv.c (clean_predicate_lists): Clean all basic blocks. diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index dcacae20d4b..4ab98d85bde 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -32,6 +32,7 @@ Boston, MA 02111-1307, USA. */ #include "hard-reg-set.h" #include "real.h" #include "insn-config.h" +#include "insn-codes.h" #include "conditions.h" #include "output.h" #include "insn-attr.h" @@ -48,6 +49,7 @@ Boston, MA 02111-1307, USA. */ #include "target-def.h" #include "cfglayout.h" #include "tree-gimple.h" +#include "langhooks.h" /* Processor costs */ static const @@ -332,6 +334,9 @@ static void emit_hard_tfmode_operation (enum rtx_code, rtx *); static bool sparc_function_ok_for_sibcall (tree, tree); static void sparc_init_libfuncs (void); +static void sparc_init_builtins (void); +static void sparc_vis_init_builtins (void); +static rtx sparc_expand_builtin (tree, rtx, rtx, enum machine_mode, int); static void sparc_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT, tree); static bool sparc_can_output_mi_thunk (tree, HOST_WIDE_INT, @@ -417,6 +422,11 @@ enum processor_type sparc_cpu; #undef TARGET_INIT_LIBFUNCS #define TARGET_INIT_LIBFUNCS sparc_init_libfuncs +#undef TARGET_INIT_BUILTINS +#define TARGET_INIT_BUILTINS sparc_init_builtins + +#undef TARGET_EXPAND_BUILTIN +#define TARGET_EXPAND_BUILTIN sparc_expand_builtin #ifdef HAVE_AS_TLS #undef TARGET_HAVE_TLS @@ -8446,6 +8456,163 @@ sparc_init_libfuncs (void) gofast_maybe_init_libfuncs (); } +#define def_builtin(NAME, CODE, TYPE) \ + lang_hooks.builtin_function((NAME), (TYPE), (CODE), BUILT_IN_MD, NULL, \ + NULL_TREE) + +/* Implement the TARGET_INIT_BUILTINS target hook. + Create builtin functions for special SPARC instructions. */ + +static void +sparc_init_builtins (void) +{ + if (TARGET_VIS) + sparc_vis_init_builtins (); +} + +/* Create builtin functions for VIS 1.0 instructions. */ + +static void +sparc_vis_init_builtins (void) +{ + tree v4qi = build_vector_type (unsigned_intQI_type_node, 4); + tree v8qi = build_vector_type (unsigned_intQI_type_node, 8); + tree v4hi = build_vector_type (intHI_type_node, 4); + tree v2hi = build_vector_type (intHI_type_node, 2); + tree v2si = build_vector_type (intSI_type_node, 2); + + tree v4qi_ftype_v4hi = build_function_type_list (v4qi, v4hi, 0); + tree v8qi_ftype_v2si_v8qi = build_function_type_list (v8qi, v2si, v8qi, 0); + tree v2hi_ftype_v2si = build_function_type_list (v2hi, v2si, 0); + tree v4hi_ftype_v4qi = build_function_type_list (v4hi, v4qi, 0); + tree v8qi_ftype_v4qi_v4qi = build_function_type_list (v8qi, v4qi, v4qi, 0); + tree v4hi_ftype_v4qi_v4hi = build_function_type_list (v4hi, v4qi, v4hi, 0); + tree v4hi_ftype_v4qi_v2hi = build_function_type_list (v4hi, v4qi, v2hi, 0); + tree v2si_ftype_v4qi_v2hi = build_function_type_list (v2si, v4qi, v2hi, 0); + tree v4hi_ftype_v8qi_v4hi = build_function_type_list (v4hi, v8qi, v4hi, 0); + tree v4hi_ftype_v4hi_v4hi = build_function_type_list (v4hi, v4hi, v4hi, 0); + tree v2si_ftype_v2si_v2si = build_function_type_list (v2si, v2si, v2si, 0); + tree v8qi_ftype_v8qi_v8qi = build_function_type_list (v8qi, v8qi, v8qi, 0); + tree di_ftype_v8qi_v8qi_di = build_function_type_list (intDI_type_node, + v8qi, v8qi, + intDI_type_node, 0); + tree di_ftype_di_di = build_function_type_list (intDI_type_node, + intDI_type_node, + intDI_type_node, 0); + tree ptr_ftype_ptr_si = build_function_type_list (ptr_type_node, + ptr_type_node, + intSI_type_node, 0); + tree ptr_ftype_ptr_di = build_function_type_list (ptr_type_node, + ptr_type_node, + intDI_type_node, 0); + + /* Packing and expanding vectors. */ + def_builtin ("__builtin_vis_fpack16", CODE_FOR_fpack16_vis, v4qi_ftype_v4hi); + def_builtin ("__builtin_vis_fpack32", CODE_FOR_fpack32_vis, + v8qi_ftype_v2si_v8qi); + def_builtin ("__builtin_vis_fpackfix", CODE_FOR_fpackfix_vis, + v2hi_ftype_v2si); + def_builtin ("__builtin_vis_fexpand", CODE_FOR_fexpand_vis, v4hi_ftype_v4qi); + def_builtin ("__builtin_vis_fpmerge", CODE_FOR_fpmerge_vis, + v8qi_ftype_v4qi_v4qi); + + /* Multiplications. */ + def_builtin ("__builtin_vis_fmul8x16", CODE_FOR_fmul8x16_vis, + v4hi_ftype_v4qi_v4hi); + def_builtin ("__builtin_vis_fmul8x16au", CODE_FOR_fmul8x16au_vis, + v4hi_ftype_v4qi_v2hi); + def_builtin ("__builtin_vis_fmul8x16al", CODE_FOR_fmul8x16al_vis, + v4hi_ftype_v4qi_v2hi); + def_builtin ("__builtin_vis_fmul8sux16", CODE_FOR_fmul8sux16_vis, + v4hi_ftype_v8qi_v4hi); + def_builtin ("__builtin_vis_fmul8ulx16", CODE_FOR_fmul8ulx16_vis, + v4hi_ftype_v8qi_v4hi); + def_builtin ("__builtin_vis_fmuld8sux16", CODE_FOR_fmuld8sux16_vis, + v2si_ftype_v4qi_v2hi); + def_builtin ("__builtin_vis_fmuld8ulx16", CODE_FOR_fmuld8ulx16_vis, + v2si_ftype_v4qi_v2hi); + + /* Data aligning. */ + def_builtin ("__builtin_vis_faligndatav4hi", CODE_FOR_faligndatav4hi_vis, + v4hi_ftype_v4hi_v4hi); + def_builtin ("__builtin_vis_faligndatav8qi", CODE_FOR_faligndatav8qi_vis, + v8qi_ftype_v8qi_v8qi); + def_builtin ("__builtin_vis_faligndatav2si", CODE_FOR_faligndatav2si_vis, + v2si_ftype_v2si_v2si); + def_builtin ("__builtin_vis_faligndatadi", CODE_FOR_faligndatadi_vis, + di_ftype_di_di); + if (TARGET_ARCH64) + def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrdi_vis, + ptr_ftype_ptr_di); + else + def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrsi_vis, + ptr_ftype_ptr_si); + + /* Pixel distance. */ + def_builtin ("__builtin_vis_pdist", CODE_FOR_pdist_vis, + di_ftype_v8qi_v8qi_di); +} + +/* Handle TARGET_EXPAND_BUILTIN target hook. + Expand builtin functions for sparc instrinsics. */ + +static rtx +sparc_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, + enum machine_mode tmode, int ignore ATTRIBUTE_UNUSED) +{ + tree arglist; + tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); + unsigned int icode = DECL_FUNCTION_CODE (fndecl); + rtx pat, op[4]; + enum machine_mode mode[4]; + int arg_count = 0; + + mode[arg_count] = tmode; + + if (target == 0 + || GET_MODE (target) != tmode + || ! (*insn_data[icode].operand[0].predicate) (target, tmode)) + op[arg_count] = gen_reg_rtx (tmode); + else + op[arg_count] = target; + + for (arglist = TREE_OPERAND (exp, 1); arglist; + arglist = TREE_CHAIN (arglist)) + { + tree arg = TREE_VALUE (arglist); + + arg_count++; + mode[arg_count] = insn_data[icode].operand[arg_count].mode; + op[arg_count] = expand_expr (arg, NULL_RTX, VOIDmode, 0); + + if (! (*insn_data[icode].operand[arg_count].predicate) (op[arg_count], + mode[arg_count])) + op[arg_count] = copy_to_mode_reg (mode[arg_count], op[arg_count]); + } + + switch (arg_count) + { + case 1: + pat = GEN_FCN (icode) (op[0], op[1]); + break; + case 2: + pat = GEN_FCN (icode) (op[0], op[1], op[2]); + break; + case 3: + pat = GEN_FCN (icode) (op[0], op[1], op[2], op[3]); + break; + default: + gcc_unreachable (); + } + + if (!pat) + return NULL_RTX; + + emit_insn (pat); + + return op[0]; +} + int sparc_extra_constraint_check (rtx op, int c, int strict) { diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md index fea0f91e5f4..5e5e1f654fb 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -45,6 +45,18 @@ (UNSPEC_TLSIE 33) (UNSPEC_TLSLE 34) (UNSPEC_TLSLD_BASE 35) + + (UNSPEC_FPACK16 40) + (UNSPEC_FPACK32 41) + (UNSPEC_FPACKFIX 42) + (UNSPEC_FEXPAND 43) + (UNSPEC_FPMERGE 44) + (UNSPEC_MUL16AL 45) + (UNSPEC_MUL8UL 46) + (UNSPEC_MULDUL 47) + (UNSPEC_ALIGNDATA 48) + (UNSPEC_ALIGNADDR 49) + (UNSPEC_PDIST 50) ]) (define_constants @@ -8961,3 +8973,161 @@ "fnands\t%1, %2, %0" [(set_attr "type" "fga") (set_attr "fptype" "single")]) + +;; Hard to generate VIS instructions. We have builtins for these. + +(define_insn "fpack16_vis" + [(set (match_operand:V4QI 0 "register_operand" "=f") + (unspec:V4QI [(match_operand:V4HI 1 "register_operand" "e")] + UNSPEC_FPACK16))] + "TARGET_VIS" + "fpack16\t%1, %0" + [(set_attr "type" "fga") + (set_attr "fptype" "double")]) + +(define_insn "fpackfix_vis" + [(set (match_operand:V2HI 0 "register_operand" "=f") + (unspec:V2HI [(match_operand:V2SI 1 "register_operand" "e")] + UNSPEC_FPACKFIX))] + "TARGET_VIS" + "fpackfix\t%1, %0" + [(set_attr "type" "fga") + (set_attr "fptype" "double")]) + +(define_insn "fpack32_vis" + [(set (match_operand:V8QI 0 "register_operand" "=e") + (unspec:V8QI [(match_operand:V2SI 1 "register_operand" "e") + (match_operand:V8QI 2 "register_operand" "e")] + UNSPEC_FPACK32))] + "TARGET_VIS" + "fpack32\t%1, %2, %0" + [(set_attr "type" "fga") + (set_attr "fptype" "double")]) + +(define_insn "fexpand_vis" + [(set (match_operand:V4HI 0 "register_operand" "=e") + (unspec:V4HI [(match_operand:V4QI 1 "register_operand" "f")] + UNSPEC_FEXPAND))] + "TARGET_VIS" + "fexpand\t%1, %0" + [(set_attr "type" "fga") + (set_attr "fptype" "double")]) + +;; It may be possible to describe this operation as (1 indexed): +;; (vec_select (vec_duplicate (vec_duplicate (vec_concat 1 2))) +;; 1,5,10,14,19,23,28,32) +;; Note that (vec_merge:V8QI [(V4QI) (V4QI)] (10101010 = 170) doesn't work +;; because vec_merge expects all the operands to be of the same type. +(define_insn "fpmerge_vis" + [(set (match_operand:V8QI 0 "register_operand" "=e") + (unspec:V8QI [(match_operand:V4QI 1 "register_operand" "f") + (match_operand:V4QI 2 "register_operand" "f")] + UNSPEC_FPMERGE))] + "TARGET_VIS" + "fpmerge\t%1, %2, %0" + [(set_attr "type" "fga") + (set_attr "fptype" "double")]) + +;; Partitioned multiply instructions +(define_insn "fmul8x16_vis" + [(set (match_operand:V4HI 0 "register_operand" "=e") + (mult:V4HI (match_operand:V4QI 1 "register_operand" "f") + (match_operand:V4HI 2 "register_operand" "e")))] + "TARGET_VIS" + "fmul8x16\t%1, %2, %0" + [(set_attr "type" "fpmul") + (set_attr "fptype" "double")]) + +;; Only one of the following two insns can be a multiply. +(define_insn "fmul8x16au_vis" + [(set (match_operand:V4HI 0 "register_operand" "=e") + (mult:V4HI (match_operand:V4QI 1 "register_operand" "f") + (match_operand:V2HI 2 "register_operand" "f")))] + "TARGET_VIS" + "fmul8x16au\t%1, %2, %0" + [(set_attr "type" "fpmul") + (set_attr "fptype" "double")]) + +(define_insn "fmul8x16al_vis" + [(set (match_operand:V4HI 0 "register_operand" "=e") + (unspec:V4HI [(match_operand:V4QI 1 "register_operand" "f") + (match_operand:V2HI 2 "register_operand" "f")] + UNSPEC_MUL16AL))] + "TARGET_VIS" + "fmul8x16al\t%1, %2, %0" + [(set_attr "type" "fpmul") + (set_attr "fptype" "double")]) + +;; Only one of the following two insns can be a multiply. +(define_insn "fmul8sux16_vis" + [(set (match_operand:V4HI 0 "register_operand" "=e") + (mult:V4HI (match_operand:V8QI 1 "register_operand" "e") + (match_operand:V4HI 2 "register_operand" "e")))] + "TARGET_VIS" + "fmul8sux16\t%1, %2, %0" + [(set_attr "type" "fpmul") + (set_attr "fptype" "double")]) + +(define_insn "fmul8ulx16_vis" + [(set (match_operand:V4HI 0 "register_operand" "=e") + (unspec:V4HI [(match_operand:V8QI 1 "register_operand" "e") + (match_operand:V4HI 2 "register_operand" "e")] + UNSPEC_MUL8UL))] + "TARGET_VIS" + "fmul8ulx16\t%1, %2, %0" + [(set_attr "type" "fpmul") + (set_attr "fptype" "double")]) + +;; Only one of the following two insns can be a multiply. +(define_insn "fmuld8sux16_vis" + [(set (match_operand:V2SI 0 "register_operand" "=e") + (mult:V2SI (match_operand:V4QI 1 "register_operand" "f") + (match_operand:V2HI 2 "register_operand" "f")))] + "TARGET_VIS" + "fmuld8sux16\t%1, %2, %0" + [(set_attr "type" "fpmul") + (set_attr "fptype" "double")]) + +(define_insn "fmuld8ulx16_vis" + [(set (match_operand:V2SI 0 "register_operand" "=e") + (unspec:V2SI [(match_operand:V4QI 1 "register_operand" "f") + (match_operand:V2HI 2 "register_operand" "f")] + UNSPEC_MULDUL))] + "TARGET_VIS" + "fmuld8ulx16\t%1, %2, %0" + [(set_attr "type" "fpmul") + (set_attr "fptype" "double")]) + +;; Using faligndata only makes sense after an alignaddr since the choice of +;; bytes to take out of each operand is dependant on the results of the last +;; alignaddr. +(define_insn "faligndata<V64I:mode>_vis" + [(set (match_operand:V64I 0 "register_operand" "=e") + (unspec:V64I [(match_operand:V64I 1 "register_operand" "e") + (match_operand:V64I 2 "register_operand" "e")] + UNSPEC_ALIGNDATA))] + "TARGET_VIS" + "faligndata\t%1, %2, %0" + [(set_attr "type" "fga") + (set_attr "fptype" "double")]) + +(define_mode_macro P [(SI "Pmode == SImode") (DI "Pmode == DImode")]) + +(define_insn "alignaddr<P:mode>_vis" + [(set (match_operand:P 0 "register_operand" "=r") + (unspec:P [(match_operand:P 1 "reg_or_0_operand" "rJ") + (match_operand:P 2 "reg_or_0_operand" "rJ")] + UNSPEC_ALIGNADDR))] + "TARGET_VIS" + "alignaddr\t%r1, %r2, %0") + +(define_insn "pdist_vis" + [(set (match_operand:DI 0 "register_operand" "=e") + (unspec:DI [(match_operand:V8QI 1 "register_operand" "e") + (match_operand:V8QI 2 "register_operand" "e") + (match_operand:DI 3 "register_operand" "0")] + UNSPEC_PDIST))] + "TARGET_VIS" + "pdist\t%1, %2, %0" + [(set_attr "type" "fga") + (set_attr "fptype" "double")]) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 411df2bf196..4b9cd3f8b0d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2004-11-22 James A. Morrison <phython@gcc.gnu.org> + + * gcc.target/sparc/align.c, gcc.target/sparc/combined-2.c, + gcc.target/sparc/fpack16.c, gcc.target/sparc/fpack32.c, + gcc.target/sparc/fpackfix.c, gcc.target/fexpand.c, + gcc.target/sparc/fpmerge.c, gcc.target/sparc/fpmul.c, + gcc.target/sparc/pdist.c: New tests. + 2004-11-22 Bob Wilson <bob.wilson@acm.org> * gcc.dg/uninit-H.c: Define ASM for Xtensa targets. diff --git a/gcc/testsuite/gcc.target/sparc/align.c b/gcc/testsuite/gcc.target/sparc/align.c new file mode 100644 index 00000000000..9a9827237e1 --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/align.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ultrasparc -mvis" } */ +#include <stdint.h> +typedef int vec32 __attribute__((vector_size(8))); +typedef short vec16 __attribute__((vector_size(8))); +typedef char vec8 __attribute__((vector_size(8))); + +vec16 foo1 (vec16 a, vec16 b) { + return __builtin_vis_faligndatav4hi (a, b); +} + +vec32 foo2 (vec32 a, vec32 b) { + return __builtin_vis_faligndatav2si (a, b); +} + +vec8 foo3 (vec8 a, vec8 b) { + return __builtin_vis_faligndatav8qi (a, b); +} + +int64_t foo4 (int64_t a, int64_t b) { + return __builtin_vis_faligndatadi (a, b); +} + +unsigned char * foo5 (unsigned char *data) { + return __builtin_vis_alignaddr (data, 0); +} + +/* { dg-final { scan-assembler-times "faligndata" 4 } } */ +/* { dg-final { scan-assembler "alignaddr.*%g0" } } */ diff --git a/gcc/testsuite/gcc.target/sparc/combined-2.c b/gcc/testsuite/gcc.target/sparc/combined-2.c new file mode 100644 index 00000000000..016e4fa6a6c --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/combined-2.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mcpu=ultrasparc -mvis" } */ +typedef char pixel __attribute__((vector_size(4))); +typedef char vec8 __attribute__((vector_size(8))); +typedef short vec16 __attribute__((vector_size(8))); + +vec16 foo (pixel a, pixel b) { + vec8 c = __builtin_vis_fpmerge (a, b); + vec16 d = { -1, -1, -1, -1 }; + vec16 e = __builtin_vis_fmul8x16 (a, d); + + return e; +} + +vec16 bar (pixel a) { + vec16 d = { 0, 0, 0, 0 }; + vec16 e = __builtin_vis_fmul8x16 (a, d); /* Mulitplication by 0 = 0. */ + + return e; +} + +/* { dg-final { scan-assembler "fmul8x16" } } */ +/* { dg-final { scan-assembler "fzero" } } */ diff --git a/gcc/testsuite/gcc.target/sparc/fexpand.c b/gcc/testsuite/gcc.target/sparc/fexpand.c new file mode 100644 index 00000000000..2483f4f7235 --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/fexpand.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ultrasparc -mvis" } */ +typedef short vec16 __attribute__((vector_size(8))); +typedef char vec8 __attribute__((vector_size(4))); + +vec16 foo (vec8 a) { + return __builtin_vis_fexpand (a); +} + +/* { dg-final { scan-assembler "fexpand\t%" } } */ diff --git a/gcc/testsuite/gcc.target/sparc/fpack16.c b/gcc/testsuite/gcc.target/sparc/fpack16.c new file mode 100644 index 00000000000..2f7aac56171 --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/fpack16.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ultrasparc -mvis" } */ +typedef short vec16 __attribute__((vector_size(8))); +typedef char vec8 __attribute__((vector_size(4))); + +vec8 foo (vec16 a) { + return __builtin_vis_fpack16 (a); +} + +/* { dg-final { scan-assembler "fpack16\t%" } } */ diff --git a/gcc/testsuite/gcc.target/sparc/fpack32.c b/gcc/testsuite/gcc.target/sparc/fpack32.c new file mode 100644 index 00000000000..031372e219a --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/fpack32.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ultrasparc -mvis" } */ +typedef int vec32 __attribute__((vector_size(8))); +typedef unsigned char vec8 __attribute__((vector_size(8))); + +vec8 foo (vec32 a, vec8 b) { + return __builtin_vis_fpack32 (a, b); +} + +/* { dg-final { scan-assembler "fpack32\t%" } } */ diff --git a/gcc/testsuite/gcc.target/sparc/fpackfix.c b/gcc/testsuite/gcc.target/sparc/fpackfix.c new file mode 100644 index 00000000000..815bec0cf38 --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/fpackfix.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ultrasparc -mvis" } */ +typedef int vec32 __attribute__((vector_size(8))); +typedef short vec16 __attribute__((vector_size(4))); + +vec16 foo (vec32 a) { + return __builtin_vis_fpackfix (a); +} + +/* { dg-final { scan-assembler "fpackfix\t%" } } */ diff --git a/gcc/testsuite/gcc.target/sparc/fpmerge.c b/gcc/testsuite/gcc.target/sparc/fpmerge.c new file mode 100644 index 00000000000..013795cc6d7 --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/fpmerge.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ultrasparc -mvis" } */ +typedef char pixel __attribute__((vector_size(8))); +typedef char vec8 __attribute__((vector_size(4))); + +pixel foo (vec8 a, vec8 b) { + return __builtin_vis_fpmerge (a, b); +} + +/* { dg-final { scan-assembler "fpmerge\t%" } } */ diff --git a/gcc/testsuite/gcc.target/sparc/fpmul.c b/gcc/testsuite/gcc.target/sparc/fpmul.c new file mode 100644 index 00000000000..991cc75d661 --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/fpmul.c @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ultrasparc -mvis" } */ +typedef int vec32 __attribute__((vector_size(8))); +typedef short vec16 __attribute__((vector_size(8))); +typedef char pixel __attribute__((vector_size(4))); +typedef short pixel16 __attribute__((vector_size(4))); +typedef char vec8 __attribute__((vector_size(8))); + +vec16 foo1 (pixel a, vec16 b) { + return __builtin_vis_fmul8x16 (a, b); +} + +vec16 foo2 (pixel a, pixel16 b) { + return __builtin_vis_fmul8x16au (a, b); +} + +vec16 foo3 (pixel a, pixel16 b) { + return __builtin_vis_fmul8x16al (a, b); +} + +vec16 foo4 (vec8 a, vec16 b) { + return __builtin_vis_fmul8sux16 (a, b); +} + +vec16 foo5 (vec8 a, vec16 b) { + return __builtin_vis_fmul8ulx16 (a, b); +} + +vec32 foo6 (pixel a, pixel16 b) { + return __builtin_vis_fmuld8sux16 (a, b); +} + +vec32 foo7 (pixel a, pixel16 b) { + return __builtin_vis_fmuld8ulx16 (a, b); +} + +/* { dg-final { scan-assembler "fmul8x16\t%" } } */ +/* { dg-final { scan-assembler "fmul8x16au\t%" } } */ +/* { dg-final { scan-assembler "fmul8x16al\t%" } } */ +/* { dg-final { scan-assembler "fmul8sux16\t%" } } */ +/* { dg-final { scan-assembler "fmul8ulx16\t%" } } */ +/* { dg-final { scan-assembler "fmuld8sux16\t%" } } */ +/* { dg-final { scan-assembler "fmuld8ulx16\t%" } } */ diff --git a/gcc/testsuite/gcc.target/sparc/pdist.c b/gcc/testsuite/gcc.target/sparc/pdist.c new file mode 100644 index 00000000000..d2ba9811d58 --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/pdist.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ultrasparc -mvis" } */ +#include <stdint.h> + +typedef char vec8 __attribute__((vector_size(8))); + +int64_t foo (vec8 a, vec8 b) { + int64_t d = 0; + d = __builtin_vis_pdist (a, b, d); + return d; +} + +int64_t bar (vec8 a, vec8 b) { + int64_t d = 0; + return __builtin_vis_pdist (a, b, d); +} + +int64_t baz (vec8 a, vec8 b, int64_t d) { + int64_t e = __builtin_vis_pdist (a, b, d); + return e + d; +} + +/* { dg-final { scan-assembler-times "pdist" 4 } } */ |