mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-10 20:41:10 +08:00
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. From-SVN: r91057
This commit is contained in:
parent
3174451e16
commit
16f592418f
@ -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.
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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")])
|
||||
|
@ -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.
|
||||
|
29
gcc/testsuite/gcc.target/sparc/align.c
Normal file
29
gcc/testsuite/gcc.target/sparc/align.c
Normal file
@ -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" } } */
|
23
gcc/testsuite/gcc.target/sparc/combined-2.c
Normal file
23
gcc/testsuite/gcc.target/sparc/combined-2.c
Normal file
@ -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" } } */
|
10
gcc/testsuite/gcc.target/sparc/fexpand.c
Normal file
10
gcc/testsuite/gcc.target/sparc/fexpand.c
Normal file
@ -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%" } } */
|
10
gcc/testsuite/gcc.target/sparc/fpack16.c
Normal file
10
gcc/testsuite/gcc.target/sparc/fpack16.c
Normal file
@ -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%" } } */
|
10
gcc/testsuite/gcc.target/sparc/fpack32.c
Normal file
10
gcc/testsuite/gcc.target/sparc/fpack32.c
Normal file
@ -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%" } } */
|
10
gcc/testsuite/gcc.target/sparc/fpackfix.c
Normal file
10
gcc/testsuite/gcc.target/sparc/fpackfix.c
Normal file
@ -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%" } } */
|
10
gcc/testsuite/gcc.target/sparc/fpmerge.c
Normal file
10
gcc/testsuite/gcc.target/sparc/fpmerge.c
Normal file
@ -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%" } } */
|
43
gcc/testsuite/gcc.target/sparc/fpmul.c
Normal file
43
gcc/testsuite/gcc.target/sparc/fpmul.c
Normal file
@ -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%" } } */
|
23
gcc/testsuite/gcc.target/sparc/pdist.c
Normal file
23
gcc/testsuite/gcc.target/sparc/pdist.c
Normal file
@ -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 } } */
|
Loading…
x
Reference in New Issue
Block a user