/* Builtin functions for rs6000/powerpc.
   Copyright (C) 2009-2018 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_0 -- 0 arg builtins
   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_H -- HTM builtins
   RS6000_BUILTIN_P -- Altivec, VSX, ISA 2.07 vector predicate builtins
   RS6000_BUILTIN_Q -- Paired floating point VSX 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 implements the builtin.  */

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

#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_H
  #error "RS6000_BUILTIN_H 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_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 */

/* All builtins defined with the RS6000_BUILTIN_P macro expect three
   arguments, the first of which is an integer constant that clarifies
   the implementation's use of CR6 flags.  The integer constant
   argument may have four values: __CR6_EQ (0) means the predicate is
   considered true if the equality-test flag of the CR6 condition
   register is true following execution of the code identified by the
   ICODE pattern, __CR_EQ_REV (1) means the predicate is considered
   true if the equality-test flag is false, __CR6_LT (2) means the
   predicate is considered true if the less-than-test flag is true, and
   __CR6_LT_REV (3) means the predicate is considered true if the
   less-than-test flag is false.  For all builtins defined by this
   macro, the pattern selected by ICODE expects three operands, a
   target and two inputs and is presumed to overwrite the flags of
   condition register CR6 as a side effect of computing a result into
   the target register.  However, the built-in invocation provides
   four operands, a target, an integer constant mode, and two inputs.
   The second and third operands of the built-in function's invocation
   are automatically mapped into operands 1 and 2 of the pattern
   identifed by the ICODE argument and additional code is emitted,
   depending on the value of the constant integer first argument.
   This special processing happens within the implementation of
   altivec_expand_predicate_builtin(), which is defined within
   rs6000.c.  The implementation of altivec_expand_predicate_builtin()
   allocates a scratch register having the same mode as operand 0 to hold
   the result produced by evaluating 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 */

/* See the comment on BU_ALTIVEC_P.  */
#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 */

/* See the comment on BU_ALTIVEC_P.  */
#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 */

/* ISA 2.05 (power6) convenience macros. */
/* For functions that depend on the CMPB instruction */
#define BU_P6_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (P6_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_p6_" NAME,		/* NAME */	\
		    RS6000_BTM_CMPB,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* For functions that depend on 64-BIT support and on the CMPB instruction */
#define BU_P6_64BIT_2(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_2 (P6_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_p6_" NAME,		/* NAME */	\
		    RS6000_BTM_CMPB			   		\
		      | RS6000_BTM_64BIT,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P6_OVERLOAD_2(ENUM, NAME)					\
  RS6000_BUILTIN_2 (P6_OV_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_CMPB,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_nothing)			/* ICODE */

/* ISA 2.07 (power8) vector convenience macros.  */
/* For the instructions that are encoded as altivec instructions use
   __builtin_altivec_ as the builtin name.  */
#define BU_P8V_AV_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (P8V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P8V_AV_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (P8V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P8V_AV_3(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_3 (P8V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* See the comment on BU_ALTIVEC_P.  */
#define BU_P8V_AV_P(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_P (P8V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_PREDICATE),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* For the instructions encoded as VSX instructions use __builtin_vsx as the
   builtin name.  */
