Sandra Loosemore - revised PATCH: CALL_EXPR representation changes, part 4/9 (back ends) (original) (raw)

This is the mail archive of the gcc-patches@gcc.gnu.orgmailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

2007-02-14 Sandra Loosemore sandra@codesourcery.com Brooks Moses brooks.moses@codesourcery.com Lee Millward lee.millward@codesourcery.com

* config/alpha/alpha.c (alpha_expand_builtin): Use new CALL_EXPR
accessors.
* config/frv/frv.c (frv_expand_builtin): Likewise.
* config/s390/s390.c (s390_expand_builtin): Likewise.

* config/sparc/sparc.c (sparc_gimplify_va_arg): Use build_call_expr.
(sparc_expand_builtin): Use new CALL_EXPR accessors.

* config/i386/i386.c (ix86_function_ok_for_sibcall): Likewise.
(ix86_expand_binop_builtin): Pass entire CALL_EXPR as parameter
instead of arglist.  Use new CALL_EXPR accessors on it.  Fix callers.
(ix86_expand_store_builtin): Likewise.
(ix86_expand_unop_builtin): Likewise.
(ix86_expand_unop1_builtin): Likewise.
(ix86_expand_sse_compare): Likewise.
(ix86_expand_sse_comi): Likewise.
(ix86_expand_vec_init_builtin): Likewise.
(ix86_expand_vec_ext_builtin): Likewise.
(ix86_expand_vec_set_builtin): Likewise.
(ix86_expand_builtin): Use new CALL_EXPR accessors.

* config/sh/sh.c (sh_expand_builtin): Use new CALL_EXPR accessors.
* config/c4x/c4x.c (c4x_expand_builtin): Likewise.

* config/iq2000/iq2000.c (expand_one_builtin): Pass entire CALL_EXPR
instead of arglist.  Use new CALL_EXPR accessors.  Fix callers.
(iq2000_expand_builtin): Use new CALL_EXPR accessors.

* config/rs6000/rs6000-c.c (altivec_build_resolved_builtin): Use
build_call_expr.
* config/rs6000/rs6000.c (rs6000_gimplify_va_arg): Likewise.
(rs6000_expand_unop_builtin): Pass entire CALL_EXPR instead of
arglist.  Use new CALL_EXPR accessors.  Fix callers.
(altivec_expand_abs_builtin): Likewise.
(rs6000_expand_binop_builtin): Likewise.
(altivec_expand_predicate_builtin): Likewise.
(altivec_expand_lv_builtin): Likewise.
(spe_expand_stv_builtin): Likewise.
(altivec_expand_stv_builtin): Likewise.
(rs6000_expand_ternop_builtin): Likewise.
(altivec_expand_ld_builtin): Use new CALL_EXPR accessors.
(altivec_expand_st_builtin): Likewise.
(altivec_expand_dst_builtin): Likewise.
(altivec_expand_vec_init_builtin): Pass entire CALL_EXPR instead of
arglist.  Use new CALL_EXPR accessors.  Fix callers.
(altivec_expand_vec_set_builtin): Likewise.
(altivec_expand_vec_ext_builtin): Likewise.
(altivec_expand_builtin): Use new CALL_EXPR accessors.
(spe_expand_builtin): Likewise.
(spe_expand_predicate_builtin): Pass entire CALL_EXPR instead of
arglist.  Use new CALL_EXPR accessors.  Fix callers.
(spe_expand_evsel_builtin): Likewise.
(rs6000_expand_builtin): Use new CALL_EXPR accessors.  VCFUX and
FCFSX cases must construct whole new CALL_EXPR, not just arglist.

* config/arm/arm.c (arm_expand_binop_builtin): Pass entire CALL_EXPR
instead of arglist.  Use new CALL_EXPR accessors.  Fix callers.
(arm_expand_unop_builtin): Likewise.
(arm_expand_builtin): Use new CALL_EXPR accessors.

* config/mips/mips.c (mips_expand_builtin):  Use new CALL_EXPR
accessors.

* config/bfin/bfin.c (bfin_expand_binop_builtin): Pass entire CALL_EXPR
instead of arglist.  Use new CALL_EXPR accessors.  Fix callers.
(bfin_expand_unop_builtin): Likewise.
(bfin_expand_builtin): Use new CALL_EXPR accessors.

Index: gcc/config/alpha/alpha.c

