/* Builtin functions for rs6000/powerpc.
   Copyright (C) 2009-2013 Free Software Foundation, Inc.
   Contributed by Michael Meissner (meissner@linux.vnet.ibm.com)

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published
   by the Free Software Foundation; either version 3, or (at your
   option) any later version.

   GCC is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

/* Before including this file, some macros must be defined:
   RS6000_BUILTIN_1 -- 1 arg builtins
   RS6000_BUILTIN_2 -- 2 arg builtins
   RS6000_BUILTIN_3 -- 3 arg builtins
   RS6000_BUILTIN_A -- ABS builtins
   RS6000_BUILTIN_D -- DST builtins
   RS6000_BUILTIN_E -- SPE EVSEL builtins.
   RS6000_BUILTIN_P -- Altivec and VSX predicate builtins
   RS6000_BUILTIN_Q -- Paired floating point VSX predicate builtins
   RS6000_BUILTIN_S -- SPE predicate builtins
   RS6000_BUILTIN_X -- special builtins

   Each of the above macros takes 4 arguments:
	ENUM	Enumeration name
	NAME	String literal for the name
	MASK	Mask of bits that indicate which options enables the builtin
	ATTR	builtin attribute information.
	ICODE	Insn code of the function that implents the builtin.  */

#ifndef RS6000_BUILTIN_1
  #error "RS6000_BUILTIN_1 is not defined."
#endif

#ifndef RS6000_BUILTIN_2
  #error "RS6000_BUILTIN_2 is not defined."
#endif

#ifndef RS6000_BUILTIN_3
  #error "RS6000_BUILTIN_3 is not defined."
#endif

#ifndef RS6000_BUILTIN_A
  #error "RS6000_BUILTIN_A is not defined."
#endif

#ifndef RS6000_BUILTIN_D
  #error "RS6000_BUILTIN_D is not defined."
#endif

#ifndef RS6000_BUILTIN_E
  #error "RS6000_BUILTIN_E is not defined."
#endif

#ifndef RS6000_BUILTIN_P
  #error "RS6000_BUILTIN_P is not defined."
#endif

#ifndef RS6000_BUILTIN_Q
  #error "RS6000_BUILTIN_Q is not defined."
#endif

#ifndef RS6000_BUILTIN_S
  #error "RS6000_BUILTIN_S is not defined."
#endif

#ifndef RS6000_BUILTIN_X
  #error "RS6000_BUILTIN_X is not defined."
#endif

#ifndef BU_AV_1
/* Define convenience macros using token pasting to allow fitting everything in
   one line.  */