#define BU_P8V_VSX_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (P8V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P8V_VSX_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (P8V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P8V_OVERLOAD_1(ENUM, NAME)					\
  RS6000_BUILTIN_1 (P8V_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_P8V_OVERLOAD_2(ENUM, NAME)					\
  RS6000_BUILTIN_2 (P8V_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_P8V_OVERLOAD_3(ENUM, NAME)					\
  RS6000_BUILTIN_3 (P8V_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

/* Crypto convenience macros.  */
#define BU_CRYPTO_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (CRYPTO_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_crypto_" NAME,		/* NAME */	\
		    RS6000_BTM_CRYPTO,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_CRYPTO_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (CRYPTO_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_crypto_" NAME,		/* NAME */	\
		    RS6000_BTM_CRYPTO,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_CRYPTO_2A(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (CRYPTO_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_crypto_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_CRYPTO_3(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_3 (CRYPTO_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_crypto_" NAME,		/* NAME */	\
		    RS6000_BTM_CRYPTO,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_CRYPTO_3A(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_3 (CRYPTO_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_crypto_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_CRYPTO_OVERLOAD_1(ENUM, NAME)				\
  RS6000_BUILTIN_1 (CRYPTO_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_crypto_" NAME,		/* NAME */	\
		    RS6000_BTM_CRYPTO,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_CRYPTO_OVERLOAD_2A(ENUM, NAME)				\
  RS6000_BUILTIN_2 (CRYPTO_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_crypto_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_CRYPTO_OVERLOAD_3(ENUM, NAME)				\
  RS6000_BUILTIN_3 (CRYPTO_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_crypto_" NAME,		/* NAME */	\
		    RS6000_BTM_CRYPTO,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_CRYPTO_OVERLOAD_3A(ENUM, NAME)				\
  RS6000_BUILTIN_3 (CRYPTO_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_crypto_" NAME,		/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

/* HTM convenience macros.  */
#define BU_HTM_0(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_H (HTM_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_HTM,			/* MASK */	\
		    RS6000_BTC_ ## ATTR,		/* ATTR */	\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_HTM_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_H (HTM_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_HTM,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_HTM_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_H (HTM_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_HTM,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_HTM_3(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_H (HTM_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_HTM,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_HTM_V1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_H (HTM_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_HTM,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY					\
		     | RS6000_BTC_VOID),				\
		    CODE_FOR_ ## ICODE)			/* 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 */


/* Decimal floating point builtins for instructions.  */
#define BU_DFP_MISC_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_DFP,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_DFP_MISC_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_DFP,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* Miscellaneous builtins for instructions added in ISA 2.06.  These
   instructions don't require either the DFP or VSX options, just the basic ISA
   2.06 (popcntd) enablement since they operate on general purpose
   registers.  */
#define BU_P7_MISC_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_POPCNTD,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P7_MISC_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_POPCNTD,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P7_POWERPC64_MISC_2(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_POPCNTD					\
		    | RS6000_BTM_POWERPC64,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P7_MISC_X(ENUM, NAME, ATTR)					\
  RS6000_BUILTIN_X (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_POPCNTD,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_nothing)			/* ICODE */


/* Miscellaneous builtins for instructions added in ISA 2.07.  These
   instructions do require the ISA 2.07 vector support, but they aren't vector
   instructions.  */
#define BU_P8V_MISC_3(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_3 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_P8_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* 128-bit long double floating point builtins.  */
#define BU_LDBL128_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    (RS6000_BTM_HARD_FLOAT		/* MASK */	\
		     | RS6000_BTM_LDBL128),				\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* 128-bit __ibm128 floating point builtins (use -mfloat128 to indicate that
   __ibm128 is available).  */
#define BU_IBM128_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    (RS6000_BTM_HARD_FLOAT		/* MASK */	\
		     | RS6000_BTM_FLOAT128),				\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* Miscellaneous builtins for instructions added in ISA 3.0.  These
   instructions don't require either the DFP or VSX options, just the basic
   ISA 3.0 enablement since they operate on general purpose registers.  */
#define BU_P9_MISC_0(ENUM, NAME, ATTR, ICODE)                      \
  RS6000_BUILTIN_0 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_P9_MISC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9_MISC_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_P9_MISC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* Miscellaneous builtins for instructions added in ISA 3.0.  These
   instructions don't require either the DFP or VSX options, just the basic
   ISA 3.0 enablement since they operate on general purpose registers,
   and they require 64-bit addressing.  */
#define BU_P9_64BIT_MISC_0(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_0 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_P9_MISC					\
                     | RS6000_BTM_64BIT,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* Miscellaneous builtins for decimal floating point instructions
   added in ISA 3.0.  These instructions don't require the VSX
   options, just the basic ISA 3.0 enablement since they operate on
   general purpose registers.  */
#define BU_P9_DFP_MISC_0(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_0 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_P9_MISC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9_DFP_MISC_1(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_P9_MISC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9_DFP_MISC_2(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_P9_MISC,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* Decimal floating point overloaded functions added in ISA 3.0 */
#define BU_P9_DFP_OVERLOAD_1(ENUM, NAME)				\
  RS6000_BUILTIN_1 (P9_BUILTIN_DFP_ ## ENUM,		/* ENUM */	\
		    "__builtin_dfp_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_MISC,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_P9_DFP_OVERLOAD_2(ENUM, NAME)				\
  RS6000_BUILTIN_2 (P9_BUILTIN_DFP_ ## ENUM,		/* ENUM */	\
		    "__builtin_dfp_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_MISC,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_P9_DFP_OVERLOAD_3(ENUM, NAME)				\
  RS6000_BUILTIN_3 (P9_BUILTIN_DFP_ ## ENUM,		/* ENUM */	\
		    "__builtin_dfp_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_MISC,			/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

/* ISA 3.0 (power9) vector convenience macros.  */
/* For the instructions that are encoded as altivec instructions use
   __builtin_altivec_ as the builtin name.  */
#define BU_P9V_AV_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9V_AV_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9V_AV_3(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_3 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* See the comment on BU_ALTIVEC_P.  */
#define BU_P9V_AV_P(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_P (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_PREDICATE),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9V_AV_X(ENUM, NAME, ATTR)					\
  RS6000_BUILTIN_X (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_P9V_64BIT_AV_X(ENUM, NAME, ATTR)				\
  RS6000_BUILTIN_X (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_altivec_" NAME,		/* NAME */	\
		    (RS6000_BTM_P9_VECTOR				\
		     | RS6000_BTM_64BIT),		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_SPECIAL),				\
		    CODE_FOR_nothing)			/* ICODE */

/* For the instructions encoded as VSX instructions use __builtin_vsx as the
   builtin name.  */
#define BU_P9V_VSX_1(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_1 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9V_64BIT_VSX_1(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_1 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    (RS6000_BTM_64BIT					\
		     | RS6000_BTM_P9_VECTOR),		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9V_VSX_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9V_64BIT_VSX_2(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_2 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    (RS6000_BTM_64BIT					\
		     | RS6000_BTM_P9_VECTOR),		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9V_VSX_3(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_3 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9V_64BIT_VSX_3(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_2 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    (RS6000_BTM_64BIT					\
		     | RS6000_BTM_P9_VECTOR),		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* See the comment on BU_ALTIVEC_P.  */
#define BU_P9V_OVERLOAD_P(ENUM, NAME)					\
  RS6000_BUILTIN_P (P9V_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_P9_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (P9_BUILTIN_SCALAR_ ## ENUM,		/* ENUM */	\
		    "__builtin_scalar_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9_64BIT_2(ENUM, NAME, ATTR, ICODE)				\
  RS6000_BUILTIN_2 (P9_BUILTIN_SCALAR_ ## ENUM,		/* ENUM */	\
		    "__builtin_scalar_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR				\
		    | RS6000_BTM_64BIT,			/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_P9V_OVERLOAD_1(ENUM, NAME)					\
  RS6000_BUILTIN_1 (P9V_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_P9V_OVERLOAD_2(ENUM, NAME)					\
  RS6000_BUILTIN_2 (P9V_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_P9V_OVERLOAD_3(ENUM, NAME)					\
  RS6000_BUILTIN_3 (P9V_BUILTIN_VEC_ ## ENUM,		/* ENUM */	\
		    "__builtin_vec_" NAME,		/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_nothing)			/* ICODE */

#define BU_P9_OVERLOAD_2(ENUM, NAME)					\
  RS6000_BUILTIN_2 (P9_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_P9_VECTOR,		/* MASK */	\
		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_nothing)			/* ICODE */

/* Built-in functions for IEEE 128-bit hardware floating point.  IEEE 128-bit
   hardware requires p9-vector and 64-bit operation.  These functions use just
   __builtin_ as the prefix.  */
#define BU_FLOAT128_HW_1(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_1 (FLOAT128_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_FLOAT128_HW,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_FLOAT128_HW_2(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_2 (FLOAT128_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_FLOAT128_HW,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_FLOAT128_HW_3(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_3 (FLOAT128_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_" NAME,			/* NAME */	\
		    RS6000_BTM_FLOAT128_HW,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_TERNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

/* Built-in functions for IEEE 128-bit hardware floating point.  These
   functions use __builtin_vsx_ as the prefix.  */
#define BU_FLOAT128_HW_VSX_1(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_1 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_FLOAT128_HW,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_UNARY),				\
		    CODE_FOR_ ## ICODE)			/* ICODE */

#define BU_FLOAT128_HW_VSX_2(ENUM, NAME, ATTR, ICODE)			\
  RS6000_BUILTIN_2 (P9V_BUILTIN_ ## ENUM,		/* ENUM */	\
		    "__builtin_vsx_" NAME,		/* NAME */	\
		    RS6000_BTM_FLOAT128_HW,		/* MASK */	\
		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
		     | RS6000_BTC_BINARY),				\
		    CODE_FOR_ ## ICODE)			/* 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, 	fmav8hi4)
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_1TI,      "vperm_1ti",      CONST, 	altivec_vperm_v1ti)
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_1TI_UNS,  "vperm_1ti_uns",  CONST, 	altivec_vperm_v1ti_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_1TI,       "vsel_1ti",       CONST, 	vector_select_v1ti)
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 (VSEL_1TI_UNS,   "vsel_1ti_uns",   CONST, 	vector_select_v1ti_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_2DI,     "vsldoi_2di",     CONST, 	altivec_vsldoi_v2di)
BU_ALTIVEC_3 (VSLDOI_4SF,     "vsldoi_4sf",     CONST, 	altivec_vsldoi_v4sf)
BU_ALTIVEC_3 (VSLDOI_2DF,     "vsldoi_2df",     CONST, 	altivec_vsldoi_v2df)

/* 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 (VMULESB,	      "vmulesb",	CONST,	vec_widen_smult_even_v16qi)
BU_ALTIVEC_2 (VMULEUH,	      "vmuleuh",	CONST,	vec_widen_umult_even_v8hi)
BU_ALTIVEC_2 (VMULESH,	      "vmulesh",	CONST,	vec_widen_smult_even_v8hi)
BU_P8V_AV_2 (VMULEUW,	      "vmuleuw",	CONST,	vec_widen_umult_even_v4si)
BU_P8V_AV_2 (VMULESW,	      "vmulesw",	CONST,	vec_widen_smult_even_v4si)
BU_ALTIVEC_2 (VMULOUB,	      "vmuloub",	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 (VMULOSH,	      "vmulosh",	CONST,	vec_widen_smult_odd_v8hi)
BU_P8V_AV_2 (VMULOUW,	      "vmulouw",	CONST,	vec_widen_umult_odd_v4si)
BU_P8V_AV_2 (VMULOSW,	      "vmulosw",	CONST,	vec_widen_smult_odd_v4si)
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 (VSUMSWS_BE,     "vsumsws_be",	CONST,	altivec_vsumsws_direct)
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)

/* Altivec NABS functions.  */
BU_ALTIVEC_A (NABS_V2DI,      "nabs_v2di",	CONST,	nabsv2di2)
BU_ALTIVEC_A (NABS_V4SI,      "nabs_v4si",	CONST,	nabsv4si2)
BU_ALTIVEC_A (NABS_V8HI,      "nabs_v8hi",	CONST,	nabsv8hi2)
BU_ALTIVEC_A (NABS_V16QI,     "nabs_v16qi",	CONST,	nabsv16qi2)
BU_ALTIVEC_A (NABS_V4SF,      "nabs_v4sf",	CONST,	vsx_nabsv4sf2)
BU_ALTIVEC_A (NABS_V2DF,      "nabs_v2df",	CONST,	vsx_nabsv2df2)

/* 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 (VREVE_V2DI,      "vreve_v2di", CONST,  altivec_vrevev2di2)
BU_ALTIVEC_1 (VREVE_V4SI,      "vreve_v4si", CONST,  altivec_vrevev4si2)
BU_ALTIVEC_1 (VREVE_V8HI,      "vreve_v8hi", CONST,  altivec_vrevev8hi2)
BU_ALTIVEC_1 (VREVE_V16QI,     "vreve_v16qi", CONST, altivec_vrevev16qi2)
BU_ALTIVEC_1 (VREVE_V2DF,      "vreve_v2df", CONST,  altivec_vrevev2df2)
BU_ALTIVEC_1 (VREVE_V4SF,      "vreve_v4sf", CONST,  altivec_vrevev4sf2)

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 (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 (LVXL_V2DF,	"lvxl_v2df",	    MEM)
BU_ALTIVEC_X (LVXL_V2DI,	"lvxl_v2di",	    MEM)
BU_ALTIVEC_X (LVXL_V4SF,	"lvxl_v4sf",	    MEM)
BU_ALTIVEC_X (LVXL_V4SI,	"lvxl_v4si",	    MEM)
BU_ALTIVEC_X (LVXL_V8HI,	"lvxl_v8hi",	    MEM)
BU_ALTIVEC_X (LVXL_V16QI,	"lvxl_v16qi",	    MEM)
BU_ALTIVEC_X (LVX,		"lvx",		    MEM)
BU_ALTIVEC_X (LVX_V1TI,		"lvx_v1ti",	    MEM)
BU_ALTIVEC_X (LVX_V2DF,		"lvx_v2df",	    MEM)
BU_ALTIVEC_X (LVX_V2DI,		"lvx_v2di",	    MEM)
BU_ALTIVEC_X (LVX_V4SF,		"lvx_v4sf",	    MEM)
BU_ALTIVEC_X (LVX_V4SI,		"lvx_v4si",	    MEM)
BU_ALTIVEC_X (LVX_V8HI,		"lvx_v8hi",	    MEM)
BU_ALTIVEC_X (LVX_V16QI,	"lvx_v16qi",	    MEM)
BU_ALTIVEC_X (STVX,		"stvx",		    MEM)
BU_ALTIVEC_X (STVX_V2DF,	"stvx_v2df",	    MEM)
BU_ALTIVEC_X (STVX_V2DI,	"stvx_v2di",	    MEM)
BU_ALTIVEC_X (STVX_V4SF,	"stvx_v4sf",	    MEM)
BU_ALTIVEC_X (STVX_V4SI,	"stvx_v4si",	    MEM)
BU_ALTIVEC_X (STVX_V8HI,	"stvx_v8hi",	    MEM)
BU_ALTIVEC_X (STVX_V16QI,	"stvx_v16qi",	    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_X (STVXL_V2DF,	"stvxl_v2df",	    MEM)
BU_ALTIVEC_X (STVXL_V2DI,	"stvxl_v2di",	    MEM)
BU_ALTIVEC_X (STVXL_V4SF,	"stvxl_v4sf",	    MEM)
BU_ALTIVEC_X (STVXL_V4SI,	"stvxl_v4si",	    MEM)
BU_ALTIVEC_X (STVXL_V8HI,	"stvxl_v8hi",	    MEM)
BU_ALTIVEC_X (STVXL_V16QI,	"stvxl_v16qi",	    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 (VMULESW,	   "vmulesw")
BU_ALTIVEC_OVERLOAD_2 (VMULEUB,	   "vmuleub")
BU_ALTIVEC_OVERLOAD_2 (VMULEUH,	   "vmuleuh")
BU_ALTIVEC_OVERLOAD_2 (VMULEUW,	   "vmuleuw")
BU_ALTIVEC_OVERLOAD_2 (VMULOSB,	   "vmulosb")
BU_ALTIVEC_OVERLOAD_2 (VMULOSH,	   "vmulosh")
BU_ALTIVEC_OVERLOAD_2 (VMULOSW,	   "vmulosw")
BU_ALTIVEC_OVERLOAD_2 (VMULOUB,	   "vmuloub")
BU_ALTIVEC_OVERLOAD_2 (VMULOUH,	   "vmulouh")
BU_ALTIVEC_OVERLOAD_2 (VMULOUW,	   "vmulouw")
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 (NABS,	   "nabs")
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")

BU_ALTIVEC_OVERLOAD_1 (VREVE,        "vreve")

/* 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 (ADDE,	   "adde")
BU_ALTIVEC_OVERLOAD_X (ADDEC,	   "addec")
BU_ALTIVEC_OVERLOAD_X (CMPNE,	   "cmpne")
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 (MUL,	   "mul")
BU_ALTIVEC_OVERLOAD_X (PROMOTE,	   "promote")
BU_ALTIVEC_OVERLOAD_X (SLD,	   "sld")
BU_ALTIVEC_OVERLOAD_X (SLDW,	   "sldw")
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 (SUBE,	   "sube")
BU_ALTIVEC_OVERLOAD_X (SUBEC,	   "subec")
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_1TI,          "xxsel_1ti",      CONST, 	vector_select_v1ti)
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_1TI_UNS,      "xxsel_1ti_uns",  CONST, 	vector_select_v1ti_uns)
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_1TI,          "vperm_1ti",      CONST, 	altivec_vperm_v1ti)
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_1TI_UNS,      "vperm_1ti_uns",  CONST, 	altivec_vperm_v1ti_uns)
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_1TI,       "xxpermdi_1ti",   CONST, 	vsx_xxpermdi_v1ti)
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_1TI,            "set_1ti",        CONST, 	vsx_set_v1ti)
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)
BU_VSX_2 (XXSPLTD_V2DF,       "xxspltd_2df",    CONST,  vsx_xxspltd_v2df)
BU_VSX_2 (XXSPLTD_V2DI,       "xxspltd_2di",    CONST,  vsx_xxspltd_v2di)
BU_VSX_2 (DIV_V2DI,           "div_2di",        CONST,  vsx_div_v2di)
BU_VSX_2 (UDIV_V2DI,          "udiv_2di",       CONST,  vsx_udiv_v2di)
BU_VSX_2 (MUL_V2DI,           "mul_2di",        CONST,  vsx_mul_v2di)

BU_VSX_2 (XVCVSXDDP_SCALE,    "xvcvsxddp_scale", CONST, vsx_xvcvsxddp_scale)
BU_VSX_2 (XVCVUXDDP_SCALE,    "xvcvuxddp_scale", CONST, vsx_xvcvuxddp_scale)
BU_VSX_2 (XVCVDPSXDS_SCALE,   "xvcvdpsxds_scale", CONST, vsx_xvcvdpsxds_scale)
BU_VSX_2 (XVCVDPUXDS_SCALE,   "xvcvdpuxds_scale", CONST, vsx_xvcvdpuxds_scale)

BU_VSX_2 (CMPGE_16QI,         "cmpge_16qi",     CONST,  vector_nltv16qi)
BU_VSX_2 (CMPGE_8HI,          "cmpge_8hi",      CONST,  vector_nltv8hi)
BU_VSX_2 (CMPGE_4SI,          "cmpge_4si",      CONST,  vector_nltv4si)
BU_VSX_2 (CMPGE_2DI,          "cmpge_2di",      CONST,  vector_nltv2di)
BU_VSX_2 (CMPGE_U16QI,        "cmpge_u16qi",    CONST,  vector_nltuv16qi)
BU_VSX_2 (CMPGE_U8HI,         "cmpge_u8hi",     CONST,  vector_nltuv8hi)
BU_VSX_2 (CMPGE_U4SI,         "cmpge_u4si",     CONST,  vector_nltuv4si)
BU_VSX_2 (CMPGE_U2DI,         "cmpge_u2di",     CONST,  vector_nltuv2di)

BU_VSX_2 (CMPLE_16QI,         "cmple_16qi",     CONST,  vector_ngtv16qi)
BU_VSX_2 (CMPLE_8HI,          "cmple_8hi",      CONST,  vector_ngtv8hi)
BU_VSX_2 (CMPLE_4SI,          "cmple_4si",      CONST,  vector_ngtv4si)
BU_VSX_2 (CMPLE_2DI,          "cmple_2di",      CONST,  vector_ngtv2di)
BU_VSX_2 (CMPLE_U16QI,        "cmple_u16qi",    CONST,  vector_ngtuv16qi)
BU_VSX_2 (CMPLE_U8HI,         "cmple_u8hi",     CONST,  vector_ngtuv8hi)
BU_VSX_2 (CMPLE_U4SI,         "cmple_u4si",     CONST,  vector_ngtuv4si)
BU_VSX_2 (CMPLE_U2DI,         "cmple_u2di",     CONST,  vector_ngtuv2di)

/* 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_xscvspdp)
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 (XVCVSXWSP_V4SF,  "vsx_xvcvsxwsp",   CONST,	vsx_xvcvsxwsp)
BU_VSX_1 (XVCVUXWSP_V4SF,  "vsx_xvcvuxwsp",   CONST,	vsx_xvcvuxwsp)
BU_VSX_1 (FLOATE_V2DI,     "floate_v2di",     CONST,	floatev2di)
BU_VSX_1 (FLOATE_V2DF,     "floate_v2df",     CONST,	floatev2df)
BU_VSX_1 (FLOATO_V2DI,     "floato_v2di",     CONST,	floatov2di)
BU_VSX_1 (FLOATO_V2DF,     "floato_v2df",     CONST,	floatov2df)
BU_VSX_1 (UNS_FLOATO_V2DI, "uns_floato_v2di", CONST,	unsfloatov2di)
BU_VSX_1 (UNS_FLOATE_V2DI, "uns_floate_v2di", CONST,	unsfloatev2di)

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,	floordf2)
BU_VSX_1 (XSRDPIP,	      "xsrdpip",	CONST,	ceildf2)
BU_VSX_1 (XSRDPIZ,	      "xsrdpiz",	CONST,	btruncdf2)

BU_VSX_1 (DOUBLEE_V4SI,      "doublee_v4si",     CONST,	doubleev4si2)
BU_VSX_1 (DOUBLEE_V4SF,      "doublee_v4sf",     CONST,	doubleev4sf2)
BU_VSX_1 (UNS_DOUBLEE_V4SI,  "uns_doublee_v4si", CONST,	unsdoubleev4si2)
BU_VSX_1 (DOUBLEO_V4SI,      "doubleo_v4si",     CONST,	doubleov4si2)
BU_VSX_1 (DOUBLEO_V4SF,      "doubleo_v4sf",     CONST,	doubleov4sf2)
BU_VSX_1 (UNS_DOUBLEO_V4SI,  "uns_doubleo_v4si", CONST,	unsdoubleov4si2)
BU_VSX_1 (DOUBLEH_V4SI,      "doubleh_v4si",     CONST,	doublehv4si2)
BU_VSX_1 (DOUBLEH_V4SF,      "doubleh_v4sf",     CONST,	doublehv4sf2)
BU_VSX_1 (UNS_DOUBLEH_V4SI,  "uns_doubleh_v4si", CONST,	unsdoublehv4si2)
BU_VSX_1 (DOUBLEL_V4SI,      "doublel_v4si",     CONST,	doublelv4si2)
BU_VSX_1 (DOUBLEL_V4SF,      "doublel_v4sf",     CONST,	doublelv4sf2)
BU_VSX_1 (UNS_DOUBLEL_V4SI,  "uns_doublel_v4si", CONST,	unsdoublelv4si2)

BU_VSX_1 (VEC_VSIGNED_V4SF,      "vsigned_v4sf",     CONST,  vsx_xvcvspsxws)
BU_VSX_1 (VEC_VSIGNED_V2DF,      "vsigned_v2df",     CONST,  vsx_xvcvdpsxds)
BU_VSX_1 (VEC_VSIGNEDE_V2DF,     "vsignede_v2df",    CONST,  vsignede_v2df)
BU_VSX_1 (VEC_VSIGNEDO_V2DF,     "vsignedo_v2df",    CONST,  vsignedo_v2df)

BU_VSX_1 (VEC_VUNSIGNED_V4SF,    "vunsigned_v4sf",    CONST,  vsx_xvcvspsxws)
BU_VSX_1 (VEC_VUNSIGNED_V2DF,    "vunsigned_v2df",    CONST,  vsx_xvcvdpsxds)
BU_VSX_1 (VEC_VUNSIGNEDE_V2DF,   "vunsignede_v2df",   CONST,  vunsignede_v2df)
BU_VSX_1 (VEC_VUNSIGNEDO_V2DF,   "vunsignedo_v2df",   CONST,  vunsignedo_v2df)

/* 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_V1TI,	      "lxvd2x_v1ti",	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_V1TI,	      "stxvd2x_v1ti",	MEM)
BU_VSX_X (STXVD2X_V2DF,	      "stxvd2x_v2df",	MEM)
BU_VSX_X (STXVD2X_V2DI,	      "stxvd2x_v2di",	MEM)
BU_VSX_X (STXVW4X_V4SF,	      "stxvw4x_v4sf",	MEM)
BU_VSX_X (STXVW4X_V4SI,	      "stxvw4x_v4si",	MEM)
BU_VSX_X (STXVW4X_V8HI,	      "stxvw4x_v8hi",	MEM)
BU_VSX_X (STXVW4X_V16QI,      "stxvw4x_v16qi",	MEM)
BU_VSX_X (LD_ELEMREV_V1TI,    "ld_elemrev_v1ti",  MEM)
BU_VSX_X (LD_ELEMREV_V2DF,    "ld_elemrev_v2df",  MEM)
BU_VSX_X (LD_ELEMREV_V2DI,    "ld_elemrev_v2di",  MEM)
BU_VSX_X (LD_ELEMREV_V4SF,    "ld_elemrev_v4sf",  MEM)
BU_VSX_X (LD_ELEMREV_V4SI,    "ld_elemrev_v4si",  MEM)
BU_VSX_X (LD_ELEMREV_V8HI,    "ld_elemrev_v8hi",  MEM)
BU_VSX_X (LD_ELEMREV_V16QI,   "ld_elemrev_v16qi", MEM)
BU_VSX_X (ST_ELEMREV_V1TI,    "st_elemrev_v1ti",  MEM)
BU_VSX_X (ST_ELEMREV_V2DF,    "st_elemrev_v2df",  MEM)
BU_VSX_X (ST_ELEMREV_V2DI,    "st_elemrev_v2di",  MEM)
BU_VSX_X (ST_ELEMREV_V4SF,    "st_elemrev_v4sf",  MEM)
BU_VSX_X (ST_ELEMREV_V4SI,    "st_elemrev_v4si",  MEM)
BU_VSX_X (ST_ELEMREV_V8HI,    "st_elemrev_v8hi",  MEM)
BU_VSX_X (ST_ELEMREV_V16QI,   "st_elemrev_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_V1TI,      "vec_init_v1ti",	CONST)
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_V1TI,	      "vec_set_v1ti",	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_V1TI,	      "vec_ext_v1ti",	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 (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")

/* 1 argument VSX overloaded builtin functions.  */
BU_VSX_OVERLOAD_1 (DOUBLE,   "double")
BU_VSX_OVERLOAD_1 (DOUBLEE,  "doublee")
BU_VSX_OVERLOAD_1 (UNS_DOUBLEE,  "uns_doublee")
BU_VSX_OVERLOAD_1 (DOUBLEO,  "doubleo")
BU_VSX_OVERLOAD_1 (UNS_DOUBLEO,  "uns_doubleo")
BU_VSX_OVERLOAD_1 (DOUBLEH,  "doubleh")
BU_VSX_OVERLOAD_1 (UNS_DOUBLEH,  "uns_doubleh")
BU_VSX_OVERLOAD_1 (DOUBLEL,  "doublel")
BU_VSX_OVERLOAD_1 (UNS_DOUBLEL,  "uns_doublel")
BU_VSX_OVERLOAD_1 (FLOAT,  "float")
BU_VSX_OVERLOAD_1 (FLOATE,  "floate")
BU_VSX_OVERLOAD_1 (FLOATO,  "floato")

BU_VSX_OVERLOAD_1 (VSIGNED,   "vsigned")
BU_VSX_OVERLOAD_1 (VSIGNEDE,  "vsignede")
BU_VSX_OVERLOAD_1 (VSIGNEDO,  "vsignedo")

BU_VSX_OVERLOAD_1 (VUNSIGNED,   "vunsigned")
BU_VSX_OVERLOAD_1 (VUNSIGNEDE,  "vunsignede")
BU_VSX_OVERLOAD_1 (VUNSIGNEDO,  "vunsignedo")

/* VSX builtins that are handled as special cases.  */
BU_VSX_OVERLOAD_X (LD,	     "ld")
BU_VSX_OVERLOAD_X (ST,	     "st")
BU_VSX_OVERLOAD_X (XL,	     "xl")
BU_VSX_OVERLOAD_X (XL_BE,    "xl_be")
BU_VSX_OVERLOAD_X (XST,	     "xst")
BU_VSX_OVERLOAD_X (XST_BE,   "xst_be")


/* 2 argument CMPB instructions added in ISA 2.05. */
BU_P6_2 (CMPB_32,        "cmpb_32",	CONST,	cmpbsi3)
BU_P6_64BIT_2 (CMPB,     "cmpb",	CONST,	cmpbdi3)

/* 1 argument VSX instructions added in ISA 2.07.  */
BU_P8V_VSX_1 (XSCVSPDPN,      "xscvspdpn",	CONST,	vsx_xscvspdpn)
BU_P8V_VSX_1 (XSCVDPSPN,      "xscvdpspn",	CONST,	vsx_xscvdpspn)
BU_P8V_VSX_1 (REVB_V1TI,      "revb_v1ti",	CONST,	revb_v1ti)
BU_P8V_VSX_1 (REVB_V2DI,      "revb_v2di",	CONST,	revb_v2di)
BU_P8V_VSX_1 (REVB_V4SI,      "revb_v4si",	CONST,	revb_v4si)
BU_P8V_VSX_1 (REVB_V8HI,      "revb_v8hi",	CONST,	revb_v8hi)
BU_P8V_VSX_1 (REVB_V16QI,     "revb_v16qi",	CONST,	revb_v16qi)
BU_P8V_VSX_1 (REVB_V2DF,      "revb_v2df",	CONST,	revb_v2df)
BU_P8V_VSX_1 (REVB_V4SF,      "revb_v4sf",	CONST,	revb_v4sf)

/* Power 8 Altivec NEG functions.  */
BU_P8V_AV_1 (NEG_V2DI,      "neg_v2di",	CONST,	negv2di2)
BU_P8V_AV_1 (NEG_V4SI,      "neg_v4si",	CONST,	negv4si2)
BU_P8V_AV_1 (NEG_V8HI,      "neg_v8hi",	CONST,	negv8hi2)
BU_P8V_AV_1 (NEG_V16QI,     "neg_v16qi",	CONST,	negv16qi2)
BU_P8V_AV_1 (NEG_V4SF,      "neg_v4sf",	CONST,	negv4sf2)
BU_P8V_AV_1 (NEG_V2DF,      "neg_v2df",	CONST,	negv2df2)


/* 2 argument VSX instructions added in ISA 2.07.  */
BU_P8V_VSX_2 (FLOAT2_V2DF,        "float2_v2df",	CONST,  float2_v2df)
BU_P8V_VSX_2 (FLOAT2_V2DI,        "float2_v2di",	CONST,  float2_v2di)
BU_P8V_VSX_2 (UNS_FLOAT2_V2DI,    "uns_float2_v2di",    CONST,  uns_float2_v2di)
BU_P8V_VSX_2 (VEC_VSIGNED2_V2DF,   "vsigned2_v2df",    CONST,  vsigned2_v2df)
BU_P8V_VSX_2 (VEC_VUNSIGNED2_V2DF, "vunsigned2_v2df",  CONST,  vunsigned2_v2df)


/* 1 argument altivec instructions added in ISA 2.07.  */
BU_P8V_AV_1 (ABS_V2DI,	      "abs_v2di",	CONST,	absv2di2)
BU_P8V_AV_1 (VUPKHSW,	      "vupkhsw",	CONST,	altivec_vupkhsw)
BU_P8V_AV_1 (VUPKLSW,	      "vupklsw",	CONST,	altivec_vupklsw)
BU_P8V_AV_1 (VCLZB,	      "vclzb",		CONST,  clzv16qi2)
BU_P8V_AV_1 (VCLZH,	      "vclzh",		CONST,  clzv8hi2)
BU_P8V_AV_1 (VCLZW,	      "vclzw",		CONST,  clzv4si2)
BU_P8V_AV_1 (VCLZD,	      "vclzd",		CONST,  clzv2di2)
BU_P8V_AV_1 (VPOPCNTB,	      "vpopcntb",	CONST,  popcountv16qi2)
BU_P8V_AV_1 (VPOPCNTH,	      "vpopcnth",	CONST,  popcountv8hi2)
BU_P8V_AV_1 (VPOPCNTW,	      "vpopcntw",	CONST,  popcountv4si2)
BU_P8V_AV_1 (VPOPCNTD,	      "vpopcntd",	CONST,  popcountv2di2)
BU_P8V_AV_1 (VPOPCNTUB,       "vpopcntub",	CONST,  popcountv16qi2)
BU_P8V_AV_1 (VPOPCNTUH,       "vpopcntuh",	CONST,  popcountv8hi2)
BU_P8V_AV_1 (VPOPCNTUW,       "vpopcntuw",	CONST,  popcountv4si2)
BU_P8V_AV_1 (VPOPCNTUD,       "vpopcntud",	CONST,  popcountv2di2)
BU_P8V_AV_1 (VGBBD,	      "vgbbd",		CONST,  p8v_vgbbd)

/* 2 argument altivec instructions added in ISA 2.07.  */
BU_P8V_AV_2 (VADDCUQ,		"vaddcuq",	CONST,	altivec_vaddcuq)
BU_P8V_AV_2 (VADDUDM,		"vaddudm",	CONST,	addv2di3)
BU_P8V_AV_2 (VADDUQM,		"vadduqm",	CONST,	altivec_vadduqm)
BU_P8V_AV_2 (VMINSD,		"vminsd",	CONST,	sminv2di3)
BU_P8V_AV_2 (VMAXSD,		"vmaxsd",	CONST,	smaxv2di3)
BU_P8V_AV_2 (VMINUD,		"vminud",	CONST,	uminv2di3)
BU_P8V_AV_2 (VMAXUD,		"vmaxud",	CONST,	umaxv2di3)
BU_P8V_AV_2 (VMRGEW_V2DI,	"vmrgew_v2di",	CONST,	p8_vmrgew_v2di)
BU_P8V_AV_2 (VMRGEW_V2DF,	"vmrgew_v2df",	CONST,	p8_vmrgew_v2df)
BU_P8V_AV_2 (VMRGEW_V4SI,	"vmrgew_v4si",	CONST,	p8_vmrgew_v4si)
BU_P8V_AV_2 (VMRGEW_V4SF,	"vmrgew_v4sf",	CONST,	p8_vmrgew_v4sf)
BU_P8V_AV_2 (VMRGOW_V4SI,	"vmrgow_v4si",	CONST,	p8_vmrgow_v4si)
BU_P8V_AV_2 (VMRGOW_V4SF,	"vmrgow_v4sf",	CONST,	p8_vmrgow_v4sf)
BU_P8V_AV_2 (VMRGOW_V2DI,	"vmrgow_v2di",	CONST,	p8_vmrgow_v2di)
BU_P8V_AV_2 (VMRGOW_V2DF,	"vmrgow_v2df",	CONST,	p8_vmrgow_v2df)
BU_P8V_AV_2 (VBPERMQ,		"vbpermq",	CONST,	altivec_vbpermq)
BU_P8V_AV_2 (VBPERMQ2,		"vbpermq2",	CONST,	altivec_vbpermq2)
BU_P8V_AV_2 (VPKUDUM,		"vpkudum",	CONST,	altivec_vpkudum)
BU_P8V_AV_2 (VPKSDSS,		"vpksdss",	CONST,	altivec_vpksdss)
BU_P8V_AV_2 (VPKUDUS,		"vpkudus",	CONST,	altivec_vpkudus)
BU_P8V_AV_2 (VPKSDUS,		"vpksdus",	CONST,	altivec_vpksdus)
BU_P8V_AV_2 (VPMSUMB,		"vpmsumb",	CONST,	crypto_vpmsumb)
BU_P8V_AV_2 (VPMSUMH,		"vpmsumh",	CONST,	crypto_vpmsumh)
BU_P8V_AV_2 (VPMSUMW,		"vpmsumw",	CONST,	crypto_vpmsumw)
BU_P8V_AV_2 (VPMSUMD,		"vpmsumd",	CONST,	crypto_vpmsumd)
BU_P8V_AV_2 (VRLD,		"vrld",		CONST,	vrotlv2di3)
BU_P8V_AV_2 (VSLD,		"vsld",		CONST,	vashlv2di3)
BU_P8V_AV_2 (VSRD,		"vsrd",		CONST,	vlshrv2di3)
BU_P8V_AV_2 (VSRAD,		"vsrad",	CONST,	vashrv2di3)
BU_P8V_AV_2 (VSUBCUQ,		"vsubcuq",	CONST,	altivec_vsubcuq)
BU_P8V_AV_2 (VSUBUDM,		"vsubudm",	CONST,	subv2di3)
BU_P8V_AV_2 (VSUBUQM,		"vsubuqm",	CONST,	altivec_vsubuqm)

BU_P8V_AV_2 (EQV_V16QI,		"eqv_v16qi",	CONST,	eqvv16qi3)
BU_P8V_AV_2 (EQV_V8HI,		"eqv_v8hi",	CONST,	eqvv8hi3)
BU_P8V_AV_2 (EQV_V4SI,		"eqv_v4si",	CONST,	eqvv4si3)
BU_P8V_AV_2 (EQV_V2DI,		"eqv_v2di",	CONST,	eqvv2di3)
BU_P8V_AV_2 (EQV_V1TI,		"eqv_v1ti",	CONST,	eqvv1ti3)
BU_P8V_AV_2 (EQV_V4SF,		"eqv_v4sf",	CONST,	eqvv4sf3)
BU_P8V_AV_2 (EQV_V2DF,		"eqv_v2df",	CONST,	eqvv2df3)

BU_P8V_AV_2 (NAND_V16QI,	"nand_v16qi",	CONST,	nandv16qi3)
BU_P8V_AV_2 (NAND_V8HI,		"nand_v8hi",	CONST,	nandv8hi3)
BU_P8V_AV_2 (NAND_V4SI,		"nand_v4si",	CONST,	nandv4si3)
BU_P8V_AV_2 (NAND_V2DI,		"nand_v2di",	CONST,	nandv2di3)
BU_P8V_AV_2 (NAND_V1TI,		"nand_v1ti",	CONST,	nandv1ti3)
BU_P8V_AV_2 (NAND_V4SF,		"nand_v4sf",	CONST,	nandv4sf3)
BU_P8V_AV_2 (NAND_V2DF,		"nand_v2df",	CONST,	nandv2df3)

BU_P8V_AV_2 (ORC_V16QI,		"orc_v16qi",	CONST,	orcv16qi3)
BU_P8V_AV_2 (ORC_V8HI,		"orc_v8hi",	CONST,	orcv8hi3)
BU_P8V_AV_2 (ORC_V4SI,		"orc_v4si",	CONST,	orcv4si3)
BU_P8V_AV_2 (ORC_V2DI,		"orc_v2di",	CONST,	orcv2di3)
BU_P8V_AV_2 (ORC_V1TI,		"orc_v1ti",	CONST,	orcv1ti3)
BU_P8V_AV_2 (ORC_V4SF,		"orc_v4sf",	CONST,	orcv4sf3)
BU_P8V_AV_2 (ORC_V2DF,		"orc_v2df",	CONST,	orcv2df3)

/* 3 argument altivec instructions added in ISA 2.07.  */
BU_P8V_AV_3 (VADDEUQM,		"vaddeuqm",	CONST,	altivec_vaddeuqm)
BU_P8V_AV_3 (VADDECUQ,		"vaddecuq",	CONST,	altivec_vaddecuq)
BU_P8V_AV_3 (VSUBEUQM,		"vsubeuqm",	CONST,	altivec_vsubeuqm)
BU_P8V_AV_3 (VSUBECUQ,		"vsubecuq",	CONST,	altivec_vsubecuq)

/* Vector comparison instructions added in ISA 2.07.  */
BU_P8V_AV_2 (VCMPEQUD,		"vcmpequd",	CONST,	vector_eqv2di)
BU_P8V_AV_2 (VCMPGTSD,		"vcmpgtsd",	CONST,	vector_gtv2di)
BU_P8V_AV_2 (VCMPGTUD,		"vcmpgtud",	CONST,	vector_gtuv2di)

/* Vector comparison predicate instructions added in ISA 2.07.  */
BU_P8V_AV_P (VCMPEQUD_P,	"vcmpequd_p",	CONST,	vector_eq_v2di_p)
BU_P8V_AV_P (VCMPGTSD_P,	"vcmpgtsd_p",	CONST,	vector_gt_v2di_p)
BU_P8V_AV_P (VCMPGTUD_P,	"vcmpgtud_p",	CONST,	vector_gtu_v2di_p)

BU_P8V_AV_3 (VPERMXOR,		"vpermxor",	CONST, 	altivec_vpermxor)

/* ISA 2.05 overloaded 2 argument functions.  */
BU_P6_OVERLOAD_2 (CMPB, "cmpb")

/* ISA 2.07 vector overloaded 1 argument functions.  */
BU_P8V_OVERLOAD_1 (VUPKHSW,	"vupkhsw")
BU_P8V_OVERLOAD_1 (VUPKLSW,	"vupklsw")
BU_P8V_OVERLOAD_1 (VCLZ,	"vclz")
BU_P8V_OVERLOAD_1 (VCLZB,	"vclzb")
BU_P8V_OVERLOAD_1 (VCLZH,	"vclzh")
BU_P8V_OVERLOAD_1 (VCLZW,	"vclzw")
BU_P8V_OVERLOAD_1 (VCLZD,	"vclzd")
BU_P8V_OVERLOAD_1 (VPOPCNT,	"vpopcnt")
BU_P8V_OVERLOAD_1 (VPOPCNTB,	"vpopcntb")
BU_P8V_OVERLOAD_1 (VPOPCNTH,	"vpopcnth")
BU_P8V_OVERLOAD_1 (VPOPCNTW,	"vpopcntw")
BU_P8V_OVERLOAD_1 (VPOPCNTD,	"vpopcntd")
BU_P8V_OVERLOAD_1 (VPOPCNTU,	"vpopcntu")
BU_P8V_OVERLOAD_1 (VPOPCNTUB,	"vpopcntub")
BU_P8V_OVERLOAD_1 (VPOPCNTUH,	"vpopcntuh")
BU_P8V_OVERLOAD_1 (VPOPCNTUW,	"vpopcntuw")
BU_P8V_OVERLOAD_1 (VPOPCNTUD,	"vpopcntud")
BU_P8V_OVERLOAD_1 (VGBBD,	"vgbbd")
BU_P8V_OVERLOAD_1 (REVB,	"revb")
BU_P8V_OVERLOAD_1 (NEG, 	"neg")

/* ISA 2.07 vector overloaded 2 argument functions.  */
BU_P8V_OVERLOAD_2 (EQV,		"eqv")
BU_P8V_OVERLOAD_2 (NAND,	"nand")
BU_P8V_OVERLOAD_2 (ORC,		"orc")
BU_P8V_OVERLOAD_2 (VADDCUQ,	"vaddcuq")
BU_P8V_OVERLOAD_2 (VADDUDM,	"vaddudm")
BU_P8V_OVERLOAD_2 (VADDUQM,	"vadduqm")
BU_P8V_OVERLOAD_2 (VBPERMQ,	"vbpermq")
BU_P8V_OVERLOAD_2 (VMAXSD,	"vmaxsd")
BU_P8V_OVERLOAD_2 (VMAXUD,	"vmaxud")
BU_P8V_OVERLOAD_2 (VMINSD,	"vminsd")
BU_P8V_OVERLOAD_2 (VMINUD,	"vminud")
BU_P8V_OVERLOAD_2 (VMRGEW,	"vmrgew")
BU_P8V_OVERLOAD_2 (VMRGOW,	"vmrgow")
BU_P8V_OVERLOAD_2 (VPKSDSS,	"vpksdss")
BU_P8V_OVERLOAD_2 (VPKSDUS,	"vpksdus")
BU_P8V_OVERLOAD_2 (VPKUDUM,	"vpkudum")
BU_P8V_OVERLOAD_2 (VPKUDUS,	"vpkudus")
BU_P8V_OVERLOAD_2 (VPMSUM,      "vpmsum")
BU_P8V_OVERLOAD_2 (VRLD,	"vrld")
BU_P8V_OVERLOAD_2 (VSLD,	"vsld")
BU_P8V_OVERLOAD_2 (VSRAD,	"vsrad")
BU_P8V_OVERLOAD_2 (VSRD,	"vsrd")
BU_P8V_OVERLOAD_2 (VSUBCUQ,	"vsubcuq")
BU_P8V_OVERLOAD_2 (VSUBUDM,	"vsubudm")
BU_P8V_OVERLOAD_2 (VSUBUQM,	"vsubuqm")
BU_P8V_OVERLOAD_2 (FLOAT2,   "float2")
BU_P8V_OVERLOAD_2 (UNS_FLOAT2,   "uns_float2")
BU_P8V_OVERLOAD_2 (VSIGNED2,     "vsigned2")
BU_P8V_OVERLOAD_2 (VUNSIGNED2,   "vunsigned2")

/* ISA 2.07 vector overloaded 3 argument functions.  */
BU_P8V_OVERLOAD_3 (VADDECUQ,	"vaddecuq")
BU_P8V_OVERLOAD_3 (VADDEUQM,	"vaddeuqm")
BU_P8V_OVERLOAD_3 (VSUBECUQ,	"vsubecuq")
BU_P8V_OVERLOAD_3 (VSUBEUQM,	"vsubeuqm")
BU_P8V_OVERLOAD_3 (VPERMXOR,   "vpermxor")

/* ISA 3.0 vector overloaded 2-argument functions. */
BU_P9V_AV_2 (VSLV,		"vslv",			CONST, vslv)
BU_P9V_AV_2 (VSRV,		"vsrv",			CONST, vsrv)
BU_P9V_AV_2 (CONVERT_4F32_8I16, "convert_4f32_8i16", CONST, convert_4f32_8i16)

BU_P9V_AV_2 (VFIRSTMATCHINDEX_V16QI, "first_match_index_v16qi",
	     CONST, first_match_index_v16qi)
BU_P9V_AV_2 (VFIRSTMATCHINDEX_V8HI, "first_match_index_v8hi",
	     CONST, first_match_index_v8hi)
BU_P9V_AV_2 (VFIRSTMATCHINDEX_V4SI, "first_match_index_v4si",
	     CONST, first_match_index_v4si)
BU_P9V_AV_2 (VFIRSTMATCHOREOSINDEX_V16QI, "first_match_or_eos_index_v16qi",
	     CONST, first_match_or_eos_index_v16qi)
BU_P9V_AV_2 (VFIRSTMATCHOREOSINDEX_V8HI, "first_match_or_eos_index_v8hi",
	     CONST, first_match_or_eos_index_v8hi)
BU_P9V_AV_2 (VFIRSTMATCHOREOSINDEX_V4SI, "first_match_or_eos_index_v4si",
	     CONST, first_match_or_eos_index_v4si)
BU_P9V_AV_2 (VFIRSTMISMATCHINDEX_V16QI, "first_mismatch_index_v16qi",
	     CONST, first_mismatch_index_v16qi)
BU_P9V_AV_2 (VFIRSTMISMATCHINDEX_V8HI, "first_mismatch_index_v8hi",
	     CONST, first_mismatch_index_v8hi)
BU_P9V_AV_2 (VFIRSTMISMATCHINDEX_V4SI, "first_mismatch_index_v4si",
	     CONST, first_mismatch_index_v4si)
BU_P9V_AV_2 (VFIRSTMISMATCHOREOSINDEX_V16QI, "first_mismatch_or_eos_index_v16qi",
	     CONST, first_mismatch_or_eos_index_v16qi)
BU_P9V_AV_2 (VFIRSTMISMATCHOREOSINDEX_V8HI, "first_mismatch_or_eos_index_v8hi",
	     CONST, first_mismatch_or_eos_index_v8hi)
BU_P9V_AV_2 (VFIRSTMISMATCHOREOSINDEX_V4SI, "first_mismatch_or_eos_index_v4si",
	     CONST, first_mismatch_or_eos_index_v4si)

/* ISA 3.0 vector overloaded 2-argument functions. */
BU_P9V_OVERLOAD_2 (VSLV,	"vslv")
BU_P9V_OVERLOAD_2 (VSRV,	"vsrv")
BU_P9V_OVERLOAD_2 (CONVERT_4F32_8I16, "convert_4f32_8i16")

/* 2 argument vector functions added in ISA 3.0 (power9). */
BU_P9V_AV_2 (VADUB,		"vadub",		CONST,  vaduv16qi3)
BU_P9V_AV_2 (VADUH,		"vaduh",		CONST,  vaduv8hi3)
BU_P9V_AV_2 (VADUW,		"vaduw",		CONST,  vaduv4si3)
BU_P9V_AV_2 (VRLWNM,		"vrlwnm",		CONST,	altivec_vrlwnm)
BU_P9V_AV_2 (VRLDNM,		"vrldnm",		CONST,	altivec_vrldnm)
BU_P9V_AV_2 (VBPERMD,		"vbpermd",		CONST,  altivec_vbpermd)

/* ISA 3.0 vector overloaded 2 argument functions. */
BU_P9V_OVERLOAD_2 (VADU,	"vadu")
BU_P9V_OVERLOAD_2 (VADUB,	"vadub")
BU_P9V_OVERLOAD_2 (VADUH,	"vaduh")
BU_P9V_OVERLOAD_2 (VADUW,	"vaduw")
BU_P9V_OVERLOAD_2 (RLNM,	"rlnm")
BU_P9V_OVERLOAD_2 (VBPERM,	"vbperm_api")

/* ISA 3.0 3-argument vector functions.  */
BU_P9V_AV_3 (VRLWMI,		"vrlwmi",		CONST,	altivec_vrlwmi)
BU_P9V_AV_3 (VRLDMI,		"vrldmi",		CONST,	altivec_vrldmi)

/* ISA 3.0 vector overloaded 3-argument functions.  */
BU_P9V_OVERLOAD_3 (RLMI,	"rlmi")

/* 1 argument vsx scalar functions added in ISA 3.0 (power9).  */
BU_P9V_64BIT_VSX_1 (VSEEDP,	"scalar_extract_exp",	CONST,	xsxexpdp)
BU_P9V_64BIT_VSX_1 (VSESDP,	"scalar_extract_sig",	CONST,	xsxsigdp)

BU_FLOAT128_HW_VSX_1 (VSEEQP,	"scalar_extract_expq",	CONST,	xsxexpqp_kf)
BU_FLOAT128_HW_VSX_1 (VSESQP,	"scalar_extract_sigq",	CONST,	xsxsigqp_kf)

BU_FLOAT128_HW_VSX_1 (VSTDCNQP, "scalar_test_neg_qp",	CONST,	xststdcnegqp_kf)
BU_P9V_VSX_1 (VSTDCNDP,	"scalar_test_neg_dp",	CONST,	xststdcnegdp)
BU_P9V_VSX_1 (VSTDCNSP,	"scalar_test_neg_sp",	CONST,	xststdcnegsp)

BU_P9V_VSX_1 (XXBRQ_V16QI,	"xxbrq_v16qi",	CONST,	p9_xxbrq_v16qi)
BU_P9V_VSX_1 (XXBRQ_V1TI,	"xxbrq_v1ti",	CONST,	p9_xxbrq_v1ti)
BU_P9V_VSX_1 (XXBRD_V2DI,	"xxbrd_v2di",	CONST,	p9_xxbrd_v2di)
BU_P9V_VSX_1 (XXBRD_V2DF,	"xxbrd_v2df",	CONST,	p9_xxbrd_v2df)
BU_P9V_VSX_1 (XXBRW_V4SI,	"xxbrw_v4si",	CONST,	p9_xxbrw_v4si)
BU_P9V_VSX_1 (XXBRW_V4SF,	"xxbrw_v4sf",	CONST,	p9_xxbrw_v4sf)
BU_P9V_VSX_1 (XXBRH_V8HI,	"xxbrh_v8hi",	CONST,	p9_xxbrh_v8hi)

/* 2 argument vsx scalar functions added in ISA 3.0 (power9).  */
BU_P9V_64BIT_VSX_2 (VSIEDP,	"scalar_insert_exp",	CONST,	xsiexpdp)
BU_P9V_64BIT_VSX_2 (VSIEDPF,	"scalar_insert_exp_dp",	CONST,	xsiexpdpf)

BU_FLOAT128_HW_VSX_2 (VSIEQP,	"scalar_insert_exp_q",	CONST,	xsiexpqp_kf)
BU_FLOAT128_HW_VSX_2 (VSIEQPF,	"scalar_insert_exp_qp",	CONST,	xsiexpqpf_kf)

BU_P9V_VSX_2 (VSCEDPGT,	"scalar_cmp_exp_dp_gt",	CONST,	xscmpexpdp_gt)
BU_P9V_VSX_2 (VSCEDPLT,	"scalar_cmp_exp_dp_lt",	CONST,	xscmpexpdp_lt)
BU_P9V_VSX_2 (VSCEDPEQ,	"scalar_cmp_exp_dp_eq",	CONST,	xscmpexpdp_eq)
BU_P9V_VSX_2 (VSCEDPUO,	"scalar_cmp_exp_dp_unordered",	CONST,	xscmpexpdp_unordered)

BU_FLOAT128_HW_VSX_2 (VSTDCQP, "scalar_test_data_class_qp",	CONST,	xststdcqp_kf)
BU_P9V_VSX_2 (VSTDCDP,	"scalar_test_data_class_dp",	CONST,	xststdcdp)
BU_P9V_VSX_2 (VSTDCSP,	"scalar_test_data_class_sp",	CONST,	xststdcsp)

/* ISA 3.0 vector scalar overloaded 1 argument functions.  */
BU_P9V_OVERLOAD_1 (VSEEDP,	"scalar_extract_exp")
BU_P9V_OVERLOAD_1 (VSESDP,	"scalar_extract_sig")

BU_P9V_OVERLOAD_1 (VSTDCN,	"scalar_test_neg")
BU_P9V_OVERLOAD_1 (VSTDCNQP,	"scalar_test_neg_qp")
BU_P9V_OVERLOAD_1 (VSTDCNDP,	"scalar_test_neg_dp")
BU_P9V_OVERLOAD_1 (VSTDCNSP,	"scalar_test_neg_sp")

BU_P9V_OVERLOAD_1 (VEXTRACT_FP_FROM_SHORTH, "vextract_fp_from_shorth")
BU_P9V_OVERLOAD_1 (VEXTRACT_FP_FROM_SHORTL, "vextract_fp_from_shortl")

/* ISA 3.0 vector scalar overloaded 2 argument functions.  */
BU_P9V_OVERLOAD_2 (VFIRSTMATCHINDEX,	"first_match_index")
BU_P9V_OVERLOAD_2 (VFIRSTMISMATCHINDEX,	"first_mismatch_index")
BU_P9V_OVERLOAD_2 (VFIRSTMATCHOREOSINDEX,	"first_match_or_eos_index")
BU_P9V_OVERLOAD_2 (VFIRSTMISMATCHOREOSINDEX,	"first_mismatch_or_eos_index")

BU_P9V_OVERLOAD_2 (VSIEDP,	"scalar_insert_exp")

BU_P9V_OVERLOAD_2 (VSTDC,	"scalar_test_data_class")
BU_P9V_OVERLOAD_2 (VSTDCQP,	"scalar_test_data_class_qp")
BU_P9V_OVERLOAD_2 (VSTDCDP,	"scalar_test_data_class_dp")
BU_P9V_OVERLOAD_2 (VSTDCSP,	"scalar_test_data_class_sp")

BU_P9V_OVERLOAD_2 (VSCEDPGT,	"scalar_cmp_exp_gt")
BU_P9V_OVERLOAD_2 (VSCEDPLT,	"scalar_cmp_exp_lt")
BU_P9V_OVERLOAD_2 (VSCEDPEQ,	"scalar_cmp_exp_eq")
BU_P9V_OVERLOAD_2 (VSCEDPUO,	"scalar_cmp_exp_unordered")

/* 1 argument vsx vector functions added in ISA 3.0 (power9).  */
BU_P9V_VSX_1 (VEEDP, "extract_exp_dp", CONST, xvxexpdp)
BU_P9V_VSX_1 (VEESP, "extract_exp_sp", CONST, xvxexpsp)
BU_P9V_VSX_1 (VESDP, "extract_sig_dp", CONST, xvxsigdp)
BU_P9V_VSX_1 (VESSP, "extract_sig_sp", CONST, xvxsigsp)
BU_P9V_VSX_1 (VEXTRACT_FP_FROM_SHORTH, "vextract_fp_from_shorth", CONST, vextract_fp_from_shorth)
BU_P9V_VSX_1 (VEXTRACT_FP_FROM_SHORTL, "vextract_fp_from_shortl", CONST, vextract_fp_from_shortl)

/* 2 argument vsx vector functions added in ISA 3.0 (power9).  */
BU_P9V_VSX_2 (VIEDP, "insert_exp_dp", CONST, xviexpdp)
BU_P9V_VSX_2 (VIESP, "insert_exp_sp", CONST, xviexpsp)
BU_P9V_VSX_2 (VTDCDP, "test_data_class_dp", CONST, xvtstdcdp)
BU_P9V_VSX_2 (VTDCSP, "test_data_class_sp", CONST, xvtstdcsp)

/* ISA 3.0 vector overloaded 1 argument functions.  */
BU_P9V_OVERLOAD_1 (VES,		"extract_sig")
BU_P9V_OVERLOAD_1 (VESDP,	"extract_sig_dp")
BU_P9V_OVERLOAD_1 (VESSP,	"extract_sig_sp")

BU_P9V_OVERLOAD_1 (VEE,		"extract_exp")
BU_P9V_OVERLOAD_1 (VEEDP,	"extract_exp_dp")
BU_P9V_OVERLOAD_1 (VEESP,	"extract_exp_sp")

/* ISA 3.0 vector overloaded 2 argument functions.  */
BU_P9V_OVERLOAD_2 (VTDC,	"test_data_class")
BU_P9V_OVERLOAD_2 (VTDCDP,	"test_data_class_dp")
BU_P9V_OVERLOAD_2 (VTDCSP,	"test_data_class_sp")

BU_P9V_OVERLOAD_2 (VIE,		"insert_exp")
BU_P9V_OVERLOAD_2 (VIEDP,	"insert_exp_dp")
BU_P9V_OVERLOAD_2 (VIESP,	"insert_exp_sp")

/* 2 argument vector functions added in ISA 3.0 (power9).  */
BU_P9V_64BIT_VSX_2 (LXVL,	"lxvl",		PURE,	lxvl)
BU_P9V_64BIT_VSX_2 (XL_LEN_R,	"xl_len_r",	PURE,	xl_len_r)

BU_P9V_AV_2 (VEXTUBLX, "vextublx",		CONST,	vextublx)
BU_P9V_AV_2 (VEXTUBRX, "vextubrx",		CONST,	vextubrx)
BU_P9V_AV_2 (VEXTUHLX, "vextuhlx",		CONST,	vextuhlx)
BU_P9V_AV_2 (VEXTUHRX, "vextuhrx",		CONST,	vextuhrx)
BU_P9V_AV_2 (VEXTUWLX, "vextuwlx",		CONST,	vextuwlx)
BU_P9V_AV_2 (VEXTUWRX, "vextuwrx",		CONST,	vextuwrx)

/* Insert/extract 4 byte word into a vector.  */
BU_P9V_VSX_3 (INSERT4B,    "insert4b",		CONST,  insert4b)
BU_P9V_VSX_2 (EXTRACT4B,   "extract4b", 	CONST,  extract4b)

/* Hardware IEEE 128-bit floating point round to odd instrucitons added in ISA
   3.0 (power9).  */
BU_FLOAT128_HW_1 (SQRTF128_ODD,  "sqrtf128_round_to_odd",  FP, sqrtkf2_odd)
BU_FLOAT128_HW_1 (TRUNCF128_ODD, "truncf128_round_to_odd", FP, trunckfdf2_odd)
BU_FLOAT128_HW_2 (ADDF128_ODD,   "addf128_round_to_odd",   FP, addkf3_odd)
BU_FLOAT128_HW_2 (SUBF128_ODD,   "subf128_round_to_odd",   FP, subkf3_odd)
BU_FLOAT128_HW_2 (MULF128_ODD,   "mulf128_round_to_odd",   FP, mulkf3_odd)
BU_FLOAT128_HW_2 (DIVF128_ODD,   "divf128_round_to_odd",   FP, divkf3_odd)
BU_FLOAT128_HW_3 (FMAF128_ODD,   "fmaf128_round_to_odd",   FP, fmakf4_odd)

/* 3 argument vector functions returning void, treated as SPECIAL,
   added in ISA 3.0 (power9).  */
BU_P9V_64BIT_AV_X (STXVL,	"stxvl",	MISC)
BU_P9V_64BIT_AV_X (XST_LEN_R,	"xst_len_r",	MISC)

/* 1 argument vector functions added in ISA 3.0 (power9). */
BU_P9V_AV_1 (VCLZLSBB_V16QI, "vclzlsbb_v16qi",	CONST,	vclzlsbb_v16qi)
BU_P9V_AV_1 (VCLZLSBB_V8HI, "vclzlsbb_v8hi",	CONST,	vclzlsbb_v8hi)
BU_P9V_AV_1 (VCLZLSBB_V4SI, "vclzlsbb_v4si",	CONST,	vclzlsbb_v4si)
BU_P9V_AV_1 (VCTZLSBB_V16QI, "vctzlsbb_v16qi",	CONST,	vctzlsbb_v16qi)
BU_P9V_AV_1 (VCTZLSBB_V8HI, "vctzlsbb_v8hi",	CONST,	vctzlsbb_v8hi)
BU_P9V_AV_1 (VCTZLSBB_V4SI, "vctzlsbb_v4si",	CONST,	vctzlsbb_v4si)

/* Built-in support for Power9 "VSU option" string operations includes
   new awareness of the "vector compare not equal" (vcmpneb, vcmpneb.,
   vcmpneh, vcmpneh., vcmpnew, vcmpnew.) and "vector compare
   not equal or zero" (vcmpnezb, vcmpnezb., vcmpnezh, vcmpnezh.,
   vcmpnezw, vcmpnezw.) instructions.  */

BU_P9V_AV_2 (CMPNEB,	"vcmpneb",	CONST,	vcmpneb)
BU_P9V_AV_2 (CMPNEH,	"vcmpneh",	CONST,	vcmpneh)
BU_P9V_AV_2 (CMPNEW,	"vcmpnew",	CONST,	vcmpnew)

BU_P9V_AV_2 (VCMPNEB_P,	"vcmpneb_p",	CONST,	vector_ne_v16qi_p)
BU_P9V_AV_2 (VCMPNEH_P,	"vcmpneh_p",	CONST,	vector_ne_v8hi_p)
BU_P9V_AV_2 (VCMPNEW_P,	"vcmpnew_p",	CONST,	vector_ne_v4si_p)
BU_P9V_AV_2 (VCMPNED_P,	"vcmpned_p",	CONST,	vector_ne_v2di_p)

BU_P9V_AV_2 (VCMPNEFP_P,	"vcmpnefp_p",	CONST,	vector_ne_v4sf_p)
BU_P9V_AV_2 (VCMPNEDP_P,	"vcmpnedp_p",	CONST,	vector_ne_v2df_p)

BU_P9V_AV_2 (VCMPAEB_P,	"vcmpaeb_p",	CONST,	vector_ae_v16qi_p)
BU_P9V_AV_2 (VCMPAEH_P,	"vcmpaeh_p",	CONST,	vector_ae_v8hi_p)
BU_P9V_AV_2 (VCMPAEW_P,	"vcmpaew_p",	CONST,	vector_ae_v4si_p)
BU_P9V_AV_2 (VCMPAED_P,	"vcmpaed_p",	CONST,	vector_ae_v2di_p)

BU_P9V_AV_2 (VCMPAEFP_P,	"vcmpaefp_p",	CONST,	vector_ae_v4sf_p)
BU_P9V_AV_2 (VCMPAEDP_P,	"vcmpaedp_p",	CONST,	vector_ae_v2df_p)

BU_P9V_AV_2 (CMPNEZB,	"vcmpnezb",	CONST,	vcmpnezb)
BU_P9V_AV_2 (CMPNEZH,	"vcmpnezh",	CONST,	vcmpnezh)
BU_P9V_AV_2 (CMPNEZW,	"vcmpnezw",	CONST,	vcmpnezw)

BU_P9V_AV_P (VCMPNEZB_P,	"vcmpnezb_p",	CONST,	vector_nez_v16qi_p)
BU_P9V_AV_P (VCMPNEZH_P,	"vcmpnezh_p",	CONST,	vector_nez_v8hi_p)
BU_P9V_AV_P (VCMPNEZW_P,	"vcmpnezw_p",	CONST,	vector_nez_v4si_p)

/* ISA 3.0 Vector scalar overloaded 2 argument functions */
BU_P9V_OVERLOAD_2 (LXVL,	"lxvl")
BU_P9V_OVERLOAD_2 (XL_LEN_R,	"xl_len_r")
BU_P9V_OVERLOAD_2 (VEXTULX,	"vextulx")
BU_P9V_OVERLOAD_2 (VEXTURX,	"vexturx")
BU_P9V_OVERLOAD_2 (EXTRACT4B,  "extract4b")

/* ISA 3.0 Vector scalar overloaded 3 argument functions */
BU_P9V_OVERLOAD_3 (STXVL,	"stxvl")
BU_P9V_OVERLOAD_3 (XST_LEN_R,	"xst_len_r")
BU_P9V_OVERLOAD_3 (INSERT4B,    "insert4b")

/* Overloaded CMPNE support was implemented prior to Power 9,
   so is not mentioned here.  */
BU_P9V_OVERLOAD_2 (CMPNEZ,	"vcmpnez")

BU_P9V_OVERLOAD_P (VCMPNEZ_P,	"vcmpnez_p")
BU_P9V_OVERLOAD_2 (VCMPNE_P,	"vcmpne_p")
BU_P9V_OVERLOAD_2 (VCMPAE_P,	"vcmpae_p")

/* ISA 3.0 Vector scalar overloaded 1 argument functions */
BU_P9V_OVERLOAD_1 (VCLZLSBB,	"vclzlsbb")
BU_P9V_OVERLOAD_1 (VCTZLSBB,	"vctzlsbb")

/* 2 argument extended divide functions added in ISA 2.06.  */
BU_P7_MISC_2 (DIVWE,		"divwe",	CONST,	dive_si)
BU_P7_MISC_2 (DIVWEU,		"divweu",	CONST,	diveu_si)
BU_P7_POWERPC64_MISC_2 (DIVDE,	"divde",	CONST,	dive_di)
BU_P7_POWERPC64_MISC_2 (DIVDEU,	"divdeu",	CONST,	diveu_di)

/* 1 argument DFP (decimal floating point) functions added in ISA 2.05.  */
BU_DFP_MISC_1 (DXEX,		"dxex",		CONST,	dfp_dxex_dd)
BU_DFP_MISC_1 (DXEXQ,		"dxexq",	CONST,	dfp_dxex_td)

/* 2 argument DFP (decimal floating point) functions added in ISA 2.05.  */
BU_DFP_MISC_2 (DDEDPD,		"ddedpd",	CONST,	dfp_ddedpd_dd)
BU_DFP_MISC_2 (DDEDPDQ,		"ddedpdq",	CONST,	dfp_ddedpd_td)
BU_DFP_MISC_2 (DENBCD,		"denbcd",	CONST,	dfp_denbcd_dd)
BU_DFP_MISC_2 (DENBCDQ,		"denbcdq",	CONST,	dfp_denbcd_td)
BU_DFP_MISC_2 (DIEX,		"diex",		CONST,	dfp_diex_dd)
BU_DFP_MISC_2 (DIEXQ,		"diexq",	CONST,	dfp_diex_td)
BU_DFP_MISC_2 (DSCLI,		"dscli",	CONST,	dfp_dscli_dd)
BU_DFP_MISC_2 (DSCLIQ,		"dscliq",	CONST,	dfp_dscli_td)
BU_DFP_MISC_2 (DSCRI,		"dscri",	CONST,	dfp_dscri_dd)
BU_DFP_MISC_2 (DSCRIQ,		"dscriq",	CONST,	dfp_dscri_td)

/* 0 argument void function that we pretend was added in ISA 2.06.
   It's a special nop recognized by 2018+ firmware for P7 and up,
   with speculation barrier semantics.  */
BU_P7_MISC_X (SPEC_BARRIER,	"ppc_speculation_barrier",	MISC)

/* 1 argument BCD functions added in ISA 2.06.  */
BU_P7_MISC_1 (CDTBCD,		"cdtbcd",	CONST,	cdtbcd)
BU_P7_MISC_1 (CBCDTD,		"cbcdtd",	CONST,	cbcdtd)

/* 2 argument BCD functions added in ISA 2.06.  */
BU_P7_MISC_2 (ADDG6S,		"addg6s",	CONST,	addg6s)

/* 3 argument BCD functions added in ISA 2.07.  */
BU_P8V_MISC_3 (BCDADD,		"bcdadd",	CONST,	bcdadd)
BU_P8V_MISC_3 (BCDADD_LT,	"bcdadd_lt",	CONST,	bcdadd_lt)
BU_P8V_MISC_3 (BCDADD_EQ,	"bcdadd_eq",	CONST,	bcdadd_eq)
BU_P8V_MISC_3 (BCDADD_GT,	"bcdadd_gt",	CONST,	bcdadd_gt)
BU_P8V_MISC_3 (BCDADD_OV,	"bcdadd_ov",	CONST,	bcdadd_unordered)
BU_P8V_MISC_3 (BCDSUB,		"bcdsub",	CONST,	bcdsub)
BU_P8V_MISC_3 (BCDSUB_LT,	"bcdsub_lt",	CONST,	bcdsub_lt)
BU_P8V_MISC_3 (BCDSUB_EQ,	"bcdsub_eq",	CONST,	bcdsub_eq)
BU_P8V_MISC_3 (BCDSUB_GT,	"bcdsub_gt",	CONST,	bcdsub_gt)
BU_P8V_MISC_3 (BCDSUB_OV,	"bcdsub_ov",	CONST,	bcdsub_unordered)

/* 2 argument pack/unpack 128-bit floating point types.  */
BU_DFP_MISC_2 (PACK_TD,		"pack_dec128",		CONST,	packtd)
BU_DFP_MISC_2 (UNPACK_TD,	"unpack_dec128",	CONST,	unpacktd)

/* 0 argument general-purpose register functions added in ISA 3.0 (power9).  */
BU_P9_MISC_0 (DARN_32,		"darn_32", 		MISC, darn_32)
BU_P9_64BIT_MISC_0 (DARN_RAW,	"darn_raw", 		MISC, darn_raw)
BU_P9_64BIT_MISC_0 (DARN,	"darn",			MISC, darn)

BU_LDBL128_2 (PACK_TF,		"pack_longdouble",	CONST,	packtf)
BU_LDBL128_2 (UNPACK_TF,	"unpack_longdouble",	CONST,	unpacktf)

BU_IBM128_2 (PACK_IF,		"pack_ibm128",		CONST,	packif)
BU_IBM128_2 (UNPACK_IF,		"unpack_ibm128",	CONST,	unpackif)

BU_P7_MISC_2 (PACK_V1TI,	"pack_vector_int128",	CONST,	packv1ti)
BU_P7_MISC_2 (UNPACK_V1TI,	"unpack_vector_int128",	CONST,	unpackv1ti)

/* 2 argument DFP (Decimal Floating Point) functions added in ISA 3.0.  */
BU_P9_DFP_MISC_2 (TSTSFI_LT_DD, "dtstsfi_lt_dd", CONST, dfptstsfi_lt_dd)
BU_P9_DFP_MISC_2 (TSTSFI_LT_TD, "dtstsfi_lt_td", CONST, dfptstsfi_lt_td)

BU_P9_DFP_MISC_2 (TSTSFI_EQ_DD, "dtstsfi_eq_dd", CONST, dfptstsfi_eq_dd)
BU_P9_DFP_MISC_2 (TSTSFI_EQ_TD, "dtstsfi_eq_td", CONST, dfptstsfi_eq_td)

BU_P9_DFP_MISC_2 (TSTSFI_GT_DD, "dtstsfi_gt_dd", CONST, dfptstsfi_gt_dd)
BU_P9_DFP_MISC_2 (TSTSFI_GT_TD, "dtstsfi_gt_td", CONST, dfptstsfi_gt_td)

BU_P9_DFP_MISC_2 (TSTSFI_OV_DD, "dtstsfi_ov_dd", CONST, dfptstsfi_unordered_dd)
BU_P9_DFP_MISC_2 (TSTSFI_OV_TD, "dtstsfi_ov_td", CONST, dfptstsfi_unordered_td)

/* 2 argument overloaded DFP functions added in ISA 3.0.  */
BU_P9_DFP_OVERLOAD_2 (TSTSFI_LT,	"dtstsfi_lt")
BU_P9_DFP_OVERLOAD_2 (TSTSFI_LT_DD,	"dtstsfi_lt_dd")
BU_P9_DFP_OVERLOAD_2 (TSTSFI_LT_TD,	"dtstsfi_lt_td")

BU_P9_DFP_OVERLOAD_2 (TSTSFI_EQ,	"dtstsfi_eq")
BU_P9_DFP_OVERLOAD_2 (TSTSFI_EQ_DD,	"dtstsfi_eq_dd")
BU_P9_DFP_OVERLOAD_2 (TSTSFI_EQ_TD,	"dtstsfi_eq_td")

BU_P9_DFP_OVERLOAD_2 (TSTSFI_GT,	"dtstsfi_gt")
BU_P9_DFP_OVERLOAD_2 (TSTSFI_GT_DD,	"dtstsfi_gt_dd")
BU_P9_DFP_OVERLOAD_2 (TSTSFI_GT_TD,	"dtstsfi_gt_td")

BU_P9_DFP_OVERLOAD_2 (TSTSFI_OV,	"dtstsfi_ov")
BU_P9_DFP_OVERLOAD_2 (TSTSFI_OV_DD,	"dtstsfi_ov_dd")
BU_P9_DFP_OVERLOAD_2 (TSTSFI_OV_TD,	"dtstsfi_ov_td")

/* 1 argument vector functions added in ISA 3.0 (power9).  */
BU_P9V_AV_1 (VCTZB,		"vctzb",		CONST,  ctzv16qi2)
BU_P9V_AV_1 (VCTZH,		"vctzh",		CONST,  ctzv8hi2)
BU_P9V_AV_1 (VCTZW,		"vctzw",		CONST,  ctzv4si2)
BU_P9V_AV_1 (VCTZD,		"vctzd",		CONST,  ctzv2di2)
BU_P9V_AV_1 (VPRTYBD,		"vprtybd",		CONST,  parityv2di2)
BU_P9V_AV_1 (VPRTYBQ,		"vprtybq",		CONST,  parityv1ti2)
BU_P9V_AV_1 (VPRTYBW,		"vprtybw",		CONST,  parityv4si2)

/* ISA 3.0 vector overloaded 1 argument functions.  */
BU_P9V_OVERLOAD_1 (VCTZ,	"vctz")
BU_P9V_OVERLOAD_1 (VCTZB,	"vctzb")
BU_P9V_OVERLOAD_1 (VCTZH,	"vctzh")
BU_P9V_OVERLOAD_1 (VCTZW,	"vctzw")
BU_P9V_OVERLOAD_1 (VCTZD,	"vctzd")
BU_P9V_OVERLOAD_1 (VPRTYB,	"vprtyb")
BU_P9V_OVERLOAD_1 (VPRTYBD,	"vprtybd")
BU_P9V_OVERLOAD_1 (VPRTYBQ,	"vprtybq")
BU_P9V_OVERLOAD_1 (VPRTYBW,	"vprtybw")
BU_P9V_OVERLOAD_1 (VPARITY_LSBB,	"vparity_lsbb")

/* 2 argument functions added in ISA 3.0 (power9).  */
BU_P9_2 (CMPRB,	"byte_in_range",	CONST,	cmprb)
BU_P9_2 (CMPRB2,	"byte_in_either_range",	CONST,	cmprb2)
BU_P9_64BIT_2 (CMPEQB,	"byte_in_set",	CONST,	cmpeqb)

/* 2 argument overloaded functions added in ISA 3.0 (power9).  */
BU_P9_OVERLOAD_2 (CMPRB,	"byte_in_range")
BU_P9_OVERLOAD_2 (CMPRB2,	"byte_in_either_range")
BU_P9_OVERLOAD_2 (CMPEQB,	"byte_in_set")

/* 1 argument crypto functions.  */
BU_CRYPTO_1 (VSBOX,		"vsbox",	  CONST, crypto_vsbox)

/* 2 argument crypto functions.  */
BU_CRYPTO_2 (VCIPHER,		"vcipher",	  CONST, crypto_vcipher)
BU_CRYPTO_2 (VCIPHERLAST,	"vcipherlast",	  CONST, crypto_vcipherlast)
BU_CRYPTO_2 (VNCIPHER,		"vncipher",	  CONST, crypto_vncipher)
BU_CRYPTO_2 (VNCIPHERLAST,	"vncipherlast",	  CONST, crypto_vncipherlast)
BU_CRYPTO_2A (VPMSUMB,		"vpmsumb",	  CONST, crypto_vpmsumb)
BU_CRYPTO_2A (VPMSUMH,		"vpmsumh",	  CONST, crypto_vpmsumh)
BU_CRYPTO_2A (VPMSUMW,		"vpmsumw",	  CONST, crypto_vpmsumw)
BU_CRYPTO_2A (VPMSUMD,		"vpmsumd",	  CONST, crypto_vpmsumd)

/* 3 argument crypto functions.  */
BU_CRYPTO_3A (VPERMXOR_V2DI,	"vpermxor_v2di",  CONST, crypto_vpermxor_v2di)
BU_CRYPTO_3A (VPERMXOR_V4SI,	"vpermxor_v4si",  CONST, crypto_vpermxor_v4si)
BU_CRYPTO_3A (VPERMXOR_V8HI,	"vpermxor_v8hi",  CONST, crypto_vpermxor_v8hi)
BU_CRYPTO_3A (VPERMXOR_V16QI,	"vpermxor_v16qi", CONST, crypto_vpermxor_v16qi)
BU_CRYPTO_3 (VSHASIGMAW,	"vshasigmaw",	  CONST, crypto_vshasigmaw)
BU_CRYPTO_3 (VSHASIGMAD,	"vshasigmad",	  CONST, crypto_vshasigmad)

/* 2 argument crypto overloaded functions.  */
BU_CRYPTO_OVERLOAD_2A (VPMSUM,	 "vpmsum")

/* 3 argument crypto overloaded functions.  */
BU_CRYPTO_OVERLOAD_3A (VPERMXOR,	 "vpermxor")
BU_CRYPTO_OVERLOAD_3 (VSHASIGMA, "vshasigma")


/* HTM functions.  */
BU_HTM_1  (TABORT,	"tabort",	CR,	tabort)
BU_HTM_3  (TABORTDC,	"tabortdc",	CR,	tabortdc)
BU_HTM_3  (TABORTDCI,	"tabortdci",	CR,	tabortdci)
BU_HTM_3  (TABORTWC,	"tabortwc",	CR,	tabortwc)
BU_HTM_3  (TABORTWCI,	"tabortwci",	CR,	tabortwci)
BU_HTM_1  (TBEGIN,	"tbegin",	CR,	tbegin)
BU_HTM_0  (TCHECK,	"tcheck",	CR,	tcheck)
BU_HTM_1  (TEND,	"tend",		CR,	tend)
BU_HTM_0  (TENDALL,	"tendall",	CR,	tend)
BU_HTM_0  (TRECHKPT,	"trechkpt",	CR,	trechkpt)
BU_HTM_1  (TRECLAIM,	"treclaim",	CR,	treclaim)
BU_HTM_0  (TRESUME,	"tresume",	CR,	tsr)
BU_HTM_0  (TSUSPEND,	"tsuspend",	CR,	tsr)
BU_HTM_1  (TSR,		"tsr",		CR,	tsr)
BU_HTM_0  (TTEST,	"ttest",	CR,	ttest)

BU_HTM_0  (GET_TFHAR,	"get_tfhar",	SPR,	nothing)
BU_HTM_V1 (SET_TFHAR,	"set_tfhar",	SPR,	nothing)
BU_HTM_0  (GET_TFIAR,	"get_tfiar",	SPR,	nothing)
BU_HTM_V1 (SET_TFIAR,	"set_tfiar",	SPR,	nothing)
BU_HTM_0  (GET_TEXASR,	"get_texasr",	SPR,	nothing)
BU_HTM_V1 (SET_TEXASR,	"set_texasr",	SPR,	nothing)
BU_HTM_0  (GET_TEXASRU,	"get_texasru",	SPR,	nothing)
BU_HTM_V1 (SET_TEXASRU,	"set_texasru",	SPR,	nothing)


/* 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,	divv2sf3)
BU_PAIRED_2 (ADDV2SF3,	      "addv2sf3",	FP,	addv2sf3)
BU_PAIRED_2 (SUBV2SF3,	      "subv2sf3",	FP,	subv2sf3)
BU_PAIRED_2 (MULV2SF3,	      "mulv2sf3",	FP,	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,	absv2sf2)
BU_PAIRED_1 (NABSV2SF2,	      "nabsv2sf2",	CONST,	nabsv2sf2)
BU_PAIRED_1 (NEGV2SF2,	      "negv2sf2",	CONST,	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)

/* 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)

BU_SPECIAL_X (RS6000_BUILTIN_MFFS, "__builtin_mffs",
	      RS6000_BTM_ALWAYS, RS6000_BTC_MISC)

RS6000_BUILTIN_X (RS6000_BUILTIN_MTFSF, "__builtin_mtfsf",
	          RS6000_BTM_ALWAYS,
	          RS6000_BTC_MISC | RS6000_BTC_UNARY | RS6000_BTC_VOID,
		  CODE_FOR_rs6000_mtfsf)

BU_SPECIAL_X (RS6000_BUILTIN_CPU_INIT, "__builtin_cpu_init",
	      RS6000_BTM_ALWAYS, RS6000_BTC_MISC)

BU_SPECIAL_X (RS6000_BUILTIN_CPU_IS, "__builtin_cpu_is",
	      RS6000_BTM_ALWAYS, RS6000_BTC_MISC)

BU_SPECIAL_X (RS6000_BUILTIN_CPU_SUPPORTS, "__builtin_cpu_supports",
	      RS6000_BTM_ALWAYS, RS6000_BTC_MISC)

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