*** gcc/config/alpha/alpha.c (revision 121818) --- gcc/config/alpha/alpha.c (working copy) *************** alpha_expand_builtin (tree exp, rtx targ *** 6585,6593 **** { #define MAX_ARGS 2
! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); ! tree arglist = TREE_OPERAND (exp, 1); enum insn_code icode; rtx op[MAX_ARGS], pat; int arity; --- 6585,6594 ---- { #define MAX_ARGS 2
! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); ! tree arg; ! call_expr_arg_iterator iter; enum insn_code icode; rtx op[MAX_ARGS], pat; int arity; *************** alpha_expand_builtin (tree exp, rtx targ *** 6601,6613 ****
nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
! for (arglist = TREE_OPERAND (exp, 1), arity = 0; ! arglist; ! arglist = TREE_CHAIN (arglist), arity++) { const struct insn_operand_data *insn_op;
- tree arg = TREE_VALUE (arglist); if (arg == error_mark_node) return NULL_RTX; if (arity > MAX_ARGS) --- 6602,6612 ----
nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
! arity = 0; ! FOR_EACH_CALL_EXPR_ARG (arg, iter, exp) { const struct insn_operand_data *insn_op;
if (arg == error_mark_node) return NULL_RTX; if (arity > MAX_ARGS) *************** alpha_expand_builtin (tree exp, rtx targ *** 6619,6624 **** --- 6618,6624 ----
if (!(*insn_op->predicate) (op[arity], insn_op->mode)) op[arity] = copy_to_mode_reg (insn_op->mode, op[arity]); + arity++; }
if (nonvoid) Index: gcc/config/frv/frv.c

*** gcc/config/frv/frv.c (revision 121818) --- gcc/config/frv/frv.c (working copy) *************** frv_expand_builtin (tree exp, *** 9216,9223 **** enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED) { ! tree arglist = TREE_OPERAND (exp, 1); ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); unsigned fcode = (unsigned)DECL_FUNCTION_CODE (fndecl); unsigned i; struct builtin_description d; --- 9216,9224 ---- enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED) { ! / FIXME: Pass the CALL_EXPR directly instead of consing up an arglist. */ ! tree arglist = CALL_EXPR_ARGS (exp); ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned fcode = (unsigned)DECL_FUNCTION_CODE (fndecl); unsigned i; struct builtin_description *d; Index: gcc/config/s390/s390.c

*** gcc/config/s390/s390.c (revision 121818) --- gcc/config/s390/s390.c (working copy) *************** s390_expand_builtin (tree exp, rtx targe *** 8210,8222 **** unsigned int const *code_for_builtin = TARGET_64BIT ? code_for_builtin_64 : code_for_builtin_31;
! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); - tree arglist = TREE_OPERAND (exp, 1); enum insn_code icode; rtx op[MAX_ARGS], pat; int arity; bool nonvoid;
if (fcode >= S390_BUILTIN_max) internal_error ("bad builtin fcode"); --- 8210,8223 ---- unsigned int const *code_for_builtin = TARGET_64BIT ? code_for_builtin_64 : code_for_builtin_31;
! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); enum insn_code icode; rtx op[MAX_ARGS], pat; int arity; bool nonvoid; + tree arg; + call_expr_arg_iterator iter;
if (fcode >= S390_BUILTIN_max) internal_error ("bad builtin fcode"); *************** s390_expand_builtin (tree exp, rtx targe *** 8226,8238 ****
nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
! for (arglist = TREE_OPERAND (exp, 1), arity = 0; ! arglist; ! arglist = TREE_CHAIN (arglist), arity++) { const struct insn_operand_data *insn_op;
- tree arg = TREE_VALUE (arglist); if (arg == error_mark_node) return NULL_RTX; if (arity > MAX_ARGS) --- 8227,8237 ----
nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
! arity = 0; ! FOR_EACH_CALL_EXPR_ARG (arg, iter, exp) { const struct insn_operand_data *insn_op;
if (arg == error_mark_node) return NULL_RTX; if (arity > MAX_ARGS) *************** s390_expand_builtin (tree exp, rtx targe *** 8244,8249 **** --- 8243,8249 ----
if (!(*insn_op->predicate) (op[arity], insn_op->mode)) op[arity] = copy_to_mode_reg (insn_op->mode, op[arity]); + arity++; }
if (nonvoid) Index: gcc/config/sparc/sparc.c

*** gcc/config/sparc/sparc.c (revision 121818) --- gcc/config/sparc/sparc.c (working copy) *************** sparc_gimplify_va_arg (tree valist, tree *** 5701,5712 **** tree tmp = create_tmp_var (type, "va_arg_tmp"); tree dest_addr = build_fold_addr_expr (tmp);
! tree copy = build_function_call_expr ! (implicit_built_in_decls[BUILT_IN_MEMCPY], ! tree_cons (NULL_TREE, dest_addr, ! tree_cons (NULL_TREE, addr, ! tree_cons (NULL_TREE, size_int (rsize), ! NULL_TREE))));
gimplify_and_add (copy, pre_p); addr = dest_addr; --- 5701,5710 ---- tree tmp = create_tmp_var (type, "va_arg_tmp"); tree dest_addr = build_fold_addr_expr (tmp);
! tree copy = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY], 3, ! dest_addr, ! addr, ! size_int (rsize));
gimplify_and_add (copy, pre_p); addr = dest_addr; *************** static rtx *** 7985,7992 **** 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]; --- 7983,7991 ---- sparc_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode tmode, int ignore ATTRIBUTE_UNUSED) { ! tree arg; ! call_expr_arg_iterator iter; ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned int icode = DECL_FUNCTION_CODE (fndecl); rtx pat, op[4]; enum machine_mode mode[4]; *************** sparc_expand_builtin (tree exp, rtx targ *** 8001,8011 **** 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_normal (arg);

--- 8000,8007 ---- else op[arg_count] = target;
! FOR_EACH_CALL_EXPR_ARG (arg, iter, exp) { arg_count++; mode[arg_count] = insn_data[icode].operand[arg_count].mode; op[arg_count] = expand_normal (arg); Index: gcc/config/i386/i386.c

*** gcc/config/i386/i386.c (revision 121818) --- gcc/config/i386/i386.c (working copy) *************** ix86_function_ok_for_sibcall (tree decl, *** 2692,2698 **** func = decl; else { ! func = TREE_TYPE (TREE_OPERAND (exp, 0)); if (POINTER_TYPE_P (func)) func = TREE_TYPE (func); } --- 2692,2698 ---- func = decl; else { ! func = TREE_TYPE (CALL_EXPR_FN (exp)); if (POINTER_TYPE_P (func)) func = TREE_TYPE (func); } *************** ix86_function_ok_for_sibcall (tree decl, *** 2727,2733 **** tree type;
/* We're looking at the CALL_EXPR, we need the type of the function. / ! type = TREE_OPERAND (exp, 0); / pointer expression / type = TREE_TYPE (type); / pointer type / type = TREE_TYPE (type); / function type /
--- 2727,2733 ---- tree type;
/
We're looking at the CALL_EXPR, we need the type of the function. / ! type = CALL_EXPR_FN (exp); / pointer expression / type = TREE_TYPE (type); / pointer type / type = TREE_TYPE (type); / function type /
*************** safe_vector_operand (rtx x, enum machine *** 17245,17255 **** /
Subroutine of ix86_expand_builtin to take care of binop insns. /
static rtx ! ix86_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target) { rtx pat, xops[3]; ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode tmode = insn_data[icode].operand[0].mode; --- 17245,17255 ---- /
Subroutine of ix86_expand_builtin to take care of binop insns. /
static rtx ! ix86_expand_binop_builtin (enum insn_code icode, tree exp, rtx target) { rtx pat, xops[3]; ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode tmode = insn_data[icode].operand[0].mode; *************** ix86_expand_binop_builtin (enum insn_cod *** 17313,17323 **** /
Subroutine of ix86_expand_builtin to take care of stores. /
static rtx ! ix86_expand_store_builtin (enum insn_code icode, tree arglist) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode mode0 = insn_data[icode].operand[0].mode; --- 17313,17323 ---- /
Subroutine of ix86_expand_builtin to take care of stores. /
static rtx ! ix86_expand_store_builtin (enum insn_code icode, tree exp) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode mode0 = insn_data[icode].operand[0].mode; *************** ix86_expand_store_builtin (enum insn_cod *** 17338,17348 **** /
Subroutine of ix86_expand_builtin to take care of unop insns. /
static rtx ! ix86_expand_unop_builtin (enum insn_code icode, tree arglist, rtx target, int do_load) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); rtx op0 = expand_normal (arg0); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = insn_data[icode].operand[1].mode; --- 17338,17348 ---- /
Subroutine of ix86_expand_builtin to take care of unop insns. */
static rtx ! ix86_expand_unop_builtin (enum insn_code icode, tree exp, rtx target, int do_load) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); rtx op0 = expand_normal (arg0); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = insn_data[icode].operand[1].mode; *************** ix86_expand_unop_builtin (enum insn_code *** 17374,17383 **** sqrtss, rsqrtss, rcpss. */
static rtx ! ix86_expand_unop1_builtin (enum insn_code icode, tree arglist, rtx target) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); rtx op1, op0 = expand_normal (arg0); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = insn_data[icode].operand[1].mode; --- 17374,17383 ---- sqrtss, rsqrtss, rcpss. /
static rtx ! ix86_expand_unop1_builtin (enum insn_code icode, tree exp, rtx target) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); rtx op1, op0 = expand_normal (arg0); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = insn_data[icode].operand[1].mode; *************** ix86_expand_unop1_builtin (enum insn_cod *** 17408,17419 **** /
Subroutine of ix86_expand_builtin to take care of comparison insns. */
static rtx ! ix86_expand_sse_compare (const struct builtin_description d, tree arglist, rtx target) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2; --- 17408,17419 ---- / Subroutine of ix86_expand_builtin to take care of comparison insns. */
static rtx ! ix86_expand_sse_compare (const struct builtin_description d, tree exp, rtx target) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2; *************** ix86_expand_sse_compare (const struct bu *** 17460,17471 **** / Subroutine of ix86_expand_builtin to take care of comi insns. */
static rtx ! ix86_expand_sse_comi (const struct builtin_description d, tree arglist, rtx target) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2; --- 17460,17471 ---- / Subroutine of ix86_expand_builtin to take care of comi insns. */
static rtx ! ix86_expand_sse_comi (const struct builtin_description *d, tree exp, rtx target) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2; *************** get_element_number (tree vec_type, tree *** 17540,17546 **** these sorts of instructions. */
static rtx ! ix86_expand_vec_init_builtin (tree type, tree arglist, rtx target) { enum machine_mode tmode = TYPE_MODE (type); enum machine_mode inner_mode = GET_MODE_INNER (tmode); --- 17540,17546 ---- these sorts of instructions. */
static rtx ! ix86_expand_vec_init_builtin (tree type, tree exp, rtx target) { enum machine_mode tmode = TYPE_MODE (type); enum machine_mode inner_mode = GET_MODE_INNER (tmode); *************** ix86_expand_vec_init_builtin (tree type, *** 17548,17562 **** rtvec v = rtvec_alloc (n_elt);
gcc_assert (VECTOR_MODE_P (tmode));
! for (i = 0; i < n_elt; ++i, arglist = TREE_CHAIN (arglist)) { ! rtx x = expand_normal (TREE_VALUE (arglist)); RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x); }
- gcc_assert (arglist == NULL);

if (!target || !register_operand (target, tmode))
  target = gen_reg_rtx (tmode);

--- 17548,17561 ---- rtvec v = rtvec_alloc (n_elt);
gcc_assert (VECTOR_MODE_P (tmode)); + gcc_assert (call_expr_nargs (exp) == n_elt);
! for (i = 0; i < n_elt; ++i) { ! rtx x = expand_normal (CALL_EXPR_ARG (exp, i)); RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x); }
if (!target || !register_operand (target, tmode)) target = gen_reg_rtx (tmode);
*************** ix86_expand_vec_init_builtin (tree type, *** 17569,17583 **** had a language-level syntax for referencing vector elements. */
static rtx ! ix86_expand_vec_ext_builtin (tree arglist, rtx target) { enum machine_mode tmode, mode0; tree arg0, arg1; int elt; rtx op0;
! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist));
op0 = expand_normal (arg0); elt = get_element_number (TREE_TYPE (arg0), arg1); --- 17568,17582 ---- had a language-level syntax for referencing vector elements. */
static rtx ! ix86_expand_vec_ext_builtin (tree exp, rtx target) { enum machine_mode tmode, mode0; tree arg0, arg1; int elt; rtx op0;
! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1);
op0 = expand_normal (arg0); elt = get_element_number (TREE_TYPE (arg0), arg1); *************** ix86_expand_vec_ext_builtin (tree arglis *** 17601,17616 **** a language-level syntax for referencing vector elements. */
static rtx ! ix86_expand_vec_set_builtin (tree arglist) { enum machine_mode tmode, mode1; tree arg0, arg1, arg2; int elt; rtx op0, op1;
! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
tmode = TYPE_MODE (TREE_TYPE (arg0)); mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0))); --- 17600,17615 ---- a language-level syntax for referencing vector elements. */
static rtx ! ix86_expand_vec_set_builtin (tree exp) { enum machine_mode tmode, mode1; tree arg0, arg1, arg2; int elt; rtx op0, op1;
! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2);
tmode = TYPE_MODE (TREE_TYPE (arg0)); mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0))); *************** ix86_expand_builtin (tree exp, rtx targe *** 17645,17652 **** const struct builtin_description *d; size_t i; enum insn_code icode; ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); tree arg0, arg1, arg2, arg3; rtx op0, op1, op2, op3, pat; enum machine_mode tmode, mode0, mode1, mode2, mode3, mode4; --- 17644,17650 ---- const struct builtin_description *d; size_t i; enum insn_code icode; ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); tree arg0, arg1, arg2, arg3; rtx op0, op1, op2, op3, pat; enum machine_mode tmode, mode0, mode1, mode2, mode3, mode4; *************** ix86_expand_builtin (tree exp, rtx targe *** 17668,17676 **** ? CODE_FOR_mmx_maskmovq : CODE_FOR_sse2_maskmovdqu); /* Note the arg order is different from the operand order. */ ! arg1 = TREE_VALUE (arglist); ! arg2 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg0 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); --- 17666,17674 ---- ? CODE_FOR_mmx_maskmovq : CODE_FOR_sse2_maskmovdqu); /* Note the arg order is different from the operand order. */ ! arg1 = CALL_EXPR_ARG (exp, 0); ! arg2 = CALL_EXPR_ARG (exp, 1); ! arg0 = CALL_EXPR_ARG (exp, 2); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); *************** ix86_expand_builtin (tree exp, rtx targe *** 17694,17710 **** return 0;
case IX86_BUILTIN_SQRTSS: ! return ix86_expand_unop1_builtin (CODE_FOR_sse_vmsqrtv4sf2, arglist, target); case IX86_BUILTIN_RSQRTSS: ! return ix86_expand_unop1_builtin (CODE_FOR_sse_vmrsqrtv4sf2, arglist, target); case IX86_BUILTIN_RCPSS: ! return ix86_expand_unop1_builtin (CODE_FOR_sse_vmrcpv4sf2, arglist, target);
case IX86_BUILTIN_LOADUPS: ! return ix86_expand_unop_builtin (CODE_FOR_sse_movups, arglist, target, 1);
case IX86_BUILTIN_STOREUPS: ! return ix86_expand_store_builtin (CODE_FOR_sse_movups, arglist);
case IX86_BUILTIN_LOADHPS: case IX86_BUILTIN_LOADLPS: --- 17692,17708 ---- return 0;
case IX86_BUILTIN_SQRTSS: ! return ix86_expand_unop1_builtin (CODE_FOR_sse_vmsqrtv4sf2, exp, target); case IX86_BUILTIN_RSQRTSS: ! return ix86_expand_unop1_builtin (CODE_FOR_sse_vmrsqrtv4sf2, exp, target); case IX86_BUILTIN_RCPSS: ! return ix86_expand_unop1_builtin (CODE_FOR_sse_vmrcpv4sf2, exp, target);
case IX86_BUILTIN_LOADUPS: ! return ix86_expand_unop_builtin (CODE_FOR_sse_movups, exp, target, 1);
case IX86_BUILTIN_STOREUPS: ! return ix86_expand_store_builtin (CODE_FOR_sse_movups, exp);
case IX86_BUILTIN_LOADHPS: case IX86_BUILTIN_LOADLPS: *************** ix86_expand_builtin (tree exp, rtx targe *** 17714,17721 **** : fcode == IX86_BUILTIN_LOADLPS ? CODE_FOR_sse_loadlps : fcode == IX86_BUILTIN_LOADHPD ? CODE_FOR_sse2_loadhpd : CODE_FOR_sse2_loadlpd); ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; --- 17712,17719 ---- : fcode == IX86_BUILTIN_LOADLPS ? CODE_FOR_sse_loadlps : fcode == IX86_BUILTIN_LOADHPD ? CODE_FOR_sse2_loadhpd : CODE_FOR_sse2_loadlpd); ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; *************** ix86_expand_builtin (tree exp, rtx targe *** 17738,17745 **** case IX86_BUILTIN_STORELPS: icode = (fcode == IX86_BUILTIN_STOREHPS ? CODE_FOR_sse_storehps : CODE_FOR_sse_storelps); ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = expand_normal (arg0); op1 = expand_normal (arg1); mode0 = insn_data[icode].operand[0].mode; --- 17736,17743 ---- case IX86_BUILTIN_STORELPS: icode = (fcode == IX86_BUILTIN_STOREHPS ? CODE_FOR_sse_storehps : CODE_FOR_sse_storelps); ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = expand_normal (arg0); op1 = expand_normal (arg1); mode0 = insn_data[icode].operand[0].mode; *************** ix86_expand_builtin (tree exp, rtx targe *** 17755,17766 **** return const0_rtx;
case IX86_BUILTIN_MOVNTPS: ! return ix86_expand_store_builtin (CODE_FOR_sse_movntv4sf, arglist); case IX86_BUILTIN_MOVNTQ: ! return ix86_expand_store_builtin (CODE_FOR_sse_movntdi, arglist);
case IX86_BUILTIN_LDMXCSR: ! op0 = expand_normal (TREE_VALUE (arglist)); target = assign_386_stack_local (SImode, SLOT_TEMP); emit_move_insn (target, op0); emit_insn (gen_sse_ldmxcsr (target)); --- 17753,17764 ---- return const0_rtx;
case IX86_BUILTIN_MOVNTPS: ! return ix86_expand_store_builtin (CODE_FOR_sse_movntv4sf, exp); case IX86_BUILTIN_MOVNTQ: ! return ix86_expand_store_builtin (CODE_FOR_sse_movntdi, exp);
case IX86_BUILTIN_LDMXCSR: ! op0 = expand_normal (CALL_EXPR_ARG (exp, 0)); target = assign_386_stack_local (SImode, SLOT_TEMP); emit_move_insn (target, op0); emit_insn (gen_sse_ldmxcsr (target)); *************** ix86_expand_builtin (tree exp, rtx targe *** 17776,17784 **** icode = (fcode == IX86_BUILTIN_SHUFPS ? CODE_FOR_sse_shufps : CODE_FOR_sse2_shufpd); ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); --- 17774,17782 ---- icode = (fcode == IX86_BUILTIN_SHUFPS ? CODE_FOR_sse_shufps : CODE_FOR_sse2_shufpd); ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); *************** ix86_expand_builtin (tree exp, rtx targe *** 17816,17823 **** : fcode == IX86_BUILTIN_PSHUFLW ? CODE_FOR_sse2_pshuflw : fcode == IX86_BUILTIN_PSHUFD ? CODE_FOR_sse2_pshufd : CODE_FOR_mmx_pshufw); ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; --- 17814,17821 ---- : fcode == IX86_BUILTIN_PSHUFLW ? CODE_FOR_sse2_pshuflw : fcode == IX86_BUILTIN_PSHUFD ? CODE_FOR_sse2_pshufd : CODE_FOR_mmx_pshufw); ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; *************** ix86_expand_builtin (tree exp, rtx targe *** 17846,17853 **** case IX86_BUILTIN_PSRLDQI128: icode = ( fcode == IX86_BUILTIN_PSLLDQI128 ? CODE_FOR_sse2_ashlti3 : CODE_FOR_sse2_lshrti3); ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; --- 17844,17851 ---- case IX86_BUILTIN_PSRLDQI128: icode = ( fcode == IX86_BUILTIN_PSLLDQI128 ? CODE_FOR_sse2_ashlti3 : CODE_FOR_sse2_lshrti3); ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; *************** ix86_expand_builtin (tree exp, rtx targe *** 17876,17961 **** return NULL_RTX;
case IX86_BUILTIN_PAVGUSB: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_uavgv8qi3, arglist, target);
case IX86_BUILTIN_PF2ID: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_pf2id, arglist, target, 0);
case IX86_BUILTIN_PFACC: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_haddv2sf3, arglist, target);
case IX86_BUILTIN_PFADD: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_addv2sf3, arglist, target);
case IX86_BUILTIN_PFCMPEQ: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_eqv2sf3, arglist, target);
case IX86_BUILTIN_PFCMPGE: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_gev2sf3, arglist, target);
case IX86_BUILTIN_PFCMPGT: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_gtv2sf3, arglist, target);
case IX86_BUILTIN_PFMAX: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_smaxv2sf3, arglist, target);
case IX86_BUILTIN_PFMIN: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_sminv2sf3, arglist, target);
case IX86_BUILTIN_PFMUL: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_mulv2sf3, arglist, target);
case IX86_BUILTIN_PFRCP: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_rcpv2sf2, arglist, target, 0);
case IX86_BUILTIN_PFRCPIT1: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_rcpit1v2sf3, arglist, target);
case IX86_BUILTIN_PFRCPIT2: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_rcpit2v2sf3, arglist, target);
case IX86_BUILTIN_PFRSQIT1: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_rsqit1v2sf3, arglist, target);
case IX86_BUILTIN_PFRSQRT: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_rsqrtv2sf2, arglist, target, 0);
case IX86_BUILTIN_PFSUB: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_subv2sf3, arglist, target);
case IX86_BUILTIN_PFSUBR: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_subrv2sf3, arglist, target);
case IX86_BUILTIN_PI2FD: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_floatv2si2, arglist, target, 0);
case IX86_BUILTIN_PMULHRW: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_pmulhrwv4hi3, arglist, target);
case IX86_BUILTIN_PF2IW: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_pf2iw, arglist, target, 0);
case IX86_BUILTIN_PFNACC: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_hsubv2sf3, arglist, target);
case IX86_BUILTIN_PFPNACC: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_addsubv2sf3, arglist, target);
case IX86_BUILTIN_PI2FW: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_pi2fw, arglist, target, 0);
case IX86_BUILTIN_PSWAPDSI: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_pswapdv2si2, arglist, target, 0);
case IX86_BUILTIN_PSWAPDSF: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_pswapdv2sf2, arglist, target, 0);
case IX86_BUILTIN_SQRTSD: ! return ix86_expand_unop1_builtin (CODE_FOR_sse2_vmsqrtv2df2, arglist, target); case IX86_BUILTIN_LOADUPD: ! return ix86_expand_unop_builtin (CODE_FOR_sse2_movupd, arglist, target, 1); case IX86_BUILTIN_STOREUPD: ! return ix86_expand_store_builtin (CODE_FOR_sse2_movupd, arglist);
case IX86_BUILTIN_MFENCE: emit_insn (gen_sse2_mfence ()); --- 17874,17959 ---- return NULL_RTX;
case IX86_BUILTIN_PAVGUSB: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_uavgv8qi3, exp, target);
case IX86_BUILTIN_PF2ID: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_pf2id, exp, target, 0);
case IX86_BUILTIN_PFACC: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_haddv2sf3, exp, target);
case IX86_BUILTIN_PFADD: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_addv2sf3, exp, target);
case IX86_BUILTIN_PFCMPEQ: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_eqv2sf3, exp, target);
case IX86_BUILTIN_PFCMPGE: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_gev2sf3, exp, target);
case IX86_BUILTIN_PFCMPGT: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_gtv2sf3, exp, target);
case IX86_BUILTIN_PFMAX: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_smaxv2sf3, exp, target);
case IX86_BUILTIN_PFMIN: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_sminv2sf3, exp, target);
case IX86_BUILTIN_PFMUL: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_mulv2sf3, exp, target);
case IX86_BUILTIN_PFRCP: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_rcpv2sf2, exp, target, 0);
case IX86_BUILTIN_PFRCPIT1: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_rcpit1v2sf3, exp, target);
case IX86_BUILTIN_PFRCPIT2: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_rcpit2v2sf3, exp, target);
case IX86_BUILTIN_PFRSQIT1: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_rsqit1v2sf3, exp, target);
case IX86_BUILTIN_PFRSQRT: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_rsqrtv2sf2, exp, target, 0);
case IX86_BUILTIN_PFSUB: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_subv2sf3, exp, target);
case IX86_BUILTIN_PFSUBR: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_subrv2sf3, exp, target);
case IX86_BUILTIN_PI2FD: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_floatv2si2, exp, target, 0);
case IX86_BUILTIN_PMULHRW: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_pmulhrwv4hi3, exp, target);
case IX86_BUILTIN_PF2IW: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_pf2iw, exp, target, 0);
case IX86_BUILTIN_PFNACC: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_hsubv2sf3, exp, target);
case IX86_BUILTIN_PFPNACC: ! return ix86_expand_binop_builtin (CODE_FOR_mmx_addsubv2sf3, exp, target);
case IX86_BUILTIN_PI2FW: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_pi2fw, exp, target, 0);
case IX86_BUILTIN_PSWAPDSI: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_pswapdv2si2, exp, target, 0);
case IX86_BUILTIN_PSWAPDSF: ! return ix86_expand_unop_builtin (CODE_FOR_mmx_pswapdv2sf2, exp, target, 0);
case IX86_BUILTIN_SQRTSD: ! return ix86_expand_unop1_builtin (CODE_FOR_sse2_vmsqrtv2df2, exp, target); case IX86_BUILTIN_LOADUPD: ! return ix86_expand_unop_builtin (CODE_FOR_sse2_movupd, exp, target, 1); case IX86_BUILTIN_STOREUPD: ! return ix86_expand_store_builtin (CODE_FOR_sse2_movupd, exp);
case IX86_BUILTIN_MFENCE: emit_insn (gen_sse2_mfence ()); *************** ix86_expand_builtin (tree exp, rtx targe *** 17965,17971 **** return 0;
case IX86_BUILTIN_CLFLUSH: ! arg0 = TREE_VALUE (arglist); op0 = expand_normal (arg0); icode = CODE_FOR_sse2_clflush; if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode)) --- 17963,17969 ---- return 0;
case IX86_BUILTIN_CLFLUSH: ! arg0 = CALL_EXPR_ARG (exp, 0); op0 = expand_normal (arg0); icode = CODE_FOR_sse2_clflush; if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode)) *************** ix86_expand_builtin (tree exp, rtx targe *** 17975,17995 **** return 0;
case IX86_BUILTIN_MOVNTPD: ! return ix86_expand_store_builtin (CODE_FOR_sse2_movntv2df, arglist); case IX86_BUILTIN_MOVNTDQ: ! return ix86_expand_store_builtin (CODE_FOR_sse2_movntv2di, arglist); case IX86_BUILTIN_MOVNTI: ! return ix86_expand_store_builtin (CODE_FOR_sse2_movntsi, arglist);
case IX86_BUILTIN_LOADDQU: ! return ix86_expand_unop_builtin (CODE_FOR_sse2_movdqu, arglist, target, 1); case IX86_BUILTIN_STOREDQU: ! return ix86_expand_store_builtin (CODE_FOR_sse2_movdqu, arglist);
case IX86_BUILTIN_MONITOR: ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); --- 17973,17993 ---- return 0;
case IX86_BUILTIN_MOVNTPD: ! return ix86_expand_store_builtin (CODE_FOR_sse2_movntv2df, exp); case IX86_BUILTIN_MOVNTDQ: ! return ix86_expand_store_builtin (CODE_FOR_sse2_movntv2di, exp); case IX86_BUILTIN_MOVNTI: ! return ix86_expand_store_builtin (CODE_FOR_sse2_movntsi, exp);
case IX86_BUILTIN_LOADDQU: ! return ix86_expand_unop_builtin (CODE_FOR_sse2_movdqu, exp, target, 1); case IX86_BUILTIN_STOREDQU: ! return ix86_expand_store_builtin (CODE_FOR_sse2_movdqu, exp);
case IX86_BUILTIN_MONITOR: ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); *************** ix86_expand_builtin (tree exp, rtx targe *** 18006,18013 **** return 0;
case IX86_BUILTIN_MWAIT: ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = expand_normal (arg0); op1 = expand_normal (arg1); if (!REG_P (op0)) --- 18004,18011 ---- return 0;
case IX86_BUILTIN_MWAIT: ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = expand_normal (arg0); op1 = expand_normal (arg1); if (!REG_P (op0)) *************** ix86_expand_builtin (tree exp, rtx targe *** 18018,18024 **** return 0;
case IX86_BUILTIN_LDDQU: ! return ix86_expand_unop_builtin (CODE_FOR_sse3_lddqu, arglist, target, 1);
case IX86_BUILTIN_PALIGNR: --- 18016,18022 ---- return 0;
case IX86_BUILTIN_LDDQU: ! return ix86_expand_unop_builtin (CODE_FOR_sse3_lddqu, exp, target, 1);
case IX86_BUILTIN_PALIGNR: *************** ix86_expand_builtin (tree exp, rtx targe *** 18033,18041 **** icode = CODE_FOR_ssse3_palignrti; mode = V2DImode; } ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0); --- 18031,18039 ---- icode = CODE_FOR_ssse3_palignrti; mode = V2DImode; } ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2); op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0); *************** ix86_expand_builtin (tree exp, rtx targe *** 18068,18085 **** return target;
case IX86_BUILTIN_MOVNTSD: ! return ix86_expand_store_builtin (CODE_FOR_sse4a_vmmovntv2df, arglist);
case IX86_BUILTIN_MOVNTSS: ! return ix86_expand_store_builtin (CODE_FOR_sse4a_vmmovntv4sf, arglist);
case IX86_BUILTIN_INSERTQ: case IX86_BUILTIN_EXTRQ: icode = (fcode == IX86_BUILTIN_EXTRQ ? CODE_FOR_sse4a_extrq : CODE_FOR_sse4a_insertq); ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; --- 18066,18083 ---- return target;
case IX86_BUILTIN_MOVNTSD: ! return ix86_expand_store_builtin (CODE_FOR_sse4a_vmmovntv2df, exp);
case IX86_BUILTIN_MOVNTSS: ! return ix86_expand_store_builtin (CODE_FOR_sse4a_vmmovntv4sf, exp);
case IX86_BUILTIN_INSERTQ: case IX86_BUILTIN_EXTRQ: icode = (fcode == IX86_BUILTIN_EXTRQ ? CODE_FOR_sse4a_extrq : CODE_FOR_sse4a_insertq); ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; *************** ix86_expand_builtin (tree exp, rtx targe *** 18101,18109 ****
case IX86_BUILTIN_EXTRQI: icode = CODE_FOR_sse4a_extrqi; ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); --- 18099,18107 ----
case IX86_BUILTIN_EXTRQI: icode = CODE_FOR_sse4a_extrqi; ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); *************** ix86_expand_builtin (tree exp, rtx targe *** 18135,18144 ****
case IX86_BUILTIN_INSERTQI: icode = CODE_FOR_sse4a_insertqi; ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); ! arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist)))); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); --- 18133,18142 ----
case IX86_BUILTIN_INSERTQI: icode = CODE_FOR_sse4a_insertqi; ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2); ! arg3 = CALL_EXPR_ARG (exp, 3); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); *************** ix86_expand_builtin (tree exp, rtx targe *** 18178,18184 **** case IX86_BUILTIN_VEC_INIT_V2SI: case IX86_BUILTIN_VEC_INIT_V4HI: case IX86_BUILTIN_VEC_INIT_V8QI: ! return ix86_expand_vec_init_builtin (TREE_TYPE (exp), arglist, target);
case IX86_BUILTIN_VEC_EXT_V2DF: case IX86_BUILTIN_VEC_EXT_V2DI: --- 18176,18182 ---- case IX86_BUILTIN_VEC_INIT_V2SI: case IX86_BUILTIN_VEC_INIT_V4HI: case IX86_BUILTIN_VEC_INIT_V8QI: ! return ix86_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
case IX86_BUILTIN_VEC_EXT_V2DF: case IX86_BUILTIN_VEC_EXT_V2DI: *************** ix86_expand_builtin (tree exp, rtx targe *** 18187,18197 **** case IX86_BUILTIN_VEC_EXT_V8HI: case IX86_BUILTIN_VEC_EXT_V2SI: case IX86_BUILTIN_VEC_EXT_V4HI: ! return ix86_expand_vec_ext_builtin (arglist, target);
case IX86_BUILTIN_VEC_SET_V8HI: case IX86_BUILTIN_VEC_SET_V4HI: ! return ix86_expand_vec_set_builtin (arglist);
default: break; --- 18185,18195 ---- case IX86_BUILTIN_VEC_EXT_V8HI: case IX86_BUILTIN_VEC_EXT_V2SI: case IX86_BUILTIN_VEC_EXT_V4HI: ! return ix86_expand_vec_ext_builtin (exp, target);
case IX86_BUILTIN_VEC_SET_V8HI: case IX86_BUILTIN_VEC_SET_V4HI: ! return ix86_expand_vec_set_builtin (exp);
default: break; *************** ix86_expand_builtin (tree exp, rtx targe *** 18205,18222 **** || d->icode == CODE_FOR_sse_vmmaskcmpv4sf3 || d->icode == CODE_FOR_sse2_maskcmpv2df3 || d->icode == CODE_FOR_sse2_vmmaskcmpv2df3) ! return ix86_expand_sse_compare (d, arglist, target);
! return ix86_expand_binop_builtin (d->icode, arglist, target); }
for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++) if (d->code == fcode) ! return ix86_expand_unop_builtin (d->icode, arglist, target, 0);
for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++) if (d->code == fcode) ! return ix86_expand_sse_comi (d, arglist, target);
gcc_unreachable (); } --- 18203,18220 ---- || d->icode == CODE_FOR_sse_vmmaskcmpv4sf3 || d->icode == CODE_FOR_sse2_maskcmpv2df3 || d->icode == CODE_FOR_sse2_vmmaskcmpv2df3) ! return ix86_expand_sse_compare (d, exp, target);
! return ix86_expand_binop_builtin (d->icode, exp, target); }
for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++) if (d->code == fcode) ! return ix86_expand_unop_builtin (d->icode, exp, target, 0);
for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++) if (d->code == fcode) ! return ix86_expand_sse_comi (d, exp, target);
gcc_unreachable (); } Index: gcc/config/sh/sh.c

