frv.c (bdesc_2arg): Remove __MDPACKH.
* config/frv/frv.c (bdesc_2arg): Remove __MDPACKH. (frv_init_builtins): Change its prototype to take 4 uhalf arguments. (frv_expand_mdpackh_builtin): New function. (frv_expand_builtin): Use it to expand __MDPACKH. * config/frv/media.h (__MDPACKH): Update prototype. * doc/extend.texi (__MDPACKH): Update documentation. From-SVN: r94371
This commit is contained in:
parent
f8023b7846
commit
a738d8481d
|
@ -1,3 +1,12 @@
|
|||
2005-01-28 Richard Sandiford <rsandifo@redhat.com>
|
||||
|
||||
* config/frv/frv.c (bdesc_2arg): Remove __MDPACKH.
|
||||
(frv_init_builtins): Change its prototype to take 4 uhalf arguments.
|
||||
(frv_expand_mdpackh_builtin): New function.
|
||||
(frv_expand_builtin): Use it to expand __MDPACKH.
|
||||
* config/frv/media.h (__MDPACKH): Update prototype.
|
||||
* doc/extend.texi (__MDPACKH): Update documentation.
|
||||
|
||||
2005-01-28 Uros Bizjak <uros@kss-loka.si>
|
||||
|
||||
* config/i386/i386.c (ix86_expand_fp_absneg_operator): Use
|
||||
|
|
|
@ -9349,7 +9349,6 @@ static struct builtin_description bdesc_2arg[] =
|
|||
{ CODE_FOR_mqsubhss, "__MQSUBHSS", FRV_BUILTIN_MQSUBHSS, 0, 0 },
|
||||
{ CODE_FOR_mqsubhus, "__MQSUBHUS", FRV_BUILTIN_MQSUBHUS, 0, 0 },
|
||||
{ CODE_FOR_mpackh, "__MPACKH", FRV_BUILTIN_MPACKH, 0, 0 },
|
||||
{ CODE_FOR_mdpackh, "__MDPACKH", FRV_BUILTIN_MDPACKH, 0, 0 },
|
||||
{ CODE_FOR_mcop1, "__Mcop1", FRV_BUILTIN_MCOP1, 0, 0 },
|
||||
{ CODE_FOR_mcop2, "__Mcop2", FRV_BUILTIN_MCOP2, 0, 0 },
|
||||
{ CODE_FOR_mwcut, "__MWCUT", FRV_BUILTIN_MWCUT, 0, 0 },
|
||||
|
@ -9494,6 +9493,12 @@ frv_init_builtins (void)
|
|||
tree_cons (NULL_TREE, T2, \
|
||||
tree_cons (NULL_TREE, T3, endlink))))
|
||||
|
||||
#define QUAD(RET, T1, T2, T3, T4) \
|
||||
build_function_type (RET, tree_cons (NULL_TREE, T1, \
|
||||
tree_cons (NULL_TREE, T2, \
|
||||
tree_cons (NULL_TREE, T3, \
|
||||
tree_cons (NULL_TREE, T4, endlink)))))
|
||||
|
||||
tree void_ftype_void = build_function_type (voidt, endlink);
|
||||
|
||||
tree void_ftype_acc = UNARY (voidt, accumulator);
|
||||
|
@ -9527,6 +9532,7 @@ frv_init_builtins (void)
|
|||
tree uw2_ftype_uw2_uw2 = BINARY (uword2, uword2, uword2);
|
||||
tree uw2_ftype_uw2_int = BINARY (uword2, uword2, integer);
|
||||
tree uw2_ftype_acc_int = BINARY (uword2, accumulator, integer);
|
||||
tree uw2_ftype_uh_uh_uh_uh = QUAD (uword2, uhalf, uhalf, uhalf, uhalf);
|
||||
|
||||
tree sw2_ftype_sw2_sw2 = BINARY (sword2, sword2, sword2);
|
||||
tree sw2_ftype_sw2_int = BINARY (sword2, sword2, integer);
|
||||
|
@ -9589,7 +9595,7 @@ frv_init_builtins (void)
|
|||
def_builtin ("__MEXPDHD", uw2_ftype_uw1_int, FRV_BUILTIN_MEXPDHD);
|
||||
def_builtin ("__MPACKH", uw1_ftype_uh_uh, FRV_BUILTIN_MPACKH);
|
||||
def_builtin ("__MUNPACKH", uw2_ftype_uw1, FRV_BUILTIN_MUNPACKH);
|
||||
def_builtin ("__MDPACKH", uw2_ftype_uw2_uw2, FRV_BUILTIN_MDPACKH);
|
||||
def_builtin ("__MDPACKH", uw2_ftype_uh_uh_uh_uh, FRV_BUILTIN_MDPACKH);
|
||||
def_builtin ("__MDUNPACKH", void_ftype_uw4_uw2, FRV_BUILTIN_MDUNPACKH);
|
||||
def_builtin ("__MBTOH", uw2_ftype_uw1, FRV_BUILTIN_MBTOH);
|
||||
def_builtin ("__MHTOB", uw1_ftype_uw2, FRV_BUILTIN_MHTOB);
|
||||
|
@ -9648,6 +9654,7 @@ frv_init_builtins (void)
|
|||
#undef UNARY
|
||||
#undef BINARY
|
||||
#undef TRINARY
|
||||
#undef QUAD
|
||||
}
|
||||
|
||||
/* Set the names for various arithmetic operations according to the
|
||||
|
@ -10116,6 +10123,44 @@ frv_expand_voidaccop_builtin (enum insn_code icode, tree arglist)
|
|||
return NULL_RTX;
|
||||
}
|
||||
|
||||
/* Expand the MDPACKH builtin. It takes four unsigned short arguments and
|
||||
each argument forms one word of the two double-word input registers.
|
||||
ARGLIST is a TREE_LIST of the arguments and TARGET, if nonnull,
|
||||
suggests a good place to put the return value. */
|
||||
|
||||
static rtx
|
||||
frv_expand_mdpackh_builtin (tree arglist, rtx target)
|
||||
{
|
||||
enum insn_code icode = CODE_FOR_mdpackh;
|
||||
rtx pat, op0, op1;
|
||||
rtx arg1 = frv_read_argument (&arglist);
|
||||
rtx arg2 = frv_read_argument (&arglist);
|
||||
rtx arg3 = frv_read_argument (&arglist);
|
||||
rtx arg4 = frv_read_argument (&arglist);
|
||||
|
||||
target = frv_legitimize_target (icode, target);
|
||||
op0 = gen_reg_rtx (DImode);
|
||||
op1 = gen_reg_rtx (DImode);
|
||||
|
||||
/* The high half of each word is not explicitly initialised, so indicate
|
||||
that the input operands are not live before this point. */
|
||||
emit_insn (gen_rtx_CLOBBER (DImode, op0));
|
||||
emit_insn (gen_rtx_CLOBBER (DImode, op1));
|
||||
|
||||
/* Move each argument into the low half of its associated input word. */
|
||||
emit_move_insn (simplify_gen_subreg (HImode, op0, DImode, 2), arg1);
|
||||
emit_move_insn (simplify_gen_subreg (HImode, op0, DImode, 6), arg2);
|
||||
emit_move_insn (simplify_gen_subreg (HImode, op1, DImode, 2), arg3);
|
||||
emit_move_insn (simplify_gen_subreg (HImode, op1, DImode, 6), arg4);
|
||||
|
||||
pat = GEN_FCN (icode) (target, op0, op1);
|
||||
if (! pat)
|
||||
return NULL_RTX;
|
||||
|
||||
emit_insn (pat);
|
||||
return target;
|
||||
}
|
||||
|
||||
/* Expand the MCLRACC builtin. This builtin takes a single accumulator
|
||||
number as argument. */
|
||||
|
||||
|
@ -10343,6 +10388,9 @@ frv_expand_builtin (tree exp,
|
|||
case FRV_BUILTIN_MWTACCG:
|
||||
return frv_expand_mwtacc_builtin (CODE_FOR_mwtaccg, arglist);
|
||||
|
||||
case FRV_BUILTIN_MDPACKH:
|
||||
return frv_expand_mdpackh_builtin (arglist, target);
|
||||
|
||||
case FRV_BUILTIN_IACCreadll:
|
||||
{
|
||||
rtx src = frv_read_iacc_argument (DImode, &arglist);
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2005-01-28 Richard Sandiford <rsandifo@redhat.com>
|
||||
|
||||
* gcc.target/frv/all-mdpackh-1.c: New test.
|
||||
|
||||
2005-01-26 Steven Bosscher <stevenb@suse.de>
|
||||
|
||||
* gcc.dg/tree-ssa/20030711-2.c: Run at -O2, not -O1.
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
/* Test the new (Fujitsu-compatible) __MDPACKH() interface. */
|
||||
/* { dg-do run } */
|
||||
extern void exit (int);
|
||||
extern void abort (void);
|
||||
|
||||
unsigned short x[] = { 0x8765, 0x1234, 0x2222, 0xeeee };
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
if (__MDPACKH (x[0], x[1], x[2], x[3]) != 0x876522221234eeeeULL)
|
||||
abort ();
|
||||
if (__MDPACKH (0x1111, 0x8001, 0xeeee, 0x7002) != 0x1111eeee80017002ULL)
|
||||
abort ();
|
||||
exit (0);
|
||||
}
|
Loading…
Reference in New Issue