/* Altivec convenience macros.  */
#define BU_ALTIVEC_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (ALTIVEC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_ALTIVEC_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (ALTIVEC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_ALTIVEC_3(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_3 (ALTIVEC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_ALTIVEC_A(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_A (ALTIVEC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_ABS),					\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_ALTIVEC_D(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_D (ALTIVEC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_DST),					\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_ALTIVEC_P(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_P (ALTIVEC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_PREDICATE),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_ALTIVEC_X(ENUM, NAME, ATTR)					\
  RS6000_BUILTIN_X (ALTIVEC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_ALTIVEC_C(ENUM, NAME, ATTR)					\
  RS6000_BUILTIN_X (ALTIVEC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    (RS6000_BTM_ALTIVEC			/* MASK */	\
		     | RS6000_BTM_CELL),				\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_nothing)			/* ICODE */

/* Altivec overloaded builtin function macros.  */
#define BU_ALTIVEC_OVERLOAD_1(ENUM, NAME)				\
  RS6000_BUILTIN_1 (ALTIVEC_BUILTIN_VEC_ ## ENUM,	/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_ALTIVEC_OVERLOAD_2(ENUM, NAME)				\
  RS6000_BUILTIN_2 (ALTIVEC_BUILTIN_VEC_ ## ENUM,	/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_ALTIVEC_OVERLOAD_3(ENUM, NAME)				\
  RS6000_BUILTIN_3 (ALTIVEC_BUILTIN_VEC_ ## ENUM,	/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_ALTIVEC_OVERLOAD_A(ENUM, NAME)				\
  RS6000_BUILTIN_A (ALTIVEC_BUILTIN_VEC_ ## ENUM,	/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_ABS),					\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_ALTIVEC_OVERLOAD_D(ENUM, NAME)				\
  RS6000_BUILTIN_D (ALTIVEC_BUILTIN_VEC_ ## ENUM,	/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_DST),					\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_ALTIVEC_OVERLOAD_P(ENUM, NAME)				\
  RS6000_BUILTIN_P (ALTIVEC_BUILTIN_VEC_ ## ENUM,	/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_PREDICATE),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_ALTIVEC_OVERLOAD_X(ENUM, NAME)				\
  RS6000_BUILTIN_X (ALTIVEC_BUILTIN_VEC_ ## ENUM,	/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_ALTIVEC,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_nothing)			/* ICODE */

/* VSX convenience macros.  */
#define BU_VSX_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (VSX_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_VSX_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (VSX_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_VSX_3(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_3 (VSX_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_VSX_A(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_A (VSX_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_ABS),					\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_VSX_P(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_P (VSX_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_PREDICATE),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_VSX_X(ENUM, NAME, ATTR)					\
  RS6000_BUILTIN_X (VSX_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_nothing)			/* ICODE */

/* VSX overloaded builtin function macros.  */
#define BU_VSX_OVERLOAD_1(ENUM, NAME)					\
  RS6000_BUILTIN_1 (VSX_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_VSX_OVERLOAD_2(ENUM, NAME)					\
  RS6000_BUILTIN_2 (VSX_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_VSX_OVERLOAD_3(ENUM, NAME)					\
  RS6000_BUILTIN_3 (VSX_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

/* xxpermdi and xxsldwi are overloaded functions, but had __builtin_vsx names
   instead of __builtin_vec.  */
#define BU_VSX_OVERLOAD_3V(ENUM, NAME)					\
  RS6000_BUILTIN_3 (VSX_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_VSX_OVERLOAD_X(ENUM, NAME)					\
  RS6000_BUILTIN_X (VSX_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_VSX,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_nothing)			/* ICODE */

/* SPE convenience macros.  */
#define BU_SPE_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (SPE_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_spe_" NAME,		/* NAME */	\
		    RS6000_BTM_SPE,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_SPE_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (SPE_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_spe_" NAME,		/* NAME */	\
		    RS6000_BTM_SPE,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_SPE_3(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_3 (SPE_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_spe_" NAME,		/* NAME */	\
		    RS6000_BTM_SPE,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_SPE_E(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_E (SPE_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_spe_" NAME,		/* NAME */	\
		    RS6000_BTM_SPE,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_EVSEL),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_SPE_P(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_S (SPE_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_spe_" NAME,		/* NAME */	\
		    RS6000_BTM_SPE,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_PREDICATE),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_SPE_X(ENUM, NAME, ATTR)					\
  RS6000_BUILTIN_X (SPE_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_spe_" NAME,		/* NAME */	\
		    RS6000_BTM_SPE,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_nothing)			/* ICODE */

/* Paired floating point convenience macros.  */
#define BU_PAIRED_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (PAIRED_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_paired_" NAME,		/* NAME */	\
		    RS6000_BTM_PAIRED,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_PAIRED_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (PAIRED_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_paired_" NAME,		/* NAME */	\
		    RS6000_BTM_PAIRED,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_PAIRED_3(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_3 (PAIRED_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_paired_" NAME,		/* NAME */	\
		    RS6000_BTM_PAIRED,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_PAIRED_P(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_Q (PAIRED_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_paired_" NAME,		/* NAME */	\
		    RS6000_BTM_PAIRED,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_PREDICATE),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_PAIRED_X(ENUM, NAME, ATTR)					\
  RS6000_BUILTIN_X (PAIRED_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_paired_" NAME,		/* NAME */	\
		    RS6000_BTM_PAIRED,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_SPECIAL_X(ENUM, NAME, MASK, ATTR)				\
  RS6000_BUILTIN_X (ENUM,				/* ENUM */	\
		    NAME,				/* NAME */	\
		    MASK,				/* MASK */	\
		    (ATTR | RS6000_BTC_SPECIAL),	/* ATTR */	\
		    CODE_FOR_nothing)			/* ICODE */
#endif

/* Insure 0 is not a legitimate index.  */
BU_SPECIAL_X (RS6000_BUILTIN_NONE, NULL, 0, RS6000_BTC_MISC)

/* 3 argument Altivec builtins.  */
BU_ALTIVEC_3 (VMADDFP,        "vmaddfp",        FP,    	fmav4sf4)
BU_ALTIVEC_3 (VMHADDSHS,      "vmhaddshs",      SAT,   	altivec_vmhaddshs)
BU_ALTIVEC_3 (VMHRADDSHS,     "vmhraddshs",     SAT,   	altivec_vmhraddshs)
BU_ALTIVEC_3 (VMLADDUHM,      "vmladduhm",      CONST, 	altivec_vmladduhm)
BU_ALTIVEC_3 (VMSUMUBM,       "vmsumubm",       CONST, 	altivec_vmsumubm)
BU_ALTIVEC_3 (VMSUMMBM,       "vmsummbm",       CONST, 	altivec_vmsummbm)
BU_ALTIVEC_3 (VMSUMUHM,       "vmsumuhm",       CONST, 	altivec_vmsumuhm)
BU_ALTIVEC_3 (VMSUMSHM,       "vmsumshm",       CONST, 	altivec_vmsumshm)
BU_ALTIVEC_3 (VMSUMUHS,       "vmsumuhs",       SAT,   	altivec_vmsumuhs)
BU_ALTIVEC_3 (VMSUMSHS,       "vmsumshs",       SAT,   	altivec_vmsumshs)
BU_ALTIVEC_3 (VNMSUBFP,       "vnmsubfp",       FP,    	nfmsv4sf4)
BU_ALTIVEC_3 (VPERM_2DF,      "vperm_2df",      CONST, 	altivec_vperm_v2df)
BU_ALTIVEC_3 (VPERM_2DI,      "vperm_2di",      CONST, 	altivec_vperm_v2di)
BU_ALTIVEC_3 (VPERM_4SF,      "vperm_4sf",      CONST, 	altivec_vperm_v4sf)
BU_ALTIVEC_3 (VPERM_4SI,      "vperm_4si",      CONST, 	altivec_vperm_v4si)
BU_ALTIVEC_3 (VPERM_8HI,      "vperm_8hi",      CONST, 	altivec_vperm_v8hi)
BU_ALTIVEC_3 (VPERM_16QI,     "vperm_16qi",     CONST, 	altivec_vperm_v16qi_uns)
BU_ALTIVEC_3 (VPERM_2DI_UNS,  "vperm_2di_uns",  CONST, 	altivec_vperm_v2di_uns)
BU_ALTIVEC_3 (VPERM_4SI_UNS,  "vperm_4si_uns",  CONST, 	altivec_vperm_v4si_uns)
BU_ALTIVEC_3 (VPERM_8HI_UNS,  "vperm_8hi_uns",  CONST, 	altivec_vperm_v8hi_uns)
BU_ALTIVEC_3 (VPERM_16QI_UNS, "vperm_16qi_uns", CONST, 	altivec_vperm_v16qi_uns)
BU_ALTIVEC_3 (VSEL_4SF,       "vsel_4sf",       CONST, 	vector_select_v4sf)
BU_ALTIVEC_3 (VSEL_4SI,       "vsel_4si",       CONST, 	vector_select_v4si)
BU_ALTIVEC_3 (VSEL_8HI,       "vsel_8hi",       CONST, 	vector_select_v8hi)
BU_ALTIVEC_3 (VSEL_16QI,      "vsel_16qi",      CONST, 	vector_select_v16qi)
BU_ALTIVEC_3 (VSEL_2DF,       "vsel_2df",       CONST, 	vector_select_v2df)
BU_ALTIVEC_3 (VSEL_2DI,       "vsel_2di",       CONST, 	vector_select_v2di)
BU_ALTIVEC_3 (VSEL_4SI_UNS,   "vsel_4si_uns",   CONST, 	vector_select_v4si_uns)
BU_ALTIVEC_3 (VSEL_8HI_UNS,   "vsel_8hi_uns",   CONST, 	vector_select_v8hi_uns)
BU_ALTIVEC_3 (VSEL_16QI_UNS,  "vsel_16qi_uns",  CONST, 	vector_select_v16qi_uns)
BU_ALTIVEC_3 (VSEL_2DI_UNS,   "vsel_2di_uns",   CONST, 	vector_select_v2di_uns)
BU_ALTIVEC_3 (VSLDOI_16QI,    "vsldoi_16qi",    CONST, 	altivec_vsldoi_v16qi)
BU_ALTIVEC_3 (VSLDOI_8HI,     "vsldoi_8hi",     CONST, 	altivec_vsldoi_v8hi)
BU_ALTIVEC_3 (VSLDOI_4SI,     "vsldoi_4si",     CONST, 	altivec_vsldoi_v4si)
BU_ALTIVEC_3 (VSLDOI_4SF,     "vsldoi_4sf",     CONST, 	altivec_vsldoi_v4sf)

/* Altivec DST builtins.  */
BU_ALTIVEC_D (DST,	      "dst",		MISC,  	altivec_dst)
BU_ALTIVEC_D (DSTT,	      "dstt",		MISC,  	altivec_dstt)
BU_ALTIVEC_D (DSTST,	      "dstst",		MISC,  	altivec_dstst)
BU_ALTIVEC_D (DSTSTT,	      "dststt",		MISC,  	altivec_dststt)

/* Altivec 2 argument builtin functions.  */
BU_ALTIVEC_2 (VADDUBM,        "vaddubm",	CONST,	addv16qi3)
BU_ALTIVEC_2 (VADDUHM,	      "vadduhm",	CONST,	addv8hi3)
BU_ALTIVEC_2 (VADDUWM,	      "vadduwm",	CONST,	addv4si3)
BU_ALTIVEC_2 (VADDFP,	      "vaddfp",		CONST,	addv4sf3)
BU_ALTIVEC_2 (VADDCUW,	      "vaddcuw",	CONST,	altivec_vaddcuw)
BU_ALTIVEC_2 (VADDUBS,	      "vaddubs",	CONST,	altivec_vaddubs)
BU_ALTIVEC_2 (VADDSBS,	      "vaddsbs",	CONST,	altivec_vaddsbs)
BU_ALTIVEC_2 (VADDUHS,	      "vadduhs",	CONST,	altivec_vadduhs)
BU_ALTIVEC_2 (VADDSHS,	      "vaddshs",	CONST,	altivec_vaddshs)
BU_ALTIVEC_2 (VADDUWS,	      "vadduws",	CONST,	altivec_vadduws)
BU_ALTIVEC_2 (VADDSWS,	      "vaddsws",	CONST,	altivec_vaddsws)
BU_ALTIVEC_2 (VAND,	      "vand",		CONST,	andv4si3)
BU_ALTIVEC_2 (VANDC,	      "vandc",		CONST,	andcv4si3)
BU_ALTIVEC_2 (VAVGUB,	      "vavgub",		CONST,	altivec_vavgub)
BU_ALTIVEC_2 (VAVGSB,	      "vavgsb",		CONST,	altivec_vavgsb)
BU_ALTIVEC_2 (VAVGUH,	      "vavguh",		CONST,	altivec_vavguh)
BU_ALTIVEC_2 (VAVGSH,	      "vavgsh",		CONST,	altivec_vavgsh)
BU_ALTIVEC_2 (VAVGUW,	      "vavguw",		CONST,	altivec_vavguw)
BU_ALTIVEC_2 (VAVGSW,	      "vavgsw",		CONST,	altivec_vavgsw)
BU_ALTIVEC_2 (VCFUX,	      "vcfux",		CONST,	altivec_vcfux)
BU_ALTIVEC_2 (VCFSX,	      "vcfsx",		CONST,	altivec_vcfsx)
BU_ALTIVEC_2 (VCMPBFP,	      "vcmpbfp",	CONST,	altivec_vcmpbfp)
BU_ALTIVEC_2 (VCMPEQUB,	      "vcmpequb",	CONST,	vector_eqv16qi)
BU_ALTIVEC_2 (VCMPEQUH,	      "vcmpequh",	CONST,	vector_eqv8hi)
BU_ALTIVEC_2 (VCMPEQUW,	      "vcmpequw",	CONST,	vector_eqv4si)
BU_ALTIVEC_2 (VCMPEQFP,	      "vcmpeqfp",	CONST,	vector_eqv4sf)
BU_ALTIVEC_2 (VCMPGEFP,	      "vcmpgefp",	CONST,	vector_gev4sf)
BU_ALTIVEC_2 (VCMPGTUB,	      "vcmpgtub",	CONST,	vector_gtuv16qi)
BU_ALTIVEC_2 (VCMPGTSB,	      "vcmpgtsb",	CONST,	vector_gtv16qi)
BU_ALTIVEC_2 (VCMPGTUH,	      "vcmpgtuh",	CONST,	vector_gtuv8hi)
BU_ALTIVEC_2 (VCMPGTSH,	      "vcmpgtsh",	CONST,	vector_gtv8hi)
BU_ALTIVEC_2 (VCMPGTUW,	      "vcmpgtuw",	CONST,	vector_gtuv4si)
BU_ALTIVEC_2 (VCMPGTSW,	      "vcmpgtsw",	CONST,	vector_gtv4si)
BU_ALTIVEC_2 (VCMPGTFP,	      "vcmpgtfp",	CONST,	vector_gtv4sf)
BU_ALTIVEC_2 (VCTSXS,	      "vctsxs",		CONST,	altivec_vctsxs)
BU_ALTIVEC_2 (VCTUXS,	      "vctuxs",		CONST,	altivec_vctuxs)
BU_ALTIVEC_2 (VMAXUB,	      "vmaxub",		CONST,	umaxv16qi3)
BU_ALTIVEC_2 (VMAXSB,	      "vmaxsb",		CONST,	smaxv16qi3)
BU_ALTIVEC_2 (VMAXUH,	      "vmaxuh",		CONST,	umaxv8hi3)
BU_ALTIVEC_2 (VMAXSH,	      "vmaxsh",		CONST,	smaxv8hi3)
BU_ALTIVEC_2 (VMAXUW,	      "vmaxuw",		CONST,	umaxv4si3)
BU_ALTIVEC_2 (VMAXSW,	      "vmaxsw",		CONST,	smaxv4si3)
BU_ALTIVEC_2 (VMAXFP,	      "vmaxfp",		CONST,	smaxv4sf3)
BU_ALTIVEC_2 (VMRGHB,	      "vmrghb",		CONST,	altivec_vmrghb)
BU_ALTIVEC_2 (VMRGHH,	      "vmrghh",		CONST,	altivec_vmrghh)
BU_ALTIVEC_2 (VMRGHW,	      "vmrghw",		CONST,	altivec_vmrghw)
BU_ALTIVEC_2 (VMRGLB,	      "vmrglb",		CONST,	altivec_vmrglb)
BU_ALTIVEC_2 (VMRGLH,	      "vmrglh",		CONST,	altivec_vmrglh)
BU_ALTIVEC_2 (VMRGLW,	      "vmrglw",		CONST,	altivec_vmrglw)
BU_ALTIVEC_2 (VMINUB,	      "vminub",		CONST,	uminv16qi3)
BU_ALTIVEC_2 (VMINSB,	      "vminsb",		CONST,	sminv16qi3)
BU_ALTIVEC_2 (VMINUH,	      "vminuh",		CONST,	uminv8hi3)
BU_ALTIVEC_2 (VMINSH,	      "vminsh",		CONST,	sminv8hi3)
BU_ALTIVEC_2 (VMINUW,	      "vminuw",		CONST,	uminv4si3)
BU_ALTIVEC_2 (VMINSW,	      "vminsw",		CONST,	sminv4si3)
BU_ALTIVEC_2 (VMINFP,	      "vminfp",		CONST,	sminv4sf3)
BU_ALTIVEC_2 (VMULEUB,	      "vmuleub",	CONST,	vec_widen_umult_even_v16qi)
BU_ALTIVEC_2 (VMULEUB_UNS,    "vmuleub_uns",	CONST,	vec_widen_umult_even_v16qi)
BU_ALTIVEC_2 (VMULESB,	      "vmulesb",	CONST,	vec_widen_smult_even_v16qi)
BU_ALTIVEC_2 (VMULEUH,	      "vmuleuh",	CONST,	vec_widen_umult_even_v8hi)
BU_ALTIVEC_2 (VMULEUH_UNS,    "vmuleuh_uns",	CONST,	vec_widen_umult_even_v8hi)
BU_ALTIVEC_2 (VMULESH,	      "vmulesh",	CONST,	vec_widen_smult_even_v8hi)
BU_ALTIVEC_2 (VMULOUB,	      "vmuloub",	CONST,	vec_widen_umult_odd_v16qi)
BU_ALTIVEC_2 (VMULOUB_UNS,    "vmuloub_uns",	CONST,	vec_widen_umult_odd_v16qi)
BU_ALTIVEC_2 (VMULOSB,	      "vmulosb",	CONST,	vec_widen_smult_odd_v16qi)
BU_ALTIVEC_2 (VMULOUH,	      "vmulouh",	CONST,	vec_widen_umult_odd_v8hi)
BU_ALTIVEC_2 (VMULOUH_UNS,    "vmulouh_uns",	CONST,	vec_widen_umult_odd_v8hi)
BU_ALTIVEC_2 (VMULOSH,	      "vmulosh",	CONST,	vec_widen_smult_odd_v8hi)
BU_ALTIVEC_2 (VNOR,	      "vnor",		CONST,	norv4si3)
BU_ALTIVEC_2 (VOR,	      "vor",		CONST,	iorv4si3)
BU_ALTIVEC_2 (VPKUHUM,	      "vpkuhum",	CONST,	altivec_vpkuhum)
BU_ALTIVEC_2 (VPKUWUM,	      "vpkuwum",	CONST,	altivec_vpkuwum)
BU_ALTIVEC_2 (VPKPX,	      "vpkpx",		CONST,	altivec_vpkpx)
BU_ALTIVEC_2 (VPKSHSS,	      "vpkshss",	CONST,	altivec_vpkshss)
BU_ALTIVEC_2 (VPKSWSS,	      "vpkswss",	CONST,	altivec_vpkswss)
BU_ALTIVEC_2 (VPKUHUS,	      "vpkuhus",	CONST,	altivec_vpkuhus)
BU_ALTIVEC_2 (VPKSHUS,	      "vpkshus",	CONST,	altivec_vpkshus)
BU_ALTIVEC_2 (VPKUWUS,	      "vpkuwus",	CONST,	altivec_vpkuwus)
BU_ALTIVEC_2 (VPKSWUS,	      "vpkswus",	CONST,	altivec_vpkswus)
BU_ALTIVEC_2 (VRECIPFP,	      "vrecipdivfp",	CONST,	recipv4sf3)
BU_ALTIVEC_2 (VRLB,	      "vrlb",		CONST,	vrotlv16qi3)
BU_ALTIVEC_2 (VRLH,	      "vrlh",		CONST,	vrotlv8hi3)
BU_ALTIVEC_2 (VRLW,	      "vrlw",		CONST,	vrotlv4si3)
BU_ALTIVEC_2 (VSLB,	      "vslb",		CONST,	vashlv16qi3)
BU_ALTIVEC_2 (VSLH,	      "vslh",		CONST,	vashlv8hi3)
BU_ALTIVEC_2 (VSLW,	      "vslw",		CONST,	vashlv4si3)
BU_ALTIVEC_2 (VSL,	      "vsl",		CONST,	altivec_vsl)
BU_ALTIVEC_2 (VSLO,	      "vslo",		CONST,	altivec_vslo)
BU_ALTIVEC_2 (VSPLTB,	      "vspltb",		CONST,	altivec_vspltb)
BU_ALTIVEC_2 (VSPLTH,	      "vsplth",		CONST,	altivec_vsplth)
BU_ALTIVEC_2 (VSPLTW,	      "vspltw",		CONST,	altivec_vspltw)
BU_ALTIVEC_2 (VSRB,	      "vsrb",		CONST,	vlshrv16qi3)
BU_ALTIVEC_2 (VSRH,	      "vsrh",		CONST,	vlshrv8hi3)
BU_ALTIVEC_2 (VSRW,	      "vsrw",		CONST,	vlshrv4si3)
BU_ALTIVEC_2 (VSRAB,	      "vsrab",		CONST,	vashrv16qi3)
BU_ALTIVEC_2 (VSRAH,	      "vsrah",		CONST,	vashrv8hi3)
BU_ALTIVEC_2 (VSRAW,	      "vsraw",		CONST,	vashrv4si3)
BU_ALTIVEC_2 (VSR,	      "vsr",		CONST,	altivec_vsr)
BU_ALTIVEC_2 (VSRO,	      "vsro",		CONST,	altivec_vsro)
BU_ALTIVEC_2 (VSUBUBM,	      "vsububm",	CONST,	subv16qi3)
BU_ALTIVEC_2 (VSUBUHM,	      "vsubuhm",	CONST,	subv8hi3)
BU_ALTIVEC_2 (VSUBUWM,	      "vsubuwm",	CONST,	subv4si3)
BU_ALTIVEC_2 (VSUBFP,	      "vsubfp",		CONST,	subv4sf3)
BU_ALTIVEC_2 (VSUBCUW,	      "vsubcuw",	CONST,	altivec_vsubcuw)
BU_ALTIVEC_2 (VSUBUBS,	      "vsububs",	CONST,	altivec_vsububs)
BU_ALTIVEC_2 (VSUBSBS,	      "vsubsbs",	CONST,	altivec_vsubsbs)
BU_ALTIVEC_2 (VSUBUHS,	      "vsubuhs",	CONST,	altivec_vsubuhs)
BU_ALTIVEC_2 (VSUBSHS,	      "vsubshs",	CONST,	altivec_vsubshs)
BU_ALTIVEC_2 (VSUBUWS,	      "vsubuws",	CONST,	altivec_vsubuws)
BU_ALTIVEC_2 (VSUBSWS,	      "vsubsws",	CONST,	altivec_vsubsws)
BU_ALTIVEC_2 (VSUM4UBS,	      "vsum4ubs",	CONST,	altivec_vsum4ubs)
BU_ALTIVEC_2 (VSUM4SBS,	      "vsum4sbs",	CONST,	altivec_vsum4sbs)
BU_ALTIVEC_2 (VSUM4SHS,	      "vsum4shs",	CONST,	altivec_vsum4shs)
BU_ALTIVEC_2 (VSUM2SWS,	      "vsum2sws",	CONST,	altivec_vsum2sws)
BU_ALTIVEC_2 (VSUMSWS,	      "vsumsws",	CONST,	altivec_vsumsws)
BU_ALTIVEC_2 (VXOR,	      "vxor",		CONST,	xorv4si3)
BU_ALTIVEC_2 (COPYSIGN_V4SF,  "copysignfp",	CONST,	vector_copysignv4sf3)

/* Altivec ABS functions.  */
BU_ALTIVEC_A (ABS_V4SI,	      "abs_v4si",	CONST,	absv4si2)
BU_ALTIVEC_A (ABS_V8HI,	      "abs_v8hi",	CONST,	absv8hi2)
BU_ALTIVEC_A (ABS_V4SF,	      "abs_v4sf",	CONST,	absv4sf2)
BU_ALTIVEC_A (ABS_V16QI,      "abs_v16qi",	CONST,	absv16qi2)
BU_ALTIVEC_A (ABSS_V4SI,      "abss_v4si",	SAT,	altivec_abss_v4si)
BU_ALTIVEC_A (ABSS_V8HI,      "abss_v8hi",	SAT,	altivec_abss_v8hi)
BU_ALTIVEC_A (ABSS_V16QI,     "abss_v16qi",	SAT,	altivec_abss_v16qi)

/* 1 argument Altivec builtin functions.  */
BU_ALTIVEC_1 (VEXPTEFP,	      "vexptefp",	FP,	altivec_vexptefp)
BU_ALTIVEC_1 (VLOGEFP,	      "vlogefp",	FP,	altivec_vlogefp)
BU_ALTIVEC_1 (VREFP,	      "vrefp",		FP,	rev4sf2)
BU_ALTIVEC_1 (VRFIM,	      "vrfim",		FP,	vector_floorv4sf2)
BU_ALTIVEC_1 (VRFIN,	      "vrfin",		FP,	altivec_vrfin)
BU_ALTIVEC_1 (VRFIP,	      "vrfip",		FP,	vector_ceilv4sf2)
BU_ALTIVEC_1 (VRFIZ,	      "vrfiz",		FP,	vector_btruncv4sf2)
BU_ALTIVEC_1 (VRSQRTFP,	      "vrsqrtfp",	FP,	rsqrtv4sf2)
BU_ALTIVEC_1 (VRSQRTEFP,      "vrsqrtefp",	FP,	rsqrtev4sf2)
BU_ALTIVEC_1 (VSPLTISB,	      "vspltisb",	CONST,	altivec_vspltisb)
BU_ALTIVEC_1 (VSPLTISH,	      "vspltish",	CONST,	altivec_vspltish)
BU_ALTIVEC_1 (VSPLTISW,	      "vspltisw",	CONST,	altivec_vspltisw)
BU_ALTIVEC_1 (VUPKHSB,	      "vupkhsb",	CONST,	altivec_vupkhsb)
BU_ALTIVEC_1 (VUPKHPX,	      "vupkhpx",	CONST,	altivec_vupkhpx)
BU_ALTIVEC_1 (VUPKHSH,	      "vupkhsh",	CONST,	altivec_vupkhsh)
BU_ALTIVEC_1 (VUPKLSB,	      "vupklsb",	CONST,	altivec_vupklsb)
BU_ALTIVEC_1 (VUPKLPX,	      "vupklpx",	CONST,	altivec_vupklpx)
BU_ALTIVEC_1 (VUPKLSH,	      "vupklsh",	CONST,	altivec_vupklsh)

BU_ALTIVEC_1 (FLOAT_V4SI_V4SF,    "float_sisf",	    FP,	floatv4siv4sf2)
BU_ALTIVEC_1 (UNSFLOAT_V4SI_V4SF, "uns_float_sisf", FP, floatunsv4siv4sf2)
BU_ALTIVEC_1 (FIX_V4SF_V4SI,      "fix_sfsi",       FP, fix_truncv4sfv4si2)
BU_ALTIVEC_1 (FIXUNS_V4SF_V4SI,   "fixuns_sfsi",    FP, fixuns_truncv4sfv4si2)

/* Altivec predicate functions.  */
BU_ALTIVEC_P (VCMPBFP_P,      "vcmpbfp_p",	CONST,	altivec_vcmpbfp_p)
BU_ALTIVEC_P (VCMPEQFP_P,     "vcmpeqfp_p",	CONST,	vector_eq_v4sf_p)
BU_ALTIVEC_P (VCMPGEFP_P,     "vcmpgefp_p",	CONST,	vector_ge_v4sf_p)
BU_ALTIVEC_P (VCMPGTFP_P,     "vcmpgtfp_p",	CONST,	vector_gt_v4sf_p)
BU_ALTIVEC_P (VCMPEQUW_P,     "vcmpequw_p",	CONST,	vector_eq_v4si_p)
BU_ALTIVEC_P (VCMPGTSW_P,     "vcmpgtsw_p",	CONST,	vector_gt_v4si_p)
BU_ALTIVEC_P (VCMPGTUW_P,     "vcmpgtuw_p",	CONST,	vector_gtu_v4si_p)
BU_ALTIVEC_P (VCMPEQUH_P,     "vcmpequh_p",	CONST,	vector_eq_v8hi_p)
BU_ALTIVEC_P (VCMPGTSH_P,     "vcmpgtsh_p",	CONST,	vector_gt_v8hi_p)
BU_ALTIVEC_P (VCMPGTUH_P,     "vcmpgtuh_p",	CONST,	vector_gtu_v8hi_p)
BU_ALTIVEC_P (VCMPEQUB_P,     "vcmpequb_p",	CONST,	vector_eq_v16qi_p)
BU_ALTIVEC_P (VCMPGTSB_P,     "vcmpgtsb_p",	CONST,	vector_gt_v16qi_p)
BU_ALTIVEC_P (VCMPGTUB_P,     "vcmpgtub_p",	CONST,	vector_gtu_v16qi_p)

/* AltiVec builtins that are handled as special cases.  */
BU_ALTIVEC_X (ST_INTERNAL_4si,  "st_internal_4si",  MEM)
BU_ALTIVEC_X (LD_INTERNAL_4si,  "ld_internal_4si",  MEM)
BU_ALTIVEC_X (ST_INTERNAL_8hi,	"st_internal_8hi",  MEM)
BU_ALTIVEC_X (LD_INTERNAL_8hi,	"ld_internal_8hi",  MEM)
BU_ALTIVEC_X (ST_INTERNAL_16qi,	"st_internal_16qi", MEM)
BU_ALTIVEC_X (LD_INTERNAL_16qi,	"ld_internal_16qi", MEM)
BU_ALTIVEC_X (ST_INTERNAL_4sf,	"st_internal_16qi", MEM)
BU_ALTIVEC_X (LD_INTERNAL_4sf,	"ld_internal_4sf",  MEM)
BU_ALTIVEC_X (ST_INTERNAL_2df,	"st_internal_4sf",  MEM)
BU_ALTIVEC_X (LD_INTERNAL_2df,	"ld_internal_2df",  MEM)
BU_ALTIVEC_X (ST_INTERNAL_2di,	"st_internal_2di",  MEM)
BU_ALTIVEC_X (LD_INTERNAL_2di,	"ld_internal_2di",  MEM)
BU_ALTIVEC_X (MTVSCR,		"mtvscr",	    MISC)
BU_ALTIVEC_X (MFVSCR,		"mfvscr",	    MISC)
BU_ALTIVEC_X (DSSALL,		"dssall",	    MISC)
BU_ALTIVEC_X (DSS,		"dss",		    MISC)
BU_ALTIVEC_X (LVSL,		"lvsl",		    MEM)
BU_ALTIVEC_X (LVSR,		"lvsr",		    MEM)
BU_ALTIVEC_X (LVEBX,		"lvebx",	    MEM)
BU_ALTIVEC_X (LVEHX,		"lvehx",	    MEM)
BU_ALTIVEC_X (LVEWX,		"lvewx",	    MEM)
BU_ALTIVEC_X (LVXL,		"lvxl",		    MEM)
BU_ALTIVEC_X (LVX,		"lvx",		    MEM)
BU_ALTIVEC_X (STVX,		"stvx",		    MEM)
BU_ALTIVEC_C (LVLX,		"lvlx",		    MEM)
BU_ALTIVEC_C (LVLXL,		"lvlxl",	    MEM)
BU_ALTIVEC_C (LVRX,		"lvrx",		    MEM)
BU_ALTIVEC_C (LVRXL,		"lvrxl",	    MEM)
BU_ALTIVEC_X (STVEBX,		"stvebx",	    MEM)
BU_ALTIVEC_X (STVEHX,		"stvehx",	    MEM)
BU_ALTIVEC_X (STVEWX,		"stvewx",	    MEM)
BU_ALTIVEC_X (STVXL,		"stvxl",	    MEM)
BU_ALTIVEC_C (STVLX,		"stvlx",	    MEM)
BU_ALTIVEC_C (STVLXL,		"stvlxl",	    MEM)
BU_ALTIVEC_C (STVRX,		"stvrx",	    MEM)
BU_ALTIVEC_C (STVRXL,		"stvrxl",	    MEM)
BU_ALTIVEC_X (MASK_FOR_LOAD,	"mask_for_load",    MISC)
BU_ALTIVEC_X (MASK_FOR_STORE,	"mask_for_store",   MISC)
BU_ALTIVEC_X (VEC_INIT_V4SI,	"vec_init_v4si",    CONST)
BU_ALTIVEC_X (VEC_INIT_V8HI,	"vec_init_v8hi",    CONST)
BU_ALTIVEC_X (VEC_INIT_V16QI,	"vec_init_v16qi",   CONST)
BU_ALTIVEC_X (VEC_INIT_V4SF,	"vec_init_v4sf",    CONST)
BU_ALTIVEC_X (VEC_SET_V4SI,	"vec_set_v4si",     CONST)
BU_ALTIVEC_X (VEC_SET_V8HI,	"vec_set_v8hi",     CONST)
BU_ALTIVEC_X (VEC_SET_V16QI,	"vec_set_v16qi",    CONST)
BU_ALTIVEC_X (VEC_SET_V4SF,	"vec_set_v4sf",     CONST)
BU_ALTIVEC_X (VEC_EXT_V4SI,	"vec_ext_v4si",     CONST)
BU_ALTIVEC_X (VEC_EXT_V8HI,	"vec_ext_v8hi",     CONST)
BU_ALTIVEC_X (VEC_EXT_V16QI,	"vec_ext_v16qi",    CONST)
BU_ALTIVEC_X (VEC_EXT_V4SF,	"vec_ext_v4sf",     CONST)

/* Altivec overloaded builtins.  */
/* For now, don't set the classification for overloaded functions.
   The function should be converted to the type specific instruction
   before we get to the point about classifying the builtin type.  */

/* 3 argument Altivec overloaded builtins.  */
BU_ALTIVEC_OVERLOAD_3 (MADD,       "madd")
BU_ALTIVEC_OVERLOAD_3 (MADDS,      "madds")
BU_ALTIVEC_OVERLOAD_3 (MLADD,      "mladd")
BU_ALTIVEC_OVERLOAD_3 (MRADDS,     "mradds")
BU_ALTIVEC_OVERLOAD_3 (MSUM,       "msum")
BU_ALTIVEC_OVERLOAD_3 (MSUMS,      "msums")
BU_ALTIVEC_OVERLOAD_3 (NMSUB,      "nmsub")
BU_ALTIVEC_OVERLOAD_3 (PERM,       "perm")
BU_ALTIVEC_OVERLOAD_3 (SEL,        "sel")
BU_ALTIVEC_OVERLOAD_3 (VMSUMMBM,   "vmsummbm")
BU_ALTIVEC_OVERLOAD_3 (VMSUMSHM,   "vmsumshm")
BU_ALTIVEC_OVERLOAD_3 (VMSUMSHS,   "vmsumshs")
BU_ALTIVEC_OVERLOAD_3 (VMSUMUBM,   "vmsumubm")
BU_ALTIVEC_OVERLOAD_3 (VMSUMUHM,   "vmsumuhm")
BU_ALTIVEC_OVERLOAD_3 (VMSUMUHS,   "vmsumuhs")

/* Altivec DST overloaded builtins.  */
BU_ALTIVEC_OVERLOAD_D (DST,	   "dst")
BU_ALTIVEC_OVERLOAD_D (DSTT,	   "dstt")
BU_ALTIVEC_OVERLOAD_D (DSTST,	   "dstst")
BU_ALTIVEC_OVERLOAD_D (DSTSTT,	   "dststt")

/* 2 argument Altivec overloaded builtins.  */
BU_ALTIVEC_OVERLOAD_2 (ADD,	   "add")
BU_ALTIVEC_OVERLOAD_2 (ADDC,	   "addc")
BU_ALTIVEC_OVERLOAD_2 (ADDS,	   "adds")
BU_ALTIVEC_OVERLOAD_2 (AND,	   "and")
BU_ALTIVEC_OVERLOAD_2 (ANDC,	   "andc")
BU_ALTIVEC_OVERLOAD_2 (AVG,	   "avg")
BU_ALTIVEC_OVERLOAD_2 (CMPB,	   "cmpb")
BU_ALTIVEC_OVERLOAD_2 (CMPEQ,	   "cmpeq")
BU_ALTIVEC_OVERLOAD_2 (CMPGE,	   "cmpge")
BU_ALTIVEC_OVERLOAD_2 (CMPGT,	   "cmpgt")
BU_ALTIVEC_OVERLOAD_2 (CMPLE,	   "cmple")
BU_ALTIVEC_OVERLOAD_2 (CMPLT,	   "cmplt")
BU_ALTIVEC_OVERLOAD_2 (COPYSIGN,   "copysign")
BU_ALTIVEC_OVERLOAD_2 (MAX,	   "max")
BU_ALTIVEC_OVERLOAD_2 (MERGEH,	   "mergeh")
BU_ALTIVEC_OVERLOAD_2 (MERGEL,	   "mergel")
BU_ALTIVEC_OVERLOAD_2 (MIN,	   "min")
BU_ALTIVEC_OVERLOAD_2 (MULE,	   "mule")
BU_ALTIVEC_OVERLOAD_2 (MULO,	   "mulo")
BU_ALTIVEC_OVERLOAD_2 (NOR,	   "nor")
BU_ALTIVEC_OVERLOAD_2 (OR,	   "or")
BU_ALTIVEC_OVERLOAD_2 (PACK,	   "pack")
BU_ALTIVEC_OVERLOAD_2 (PACKPX,	   "packpx")
BU_ALTIVEC_OVERLOAD_2 (PACKS,	   "packs")
BU_ALTIVEC_OVERLOAD_2 (PACKSU,	   "packsu")
BU_ALTIVEC_OVERLOAD_2 (RECIP,	   "recipdiv")
BU_ALTIVEC_OVERLOAD_2 (RL,	   "rl")
BU_ALTIVEC_OVERLOAD_2 (SL,	   "sl")
BU_ALTIVEC_OVERLOAD_2 (SLL,	   "sll")
BU_ALTIVEC_OVERLOAD_2 (SLO,	   "slo")
BU_ALTIVEC_OVERLOAD_2 (SR,	   "sr")
BU_ALTIVEC_OVERLOAD_2 (SRA,	   "sra")
BU_ALTIVEC_OVERLOAD_2 (SRL,	   "srl")
BU_ALTIVEC_OVERLOAD_2 (SRO,	   "sro")
BU_ALTIVEC_OVERLOAD_2 (SUB,	   "sub")
BU_ALTIVEC_OVERLOAD_2 (SUBC,	   "subc")
BU_ALTIVEC_OVERLOAD_2 (SUBS,	   "subs")
BU_ALTIVEC_OVERLOAD_2 (SUM2S,	   "sum2s")
BU_ALTIVEC_OVERLOAD_2 (SUM4S,	   "sum4s")
BU_ALTIVEC_OVERLOAD_2 (SUMS,	   "sums")
BU_ALTIVEC_OVERLOAD_2 (VADDFP,	   "vaddfp")
BU_ALTIVEC_OVERLOAD_2 (VADDSBS,	   "vaddsbs")
BU_ALTIVEC_OVERLOAD_2 (VADDSHS,	   "vaddshs")
BU_ALTIVEC_OVERLOAD_2 (VADDSWS,	   "vaddsws")
BU_ALTIVEC_OVERLOAD_2 (VADDUBM,	   "vaddubm")
BU_ALTIVEC_OVERLOAD_2 (VADDUBS,	   "vaddubs")
BU_ALTIVEC_OVERLOAD_2 (VADDUHM,	   "vadduhm")
BU_ALTIVEC_OVERLOAD_2 (VADDUHS,	   "vadduhs")
BU_ALTIVEC_OVERLOAD_2 (VADDUWM,	   "vadduwm")
BU_ALTIVEC_OVERLOAD_2 (VADDUWS,	   "vadduws")
BU_ALTIVEC_OVERLOAD_2 (VAVGSB,	   "vavgsb")
BU_ALTIVEC_OVERLOAD_2 (VAVGSH,	   "vavgsh")
BU_ALTIVEC_OVERLOAD_2 (VAVGSW,	   "vavgsw")
BU_ALTIVEC_OVERLOAD_2 (VAVGUB,	   "vavgub")
BU_ALTIVEC_OVERLOAD_2 (VAVGUH,	   "vavguh")
BU_ALTIVEC_OVERLOAD_2 (VAVGUW,	   "vavguw")
BU_ALTIVEC_OVERLOAD_2 (VCMPEQFP,   "vcmpeqfp")
BU_ALTIVEC_OVERLOAD_2 (VCMPEQUB,   "vcmpequb")
BU_ALTIVEC_OVERLOAD_2 (VCMPEQUH,   "vcmpequh")
BU_ALTIVEC_OVERLOAD_2 (VCMPEQUW,   "vcmpequw")
BU_ALTIVEC_OVERLOAD_2 (VCMPGTFP,   "vcmpgtfp")
BU_ALTIVEC_OVERLOAD_2 (VCMPGTSB,   "vcmpgtsb")
BU_ALTIVEC_OVERLOAD_2 (VCMPGTSH,   "vcmpgtsh")
BU_ALTIVEC_OVERLOAD_2 (VCMPGTSW,   "vcmpgtsw")
BU_ALTIVEC_OVERLOAD_2 (VCMPGTUB,   "vcmpgtub")
BU_ALTIVEC_OVERLOAD_2 (VCMPGTUH,   "vcmpgtuh")
BU_ALTIVEC_OVERLOAD_2 (VCMPGTUW,   "vcmpgtuw")
BU_ALTIVEC_OVERLOAD_2 (VMAXFP,	   "vmaxfp")
BU_ALTIVEC_OVERLOAD_2 (VMAXSB,	   "vmaxsb")
BU_ALTIVEC_OVERLOAD_2 (VMAXSH,	   "vmaxsh")
BU_ALTIVEC_OVERLOAD_2 (VMAXSW,	   "vmaxsw")
BU_ALTIVEC_OVERLOAD_2 (VMAXUB,	   "vmaxub")
BU_ALTIVEC_OVERLOAD_2 (VMAXUH,	   "vmaxuh")
BU_ALTIVEC_OVERLOAD_2 (VMAXUW,	   "vmaxuw")
BU_ALTIVEC_OVERLOAD_2 (VMINFP,	   "vminfp")
BU_ALTIVEC_OVERLOAD_2 (VMINSB,	   "vminsb")
BU_ALTIVEC_OVERLOAD_2 (VMINSH,	   "vminsh")
BU_ALTIVEC_OVERLOAD_2 (VMINSW,	   "vminsw")
BU_ALTIVEC_OVERLOAD_2 (VMINUB,	   "vminub")
BU_ALTIVEC_OVERLOAD_2 (VMINUH,	   "vminuh")
BU_ALTIVEC_OVERLOAD_2 (VMINUW,	   "vminuw")
BU_ALTIVEC_OVERLOAD_2 (VMRGHB,	   "vmrghb")
BU_ALTIVEC_OVERLOAD_2 (VMRGHH,	   "vmrghh")
BU_ALTIVEC_OVERLOAD_2 (VMRGHW,	   "vmrghw")
BU_ALTIVEC_OVERLOAD_2 (VMRGLB,	   "vmrglb")
BU_ALTIVEC_OVERLOAD_2 (VMRGLH,	   "vmrglh")
BU_ALTIVEC_OVERLOAD_2 (VMRGLW,	   "vmrglw")
BU_ALTIVEC_OVERLOAD_2 (VMULESB,	   "vmulesb")
BU_ALTIVEC_OVERLOAD_2 (VMULESH,	   "vmulesh")
BU_ALTIVEC_OVERLOAD_2 (VMULEUB,	   "vmuleub")
BU_ALTIVEC_OVERLOAD_2 (VMULEUH,	   "vmuleuh")
BU_ALTIVEC_OVERLOAD_2 (VMULOSB,	   "vmulosb")
BU_ALTIVEC_OVERLOAD_2 (VMULOSH,	   "vmulosh")
BU_ALTIVEC_OVERLOAD_2 (VMULOUB,	   "vmuloub")
BU_ALTIVEC_OVERLOAD_2 (VMULOUH,	   "vmulouh")
BU_ALTIVEC_OVERLOAD_2 (VPKSHSS,	   "vpkshss")
BU_ALTIVEC_OVERLOAD_2 (VPKSHUS,	   "vpkshus")
BU_ALTIVEC_OVERLOAD_2 (VPKSWSS,	   "vpkswss")
BU_ALTIVEC_OVERLOAD_2 (VPKSWUS,	   "vpkswus")
BU_ALTIVEC_OVERLOAD_2 (VPKUHUM,	   "vpkuhum")
BU_ALTIVEC_OVERLOAD_2 (VPKUHUS,	   "vpkuhus")
BU_ALTIVEC_OVERLOAD_2 (VPKUWUM,	   "vpkuwum")
BU_ALTIVEC_OVERLOAD_2 (VPKUWUS,	   "vpkuwus")
BU_ALTIVEC_OVERLOAD_2 (VRLB,	   "vrlb")
BU_ALTIVEC_OVERLOAD_2 (VRLH,	   "vrlh")
BU_ALTIVEC_OVERLOAD_2 (VRLW,	   "vrlw")
BU_ALTIVEC_OVERLOAD_2 (VSLB,	   "vslb")
BU_ALTIVEC_OVERLOAD_2 (VSLH,	   "vslh")
BU_ALTIVEC_OVERLOAD_2 (VSLW,	   "vslw")
BU_ALTIVEC_OVERLOAD_2 (VSRAB,	   "vsrab")
BU_ALTIVEC_OVERLOAD_2 (VSRAH,	   "vsrah")
BU_ALTIVEC_OVERLOAD_2 (VSRAW,	   "vsraw")
BU_ALTIVEC_OVERLOAD_2 (VSRB,	   "vsrb")
BU_ALTIVEC_OVERLOAD_2 (VSRH,	   "vsrh")
BU_ALTIVEC_OVERLOAD_2 (VSRW,	   "vsrw")
BU_ALTIVEC_OVERLOAD_2 (VSUBFP,	   "vsubfp")
BU_ALTIVEC_OVERLOAD_2 (VSUBSBS,	   "vsubsbs")
BU_ALTIVEC_OVERLOAD_2 (VSUBSHS,	   "vsubshs")
BU_ALTIVEC_OVERLOAD_2 (VSUBSWS,	   "vsubsws")
BU_ALTIVEC_OVERLOAD_2 (VSUBUBM,	   "vsububm")
BU_ALTIVEC_OVERLOAD_2 (VSUBUBS,	   "vsububs")
BU_ALTIVEC_OVERLOAD_2 (VSUBUHM,	   "vsubuhm")
BU_ALTIVEC_OVERLOAD_2 (VSUBUHS,	   "vsubuhs")
BU_ALTIVEC_OVERLOAD_2 (VSUBUWM,	   "vsubuwm")
BU_ALTIVEC_OVERLOAD_2 (VSUBUWS,	   "vsubuws")
BU_ALTIVEC_OVERLOAD_2 (VSUM4SBS,   "vsum4sbs")
BU_ALTIVEC_OVERLOAD_2 (VSUM4SHS,   "vsum4shs")
BU_ALTIVEC_OVERLOAD_2 (VSUM4UBS,   "vsum4ubs")
BU_ALTIVEC_OVERLOAD_2 (XOR,	   "xor")

/* 1 argument Altivec overloaded functions.  */
BU_ALTIVEC_OVERLOAD_1 (ABS,	   "abs")
BU_ALTIVEC_OVERLOAD_1 (ABSS,	   "abss")
BU_ALTIVEC_OVERLOAD_1 (CEIL,	   "ceil")
BU_ALTIVEC_OVERLOAD_1 (EXPTE,	   "expte")
BU_ALTIVEC_OVERLOAD_1 (FLOOR,	   "floor")
BU_ALTIVEC_OVERLOAD_1 (LOGE,	   "loge")
BU_ALTIVEC_OVERLOAD_1 (MTVSCR,	   "mtvscr")
BU_ALTIVEC_OVERLOAD_1 (NEARBYINT,  "nearbyint")
BU_ALTIVEC_OVERLOAD_1 (RE,	   "re")
BU_ALTIVEC_OVERLOAD_1 (RINT,       "rint")
BU_ALTIVEC_OVERLOAD_1 (ROUND,	   "round")
BU_ALTIVEC_OVERLOAD_1 (RSQRT,	   "rsqrt")
BU_ALTIVEC_OVERLOAD_1 (RSQRTE,	   "rsqrte")
BU_ALTIVEC_OVERLOAD_1 (SQRT,       "sqrt")
BU_ALTIVEC_OVERLOAD_1 (TRUNC,	   "trunc")
BU_ALTIVEC_OVERLOAD_1 (UNPACKH,	   "unpackh")
BU_ALTIVEC_OVERLOAD_1 (UNPACKL,	   "unpackl")
BU_ALTIVEC_OVERLOAD_1 (VUPKHPX,	   "vupkhpx")
BU_ALTIVEC_OVERLOAD_1 (VUPKHSB,	   "vupkhsb")
BU_ALTIVEC_OVERLOAD_1 (VUPKHSH,	   "vupkhsh")
BU_ALTIVEC_OVERLOAD_1 (VUPKLPX,	   "vupklpx")
BU_ALTIVEC_OVERLOAD_1 (VUPKLSB,	   "vupklsb")
BU_ALTIVEC_OVERLOAD_1 (VUPKLSH,	   "vupklsh")

/* Overloaded altivec predicates.  */
BU_ALTIVEC_OVERLOAD_P (VCMPEQ_P,   "vcmpeq_p")
BU_ALTIVEC_OVERLOAD_P (VCMPGT_P,   "vcmpgt_p")
BU_ALTIVEC_OVERLOAD_P (VCMPGE_P,   "vcmpge_p")

/* Overloaded Altivec builtins that are handled as special cases.  */
BU_ALTIVEC_OVERLOAD_X (CTF,	   "ctf")
BU_ALTIVEC_OVERLOAD_X (CTS,	   "cts")
BU_ALTIVEC_OVERLOAD_X (CTU,	   "ctu")
BU_ALTIVEC_OVERLOAD_X (EXTRACT,	   "extract")
BU_ALTIVEC_OVERLOAD_X (INSERT,	   "insert")
BU_ALTIVEC_OVERLOAD_X (LD,	   "ld")
BU_ALTIVEC_OVERLOAD_X (LDE,	   "lde")
BU_ALTIVEC_OVERLOAD_X (LDL,	   "ldl")
BU_ALTIVEC_OVERLOAD_X (LVEBX,	   "lvebx")
BU_ALTIVEC_OVERLOAD_X (LVEHX,	   "lvehx")
BU_ALTIVEC_OVERLOAD_X (LVEWX,	   "lvewx")
BU_ALTIVEC_OVERLOAD_X (LVLX,	   "lvlx")
BU_ALTIVEC_OVERLOAD_X (LVLXL,	   "lvlxl")
BU_ALTIVEC_OVERLOAD_X (LVRX,	   "lvrx")
BU_ALTIVEC_OVERLOAD_X (LVRXL,	   "lvrxl")
BU_ALTIVEC_OVERLOAD_X (LVSL,	   "lvsl")
BU_ALTIVEC_OVERLOAD_X (LVSR,	   "lvsr")
BU_ALTIVEC_OVERLOAD_X (PROMOTE,	   "promote")
BU_ALTIVEC_OVERLOAD_X (SLD,	   "sld")
BU_ALTIVEC_OVERLOAD_X (SPLAT,	   "splat")
BU_ALTIVEC_OVERLOAD_X (SPLATS,	   "splats")
BU_ALTIVEC_OVERLOAD_X (ST,	   "st")
BU_ALTIVEC_OVERLOAD_X (STE,	   "ste")
BU_ALTIVEC_OVERLOAD_X (STEP,	   "step")
BU_ALTIVEC_OVERLOAD_X (STL,	   "stl")
BU_ALTIVEC_OVERLOAD_X (STVEBX,	   "stvebx")
BU_ALTIVEC_OVERLOAD_X (STVEHX,	   "stvehx")
BU_ALTIVEC_OVERLOAD_X (STVEWX,	   "stvewx")
BU_ALTIVEC_OVERLOAD_X (STVLX,	   "stvlx")
BU_ALTIVEC_OVERLOAD_X (STVLXL,	   "stvlxl")
BU_ALTIVEC_OVERLOAD_X (STVRX,	   "stvrx")
BU_ALTIVEC_OVERLOAD_X (STVRXL,	   "stvrxl")
BU_ALTIVEC_OVERLOAD_X (VCFSX,	   "vcfsx")
BU_ALTIVEC_OVERLOAD_X (VCFUX,	   "vcfux")
BU_ALTIVEC_OVERLOAD_X (VSPLTB,	   "vspltb")
BU_ALTIVEC_OVERLOAD_X (VSPLTH,	   "vsplth")
BU_ALTIVEC_OVERLOAD_X (VSPLTW,	   "vspltw")

/* 3 argument VSX builtins.  */
BU_VSX_3 (XVMADDSP,           "xvmaddsp",       CONST, 	fmav4sf4)
BU_VSX_3 (XVMSUBSP,           "xvmsubsp",       CONST, 	fmsv4sf4)
BU_VSX_3 (XVNMADDSP,          "xvnmaddsp",      CONST, 	nfmav4sf4)
BU_VSX_3 (XVNMSUBSP,          "xvnmsubsp",      CONST, 	nfmsv4sf4)

BU_VSX_3 (XVMADDDP,           "xvmadddp",       CONST, 	fmav2df4)
BU_VSX_3 (XVMSUBDP,           "xvmsubdp",       CONST, 	fmsv2df4)
BU_VSX_3 (XVNMADDDP,          "xvnmadddp",      CONST, 	nfmav2df4)
BU_VSX_3 (XVNMSUBDP,          "xvnmsubdp",      CONST, 	nfmsv2df4)

BU_VSX_3 (XXSEL_2DI,          "xxsel_2di",      CONST, 	vector_select_v2di)
BU_VSX_3 (XXSEL_2DF,          "xxsel_2df",      CONST, 	vector_select_v2df)
BU_VSX_3 (XXSEL_4SF,          "xxsel_4sf",      CONST, 	vector_select_v4sf)
BU_VSX_3 (XXSEL_4SI,          "xxsel_4si",      CONST, 	vector_select_v4si)
BU_VSX_3 (XXSEL_8HI,          "xxsel_8hi",      CONST, 	vector_select_v8hi)
BU_VSX_3 (XXSEL_16QI,         "xxsel_16qi",     CONST, 	vector_select_v16qi)
BU_VSX_3 (XXSEL_2DI_UNS,      "xxsel_2di_uns",  CONST, 	vector_select_v2di_uns)
BU_VSX_3 (XXSEL_4SI_UNS,      "xxsel_4si_uns",  CONST, 	vector_select_v4si_uns)
BU_VSX_3 (XXSEL_8HI_UNS,      "xxsel_8hi_uns",  CONST, 	vector_select_v8hi_uns)
BU_VSX_3 (XXSEL_16QI_UNS,     "xxsel_16qi_uns", CONST, 	vector_select_v16qi_uns)

BU_VSX_3 (VPERM_2DI,          "vperm_2di",      CONST, 	altivec_vperm_v2di)
BU_VSX_3 (VPERM_2DF,          "vperm_2df",      CONST, 	altivec_vperm_v2df)
BU_VSX_3 (VPERM_4SF,          "vperm_4sf",      CONST, 	altivec_vperm_v4sf)
BU_VSX_3 (VPERM_4SI,          "vperm_4si",      CONST, 	altivec_vperm_v4si)
BU_VSX_3 (VPERM_8HI,          "vperm_8hi",      CONST, 	altivec_vperm_v8hi)
BU_VSX_3 (VPERM_16QI,         "vperm_16qi",     CONST, 	altivec_vperm_v16qi)
BU_VSX_3 (VPERM_2DI_UNS,      "vperm_2di_uns",  CONST, 	altivec_vperm_v2di_uns)
BU_VSX_3 (VPERM_4SI_UNS,      "vperm_4si_uns",  CONST, 	altivec_vperm_v4si_uns)
BU_VSX_3 (VPERM_8HI_UNS,      "vperm_8hi_uns",  CONST, 	altivec_vperm_v8hi_uns)
BU_VSX_3 (VPERM_16QI_UNS,     "vperm_16qi_uns", CONST, 	altivec_vperm_v16qi_uns)

BU_VSX_3 (XXPERMDI_2DF,       "xxpermdi_2df",   CONST, 	vsx_xxpermdi_v2df)
BU_VSX_3 (XXPERMDI_2DI,       "xxpermdi_2di",   CONST, 	vsx_xxpermdi_v2di)
BU_VSX_3 (XXPERMDI_4SF,       "xxpermdi_4sf",   CONST, 	vsx_xxpermdi_v4sf)
BU_VSX_3 (XXPERMDI_4SI,       "xxpermdi_4si",   CONST, 	vsx_xxpermdi_v4si)
BU_VSX_3 (XXPERMDI_8HI,       "xxpermdi_8hi",   CONST, 	vsx_xxpermdi_v8hi)
BU_VSX_3 (XXPERMDI_16QI,      "xxpermdi_16qi",  CONST, 	vsx_xxpermdi_v16qi)
BU_VSX_3 (SET_2DF,            "set_2df",        CONST, 	vsx_set_v2df)
BU_VSX_3 (SET_2DI,            "set_2di",        CONST, 	vsx_set_v2di)
BU_VSX_3 (XXSLDWI_2DI,        "xxsldwi_2di",    CONST, 	vsx_xxsldwi_v2di)
BU_VSX_3 (XXSLDWI_2DF,        "xxsldwi_2df",    CONST, 	vsx_xxsldwi_v2df)
BU_VSX_3 (XXSLDWI_4SF,        "xxsldwi_4sf",    CONST, 	vsx_xxsldwi_v4sf)
BU_VSX_3 (XXSLDWI_4SI,        "xxsldwi_4si",    CONST, 	vsx_xxsldwi_v4si)
BU_VSX_3 (XXSLDWI_8HI,        "xxsldwi_8hi",    CONST, 	vsx_xxsldwi_v8hi)
BU_VSX_3 (XXSLDWI_16QI,       "xxsldwi_16qi",   CONST, 	vsx_xxsldwi_v16qi)

/* 2 argument VSX builtins.  */
BU_VSX_2 (XVADDDP,	      "xvadddp",	FP,	addv2df3)
BU_VSX_2 (XVSUBDP,	      "xvsubdp",	FP,	subv2df3)
BU_VSX_2 (XVMULDP,	      "xvmuldp",	FP,	mulv2df3)
BU_VSX_2 (XVDIVDP,	      "xvdivdp",	FP,	divv2df3)
BU_VSX_2 (RECIP_V2DF,	      "xvrecipdivdp",	FP,	recipv2df3)
BU_VSX_2 (XVMINDP,	      "xvmindp",	CONST,	sminv2df3)
BU_VSX_2 (XVMAXDP,	      "xvmaxdp",	CONST,	smaxv2df3)
BU_VSX_2 (XVTDIVDP_FE,	      "xvtdivdp_fe",	CONST,	vsx_tdivv2df3_fe)
BU_VSX_2 (XVTDIVDP_FG,	      "xvtdivdp_fg",	CONST,	vsx_tdivv2df3_fg)
BU_VSX_2 (XVCMPEQDP,	      "xvcmpeqdp",	CONST,	vector_eqv2df)
BU_VSX_2 (XVCMPGTDP,	      "xvcmpgtdp",	CONST,	vector_gtv2df)
BU_VSX_2 (XVCMPGEDP,	      "xvcmpgedp",	CONST,	vector_gev2df)

BU_VSX_2 (XVADDSP,	      "xvaddsp",	FP,	addv4sf3)
BU_VSX_2 (XVSUBSP,	      "xvsubsp",	FP,	subv4sf3)
BU_VSX_2 (XVMULSP,	      "xvmulsp",	FP,	mulv4sf3)
BU_VSX_2 (XVDIVSP,	      "xvdivsp",	FP,	divv4sf3)
BU_VSX_2 (RECIP_V4SF,	      "xvrecipdivsp",	FP,	recipv4sf3)
BU_VSX_2 (XVMINSP,	      "xvminsp",	CONST,	sminv4sf3)
BU_VSX_2 (XVMAXSP,	      "xvmaxsp",	CONST,	smaxv4sf3)
BU_VSX_2 (XVTDIVSP_FE,	      "xvtdivsp_fe",	CONST,	vsx_tdivv4sf3_fe)
BU_VSX_2 (XVTDIVSP_FG,	      "xvtdivsp_fg",	CONST,	vsx_tdivv4sf3_fg)
BU_VSX_2 (XVCMPEQSP,	      "xvcmpeqsp",	CONST,	vector_eqv4sf)
BU_VSX_2 (XVCMPGTSP,	      "xvcmpgtsp",	CONST,	vector_gtv4sf)
BU_VSX_2 (XVCMPGESP,	      "xvcmpgesp",	CONST,	vector_gev4sf)

BU_VSX_2 (XSMINDP,	      "xsmindp",	CONST,	smindf3)
BU_VSX_2 (XSMAXDP,	      "xsmaxdp",	CONST,	smaxdf3)
BU_VSX_2 (XSTDIVDP_FE,	      "xstdivdp_fe",	CONST,	vsx_tdivdf3_fe)
BU_VSX_2 (XSTDIVDP_FG,	      "xstdivdp_fg",	CONST,	vsx_tdivdf3_fg)
BU_VSX_2 (CPSGNDP,	      "cpsgndp",	CONST,	vector_copysignv2df3)
BU_VSX_2 (CPSGNSP,	      "cpsgnsp",	CONST,	vector_copysignv4sf3)

BU_VSX_2 (CONCAT_2DF,	      "concat_2df",	CONST,	vsx_concat_v2df)
BU_VSX_2 (CONCAT_2DI,	      "concat_2di",	CONST,	vsx_concat_v2di)
BU_VSX_2 (SPLAT_2DF,	      "splat_2df",	CONST,	vsx_splat_v2df)
BU_VSX_2 (SPLAT_2DI,	      "splat_2di",	CONST,	vsx_splat_v2di)
BU_VSX_2 (XXMRGHW_4SF,	      "xxmrghw",	CONST,	vsx_xxmrghw_v4sf)
BU_VSX_2 (XXMRGHW_4SI,	      "xxmrghw_4si",	CONST,	vsx_xxmrghw_v4si)
BU_VSX_2 (XXMRGLW_4SF,	      "xxmrglw",	CONST,	vsx_xxmrglw_v4sf)
BU_VSX_2 (XXMRGLW_4SI,	      "xxmrglw_4si",	CONST,	vsx_xxmrglw_v4si)
BU_VSX_2 (VEC_MERGEL_V2DF,    "mergel_2df",	CONST,	vsx_mergel_v2df)
BU_VSX_2 (VEC_MERGEL_V2DI,    "mergel_2di",	CONST,	vsx_mergel_v2di)
BU_VSX_2 (VEC_MERGEH_V2DF,    "mergeh_2df",	CONST,	vsx_mergeh_v2df)
BU_VSX_2 (VEC_MERGEH_V2DI,    "mergeh_2di",	CONST,	vsx_mergeh_v2di)

/* VSX abs builtin functions.  */
BU_VSX_A (XVABSDP,	      "xvabsdp",	CONST,	absv2df2)
BU_VSX_A (XVNABSDP,	      "xvnabsdp",	CONST,	vsx_nabsv2df2)
BU_VSX_A (XVABSSP,	      "xvabssp",	CONST,	absv4sf2)
BU_VSX_A (XVNABSSP,	      "xvnabssp",	CONST,	vsx_nabsv4sf2)

/* 1 argument VSX builtin functions.  */
BU_VSX_1 (XVNEGDP,	      "xvnegdp",	CONST,	negv2df2)
BU_VSX_1 (XVSQRTDP,	      "xvsqrtdp",	CONST,	sqrtv2df2)
BU_VSX_1 (RSQRT_2DF,	      "xvrsqrtdp",	CONST,	rsqrtv2df2)
BU_VSX_1 (XVRSQRTEDP,	      "xvrsqrtedp",	CONST,	rsqrtev2df2)
BU_VSX_1 (XVTSQRTDP_FE,	      "xvtsqrtdp_fe",	CONST,	vsx_tsqrtv2df2_fe)
BU_VSX_1 (XVTSQRTDP_FG,	      "xvtsqrtdp_fg",	CONST,	vsx_tsqrtv2df2_fg)
BU_VSX_1 (XVREDP,	      "xvredp",		CONST,	vsx_frev2df2)

BU_VSX_1 (XVNEGSP,	      "xvnegsp",	CONST,	negv4sf2)
BU_VSX_1 (XVSQRTSP,	      "xvsqrtsp",	CONST,	sqrtv4sf2)
BU_VSX_1 (RSQRT_4SF,          "xvrsqrtsp",	CONST,	rsqrtv4sf2)
BU_VSX_1 (XVRSQRTESP,	      "xvrsqrtesp",	CONST,	rsqrtev4sf2)
BU_VSX_1 (XVTSQRTSP_FE,	      "xvtsqrtsp_fe",	CONST,	vsx_tsqrtv4sf2_fe)
BU_VSX_1 (XVTSQRTSP_FG,	      "xvtsqrtsp_fg",	CONST,	vsx_tsqrtv4sf2_fg)
BU_VSX_1 (XVRESP,	      "xvresp",		CONST,	vsx_frev4sf2)

BU_VSX_1 (XSCVDPSP,	      "xscvdpsp",	CONST,	vsx_xscvdpsp)
BU_VSX_1 (XSCVSPDP,	      "xscvspdp",	CONST,	vsx_xscvdpsp)
BU_VSX_1 (XVCVDPSP,	      "xvcvdpsp",	CONST,	vsx_xvcvdpsp)
BU_VSX_1 (XVCVSPDP,	      "xvcvspdp",	CONST,	vsx_xvcvspdp)
BU_VSX_1 (XSTSQRTDP_FE,	      "xstsqrtdp_fe",	CONST,	vsx_tsqrtdf2_fe)
BU_VSX_1 (XSTSQRTDP_FG,	      "xstsqrtdp_fg",	CONST,	vsx_tsqrtdf2_fg)

BU_VSX_1 (XVCVDPSXDS,	      "xvcvdpsxds",	CONST,	vsx_fix_truncv2dfv2di2)
BU_VSX_1 (XVCVDPUXDS,	      "xvcvdpuxds",	CONST,	vsx_fixuns_truncv2dfv2di2)
BU_VSX_1 (XVCVDPUXDS_UNS,     "xvcvdpuxds_uns",	CONST,	vsx_fixuns_truncv2dfv2di2)
BU_VSX_1 (XVCVSXDDP,	      "xvcvsxddp",	CONST,	vsx_floatv2div2df2)
BU_VSX_1 (XVCVUXDDP,	      "xvcvuxddp",	CONST,	vsx_floatunsv2div2df2)
BU_VSX_1 (XVCVUXDDP_UNS,       "xvcvuxddp_uns",	CONST,	vsx_floatunsv2div2df2)

BU_VSX_1 (XVCVSPSXWS,	      "xvcvspsxws",	CONST,	vsx_fix_truncv4sfv4si2)
BU_VSX_1 (XVCVSPUXWS,	      "xvcvspuxws",	CONST,	vsx_fixuns_truncv4sfv4si2)
BU_VSX_1 (XVCVSXWSP,	      "xvcvsxwsp",	CONST,	vsx_floatv4siv4sf2)
BU_VSX_1 (XVCVUXWSP,	      "xvcvuxwsp",	CONST,	vsx_floatunsv4siv4sf2)

BU_VSX_1 (XVCVDPSXWS,	      "xvcvdpsxws",	CONST,	vsx_xvcvdpsxws)
BU_VSX_1 (XVCVDPUXWS,	      "xvcvdpuxws",	CONST,	vsx_xvcvdpuxws)
BU_VSX_1 (XVCVSXWDP,	      "xvcvsxwdp",	CONST,	vsx_xvcvsxwdp)
BU_VSX_1 (XVCVUXWDP,	      "xvcvuxwdp",	CONST,	vsx_xvcvuxwdp)
BU_VSX_1 (XVRDPI,	      "xvrdpi",		CONST,	vsx_xvrdpi)
BU_VSX_1 (XVRDPIC,	      "xvrdpic",	CONST,	vsx_xvrdpic)
BU_VSX_1 (XVRDPIM,	      "xvrdpim",	CONST,	vsx_floorv2df2)
BU_VSX_1 (XVRDPIP,	      "xvrdpip",	CONST,	vsx_ceilv2df2)
BU_VSX_1 (XVRDPIZ,	      "xvrdpiz",	CONST,	vsx_btruncv2df2)

BU_VSX_1 (XVCVSPSXDS,	      "xvcvspsxds",	CONST,	vsx_xvcvspsxds)
BU_VSX_1 (XVCVSPUXDS,	      "xvcvspuxds",	CONST,	vsx_xvcvspuxds)
BU_VSX_1 (XVCVSXDSP,	      "xvcvsxdsp",	CONST,	vsx_xvcvsxdsp)
BU_VSX_1 (XVCVUXDSP,	      "xvcvuxdsp",	CONST,	vsx_xvcvuxdsp)
BU_VSX_1 (XVRSPI,	      "xvrspi",		CONST,	vsx_xvrspi)
BU_VSX_1 (XVRSPIC,	      "xvrspic",	CONST,	vsx_xvrspic)
BU_VSX_1 (XVRSPIM,	      "xvrspim",	CONST,	vsx_floorv4sf2)
BU_VSX_1 (XVRSPIP,	      "xvrspip",	CONST,	vsx_ceilv4sf2)
BU_VSX_1 (XVRSPIZ,	      "xvrspiz",	CONST,	vsx_btruncv4sf2)

BU_VSX_1 (XSRDPI,	      "xsrdpi",		CONST,	vsx_xsrdpi)
BU_VSX_1 (XSRDPIC,	      "xsrdpic",	CONST,	vsx_xsrdpic)
BU_VSX_1 (XSRDPIM,	      "xsrdpim",	CONST,	vsx_floordf2)
BU_VSX_1 (XSRDPIP,	      "xsrdpip",	CONST,	vsx_ceildf2)
BU_VSX_1 (XSRDPIZ,	      "xsrdpiz",	CONST,	vsx_btruncdf2)

/* VSX predicate functions.  */
BU_VSX_P (XVCMPEQSP_P,	      "xvcmpeqsp_p",	CONST,	vector_eq_v4sf_p)
BU_VSX_P (XVCMPGESP_P,	      "xvcmpgesp_p",	CONST,	vector_ge_v4sf_p)
BU_VSX_P (XVCMPGTSP_P,	      "xvcmpgtsp_p",	CONST,	vector_gt_v4sf_p)
BU_VSX_P (XVCMPEQDP_P,	      "xvcmpeqdp_p",	CONST,	vector_eq_v2df_p)
BU_VSX_P (XVCMPGEDP_P,	      "xvcmpgedp_p",	CONST,	vector_ge_v2df_p)
BU_VSX_P (XVCMPGTDP_P,	      "xvcmpgtdp_p",	CONST,	vector_gt_v2df_p)

/* VSX builtins that are handled as special cases.  */
BU_VSX_X (LXSDX,	      "lxsdx",		MEM)
BU_VSX_X (LXVD2X_V2DF,	      "lxvd2x_v2df",	MEM)
BU_VSX_X (LXVD2X_V2DI,	      "lxvd2x_v2di",	MEM)
BU_VSX_X (LXVDSX,	      "lxvdsx",		MEM)
BU_VSX_X (LXVW4X_V4SF,	      "lxvw4x_v4sf",	MEM)
BU_VSX_X (LXVW4X_V4SI,        "lxvw4x_v4si",	MEM)
BU_VSX_X (LXVW4X_V8HI,        "lxvw4x_v8hi",	MEM)
BU_VSX_X (LXVW4X_V16QI,	      "lxvw4x_v16qi",	MEM)
BU_VSX_X (STXSDX,	      "stxsdx",		MEM)
BU_VSX_X (STXVD2X_V2DF,	      "stxsdx_v2df",	MEM)
BU_VSX_X (STXVD2X_V2DI,	      "stxsdx_v2di",	MEM)
BU_VSX_X (STXVW4X_V4SF,	      "stxsdx_v4sf",	MEM)
BU_VSX_X (STXVW4X_V4SI,	      "stxsdx_v4si",	MEM)
BU_VSX_X (STXVW4X_V8HI,	      "stxsdx_v8hi",	MEM)
BU_VSX_X (STXVW4X_V16QI,      "stxsdx_v16qi",	MEM)
BU_VSX_X (XSABSDP,	      "xsabsdp",	CONST)
BU_VSX_X (XSADDDP,	      "xsadddp",	FP)
BU_VSX_X (XSCMPODP,	      "xscmpodp",	FP)
BU_VSX_X (XSCMPUDP,	      "xscmpudp",	FP)
BU_VSX_X (XSCVDPSXDS,	      "xscvdpsxds",	FP)
BU_VSX_X (XSCVDPSXWS,	      "xscvdpsxws",	FP)
BU_VSX_X (XSCVDPUXDS,	      "xscvdpuxds",	FP)
BU_VSX_X (XSCVDPUXWS,	      "xscvdpuxws",	FP)
BU_VSX_X (XSCVSXDDP,	      "xscvsxddp",	FP)
BU_VSX_X (XSCVUXDDP,	      "xscvuxddp",	FP)
BU_VSX_X (XSDIVDP,	      "xsdivdp",	FP)
BU_VSX_X (XSMADDADP,	      "xsmaddadp",	FP)
BU_VSX_X (XSMADDMDP,	      "xsmaddmdp",	FP)
BU_VSX_X (XSMOVDP,	      "xsmovdp",	FP)
BU_VSX_X (XSMSUBADP,	      "xsmsubadp",	FP)
BU_VSX_X (XSMSUBMDP,	      "xsmsubmdp",	FP)
BU_VSX_X (XSMULDP,	      "xsmuldp",	FP)
BU_VSX_X (XSNABSDP,	      "xsnabsdp",	FP)
BU_VSX_X (XSNEGDP,	      "xsnegdp",	FP)
BU_VSX_X (XSNMADDADP,	      "xsnmaddadp",	FP)
BU_VSX_X (XSNMADDMDP,	      "xsnmaddmdp",	FP)
BU_VSX_X (XSNMSUBADP,	      "xsnmsubadp",	FP)
BU_VSX_X (XSNMSUBMDP,	      "xsnmsubmdp",	FP)
BU_VSX_X (XSSUBDP,	      "xssubdp",	FP)
BU_VSX_X (VEC_INIT_V2DF,      "vec_init_v2df",	CONST)
BU_VSX_X (VEC_INIT_V2DI,      "vec_init_v2di",	CONST)
BU_VSX_X (VEC_SET_V2DF,	      "vec_set_v2df",	CONST)
BU_VSX_X (VEC_SET_V2DI,	      "vec_set_v2di",	CONST)
BU_VSX_X (VEC_EXT_V2DF,	      "vec_ext_v2df",	CONST)
BU_VSX_X (VEC_EXT_V2DI,	      "vec_ext_v2di",	CONST)

/* VSX overloaded builtins, add the overloaded functions not present in
   Altivec.  */

/* 3 argument VSX overloaded builtins.  */
BU_VSX_OVERLOAD_3  (MSUB,     "msub")
BU_VSX_OVERLOAD_3  (NMADD,    "nmadd")
BU_VSX_OVERLOAD_3V (XXPERMDI, "xxpermdi")
BU_VSX_OVERLOAD_3V (XXSLDWI,  "xxsldwi")

/* 2 argument VSX overloaded builtin functions.  */
BU_VSX_OVERLOAD_2 (MUL,	     "mul")
BU_VSX_OVERLOAD_2 (DIV,	     "div")
BU_VSX_OVERLOAD_2 (XXMRGHW,  "xxmrghw")
BU_VSX_OVERLOAD_2 (XXMRGLW,  "xxmrglw")
BU_VSX_OVERLOAD_2 (XXSPLTD,  "xxspltd")
BU_VSX_OVERLOAD_2 (XXSPLTW,  "xxspltw")

/* VSX builtins that are handled as special cases.  */
BU_VSX_OVERLOAD_X (LD,	     "ld")
BU_VSX_OVERLOAD_X (ST,	     "st")

/* 3 argument paired floating point builtins.  */
BU_PAIRED_3 (MSUB,            "msub",           FP, 	fmsv2sf4)
BU_PAIRED_3 (MADD,            "madd",           FP, 	fmav2sf4)
BU_PAIRED_3 (MADDS0,          "madds0",         FP, 	paired_madds0)
BU_PAIRED_3 (MADDS1,          "madds1",         FP, 	paired_madds1)
BU_PAIRED_3 (NMSUB,           "nmsub",          FP, 	nfmsv2sf4)
BU_PAIRED_3 (NMADD,           "nmadd",          FP, 	nfmav2sf4)
BU_PAIRED_3 (SUM0,            "sum0",           FP, 	paired_sum0)
BU_PAIRED_3 (SUM1,            "sum1",           FP, 	paired_sum1)
BU_PAIRED_3 (SELV2SF4,        "selv2sf4",       CONST, 	selv2sf4)

/* 2 argument paired floating point builtins.  */
BU_PAIRED_2 (DIVV2SF3,	      "divv2sf3",	FP,	paired_divv2sf3)
BU_PAIRED_2 (ADDV2SF3,	      "addv2sf3",	FP,	paired_addv2sf3)
BU_PAIRED_2 (SUBV2SF3,	      "subv2sf3",	FP,	paired_subv2sf3)
BU_PAIRED_2 (MULV2SF3,	      "mulv2sf3",	FP,	paired_mulv2sf3)
BU_PAIRED_2 (MULS0,	      "muls0",		FP,	paired_muls0)
BU_PAIRED_2 (MULS1,	      "muls1",		FP,	paired_muls1)
BU_PAIRED_2 (MERGE00,	      "merge00",	CONST,	paired_merge00)
BU_PAIRED_2 (MERGE01,	      "merge01",	CONST,	paired_merge01)
BU_PAIRED_2 (MERGE10,	      "merge10",	CONST,	paired_merge10)
BU_PAIRED_2 (MERGE11,	      "merge11",	CONST,	paired_merge11)

/* 1 argument paired floating point builtin functions.  */
BU_PAIRED_1 (ABSV2SF2,	      "absv2sf2",	CONST,	paired_absv2sf2)
BU_PAIRED_1 (NABSV2SF2,	      "nabsv2sf2",	CONST,	nabsv2sf2)
BU_PAIRED_1 (NEGV2SF2,	      "negv2sf2",	CONST,	paired_negv2sf2)
BU_PAIRED_1 (SQRTV2SF2,	      "sqrtv2sf2",	FP,	sqrtv2sf2)
BU_PAIRED_1 (RESV2SF,	      "resv2sf2",	FP,	resv2sf2)

/* PAIRED builtins that are handled as special cases.  */
BU_PAIRED_X (STX,	      "stx",		MISC)
BU_PAIRED_X (LX,	      "lx",		MISC)

/* Paired predicates.  */
BU_PAIRED_P (CMPU0,	"cmpu0",	CONST,	paired_cmpu0)
BU_PAIRED_P (CMPU1,	"cmpu1",	CONST,	paired_cmpu1)

/* PowerPC E500 builtins (SPE).  */

BU_SPE_2 (EVADDW,	"evaddw",	MISC,	addv2si3)
BU_SPE_2 (EVAND,	"evand",	MISC,	andv2si3)
BU_SPE_2 (EVANDC,	"evandc",	MISC,	spe_evandc)
BU_SPE_2 (EVDIVWS,	"evdivws",	MISC,	divv2si3)
BU_SPE_2 (EVDIVWU,	"evdivwu",	MISC,	spe_evdivwu)
BU_SPE_2 (EVEQV,	"eveqv",	MISC,	spe_eveqv)
BU_SPE_2 (EVFSADD,	"evfsadd",	MISC,	spe_evfsadd)
BU_SPE_2 (EVFSDIV,	"evfsdiv",	MISC,	spe_evfsdiv)
BU_SPE_2 (EVFSMUL,	"evfsmul",	MISC,	spe_evfsmul)
BU_SPE_2 (EVFSSUB,	"evfssub",	MISC,	spe_evfssub)
BU_SPE_2 (EVMERGEHI,	"evmergehi",	MISC,	spe_evmergehi)
BU_SPE_2 (EVMERGEHILO,	"evmergehilo",	MISC,	spe_evmergehilo)
BU_SPE_2 (EVMERGELO,	"evmergelo",	MISC,	spe_evmergelo)
BU_SPE_2 (EVMERGELOHI,	"evmergelohi",	MISC,	spe_evmergelohi)
BU_SPE_2 (EVMHEGSMFAA,	"evmhegsmfaa",	MISC,	spe_evmhegsmfaa)
BU_SPE_2 (EVMHEGSMFAN,	"evmhegsmfan",	MISC,	spe_evmhegsmfan)
BU_SPE_2 (EVMHEGSMIAA,	"evmhegsmiaa",	MISC,	spe_evmhegsmiaa)
BU_SPE_2 (EVMHEGSMIAN,	"evmhegsmian",	MISC,	spe_evmhegsmian)
BU_SPE_2 (EVMHEGUMIAA,	"evmhegumiaa",	MISC,	spe_evmhegumiaa)
BU_SPE_2 (EVMHEGUMIAN,	"evmhegumian",	MISC,	spe_evmhegumian)
BU_SPE_2 (EVMHESMF,	"evmhesmf",	MISC,	spe_evmhesmf)
BU_SPE_2 (EVMHESMFA,	"evmhesmfa",	MISC,	spe_evmhesmfa)
BU_SPE_2 (EVMHESMFAAW,	"evmhesmfaaw",	MISC,	spe_evmhesmfaaw)
BU_SPE_2 (EVMHESMFANW,	"evmhesmfanw",	MISC,	spe_evmhesmfanw)
BU_SPE_2 (EVMHESMI,	"evmhesmi",	MISC,	spe_evmhesmi)
BU_SPE_2 (EVMHESMIA,	"evmhesmia",	MISC,	spe_evmhesmia)
BU_SPE_2 (EVMHESMIAAW,	"evmhesmiaaw",	MISC,	spe_evmhesmiaaw)
BU_SPE_2 (EVMHESMIANW,	"evmhesmianw",	MISC,	spe_evmhesmianw)
BU_SPE_2 (EVMHESSF,	"evmhessf",	MISC,	spe_evmhessf)
BU_SPE_2 (EVMHESSFA,	"evmhessfa",	MISC,	spe_evmhessfa)
BU_SPE_2 (EVMHESSFAAW,	"evmhessfaaw",	MISC,	spe_evmhessfaaw)
BU_SPE_2 (EVMHESSFANW,	"evmhessfanw",	MISC,	spe_evmhessfanw)
BU_SPE_2 (EVMHESSIAAW,	"evmhessiaaw",	MISC,	spe_evmhessiaaw)
BU_SPE_2 (EVMHESSIANW,	"evmhessianw",	MISC,	spe_evmhessianw)
BU_SPE_2 (EVMHEUMI,	"evmheumi",	MISC,	spe_evmheumi)
BU_SPE_2 (EVMHEUMIA,	"evmheumia",	MISC,	spe_evmheumia)
BU_SPE_2 (EVMHEUMIAAW,	"evmheumiaaw",	MISC,	spe_evmheumiaaw)
BU_SPE_2 (EVMHEUMIANW,	"evmheumianw",	MISC,	spe_evmheumianw)
BU_SPE_2 (EVMHEUSIAAW,	"evmheusiaaw",	MISC,	spe_evmheusiaaw)
BU_SPE_2 (EVMHEUSIANW,	"evmheusianw",	MISC,	spe_evmheusianw)
BU_SPE_2 (EVMHOGSMFAA,	"evmhogsmfaa",	MISC,	spe_evmhogsmfaa)
BU_SPE_2 (EVMHOGSMFAN,	"evmhogsmfan",	MISC,	spe_evmhogsmfan)
BU_SPE_2 (EVMHOGSMIAA,	"evmhogsmiaa",	MISC,	spe_evmhogsmiaa)
BU_SPE_2 (EVMHOGSMIAN,	"evmhogsmian",	MISC,	spe_evmhogsmian)
BU_SPE_2 (EVMHOGUMIAA,	"evmhogumiaa",	MISC,	spe_evmhogumiaa)
BU_SPE_2 (EVMHOGUMIAN,	"evmhogumian",	MISC,	spe_evmhogumian)
BU_SPE_2 (EVMHOSMF,	"evmhosmf",	MISC,	spe_evmhosmf)
BU_SPE_2 (EVMHOSMFA,	"evmhosmfa",	MISC,	spe_evmhosmfa)
BU_SPE_2 (EVMHOSMFAAW,	"evmhosmfaaw",	MISC,	spe_evmhosmfaaw)
BU_SPE_2 (EVMHOSMFANW,	"evmhosmfanw",	MISC,	spe_evmhosmfanw)
BU_SPE_2 (EVMHOSMI,	"evmhosmi",	MISC,	spe_evmhosmi)
BU_SPE_2 (EVMHOSMIA,	"evmhosmia",	MISC,	spe_evmhosmia)
BU_SPE_2 (EVMHOSMIAAW,	"evmhosmiaaw",	MISC,	spe_evmhosmiaaw)
BU_SPE_2 (EVMHOSMIANW,	"evmhosmianw",	MISC,	spe_evmhosmianw)
BU_SPE_2 (EVMHOSSF,	"evmhossf",	MISC,	spe_evmhossf)
BU_SPE_2 (EVMHOSSFA,	"evmhossfa",	MISC,	spe_evmhossfa)
BU_SPE_2 (EVMHOSSFAAW,	"evmhossfaaw",	MISC,	spe_evmhossfaaw)
BU_SPE_2 (EVMHOSSFANW,	"evmhossfanw",	MISC,	spe_evmhossfanw)
BU_SPE_2 (EVMHOSSIAAW,	"evmhossiaaw",	MISC,	spe_evmhossiaaw)
BU_SPE_2 (EVMHOSSIANW,	"evmhossianw",	MISC,	spe_evmhossianw)
BU_SPE_2 (EVMHOUMI,	"evmhoumi",	MISC,	spe_evmhoumi)
BU_SPE_2 (EVMHOUMIA,	"evmhoumia",	MISC,	spe_evmhoumia)
BU_SPE_2 (EVMHOUMIAAW,	"evmhoumiaaw",	MISC,	spe_evmhoumiaaw)
BU_SPE_2 (EVMHOUMIANW,	"evmhoumianw",	MISC,	spe_evmhoumianw)
BU_SPE_2 (EVMHOUSIAAW,	"evmhousiaaw",	MISC,	spe_evmhousiaaw)
BU_SPE_2 (EVMHOUSIANW,	"evmhousianw",	MISC,	spe_evmhousianw)
BU_SPE_2 (EVMWHSMF,	"evmwhsmf",	MISC,	spe_evmwhsmf)
BU_SPE_2 (EVMWHSMFA,	"evmwhsmfa",	MISC,	spe_evmwhsmfa)
BU_SPE_2 (EVMWHSMI,	"evmwhsmi",	MISC,	spe_evmwhsmi)
BU_SPE_2 (EVMWHSMIA,	"evmwhsmia",	MISC,	spe_evmwhsmia)
BU_SPE_2 (EVMWHSSF,	"evmwhssf",	MISC,	spe_evmwhssf)
BU_SPE_2 (EVMWHSSFA,	"evmwhssfa",	MISC,	spe_evmwhssfa)
BU_SPE_2 (EVMWHUMI,	"evmwhumi",	MISC,	spe_evmwhumi)
BU_SPE_2 (EVMWHUMIA,	"evmwhumia",	MISC,	spe_evmwhumia)
BU_SPE_2 (EVMWLSMIAAW,	"evmwlsmiaaw",	MISC,	spe_evmwlsmiaaw)
BU_SPE_2 (EVMWLSMIANW,	"evmwlsmianw",	MISC,	spe_evmwlsmianw)
BU_SPE_2 (EVMWLSSIAAW,	"evmwlssiaaw",	MISC,	spe_evmwlssiaaw)
BU_SPE_2 (EVMWLSSIANW,	"evmwlssianw",	MISC,	spe_evmwlssianw)
BU_SPE_2 (EVMWLUMI,	"evmwlumi",	MISC,	spe_evmwlumi)
BU_SPE_2 (EVMWLUMIA,	"evmwlumia",	MISC,	spe_evmwlumia)
BU_SPE_2 (EVMWLUMIAAW,	"evmwlumiaaw",	MISC,	spe_evmwlumiaaw)
BU_SPE_2 (EVMWLUMIANW,	"evmwlumianw",	MISC,	spe_evmwlumianw)
BU_SPE_2 (EVMWLUSIAAW,	"evmwlusiaaw",	MISC,	spe_evmwlusiaaw)
BU_SPE_2 (EVMWLUSIANW,	"evmwlusianw",	MISC,	spe_evmwlusianw)
BU_SPE_2 (EVMWSMF,	"evmwsmf",	MISC,	spe_evmwsmf)
BU_SPE_2 (EVMWSMFA,	"evmwsmfa",	MISC,	spe_evmwsmfa)
BU_SPE_2 (EVMWSMFAA,	"evmwsmfaa",	MISC,	spe_evmwsmfaa)
BU_SPE_2 (EVMWSMFAN,	"evmwsmfan",	MISC,	spe_evmwsmfan)
BU_SPE_2 (EVMWSMI,	"evmwsmi",	MISC,	spe_evmwsmi)
BU_SPE_2 (EVMWSMIA,	"evmwsmia",	MISC,	spe_evmwsmia)
BU_SPE_2 (EVMWSMIAA,	"evmwsmiaa",	MISC,	spe_evmwsmiaa)
BU_SPE_2 (EVMWSMIAN,	"evmwsmian",	MISC,	spe_evmwsmian)
BU_SPE_2 (EVMWSSF,	"evmwssf",	MISC,	spe_evmwssf)
BU_SPE_2 (EVMWSSFA,	"evmwssfa",	MISC,	spe_evmwssfa)
BU_SPE_2 (EVMWSSFAA,	"evmwssfaa",	MISC,	spe_evmwssfaa)
BU_SPE_2 (EVMWSSFAN,	"evmwssfan",	MISC,	spe_evmwssfan)
BU_SPE_2 (EVMWUMI,	"evmwumi",	MISC,	spe_evmwumi)
BU_SPE_2 (EVMWUMIA,	"evmwumia",	MISC,	spe_evmwumia)
BU_SPE_2 (EVMWUMIAA,	"evmwumiaa",	MISC,	spe_evmwumiaa)
BU_SPE_2 (EVMWUMIAN,	"evmwumian",	MISC,	spe_evmwumian)
BU_SPE_2 (EVNAND,	"evnand",	MISC,	spe_evnand)
BU_SPE_2 (EVNOR,	"evnor",	MISC,	spe_evnor)
BU_SPE_2 (EVOR,		"evor",		MISC,	spe_evor)
BU_SPE_2 (EVORC,	"evorc",	MISC,	spe_evorc)
BU_SPE_2 (EVRLW,	"evrlw",	MISC,	spe_evrlw)
BU_SPE_2 (EVSLW,	"evslw",	MISC,	spe_evslw)
BU_SPE_2 (EVSRWS,	"evsrws",	MISC,	spe_evsrws)
BU_SPE_2 (EVSRWU,	"evsrwu",	MISC,	spe_evsrwu)
BU_SPE_2 (EVSUBFW,	"evsubfw",	MISC,	subv2si3)

/* SPE binary operations expecting a 5-bit unsigned literal.  */
BU_SPE_2 (EVADDIW,	"evaddiw",	MISC,	spe_evaddiw)

BU_SPE_2 (EVRLWI,	"evrlwi",	MISC,	spe_evrlwi)
BU_SPE_2 (EVSLWI,	"evslwi",	MISC,	spe_evslwi)
BU_SPE_2 (EVSRWIS,	"evsrwis",	MISC,	spe_evsrwis)
BU_SPE_2 (EVSRWIU,	"evsrwiu",	MISC,	spe_evsrwiu)
BU_SPE_2 (EVSUBIFW,	"evsubifw",	MISC,	spe_evsubifw)
BU_SPE_2 (EVMWHSSFAA,	"evmwhssfaa",	MISC,	spe_evmwhssfaa)
BU_SPE_2 (EVMWHSSMAA,	"evmwhssmaa",	MISC,	spe_evmwhssmaa)
BU_SPE_2 (EVMWHSMFAA,	"evmwhsmfaa",	MISC,	spe_evmwhsmfaa)
BU_SPE_2 (EVMWHSMIAA,	"evmwhsmiaa",	MISC,	spe_evmwhsmiaa)
BU_SPE_2 (EVMWHUSIAA,	"evmwhusiaa",	MISC,	spe_evmwhusiaa)
BU_SPE_2 (EVMWHUMIAA,	"evmwhumiaa",	MISC,	spe_evmwhumiaa)
BU_SPE_2 (EVMWHSSFAN,	"evmwhssfan",	MISC,	spe_evmwhssfan)
BU_SPE_2 (EVMWHSSIAN,	"evmwhssian",	MISC,	spe_evmwhssian)
BU_SPE_2 (EVMWHSMFAN,	"evmwhsmfan",	MISC,	spe_evmwhsmfan)
BU_SPE_2 (EVMWHSMIAN,	"evmwhsmian",	MISC,	spe_evmwhsmian)
BU_SPE_2 (EVMWHUSIAN,	"evmwhusian",	MISC,	spe_evmwhusian)
BU_SPE_2 (EVMWHUMIAN,	"evmwhumian",	MISC,	spe_evmwhumian)
BU_SPE_2 (EVMWHGSSFAA,	"evmwhgssfaa",	MISC,	spe_evmwhgssfaa)
BU_SPE_2 (EVMWHGSMFAA,	"evmwhgsmfaa",	MISC,	spe_evmwhgsmfaa)
BU_SPE_2 (EVMWHGSMIAA,	"evmwhgsmiaa",	MISC,	spe_evmwhgsmiaa)
BU_SPE_2 (EVMWHGUMIAA,	"evmwhgumiaa",	MISC,	spe_evmwhgumiaa)
BU_SPE_2 (EVMWHGSSFAN,	"evmwhgssfan",	MISC,	spe_evmwhgssfan)
BU_SPE_2 (EVMWHGSMFAN,	"evmwhgsmfan",	MISC,	spe_evmwhgsmfan)
BU_SPE_2 (EVMWHGSMIAN,	"evmwhgsmian",	MISC,	spe_evmwhgsmian)
BU_SPE_2 (EVMWHGUMIAN,	"evmwhgumian",	MISC,	spe_evmwhgumian)
BU_SPE_2 (BRINC,	"brinc",	MISC,	spe_brinc)
BU_SPE_2 (EVXOR,	"evxor",	MISC,	xorv2si3)

/* SPE predicate builtins.  */
BU_SPE_P (EVCMPEQ,	"evcmpeq",	MISC,	spe_evcmpeq)
BU_SPE_P (EVCMPGTS,	"evcmpgts",	MISC,	spe_evcmpgts)
BU_SPE_P (EVCMPGTU,	"evcmpgtu",	MISC,	spe_evcmpgtu)
BU_SPE_P (EVCMPLTS,	"evcmplts",	MISC,	spe_evcmplts)
BU_SPE_P (EVCMPLTU,	"evcmpltu",	MISC,	spe_evcmpltu)
BU_SPE_P (EVFSCMPEQ,	"evfscmpeq",	MISC,	spe_evfscmpeq)
BU_SPE_P (EVFSCMPGT,	"evfscmpgt",	MISC,	spe_evfscmpgt)
BU_SPE_P (EVFSCMPLT,	"evfscmplt",	MISC,	spe_evfscmplt)
BU_SPE_P (EVFSTSTEQ,	"evfststeq",	MISC,	spe_evfststeq)
BU_SPE_P (EVFSTSTGT,	"evfststgt",	MISC,	spe_evfststgt)
BU_SPE_P (EVFSTSTLT,	"evfststlt",	MISC,	spe_evfststlt)

/* SPE evsel builtins.  */
BU_SPE_E (EVSEL_CMPGTS,	 "evsel_gts",	  MISC,	spe_evcmpgts)
BU_SPE_E (EVSEL_CMPGTU,	 "evsel_gtu",	  MISC,	spe_evcmpgtu)
BU_SPE_E (EVSEL_CMPLTS,	 "evsel_lts",	  MISC,	spe_evcmplts)
BU_SPE_E (EVSEL_CMPLTU,	 "evsel_ltu",	  MISC,	spe_evcmpltu)
BU_SPE_E (EVSEL_CMPEQ,	 "evsel_eq",	  MISC,	spe_evcmpeq)
BU_SPE_E (EVSEL_FSCMPGT, "evsel_fsgt",	  MISC,	spe_evfscmpgt)
BU_SPE_E (EVSEL_FSCMPLT, "evsel_fslt",	  MISC,	spe_evfscmplt)
BU_SPE_E (EVSEL_FSCMPEQ, "evsel_fseq",	  MISC,	spe_evfscmpeq)
BU_SPE_E (EVSEL_FSTSTGT, "evsel_fststgt", MISC,	spe_evfststgt)
BU_SPE_E (EVSEL_FSTSTLT, "evsel_fststlt", MISC,	spe_evfststlt)
BU_SPE_E (EVSEL_FSTSTEQ, "evsel_fststeq", MISC,	spe_evfststeq)

BU_SPE_1 (EVABS,	"evabs",	CONST,	absv2si2)
BU_SPE_1 (EVADDSMIAAW,	"evaddsmiaaw",	CONST,	spe_evaddsmiaaw)
BU_SPE_1 (EVADDSSIAAW,	"evaddssiaaw",	CONST,	spe_evaddssiaaw)
BU_SPE_1 (EVADDUMIAAW,	"evaddumiaaw",	CONST,	spe_evaddumiaaw)
BU_SPE_1 (EVADDUSIAAW,	"evaddusiaaw",	CONST,	spe_evaddusiaaw)
BU_SPE_1 (EVCNTLSW,	"evcntlsw",	CONST,	spe_evcntlsw)
BU_SPE_1 (EVCNTLZW,	"evcntlzw",	CONST,	spe_evcntlzw)
BU_SPE_1 (EVEXTSB,	"evextsb",	CONST,	spe_evextsb)
BU_SPE_1 (EVEXTSH,	"evextsh",	CONST,	spe_evextsh)
BU_SPE_1 (EVFSABS,	"evfsabs",	CONST,	spe_evfsabs)
BU_SPE_1 (EVFSCFSF,	"evfscfsf",	CONST,	spe_evfscfsf)
BU_SPE_1 (EVFSCFSI,	"evfscfsi",	CONST,	spe_evfscfsi)
BU_SPE_1 (EVFSCFUF,	"evfscfuf",	CONST,	spe_evfscfuf)
BU_SPE_1 (EVFSCFUI,	"evfscfui",	CONST,	spe_evfscfui)
BU_SPE_1 (EVFSCTSF,	"evfsctsf",	CONST,	spe_evfsctsf)
BU_SPE_1 (EVFSCTSI,	"evfsctsi",	CONST,	spe_evfsctsi)
BU_SPE_1 (EVFSCTSIZ,	"evfsctsiz",	CONST,	spe_evfsctsiz)
BU_SPE_1 (EVFSCTUF,	"evfsctuf",	CONST,	spe_evfsctuf)
BU_SPE_1 (EVFSCTUI,	"evfsctui",	CONST,	spe_evfsctui)
BU_SPE_1 (EVFSCTUIZ,	"evfsctuiz",	CONST,	spe_evfsctuiz)
BU_SPE_1 (EVFSNABS,	"evfsnabs",	CONST,	spe_evfsnabs)
BU_SPE_1 (EVFSNEG,	"evfsneg",	CONST,	spe_evfsneg)
BU_SPE_1 (EVMRA,	"evmra",	CONST,	spe_evmra)
BU_SPE_1 (EVNEG,	"evneg",	CONST,	negv2si2)
BU_SPE_1 (EVRNDW,	"evrndw",	CONST,	spe_evrndw)
BU_SPE_1 (EVSUBFSMIAAW,	"evsubfsmiaaw",	CONST,	spe_evsubfsmiaaw)
BU_SPE_1 (EVSUBFSSIAAW,	"evsubfssiaaw",	CONST,	spe_evsubfssiaaw)
BU_SPE_1 (EVSUBFUMIAAW,	"evsubfumiaaw",	CONST,	spe_evsubfumiaaw)
BU_SPE_1 (EVSUBFUSIAAW,	"evsubfusiaaw",	CONST,	spe_evsubfusiaaw)

/* SPE builtins that are handled as special cases.  */
BU_SPE_X (EVLDD,	      "evldd",		MISC)
BU_SPE_X (EVLDDX,	      "evlddx",		MISC)
BU_SPE_X (EVLDH,	      "evldh",		MISC)
BU_SPE_X (EVLDHX,	      "evldhx",		MISC)
BU_SPE_X (EVLDW,	      "evldw",		MISC)
BU_SPE_X (EVLDWX,	      "evldwx",		MISC)
BU_SPE_X (EVLHHESPLAT,	      "evlhhesplat",	MISC)
BU_SPE_X (EVLHHESPLATX,	      "evlhhesplatx",	MISC)
BU_SPE_X (EVLHHOSSPLAT,	      "evlhhossplat",	MISC)
BU_SPE_X (EVLHHOSSPLATX,      "evlhhossplatx",	MISC)
BU_SPE_X (EVLHHOUSPLAT,	      "evlhhousplat",	MISC)
BU_SPE_X (EVLHHOUSPLATX,      "evlhhousplatx",	MISC)
BU_SPE_X (EVLWHE,	      "evlwhe",		MISC)
BU_SPE_X (EVLWHEX,	      "evlwhex",	MISC)
BU_SPE_X (EVLWHOS,	      "evlwhos",	MISC)
BU_SPE_X (EVLWHOSX,	      "evlwhosx",	MISC)
BU_SPE_X (EVLWHOU,	      "evlwhou",	MISC)
BU_SPE_X (EVLWHOUX,	      "evlwhoux",	MISC)
BU_SPE_X (EVLWHSPLAT,	      "evlwhsplat",	MISC)
BU_SPE_X (EVLWHSPLATX,	      "evlwhsplatx",	MISC)
BU_SPE_X (EVLWWSPLAT,	      "evlwwsplat",	MISC)
BU_SPE_X (EVLWWSPLATX,	      "evlwwsplatx",	MISC)
BU_SPE_X (EVSPLATFI,	      "evsplatfi",	MISC)
BU_SPE_X (EVSPLATI,	      "evsplati",	MISC)
BU_SPE_X (EVSTDD,	      "evstdd",		MISC)
BU_SPE_X (EVSTDDX,	      "evstddx",	MISC)
BU_SPE_X (EVSTDH,	      "evstdh",		MISC)
BU_SPE_X (EVSTDHX,	      "evstdhx",	MISC)
BU_SPE_X (EVSTDW,	      "evstdw",		MISC)
BU_SPE_X (EVSTDWX,	      "evstdwx",	MISC)
BU_SPE_X (EVSTWHE,	      "evstwhe",	MISC)
BU_SPE_X (EVSTWHEX,	      "evstwhex",	MISC)
BU_SPE_X (EVSTWHO,	      "evstwho",	MISC)
BU_SPE_X (EVSTWHOX,	      "evstwhox",	MISC)
BU_SPE_X (EVSTWWE,	      "evstwwe",	MISC)
BU_SPE_X (EVSTWWEX,	      "evstwwex",	MISC)
BU_SPE_X (EVSTWWO,	      "evstwwo",	MISC)
BU_SPE_X (EVSTWWOX,	      "evstwwox",	MISC)
BU_SPE_X (MFSPEFSCR,	      "mfspefscr",	MISC)
BU_SPE_X (MTSPEFSCR,	      "mtspefscr",	MISC)


/* Power7 builtins, that aren't VSX instructions.  */
BU_SPECIAL_X (POWER7_BUILTIN_BPERMD, "__builtin_bpermd", RS6000_BTM_POPCNTD,
	      RS6000_BTC_CONST)

/* Miscellaneous builtins.  */
BU_SPECIAL_X (RS6000_BUILTIN_RECIP, "__builtin_recipdiv", RS6000_BTM_FRE,
	      RS6000_BTC_FP)

BU_SPECIAL_X (RS6000_BUILTIN_RECIPF, "__builtin_recipdivf", RS6000_BTM_FRES,
	      RS6000_BTC_FP)

BU_SPECIAL_X (RS6000_BUILTIN_RSQRT, "__builtin_rsqrt", RS6000_BTM_FRSQRTE,
	      RS6000_BTC_FP)

BU_SPECIAL_X (RS6000_BUILTIN_RSQRTF, "__builtin_rsqrtf", RS6000_BTM_FRSQRTES,
	      RS6000_BTC_FP)

BU_SPECIAL_X (RS6000_BUILTIN_GET_TB, "__builtin_ppc_get_timebase",
	     RS6000_BTM_ALWAYS, RS6000_BTC_MISC)

BU_SPECIAL_X (RS6000_BUILTIN_MFTB, "__builtin_ppc_mftb",
	     RS6000_BTM_ALWAYS, RS6000_BTC_MISC)

/* Darwin CfString builtin.  */
BU_SPECIAL_X (RS6000_BUILTIN_CFSTRING, "__builtin_cfstring", RS6000_BTM_ALWAYS,
	      RS6000_BTC_MISC)