*** gcc/config/sh/sh.c (revision 121818) --- gcc/config/sh/sh.c (working copy) *************** static rtx *** 9904,9911 **** sh_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, int ignore) { ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); const struct builtin_description *d = &bdesc[fcode]; enum insn_code icode = d->icode; --- 9904,9910 ---- sh_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, int ignore) { ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); const struct builtin_description *d = &bdesc[fcode]; enum insn_code icode = d->icode; *************** sh_expand_builtin (tree exp, rtx target, *** 9938,9947 ****
if (! signature_args[signature][i]) break; ! arg = TREE_VALUE (arglist); if (arg == error_mark_node) return const0_rtx; - arglist = TREE_CHAIN (arglist); if (signature_args[signature][i] & 8) { opmode = ptr_mode; --- 9937,9945 ----
if (! signature_args[signature][i]) break; ! arg = CALL_EXPR_ARG (exp, i-1); if (arg == error_mark_node) return const0_rtx; if (signature_args[signature][i] & 8) { opmode = ptr_mode; Index: gcc/config/c4x/c4x.c

*** gcc/config/c4x/c4x.c (revision 121818) --- gcc/config/c4x/c4x.c (working copy) *************** c4x_expand_builtin (tree exp, rtx target *** 4395,4410 **** enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED) { ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); - tree arglist = TREE_OPERAND (exp, 1); tree arg0, arg1; rtx r0, r1;
switch (fcode) { case C4X_BUILTIN_FIX: ! arg0 = TREE_VALUE (arglist); r0 = expand_expr (arg0, NULL_RTX, QFmode, 0); if (! target || ! register_operand (target, QImode)) target = gen_reg_rtx (QImode); --- 4395,4409 ---- enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED) { ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); tree arg0, arg1; rtx r0, r1;
switch (fcode) { case C4X_BUILTIN_FIX: ! arg0 = CALL_EXPR_ARG (exp, 0); r0 = expand_expr (arg0, NULL_RTX, QFmode, 0); if (! target || ! register_operand (target, QImode)) target = gen_reg_rtx (QImode); *************** c4x_expand_builtin (tree exp, rtx target *** 4412,4418 **** return target;
case C4X_BUILTIN_FIX_ANSI: ! arg0 = TREE_VALUE (arglist); r0 = expand_expr (arg0, NULL_RTX, QFmode, 0); if (! target || ! register_operand (target, QImode)) target = gen_reg_rtx (QImode); --- 4411,4417 ---- return target;
case C4X_BUILTIN_FIX_ANSI: ! arg0 = CALL_EXPR_ARG (exp, 0); r0 = expand_expr (arg0, NULL_RTX, QFmode, 0); if (! target || ! register_operand (target, QImode)) target = gen_reg_rtx (QImode); *************** c4x_expand_builtin (tree exp, rtx target *** 4422,4429 **** case C4X_BUILTIN_MPYI: if (! TARGET_C3X) break; ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); r0 = expand_expr (arg0, NULL_RTX, QImode, 0); r1 = expand_expr (arg1, NULL_RTX, QImode, 0); if (! target || ! register_operand (target, QImode)) --- 4421,4428 ---- case C4X_BUILTIN_MPYI: if (! TARGET_C3X) break; ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); r0 = expand_expr (arg0, NULL_RTX, QImode, 0); r1 = expand_expr (arg1, NULL_RTX, QImode, 0); if (! target || ! register_operand (target, QImode)) *************** c4x_expand_builtin (tree exp, rtx target *** 4434,4440 **** case C4X_BUILTIN_TOIEEE: if (TARGET_C3X) break; ! arg0 = TREE_VALUE (arglist); r0 = expand_expr (arg0, NULL_RTX, QFmode, 0); if (! target || ! register_operand (target, QFmode)) target = gen_reg_rtx (QFmode); --- 4433,4439 ---- case C4X_BUILTIN_TOIEEE: if (TARGET_C3X) break; ! arg0 = CALL_EXPR_ARG (exp, 0); r0 = expand_expr (arg0, NULL_RTX, QFmode, 0); if (! target || ! register_operand (target, QFmode)) target = gen_reg_rtx (QFmode); *************** c4x_expand_builtin (tree exp, rtx target *** 4444,4450 **** case C4X_BUILTIN_FRIEEE: if (TARGET_C3X) break; ! arg0 = TREE_VALUE (arglist); r0 = expand_expr (arg0, NULL_RTX, QFmode, 0); if (register_operand (r0, QFmode)) { --- 4443,4449 ---- case C4X_BUILTIN_FRIEEE: if (TARGET_C3X) break; ! arg0 = CALL_EXPR_ARG (exp, 0); r0 = expand_expr (arg0, NULL_RTX, QFmode, 0); if (register_operand (r0, QFmode)) { *************** c4x_expand_builtin (tree exp, rtx target *** 4460,4466 **** case C4X_BUILTIN_RCPF: if (TARGET_C3X) break; ! arg0 = TREE_VALUE (arglist); r0 = expand_expr (arg0, NULL_RTX, QFmode, 0); if (! target || ! register_operand (target, QFmode)) target = gen_reg_rtx (QFmode); --- 4459,4465 ---- case C4X_BUILTIN_RCPF: if (TARGET_C3X) break; ! arg0 = CALL_EXPR_ARG (exp, 0); r0 = expand_expr (arg0, NULL_RTX, QFmode, 0); if (! target || ! register_operand (target, QFmode)) target = gen_reg_rtx (QFmode); Index: gcc/config/iq2000/iq2000.c

*** gcc/config/iq2000/iq2000.c (revision 121818) --- gcc/config/iq2000/iq2000.c (working copy) *************** void_ftype_int_int_int *** 2569,2579 **** def_builtin ("__builtin_syscall", void_ftype, IQ2000_BUILTIN_SYSCALL); }
! /* Builtin for ICODE having ARGCOUNT args in ARGLIST where each arg has an rtx CODE. */
static rtx ! expand_one_builtin (enum insn_code icode, rtx target, tree arglist, enum rtx_code code, int argcount) { rtx pat; --- 2569,2579 ---- def_builtin ("__builtin_syscall", void_ftype, IQ2000_BUILTIN_SYSCALL); }
! /
Builtin for ICODE having ARGCOUNT args in EXP where each arg has an rtx CODE. */
static rtx ! expand_one_builtin (enum insn_code icode, rtx target, tree exp, enum rtx_code *code, int argcount) { rtx pat; *************** expand_one_builtin (enum insn_code icode *** 2585,2592 **** mode[0] = insn_data[icode].operand[0].mode; for (i = 0; i < argcount; i++) { ! arg[i] = TREE_VALUE (arglist); ! arglist = TREE_CHAIN (arglist); op[i] = expand_expr (arg[i], NULL_RTX, VOIDmode, 0); mode[i] = insn_data[icode].operand[i].mode; if (code[i] == CONST_INT && GET_CODE (op[i]) != CONST_INT) --- 2585,2591 ---- mode[0] = insn_data[icode].operand[0].mode; for (i = 0; i < argcount; i++) { ! arg[i] = CALL_EXPR_ARG (exp, i); op[i] = expand_expr (arg[i], NULL_RTX, VOIDmode, 0); mode[i] = insn_data[icode].operand[i].mode; if (code[i] == CONST_INT && GET_CODE (op[i]) != CONST_INT) *************** iq2000_expand_builtin (tree exp, rtx tar *** 2655,2662 **** enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED) { ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); int fcode = DECL_FUNCTION_CODE (fndecl); enum rtx_code code [5];
--- 2654,2660 ---- enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED) { ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); int fcode = DECL_FUNCTION_CODE (fndecl); enum rtx_code code [5];
*************** iq2000_expand_builtin (tree exp, rtx tar *** 2671,2832 **** break;
case IQ2000_BUILTIN_ADO16: ! return expand_one_builtin (CODE_FOR_ado16, target, arglist, code, 2);
case IQ2000_BUILTIN_RAM: code[1] = CONST_INT; code[2] = CONST_INT; code[3] = CONST_INT; ! return expand_one_builtin (CODE_FOR_ram, target, arglist, code, 4);
case IQ2000_BUILTIN_CHKHDR: ! return expand_one_builtin (CODE_FOR_chkhdr, target, arglist, code, 2);
case IQ2000_BUILTIN_PKRL: ! return expand_one_builtin (CODE_FOR_pkrl, target, arglist, code, 2);
case IQ2000_BUILTIN_CFC0: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_cfc0, target, arglist, code, 1);
case IQ2000_BUILTIN_CFC1: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_cfc1, target, arglist, code, 1);
case IQ2000_BUILTIN_CFC2: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_cfc2, target, arglist, code, 1);
case IQ2000_BUILTIN_CFC3: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_cfc3, target, arglist, code, 1);
case IQ2000_BUILTIN_CTC0: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_ctc0, target, arglist, code, 2);
case IQ2000_BUILTIN_CTC1: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_ctc1, target, arglist, code, 2);
case IQ2000_BUILTIN_CTC2: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_ctc2, target, arglist, code, 2);
case IQ2000_BUILTIN_CTC3: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_ctc3, target, arglist, code, 2);
case IQ2000_BUILTIN_MFC0: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mfc0, target, arglist, code, 1);
case IQ2000_BUILTIN_MFC1: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mfc1, target, arglist, code, 1);
case IQ2000_BUILTIN_MFC2: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mfc2, target, arglist, code, 1);
case IQ2000_BUILTIN_MFC3: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mfc3, target, arglist, code, 1);
case IQ2000_BUILTIN_MTC0: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mtc0, target, arglist, code, 2);
case IQ2000_BUILTIN_MTC1: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mtc1, target, arglist, code, 2);
case IQ2000_BUILTIN_MTC2: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mtc2, target, arglist, code, 2);
case IQ2000_BUILTIN_MTC3: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mtc3, target, arglist, code, 2);
case IQ2000_BUILTIN_LUR: ! return expand_one_builtin (CODE_FOR_lur, target, arglist, code, 2);
case IQ2000_BUILTIN_RB: ! return expand_one_builtin (CODE_FOR_rb, target, arglist, code, 2);
case IQ2000_BUILTIN_RX: ! return expand_one_builtin (CODE_FOR_rx, target, arglist, code, 2);
case IQ2000_BUILTIN_SRRD: ! return expand_one_builtin (CODE_FOR_srrd, target, arglist, code, 1);
case IQ2000_BUILTIN_SRWR: ! return expand_one_builtin (CODE_FOR_srwr, target, arglist, code, 2);
case IQ2000_BUILTIN_WB: ! return expand_one_builtin (CODE_FOR_wb, target, arglist, code, 2);
case IQ2000_BUILTIN_WX: ! return expand_one_builtin (CODE_FOR_wx, target, arglist, code, 2);
case IQ2000_BUILTIN_LUC32L: ! return expand_one_builtin (CODE_FOR_luc32l, target, arglist, code, 2);
case IQ2000_BUILTIN_LUC64: ! return expand_one_builtin (CODE_FOR_luc64, target, arglist, code, 2);
case IQ2000_BUILTIN_LUC64L: ! return expand_one_builtin (CODE_FOR_luc64l, target, arglist, code, 2);
case IQ2000_BUILTIN_LUK: ! return expand_one_builtin (CODE_FOR_luk, target, arglist, code, 2);
case IQ2000_BUILTIN_LULCK: ! return expand_one_builtin (CODE_FOR_lulck, target, arglist, code, 1);
case IQ2000_BUILTIN_LUM32: ! return expand_one_builtin (CODE_FOR_lum32, target, arglist, code, 2);
case IQ2000_BUILTIN_LUM32L: ! return expand_one_builtin (CODE_FOR_lum32l, target, arglist, code, 2);
case IQ2000_BUILTIN_LUM64: ! return expand_one_builtin (CODE_FOR_lum64, target, arglist, code, 2);
case IQ2000_BUILTIN_LUM64L: ! return expand_one_builtin (CODE_FOR_lum64l, target, arglist, code, 2);
case IQ2000_BUILTIN_LURL: ! return expand_one_builtin (CODE_FOR_lurl, target, arglist, code, 2);
case IQ2000_BUILTIN_MRGB: code[2] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mrgb, target, arglist, code, 3);
case IQ2000_BUILTIN_SRRDL: ! return expand_one_builtin (CODE_FOR_srrdl, target, arglist, code, 1);
case IQ2000_BUILTIN_SRULCK: ! return expand_one_builtin (CODE_FOR_srulck, target, arglist, code, 1);
case IQ2000_BUILTIN_SRWRU: ! return expand_one_builtin (CODE_FOR_srwru, target, arglist, code, 2);
case IQ2000_BUILTIN_TRAPQFL: ! return expand_one_builtin (CODE_FOR_trapqfl, target, arglist, code, 0);
case IQ2000_BUILTIN_TRAPQNE: ! return expand_one_builtin (CODE_FOR_trapqne, target, arglist, code, 0);
case IQ2000_BUILTIN_TRAPREL: ! return expand_one_builtin (CODE_FOR_traprel, target, arglist, code, 1);
case IQ2000_BUILTIN_WBU: ! return expand_one_builtin (CODE_FOR_wbu, target, arglist, code, 3);
case IQ2000_BUILTIN_SYSCALL: ! return expand_one_builtin (CODE_FOR_syscall, target, arglist, code, 0); }
return NULL_RTX; --- 2669,2830 ---- break;
case IQ2000_BUILTIN_ADO16: ! return expand_one_builtin (CODE_FOR_ado16, target, exp, code, 2);
case IQ2000_BUILTIN_RAM: code[1] = CONST_INT; code[2] = CONST_INT; code[3] = CONST_INT; ! return expand_one_builtin (CODE_FOR_ram, target, exp, code, 4);
case IQ2000_BUILTIN_CHKHDR: ! return expand_one_builtin (CODE_FOR_chkhdr, target, exp, code, 2);
case IQ2000_BUILTIN_PKRL: ! return expand_one_builtin (CODE_FOR_pkrl, target, exp, code, 2);
case IQ2000_BUILTIN_CFC0: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_cfc0, target, exp, code, 1);
case IQ2000_BUILTIN_CFC1: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_cfc1, target, exp, code, 1);
case IQ2000_BUILTIN_CFC2: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_cfc2, target, exp, code, 1);
case IQ2000_BUILTIN_CFC3: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_cfc3, target, exp, code, 1);
case IQ2000_BUILTIN_CTC0: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_ctc0, target, exp, code, 2);
case IQ2000_BUILTIN_CTC1: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_ctc1, target, exp, code, 2);
case IQ2000_BUILTIN_CTC2: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_ctc2, target, exp, code, 2);
case IQ2000_BUILTIN_CTC3: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_ctc3, target, exp, code, 2);
case IQ2000_BUILTIN_MFC0: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mfc0, target, exp, code, 1);
case IQ2000_BUILTIN_MFC1: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mfc1, target, exp, code, 1);
case IQ2000_BUILTIN_MFC2: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mfc2, target, exp, code, 1);
case IQ2000_BUILTIN_MFC3: code[0] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mfc3, target, exp, code, 1);
case IQ2000_BUILTIN_MTC0: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mtc0, target, exp, code, 2);
case IQ2000_BUILTIN_MTC1: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mtc1, target, exp, code, 2);
case IQ2000_BUILTIN_MTC2: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mtc2, target, exp, code, 2);
case IQ2000_BUILTIN_MTC3: code[1] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mtc3, target, exp, code, 2);
case IQ2000_BUILTIN_LUR: ! return expand_one_builtin (CODE_FOR_lur, target, exp, code, 2);
case IQ2000_BUILTIN_RB: ! return expand_one_builtin (CODE_FOR_rb, target, exp, code, 2);
case IQ2000_BUILTIN_RX: ! return expand_one_builtin (CODE_FOR_rx, target, exp, code, 2);
case IQ2000_BUILTIN_SRRD: ! return expand_one_builtin (CODE_FOR_srrd, target, exp, code, 1);
case IQ2000_BUILTIN_SRWR: ! return expand_one_builtin (CODE_FOR_srwr, target, exp, code, 2);
case IQ2000_BUILTIN_WB: ! return expand_one_builtin (CODE_FOR_wb, target, exp, code, 2);
case IQ2000_BUILTIN_WX: ! return expand_one_builtin (CODE_FOR_wx, target, exp, code, 2);
case IQ2000_BUILTIN_LUC32L: ! return expand_one_builtin (CODE_FOR_luc32l, target, exp, code, 2);
case IQ2000_BUILTIN_LUC64: ! return expand_one_builtin (CODE_FOR_luc64, target, exp, code, 2);
case IQ2000_BUILTIN_LUC64L: ! return expand_one_builtin (CODE_FOR_luc64l, target, exp, code, 2);
case IQ2000_BUILTIN_LUK: ! return expand_one_builtin (CODE_FOR_luk, target, exp, code, 2);
case IQ2000_BUILTIN_LULCK: ! return expand_one_builtin (CODE_FOR_lulck, target, exp, code, 1);
case IQ2000_BUILTIN_LUM32: ! return expand_one_builtin (CODE_FOR_lum32, target, exp, code, 2);
case IQ2000_BUILTIN_LUM32L: ! return expand_one_builtin (CODE_FOR_lum32l, target, exp, code, 2);
case IQ2000_BUILTIN_LUM64: ! return expand_one_builtin (CODE_FOR_lum64, target, exp, code, 2);
case IQ2000_BUILTIN_LUM64L: ! return expand_one_builtin (CODE_FOR_lum64l, target, exp, code, 2);
case IQ2000_BUILTIN_LURL: ! return expand_one_builtin (CODE_FOR_lurl, target, exp, code, 2);
case IQ2000_BUILTIN_MRGB: code[2] = CONST_INT; ! return expand_one_builtin (CODE_FOR_mrgb, target, exp, code, 3);
case IQ2000_BUILTIN_SRRDL: ! return expand_one_builtin (CODE_FOR_srrdl, target, exp, code, 1);
case IQ2000_BUILTIN_SRULCK: ! return expand_one_builtin (CODE_FOR_srulck, target, exp, code, 1);
case IQ2000_BUILTIN_SRWRU: ! return expand_one_builtin (CODE_FOR_srwru, target, exp, code, 2);
case IQ2000_BUILTIN_TRAPQFL: ! return expand_one_builtin (CODE_FOR_trapqfl, target, exp, code, 0);
case IQ2000_BUILTIN_TRAPQNE: ! return expand_one_builtin (CODE_FOR_trapqne, target, exp, code, 0);
case IQ2000_BUILTIN_TRAPREL: ! return expand_one_builtin (CODE_FOR_traprel, target, exp, code, 1);
case IQ2000_BUILTIN_WBU: ! return expand_one_builtin (CODE_FOR_wbu, target, exp, code, 3);
case IQ2000_BUILTIN_SYSCALL: ! return expand_one_builtin (CODE_FOR_syscall, target, exp, code, 0); }
return NULL_RTX; Index: gcc/config/rs6000/rs6000-c.c

