This is the mail archive of the gcc-patches@gcc.gnu.org mailing 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]

revised PATCH: CALL_EXPR representation changes, part 4/9 (back ends)


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]