*** gcc/config/rs6000/rs6000-c.c (revision 121818) --- gcc/config/rs6000/rs6000-c.c (working copy) *************** altivec_build_resolved_builtin (tree ar *** 2436,2442 **** tree impl_fndecl = rs6000_builtin_decls[desc->overloaded_code]; tree ret_type = rs6000_builtin_type (desc->ret_type); tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (impl_fndecl)); ! tree arglist = NULL_TREE, arg_type[3];
int i; for (i = 0; i < n; i++) --- 2436,2443 ---- tree impl_fndecl = rs6000_builtin_decls[desc->overloaded_code]; tree ret_type = rs6000_builtin_type (desc->ret_type); tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (impl_fndecl)); ! tree arg_type[3]; ! tree call;
int i; for (i = 0; i < n; i++) *************** altivec_build_resolved_builtin (tree *ar *** 2463,2475 **** build_int_cst (NULL_TREE, 2)); }
! while (--n >= 0) ! arglist = tree_cons (NULL_TREE, ! fold_convert (arg_type[n], args[n]), ! arglist); ! ! return fold_convert (ret_type, ! build_function_call_expr (impl_fndecl, arglist)); }
/
Implementation of the resolve_overloaded_builtin target hook, to --- 2464,2493 ---- build_int_cst (NULL_TREE, 2)); }
! switch (n) ! { ! case 0: ! call = build_call_expr (impl_fndecl, 0); ! break; ! case 1: ! call = build_call_expr (impl_fndecl, 1, ! fold_convert (arg_type[0], args[0])); ! break; ! case 2: ! call = build_call_expr (impl_fndecl, 2, ! fold_convert (arg_type[0], args[0]), ! fold_convert (arg_type[1], args[1])); ! break; ! case 3: ! call = build_call_expr (impl_fndecl, 3, ! fold_convert (arg_type[0], args[0]), ! fold_convert (arg_type[1], args[1]), ! fold_convert (arg_type[2], args[2])); ! break; ! default: ! gcc_unreachable (); ! } ! return fold_convert (ret_type, call); }
/* Implementation of the resolve_overloaded_builtin target hook, to Index: gcc/config/rs6000/rs6000.c

*** gcc/config/rs6000/rs6000.c (revision 121818) --- gcc/config/rs6000/rs6000.c (working copy) *************** rs6000_gimplify_va_arg (tree valist, tre *** 6294,6305 **** tree tmp = create_tmp_var (type, "va_arg_tmp"); tree dest_addr = build_fold_addr_expr (tmp);
! tree copy = build_function_call_expr ! (implicit_built_in_decls[BUILT_IN_MEMCPY], ! tree_cons (NULL_TREE, dest_addr, ! tree_cons (NULL_TREE, addr, ! tree_cons (NULL_TREE, size_int (rsize * 4), ! NULL_TREE))));
gimplify_and_add (copy, pre_p); addr = dest_addr; --- 6294,6301 ---- tree tmp = create_tmp_var (type, "va_arg_tmp"); tree dest_addr = build_fold_addr_expr (tmp);
! tree copy = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY], ! 3, dest_addr, addr, size_int (rsize * 4));
gimplify_and_add (copy, pre_p); addr = dest_addr; *************** static struct builtin_description bdesc_ *** 6934,6943 **** };
static rtx ! rs6000_expand_unop_builtin (enum insn_code icode, tree arglist, rtx target) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); rtx op0 = expand_normal (arg0); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = insn_data[icode].operand[1].mode; --- 6930,6939 ---- };
static rtx ! rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); rtx op0 = expand_normal (arg0); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = insn_data[icode].operand[1].mode; *************** rs6000_expand_unop_builtin (enum insn_co *** 6983,6992 **** }
static rtx ! altivec_expand_abs_builtin (enum insn_code icode, tree arglist, rtx target) { rtx pat, scratch1, scratch2; ! tree arg0 = TREE_VALUE (arglist); rtx op0 = expand_normal (arg0); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = insn_data[icode].operand[1].mode; --- 6979,6988 ---- }
static rtx ! altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target) { rtx pat, scratch1, scratch2; ! tree arg0 = CALL_EXPR_ARG (exp, 0); rtx op0 = expand_normal (arg0); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = insn_data[icode].operand[1].mode; *************** altivec_expand_abs_builtin (enum insn_co *** 7015,7025 **** }
static rtx ! rs6000_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode tmode = insn_data[icode].operand[0].mode; --- 7011,7021 ---- }
static rtx ! rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode tmode = insn_data[icode].operand[0].mode; *************** rs6000_expand_binop_builtin (enum insn_c *** 7089,7100 ****
static rtx altivec_expand_predicate_builtin (enum insn_code icode, const char *opcode, ! tree arglist, rtx target) { rtx pat, scratch; ! tree cr6_form = TREE_VALUE (arglist); ! tree arg0 = TREE_VALUE (TREE_CHAIN (arglist)); ! tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode tmode = SImode; --- 7085,7096 ----
static rtx altivec_expand_predicate_builtin (enum insn_code icode, const char *opcode, ! tree exp, rtx target) { rtx pat, scratch; ! tree cr6_form = CALL_EXPR_ARG (exp, 0); ! tree arg0 = CALL_EXPR_ARG (exp, 1); ! tree arg1 = CALL_EXPR_ARG (exp, 2); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode tmode = SImode; *************** altivec_expand_predicate_builtin (enum i *** 7165,7175 **** }
static rtx ! altivec_expand_lv_builtin (enum insn_code icode, tree arglist, rtx target) { rtx pat, addr; ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = Pmode; enum machine_mode mode1 = Pmode; --- 7161,7171 ---- }
static rtx ! altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target) { rtx pat, addr; ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = Pmode; enum machine_mode mode1 = Pmode; *************** altivec_expand_lv_builtin (enum insn_cod *** 7211,7221 **** }
static rtx ! spe_expand_stv_builtin (enum insn_code icode, tree arglist) { ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2 = expand_normal (arg2); --- 7207,7217 ---- }
static rtx ! spe_expand_stv_builtin (enum insn_code icode, tree exp) { ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); ! tree arg2 = CALL_EXPR_ARG (exp, 2); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2 = expand_normal (arg2); *************** spe_expand_stv_builtin (enum insn_code i *** 7244,7254 **** }
static rtx ! altivec_expand_stv_builtin (enum insn_code icode, tree arglist) { ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2 = expand_normal (arg2); --- 7240,7250 ---- }
static rtx ! altivec_expand_stv_builtin (enum insn_code icode, tree exp) { ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); ! tree arg2 = CALL_EXPR_ARG (exp, 2); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2 = expand_normal (arg2); *************** altivec_expand_stv_builtin (enum insn_co *** 7285,7296 **** }
static rtx ! rs6000_expand_ternop_builtin (enum insn_code icode, tree arglist, rtx target) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2 = expand_normal (arg2); --- 7281,7292 ---- }
static rtx ! rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); ! tree arg2 = CALL_EXPR_ARG (exp, 2); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2 = expand_normal (arg2); *************** rs6000_expand_ternop_builtin (enum insn_ *** 7348,7355 **** static rtx altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp) { ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); tree arg0; enum machine_mode tmode, mode0; --- 7344,7350 ---- static rtx altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp) { ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); tree arg0; enum machine_mode tmode, mode0; *************** altivec_expand_ld_builtin (tree exp, rtx *** 7377,7383 ****
*expandedp = true;
! arg0 = TREE_VALUE (arglist); op0 = expand_normal (arg0); tmode = insn_data[icode].operand[0].mode; mode0 = insn_data[icode].operand[1].mode; --- 7372,7378 ----
*expandedp = true;
! arg0 = CALL_EXPR_ARG (exp, 0); op0 = expand_normal (arg0); tmode = insn_data[icode].operand[0].mode; mode0 = insn_data[icode].operand[1].mode; *************** static rtx *** 7402,7409 **** altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED, bool *expandedp) { ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); tree arg0, arg1; enum machine_mode mode0, mode1; --- 7397,7403 ---- altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED, bool *expandedp) { ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); tree arg0, arg1; enum machine_mode mode0, mode1; *************** altivec_expand_st_builtin (tree exp, rtx *** 7429,7436 **** return NULL_RTX; }
! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = expand_normal (arg0); op1 = expand_normal (arg1); mode0 = insn_data[icode].operand[0].mode; --- 7423,7430 ---- return NULL_RTX; }
! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = expand_normal (arg0); op1 = expand_normal (arg1); mode0 = insn_data[icode].operand[0].mode; *************** static rtx *** 7454,7461 **** altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED, bool *expandedp) { ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); tree arg0, arg1, arg2; enum machine_mode mode0, mode1, mode2; --- 7448,7454 ---- altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED, bool expandedp) { ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); tree arg0, arg1, arg2; enum machine_mode mode0, mode1, mode2; *************** altivec_expand_dst_builtin (tree exp, rt *** 7470,7478 **** for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++) if (d->code == fcode) { ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); --- 7463,7471 ---- for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++) if (d->code == fcode) { ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); *************** altivec_expand_dst_builtin (tree exp, rt *** 7512,7518 ****
/
Expand vec_init builtin. / static rtx ! altivec_expand_vec_init_builtin (tree type, tree arglist, rtx target) { enum machine_mode tmode = TYPE_MODE (type); enum machine_mode inner_mode = GET_MODE_INNER (tmode); --- 7505,7511 ----
/
Expand vec_init builtin. */ static rtx ! altivec_expand_vec_init_builtin (tree type, tree exp, rtx target) { enum machine_mode tmode = TYPE_MODE (type); enum machine_mode inner_mode = GET_MODE_INNER (tmode); *************** altivec_expand_vec_init_builtin (tree ty *** 7520,7534 **** rtvec v = rtvec_alloc (n_elt);
gcc_assert (VECTOR_MODE_P (tmode)); ! ! for (i = 0; i < n_elt; ++i, arglist = TREE_CHAIN (arglist)) { ! rtx x = expand_normal (TREE_VALUE (arglist)); RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x); }
- gcc_assert (arglist == NULL);

if (!target || !register_operand (target, tmode))
  target = gen_reg_rtx (tmode);

--- 7513,7526 ---- rtvec v = rtvec_alloc (n_elt);
gcc_assert (VECTOR_MODE_P (tmode)); ! gcc_assert (n_elt == call_expr_nargs (exp)); !
! for (i = 0; i < n_elt; ++i) { ! rtx x = expand_normal (CALL_EXPR_ARG (exp, i)); RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x); }
if (!target || !register_operand (target, tmode)) target = gen_reg_rtx (tmode);
*************** get_element_number (tree vec_type, tree *** 7556,7571 ****
/* Expand vec_set builtin. / static rtx ! altivec_expand_vec_set_builtin (tree arglist) { enum machine_mode tmode, mode1; tree arg0, arg1, arg2; int elt; rtx op0, op1;
! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
tmode = TYPE_MODE (TREE_TYPE (arg0)); mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0))); --- 7548,7563 ----
/* Expand vec_set builtin. / static rtx ! altivec_expand_vec_set_builtin (tree exp) { enum machine_mode tmode, mode1; tree arg0, arg1, arg2; int elt; rtx op0, op1;
! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2);
tmode = TYPE_MODE (TREE_TYPE (arg0)); mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0))); *************** altivec_expand_vec_set_builtin (tree arg *** 7588,7602 ****
/
Expand vec_ext builtin. / static rtx ! altivec_expand_vec_ext_builtin (tree arglist, rtx target) { enum machine_mode tmode, mode0; tree arg0, arg1; int elt; rtx op0;
! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist));
op0 = expand_normal (arg0); elt = get_element_number (TREE_TYPE (arg0), arg1); --- 7580,7594 ----
/
Expand vec_ext builtin. */ static rtx ! altivec_expand_vec_ext_builtin (tree exp, rtx target) { enum machine_mode tmode, mode0; tree arg0, arg1; int elt; rtx op0;
! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1);
op0 = expand_normal (arg0); elt = get_element_number (TREE_TYPE (arg0), arg1); *************** altivec_expand_builtin (tree exp, rtx ta *** 7624,7631 **** struct builtin_description_predicates *dp; size_t i; enum insn_code icode; ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); tree arg0; rtx op0, pat; enum machine_mode tmode, mode0; --- 7616,7622 ---- struct builtin_description_predicates *dp; size_t i; enum insn_code icode; ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); tree arg0; rtx op0, pat; enum machine_mode tmode, mode0; *************** altivec_expand_builtin (tree exp, rtx ta *** 7656,7670 **** switch (fcode) { case ALTIVEC_BUILTIN_STVX: ! return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, arglist); case ALTIVEC_BUILTIN_STVEBX: ! return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, arglist); case ALTIVEC_BUILTIN_STVEHX: ! return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, arglist); case ALTIVEC_BUILTIN_STVEWX: ! return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, arglist); case ALTIVEC_BUILTIN_STVXL: ! return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, arglist);
case ALTIVEC_BUILTIN_MFVSCR: icode = CODE_FOR_altivec_mfvscr; --- 7647,7661 ---- switch (fcode) { case ALTIVEC_BUILTIN_STVX: ! return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, exp); case ALTIVEC_BUILTIN_STVEBX: ! return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp); case ALTIVEC_BUILTIN_STVEHX: ! return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp); case ALTIVEC_BUILTIN_STVEWX: ! return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp); case ALTIVEC_BUILTIN_STVXL: ! return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp);
case ALTIVEC_BUILTIN_MFVSCR: icode = CODE_FOR_altivec_mfvscr; *************** altivec_expand_builtin (tree exp, rtx ta *** 7683,7689 ****
case ALTIVEC_BUILTIN_MTVSCR: icode = CODE_FOR_altivec_mtvscr; ! arg0 = TREE_VALUE (arglist); op0 = expand_normal (arg0); mode0 = insn_data[icode].operand[0].mode;
--- 7674,7680 ----
case ALTIVEC_BUILTIN_MTVSCR: icode = CODE_FOR_altivec_mtvscr; ! arg0 = CALL_EXPR_ARG (exp, 0); op0 = expand_normal (arg0); mode0 = insn_data[icode].operand[0].mode;
*************** altivec_expand_builtin (tree exp, rtx ta *** 7705,7711 ****
case ALTIVEC_BUILTIN_DSS: icode = CODE_FOR_altivec_dss; ! arg0 = TREE_VALUE (arglist); STRIP_NOPS (arg0); op0 = expand_normal (arg0); mode0 = insn_data[icode].operand[0].mode; --- 7696,7702 ----
case ALTIVEC_BUILTIN_DSS: icode = CODE_FOR_altivec_dss; ! arg0 = CALL_EXPR_ARG (exp, 0); STRIP_NOPS (arg0); op0 = expand_normal (arg0); mode0 = insn_data[icode].operand[0].mode; *************** altivec_expand_builtin (tree exp, rtx ta *** 7731,7749 **** case ALTIVEC_BUILTIN_VEC_INIT_V8HI: case ALTIVEC_BUILTIN_VEC_INIT_V16QI: case ALTIVEC_BUILTIN_VEC_INIT_V4SF: ! return altivec_expand_vec_init_builtin (TREE_TYPE (exp), arglist, target);
case ALTIVEC_BUILTIN_VEC_SET_V4SI: case ALTIVEC_BUILTIN_VEC_SET_V8HI: case ALTIVEC_BUILTIN_VEC_SET_V16QI: case ALTIVEC_BUILTIN_VEC_SET_V4SF: ! return altivec_expand_vec_set_builtin (arglist);
case ALTIVEC_BUILTIN_VEC_EXT_V4SI: case ALTIVEC_BUILTIN_VEC_EXT_V8HI: case ALTIVEC_BUILTIN_VEC_EXT_V16QI: case ALTIVEC_BUILTIN_VEC_EXT_V4SF: ! return altivec_expand_vec_ext_builtin (arglist, target);
default: break; --- 7722,7740 ---- case ALTIVEC_BUILTIN_VEC_INIT_V8HI: case ALTIVEC_BUILTIN_VEC_INIT_V16QI: case ALTIVEC_BUILTIN_VEC_INIT_V4SF: ! return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
case ALTIVEC_BUILTIN_VEC_SET_V4SI: case ALTIVEC_BUILTIN_VEC_SET_V8HI: case ALTIVEC_BUILTIN_VEC_SET_V16QI: case ALTIVEC_BUILTIN_VEC_SET_V4SF: ! return altivec_expand_vec_set_builtin (exp);
case ALTIVEC_BUILTIN_VEC_EXT_V4SI: case ALTIVEC_BUILTIN_VEC_EXT_V8HI: case ALTIVEC_BUILTIN_VEC_EXT_V16QI: case ALTIVEC_BUILTIN_VEC_EXT_V4SF: ! return altivec_expand_vec_ext_builtin (exp, target);
default: break; *************** altivec_expand_builtin (tree exp, rtx ta *** 7754,7792 **** d = (struct builtin_description *) bdesc_abs; for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++) if (d->code == fcode) ! return altivec_expand_abs_builtin (d->icode, arglist, target);
/
Expand the AltiVec predicates. / dp = (struct builtin_description_predicates ) bdesc_altivec_preds; for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++) if (dp->code == fcode) return altivec_expand_predicate_builtin (dp->icode, dp->opcode, ! arglist, target);
/
LV
are funky. We initialized them differently. / switch (fcode) { case ALTIVEC_BUILTIN_LVSL: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl, ! arglist, target); case ALTIVEC_BUILTIN_LVSR: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr, ! arglist, target); case ALTIVEC_BUILTIN_LVEBX: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx, ! arglist, target); case ALTIVEC_BUILTIN_LVEHX: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx, ! arglist, target); case ALTIVEC_BUILTIN_LVEWX: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx, ! arglist, target); case ALTIVEC_BUILTIN_LVXL: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl, ! arglist, target); case ALTIVEC_BUILTIN_LVX: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx, ! arglist, target); default: break; / Fall through. */ --- 7745,7783 ---- d = (struct builtin_description ) bdesc_abs; for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++) if (d->code == fcode) ! return altivec_expand_abs_builtin (d->icode, exp, target);
/
Expand the AltiVec predicates. / dp = (struct builtin_description_predicates ) bdesc_altivec_preds; for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++) if (dp->code == fcode) return altivec_expand_predicate_builtin (dp->icode, dp->opcode, ! exp, target);
/
LV
are funky. We initialized them differently. / switch (fcode) { case ALTIVEC_BUILTIN_LVSL: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl, ! exp, target); case ALTIVEC_BUILTIN_LVSR: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr, ! exp, target); case ALTIVEC_BUILTIN_LVEBX: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx, ! exp, target); case ALTIVEC_BUILTIN_LVEHX: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx, ! exp, target); case ALTIVEC_BUILTIN_LVEWX: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx, ! exp, target); case ALTIVEC_BUILTIN_LVXL: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl, ! exp, target); case ALTIVEC_BUILTIN_LVX: return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx, ! exp, target); default: break; / Fall through. */ *************** static struct builtin_description bdesc_ *** 7832,7839 **** static rtx spe_expand_builtin (tree exp, rtx target, bool *expandedp) { ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); tree arg1, arg0; unsigned int fcode = DECL_FUNCTION_CODE (fndecl); enum insn_code icode; --- 7823,7829 ---- static rtx spe_expand_builtin (tree exp, rtx target, bool *expandedp) { ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); tree arg1, arg0; unsigned int fcode = DECL_FUNCTION_CODE (fndecl); enum insn_code icode; *************** spe_expand_builtin (tree exp, rtx target *** 7854,7860 **** case SPE_BUILTIN_EVSTWHO: case SPE_BUILTIN_EVSTWWE: case SPE_BUILTIN_EVSTWWO: ! arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); if (TREE_CODE (arg1) != INTEGER_CST || TREE_INT_CST_LOW (arg1) & ~0x1f) { --- 7844,7850 ---- case SPE_BUILTIN_EVSTWHO: case SPE_BUILTIN_EVSTWWE: case SPE_BUILTIN_EVSTWWO: ! arg1 = CALL_EXPR_ARG (exp, 2); if (TREE_CODE (arg1) != INTEGER_CST || TREE_INT_CST_LOW (arg1) & ~0x1f) { *************** spe_expand_builtin (tree exp, rtx target *** 7871,7880 **** { case SPE_BUILTIN_EVSPLATFI: return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi, ! arglist, target); case SPE_BUILTIN_EVSPLATI: return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati, ! arglist, target); default: break; } --- 7861,7870 ---- { case SPE_BUILTIN_EVSPLATFI: return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi, ! exp, target); case SPE_BUILTIN_EVSPLATI: return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati, ! exp, target); default: break; } *************** spe_expand_builtin (tree exp, rtx target *** 7882,7929 **** d = (struct builtin_description *) bdesc_2arg_spe; for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d) if (d->code == fcode) ! return rs6000_expand_binop_builtin (d->icode, arglist, target);
d = (struct builtin_description *) bdesc_spe_predicates; for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d) if (d->code == fcode) ! return spe_expand_predicate_builtin (d->icode, arglist, target);
d = (struct builtin_description *) bdesc_spe_evsel; for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d) if (d->code == fcode) ! return spe_expand_evsel_builtin (d->icode, arglist, target);
switch (fcode) { case SPE_BUILTIN_EVSTDDX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, arglist); case SPE_BUILTIN_EVSTDHX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, arglist); case SPE_BUILTIN_EVSTDWX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, arglist); case SPE_BUILTIN_EVSTWHEX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, arglist); case SPE_BUILTIN_EVSTWHOX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, arglist); case SPE_BUILTIN_EVSTWWEX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, arglist); case SPE_BUILTIN_EVSTWWOX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, arglist); case SPE_BUILTIN_EVSTDD: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, arglist); case SPE_BUILTIN_EVSTDH: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, arglist); case SPE_BUILTIN_EVSTDW: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, arglist); case SPE_BUILTIN_EVSTWHE: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, arglist); case SPE_BUILTIN_EVSTWHO: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, arglist); case SPE_BUILTIN_EVSTWWE: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, arglist); case SPE_BUILTIN_EVSTWWO: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, arglist); case SPE_BUILTIN_MFSPEFSCR: icode = CODE_FOR_spe_mfspefscr; tmode = insn_data[icode].operand[0].mode; --- 7872,7919 ---- d = (struct builtin_description *) bdesc_2arg_spe; for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d) if (d->code == fcode) ! return rs6000_expand_binop_builtin (d->icode, exp, target);
d = (struct builtin_description *) bdesc_spe_predicates; for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d) if (d->code == fcode) ! return spe_expand_predicate_builtin (d->icode, exp, target);
d = (struct builtin_description *) bdesc_spe_evsel; for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d) if (d->code == fcode) ! return spe_expand_evsel_builtin (d->icode, exp, target);
switch (fcode) { case SPE_BUILTIN_EVSTDDX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, exp); case SPE_BUILTIN_EVSTDHX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, exp); case SPE_BUILTIN_EVSTDWX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, exp); case SPE_BUILTIN_EVSTWHEX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, exp); case SPE_BUILTIN_EVSTWHOX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, exp); case SPE_BUILTIN_EVSTWWEX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, exp); case SPE_BUILTIN_EVSTWWOX: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, exp); case SPE_BUILTIN_EVSTDD: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, exp); case SPE_BUILTIN_EVSTDH: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, exp); case SPE_BUILTIN_EVSTDW: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, exp); case SPE_BUILTIN_EVSTWHE: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, exp); case SPE_BUILTIN_EVSTWHO: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, exp); case SPE_BUILTIN_EVSTWWE: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, exp); case SPE_BUILTIN_EVSTWWO: ! return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, exp); case SPE_BUILTIN_MFSPEFSCR: icode = CODE_FOR_spe_mfspefscr; tmode = insn_data[icode].operand[0].mode; *************** spe_expand_builtin (tree exp, rtx target *** 7940,7946 **** return target; case SPE_BUILTIN_MTSPEFSCR: icode = CODE_FOR_spe_mtspefscr; ! arg0 = TREE_VALUE (arglist); op0 = expand_normal (arg0); mode0 = insn_data[icode].operand[0].mode;
--- 7930,7936 ---- return target; case SPE_BUILTIN_MTSPEFSCR: icode = CODE_FOR_spe_mtspefscr; ! arg0 = CALL_EXPR_ARG (exp, 0); op0 = expand_normal (arg0); mode0 = insn_data[icode].operand[0].mode;
*************** spe_expand_builtin (tree exp, rtx target *** 7963,7974 **** }
static rtx ! spe_expand_predicate_builtin (enum insn_code icode, tree arglist, rtx target) { rtx pat, scratch, tmp; ! tree form = TREE_VALUE (arglist); ! tree arg0 = TREE_VALUE (TREE_CHAIN (arglist)); ! tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode mode0 = insn_data[icode].operand[1].mode; --- 7953,7964 ---- }
static rtx ! spe_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target) { rtx pat, scratch, tmp; ! tree form = CALL_EXPR_ARG (exp, 0); ! tree arg0 = CALL_EXPR_ARG (exp, 1); ! tree arg1 = CALL_EXPR_ARG (exp, 2); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode mode0 = insn_data[icode].operand[1].mode; *************** spe_expand_predicate_builtin (enum insn_ *** 8071,8083 **** */
static rtx ! spe_expand_evsel_builtin (enum insn_code icode, tree arglist, rtx target) { rtx pat, scratch; ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); ! tree arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist)))); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2 = expand_normal (arg2); --- 8061,8073 ---- */
static rtx ! spe_expand_evsel_builtin (enum insn_code icode, tree exp, rtx target) { rtx pat, scratch; ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); ! tree arg2 = CALL_EXPR_ARG (exp, 2); ! tree arg3 = CALL_EXPR_ARG (exp, 3); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); rtx op2 = expand_normal (arg2); *************** rs6000_expand_builtin (tree exp, rtx tar *** 8131,8138 **** enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED) { ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); struct builtin_description *d; size_t i; --- 8121,8127 ---- enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED) { ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); struct builtin_description d; size_t i; *************** rs6000_expand_builtin (tree exp, rtx tar *** 8150,8156 ****
gcc_assert (TARGET_ALTIVEC);
! arg = TREE_VALUE (arglist); gcc_assert (TREE_CODE (TREE_TYPE (arg)) == POINTER_TYPE); op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL); addr = memory_address (mode, op); --- 8139,8145 ----
gcc_assert (TARGET_ALTIVEC);
! arg = CALL_EXPR_ARG (exp, 0); gcc_assert (TREE_CODE (TREE_TYPE (arg)) == POINTER_TYPE); op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL); addr = memory_address (mode, op); *************** rs6000_expand_builtin (tree exp, rtx tar *** 8178,8197 ****
return target; } !
if (fcode == ALTIVEC_BUILTIN_VCFUX || fcode == ALTIVEC_BUILTIN_VCFSX) { ! if (!TREE_CHAIN (arglist)) ! { ! tree t, arg0; ! t = NULL_TREE; ! t = tree_cons (NULL_TREE, integer_zero_node, t); ! arg0 = TREE_VALUE (arglist); ! t = tree_cons (NULL_TREE, arg0, t); ! arglist = t; ! TREE_OPERAND (exp, 1) = t; ! } }

if (TARGET_ALTIVEC) --- 8167,8181 ----
return target; } ! ! /
FIXME: There's got to be a nicer way to handle this case than ! constructing a new CALL_EXPR. */ if (fcode == ALTIVEC_BUILTIN_VCFUX || fcode == ALTIVEC_BUILTIN_VCFSX) { ! if (call_expr_nargs (exp) == 1) ! exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp), ! 2, CALL_EXPR_ARG (exp, 0), integer_zero_node); }

if (TARGET_ALTIVEC) *************** rs6000_expand_builtin (tree exp, rtx tar *** 8215,8233 **** d = (struct builtin_description ) bdesc_1arg; for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++) if (d->code == fcode) ! return rs6000_expand_unop_builtin (d->icode, arglist, target);
/
Handle simple binary operations. */ d = (struct builtin_description ) bdesc_2arg; for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++) if (d->code == fcode) ! return rs6000_expand_binop_builtin (d->icode, arglist, target);
/
Handle simple ternary operations. */ d = (struct builtin_description *) bdesc_3arg; for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++) if (d->code == fcode) ! return rs6000_expand_ternop_builtin (d->icode, arglist, target);
gcc_unreachable (); } --- 8199,8217 ---- d = (struct builtin_description ) bdesc_1arg; for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++) if (d->code == fcode) ! return rs6000_expand_unop_builtin (d->icode, exp, target);
/
Handle simple binary operations. */ d = (struct builtin_description ) bdesc_2arg; for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++) if (d->code == fcode) ! return rs6000_expand_binop_builtin (d->icode, exp, target);
/
Handle simple ternary operations. */ d = (struct builtin_description *) bdesc_3arg; for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++) if (d->code == fcode) ! return rs6000_expand_ternop_builtin (d->icode, exp, target);
gcc_unreachable (); } Index: gcc/config/arm/arm.c

*** gcc/config/arm/arm.c (revision 121818) --- gcc/config/arm/arm.c (working copy) *************** safe_vector_operand (rtx x, enum machine *** 13341,13351 ****
static rtx arm_expand_binop_builtin (enum insn_code icode, ! tree arglist, rtx target) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode tmode = insn_data[icode].operand[0].mode; --- 13341,13351 ----
static rtx arm_expand_binop_builtin (enum insn_code icode, ! tree exp, rtx target) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); rtx op0 = expand_normal (arg0); rtx op1 = expand_normal (arg1); enum machine_mode tmode = insn_data[icode].operand[0].mode; *************** arm_expand_binop_builtin (enum insn_code *** 13380,13389 ****
static rtx arm_expand_unop_builtin (enum insn_code icode, ! tree arglist, rtx target, int do_load) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); rtx op0 = expand_normal (arg0); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = insn_data[icode].operand[1].mode; --- 13380,13389 ----
static rtx arm_expand_unop_builtin (enum insn_code icode, ! tree exp, rtx target, int do_load) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); rtx op0 = expand_normal (arg0); enum machine_mode tmode = insn_data[icode].operand[0].mode; enum machine_mode mode0 = insn_data[icode].operand[1].mode; *************** arm_expand_builtin (tree exp, *** 13425,13432 **** { const struct builtin_description * d; enum insn_code icode; ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); tree arg0; tree arg1; tree arg2; --- 13425,13431 ---- { const struct builtin_description * d; enum insn_code icode; ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); tree arg0; tree arg1; tree arg2; *************** arm_expand_builtin (tree exp, *** 13455,13462 **** : fcode == ARM_BUILTIN_TEXTRMUH ? CODE_FOR_iwmmxt_textrmuh : CODE_FOR_iwmmxt_textrmw);
! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; --- 13454,13461 ---- : fcode == ARM_BUILTIN_TEXTRMUH ? CODE_FOR_iwmmxt_textrmuh : CODE_FOR_iwmmxt_textrmw);
! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; *************** arm_expand_builtin (tree exp, *** 13487,13495 **** icode = (fcode == ARM_BUILTIN_TINSRB ? CODE_FOR_iwmmxt_tinsrb : fcode == ARM_BUILTIN_TINSRH ? CODE_FOR_iwmmxt_tinsrh : CODE_FOR_iwmmxt_tinsrw); ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); --- 13486,13494 ---- icode = (fcode == ARM_BUILTIN_TINSRB ? CODE_FOR_iwmmxt_tinsrb : fcode == ARM_BUILTIN_TINSRH ? CODE_FOR_iwmmxt_tinsrh : CODE_FOR_iwmmxt_tinsrw); ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); *************** arm_expand_builtin (tree exp, *** 13519,13533 **** return target;
case ARM_BUILTIN_SETWCX: ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = force_reg (SImode, expand_normal (arg0)); op1 = expand_normal (arg1); emit_insn (gen_iwmmxt_tmcr (op1, op0)); return 0;
case ARM_BUILTIN_GETWCX: ! arg0 = TREE_VALUE (arglist); op0 = expand_normal (arg0); target = gen_reg_rtx (SImode); emit_insn (gen_iwmmxt_tmrc (target, op0)); --- 13518,13532 ---- return target;
case ARM_BUILTIN_SETWCX: ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = force_reg (SImode, expand_normal (arg0)); op1 = expand_normal (arg1); emit_insn (gen_iwmmxt_tmcr (op1, op0)); return 0;
case ARM_BUILTIN_GETWCX: ! arg0 = CALL_EXPR_ARG (exp, 0); op0 = expand_normal (arg0); target = gen_reg_rtx (SImode); emit_insn (gen_iwmmxt_tmrc (target, op0)); *************** arm_expand_builtin (tree exp, *** 13535,13542 ****
case ARM_BUILTIN_WSHUFH: icode = CODE_FOR_iwmmxt_wshufh; ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; --- 13534,13541 ----
case ARM_BUILTIN_WSHUFH: icode = CODE_FOR_iwmmxt_wshufh; ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = expand_normal (arg0); op1 = expand_normal (arg1); tmode = insn_data[icode].operand[0].mode; *************** arm_expand_builtin (tree exp, *** 13562,13574 **** return target;
case ARM_BUILTIN_WSADB: ! return arm_expand_binop_builtin (CODE_FOR_iwmmxt_wsadb, arglist, target); case ARM_BUILTIN_WSADH: ! return arm_expand_binop_builtin (CODE_FOR_iwmmxt_wsadh, arglist, target); case ARM_BUILTIN_WSADBZ: ! return arm_expand_binop_builtin (CODE_FOR_iwmmxt_wsadbz, arglist, target); case ARM_BUILTIN_WSADHZ: ! return arm_expand_binop_builtin (CODE_FOR_iwmmxt_wsadhz, arglist, target);
/* Several three-argument builtins. / case ARM_BUILTIN_WMACS: --- 13561,13573 ---- return target;
case ARM_BUILTIN_WSADB: ! return arm_expand_binop_builtin (CODE_FOR_iwmmxt_wsadb, exp, target); case ARM_BUILTIN_WSADH: ! return arm_expand_binop_builtin (CODE_FOR_iwmmxt_wsadh, exp, target); case ARM_BUILTIN_WSADBZ: ! return arm_expand_binop_builtin (CODE_FOR_iwmmxt_wsadbz, exp, target); case ARM_BUILTIN_WSADHZ: ! return arm_expand_binop_builtin (CODE_FOR_iwmmxt_wsadhz, exp, target);
/
Several three-argument builtins. / case ARM_BUILTIN_WMACS: *************** arm_expand_builtin (tree exp, *** 13589,13597 **** : fcode == ARM_BUILTIN_TMIATB ? CODE_FOR_iwmmxt_tmiatb : fcode == ARM_BUILTIN_TMIATT ? CODE_FOR_iwmmxt_tmiatt : CODE_FOR_iwmmxt_walign); ! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); --- 13588,13596 ---- : fcode == ARM_BUILTIN_TMIATB ? CODE_FOR_iwmmxt_tmiatb : fcode == ARM_BUILTIN_TMIATT ? CODE_FOR_iwmmxt_tmiatt : CODE_FOR_iwmmxt_walign); ! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2); op0 = expand_normal (arg0); op1 = expand_normal (arg1); op2 = expand_normal (arg2); *************** arm_expand_builtin (tree exp, *** 13630,13640 ****
for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++) if (d->code == (const enum arm_builtins) fcode) ! return arm_expand_binop_builtin (d->icode, arglist, target);
for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++) if (d->code == (const enum arm_builtins) fcode) ! return arm_expand_unop_builtin (d->icode, arglist, target, 0);
/
@@@ Should really do something sensible here. / return NULL_RTX; --- 13629,13639 ----
for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++) if (d->code == (const enum arm_builtins) fcode) ! return arm_expand_binop_builtin (d->icode, exp, target);
for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++) if (d->code == (const enum arm_builtins) fcode) ! return arm_expand_unop_builtin (d->icode, exp, target, 0);
/
@@@ Should really do something sensible here. */ return NULL_RTX; Index: gcc/config/mips/mips.c

*** gcc/config/mips/mips.c (revision 121818) --- gcc/config/mips/mips.c (working copy) *************** mips_expand_builtin (tree exp, rtx targe *** 10336,10343 **** const struct builtin_description *bdesc; const struct bdesc_map *m;
! fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! arglist = TREE_OPERAND (exp, 1); fcode = DECL_FUNCTION_CODE (fndecl);
bdesc = NULL; --- 10336,10345 ---- const struct builtin_description *bdesc; const struct bdesc_map m;
! fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); ! /
FIXME: Rewrite this to use the CALL_EXPR directly instead of consing ! up an arglist. */ ! arglist = CALL_EXPR_ARGS (exp); fcode = DECL_FUNCTION_CODE (fndecl);
bdesc = NULL; Index: gcc/config/bfin/bfin.c

*** gcc/config/bfin/bfin.c (revision 121818) --- gcc/config/bfin/bfin.c (working copy) *************** safe_vector_operand (rtx x, enum machine *** 4617,4628 **** if this is a normal binary op, or one of the MACFLAG_xxx constants. */

static rtx ! bfin_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target, int macflag) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); ! tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); enum machine_mode op0mode = GET_MODE (op0); --- 4617,4628 ---- if this is a normal binary op, or one of the MACFLAG_xxx constants. */

static rtx ! bfin_expand_binop_builtin (enum insn_code icode, tree exp, rtx target, int macflag) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); ! tree arg1 = CALL_EXPR_ARG (exp, 1); rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); enum machine_mode op0mode = GET_MODE (op0); *************** bfin_expand_binop_builtin (enum insn_cod *** 4675,4685 **** /* Subroutine of bfin_expand_builtin to take care of unop insns. */

static rtx ! bfin_expand_unop_builtin (enum insn_code icode, tree arglist, rtx target) { rtx pat; ! tree arg0 = TREE_VALUE (arglist); rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); enum machine_mode op0mode = GET_MODE (op0); enum machine_mode tmode = insn_data[icode].operand[0].mode; --- 4675,4685 ---- /* Subroutine of bfin_expand_builtin to take care of unop insns. */

static rtx ! bfin_expand_unop_builtin (enum insn_code icode, tree exp, rtx target) { rtx pat; ! tree arg0 = CALL_EXPR_ARG (exp, 0); rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); enum machine_mode op0mode = GET_MODE (op0); enum machine_mode tmode = insn_data[icode].operand[0].mode; *************** bfin_expand_builtin (tree exp, rtx targe *** 4725,4732 **** size_t i; enum insn_code icode; const struct builtin_description *d; ! tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ! tree arglist = TREE_OPERAND (exp, 1); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); tree arg0, arg1, arg2; rtx op0, op1, op2, accvec, pat, tmp1, tmp2; --- 4725,4731 ---- size_t i; enum insn_code icode; const struct builtin_description *d; ! tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); unsigned int fcode = DECL_FUNCTION_CODE (fndecl); tree arg0, arg1, arg2; rtx op0, op1, op2, accvec, pat, tmp1, tmp2; *************** bfin_expand_builtin (tree exp, rtx targe *** 4743,4749 ****

  case BFIN_BUILTIN_DIFFHL_2X16:
  case BFIN_BUILTIN_DIFFLH_2X16:

! arg0 = TREE_VALUE (arglist); op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); icode = (fcode == BFIN_BUILTIN_DIFFHL_2X16 ? CODE_FOR_subhilov2hi3 : CODE_FOR_sublohiv2hi3); --- 4742,4748 ----

  case BFIN_BUILTIN_DIFFHL_2X16:
  case BFIN_BUILTIN_DIFFLH_2X16:

! arg0 = CALL_EXPR_ARG (exp, 0); op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); icode = (fcode == BFIN_BUILTIN_DIFFHL_2X16 ? CODE_FOR_subhilov2hi3 : CODE_FOR_sublohiv2hi3); *************** bfin_expand_builtin (tree exp, rtx targe *** 4768,4775 **** return target;

  case BFIN_BUILTIN_CPLX_MUL_16:

! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); accvec = gen_reg_rtx (V2PDImode); --- 4767,4774 ---- return target;

  case BFIN_BUILTIN_CPLX_MUL_16:

! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); accvec = gen_reg_rtx (V2PDImode); *************** bfin_expand_builtin (tree exp, rtx targe *** 4795,4803 ****

  case BFIN_BUILTIN_CPLX_MAC_16:
  case BFIN_BUILTIN_CPLX_MSU_16:

! arg0 = TREE_VALUE (arglist); ! arg1 = TREE_VALUE (TREE_CHAIN (arglist)); ! arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0); --- 4794,4802 ----

  case BFIN_BUILTIN_CPLX_MAC_16:
  case BFIN_BUILTIN_CPLX_MSU_16:

! arg0 = CALL_EXPR_ARG (exp, 0); ! arg1 = CALL_EXPR_ARG (exp, 1); ! arg2 = CALL_EXPR_ARG (exp, 2); op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0); *************** bfin_expand_builtin (tree exp, rtx targe *** 4838,4849 ****

for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
  if (d->code == fcode)

! return bfin_expand_binop_builtin (d->icode, arglist, target, d->macflag);

for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
  if (d->code == fcode)

! return bfin_expand_unop_builtin (d->icode, arglist, target);

gcc_unreachable ();

} --- 4837,4848 ----

for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
  if (d->code == fcode)

! return bfin_expand_binop_builtin (d->icode, exp, target, d->macflag);

for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
  if (d->code == fcode)

! return bfin_expand_unop_builtin (d->icode, exp, target);

gcc_unreachable ();

}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]