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


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

altivec predicates


this may very well be the ugliest altivec patch yet.

it turns out that the compare predicates put their result into a
vector register, but this result register is not available in
the high level interface.  the predicate instructions
set some magic bits in CR6, and those are used instead by
the high level interface.

they work something like this:

	altivecPred vecDST, vecSRC1, vecSRC2  ;; set magic in CR6

	(CR6 being bits 24-27 of the CR)

to complicates matters, the different high level interfaces
(vec_any_blah(), vec_all_blah(), etc) use the same exact underlying
instructions, but expect different results in the 4 bits of
CR6.  even worse, it's not even an 1 or 0 type of thing, but a
1000 or 1010 or 0000-- or some oddity like that.

i came up with a least horrible approach that has predicate builtins
looking like this:

	__builtin_altivec_predicate_v4si ("insn_name",
									  INFO_ON_HOW_TO_GET_CR6,
									  src1,
									  src2);

this builtin will return 1 or 0.

this explains a lot of the apple crud as relates to predicates.
in my defense, it's not as ugly as that, but still pretty
ugly.

this patch rewrites the predicates to work as...well.. predicates,
returning 1 or 0 depending on the magic in CR6.

i also documented the fact that accessing the altivec builtins
directly is not even remotely supported, and will hopefully
change in the future ;-).

tested on darwin.

ok?

--
Aldy Hernandez                                E-mail: aldyh@redhat.com
Professional Gypsy Lost in Australia
Red Hat, Inc.

2002-01-31  Aldy Hernandez  <aldyh@redhat.com>

	* doc/extend.texi: Warn about unsupported usage of altivec
	builtins.

	* config/rs6000/rs6000.md (altivec_vcmp*_p): Remove.
	(altivec_predicate_*): New.
	(cr6_test_for_*): New.

	* config/rs6000/rs6000.h (rs6000_builtins): Add
	ALTIVEC_BUILTIN_PREDICATE_*.
	(rs6000_builtins): Remove _p predicates.

	* config/rs6000/altivec.h: Rewrite predicates to use new builtins.

	* config/rs6000/rs6000.c (bdesc_altivec_preds): New.
	(bdesc_2arg): Remove altivec predicates.
	(altivec_expand_builtin): Handle predicates.
	(altivec_init_builtins): Handle predicates.
	(altivec_expand_predicate_builtin): New.

Index: doc/extend.texi
===================================================================
RCS file: /cvs/uberbaum/gcc/doc/extend.texi,v
retrieving revision 1.57
diff -c -p -r1.57 extend.texi
*** extend.texi	2002/01/23 02:10:39	1.57
--- extend.texi	2002/01/31 04:17:05
*************** The following functions are made availab
*** 4894,4899 ****
--- 4894,4904 ----
   @option{-mabi=altivec}.  The functions implement the functionality
   described in Motorola's AltiVec Programming Interface Manual.

+ @emph{Note:} Only the @code{<altivec.h>} interface is supported.
+ Internally, GCC uses builtins to achieve the functionality in
+ the aforementioned header file, but they are not supported and
+ are subject to change without notice.
+
   @smallexample
   vector signed char vec_abs (vector signed char, vector signed char);
   vector signed short vec_abs (vector signed short, vector signed short);
Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/uberbaum/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.279
diff -c -p -r1.279 rs6000.c
*** rs6000.c	2002/01/15 07:23:18	1.279
--- rs6000.c	2002/01/31 04:17:09
*************** static rtx rs6000_expand_builtin PARAMS
*** 163,168 ****
--- 163,169 ----
   static rtx altivec_expand_builtin PARAMS ((tree, rtx));
   static rtx altivec_expand_unop_builtin PARAMS ((enum insn_code, tree, 
rtx));
   static rtx altivec_expand_binop_builtin PARAMS ((enum insn_code, tree, 
rtx));
+ static rtx altivec_expand_predicate_builtin PARAMS ((enum insn_code, 
tree, rtx));
   static rtx altivec_expand_ternop_builtin PARAMS ((enum insn_code, 
tree, rtx));
   static rtx altivec_expand_stv_builtin PARAMS ((enum insn_code, tree));
   static void rs6000_parse_abi_options PARAMS ((void));
*************** static const struct builtin_description
*** 3352,3372 ****
     { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, 
"__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
     { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, 
"__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
     { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", 
ALTIVEC_BUILTIN_VXOR },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp_p, 
"__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp_p, 
"__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb_p, 
"__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh_p, 
"__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw_p, 
"__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp_p, 
"__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp_p, 
"__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb_p, 
"__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh_p, 
"__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw_p, 
"__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub_p, 
"__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh_p, 
"__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
-   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw_p, 
"__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
   };

   /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
      foo (VECa).  */

--- 3353,3370 ----
     { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, 
"__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
     { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, 
"__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
     { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", 
ALTIVEC_BUILTIN_VXOR },
   };

+ /* AltiVec predicates.  */
+
+ static const struct builtin_description bdesc_altivec_preds[] =
+ {
+   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, 
"__builtin_altivec_predicate_v4si", ALTIVEC_BUILTIN_PREDICATE_V4SI },
+   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, 
"__builtin_altivec_predicate_v4sf", ALTIVEC_BUILTIN_PREDICATE_V4SF },
+   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, 
"__builtin_altivec_predicate_v8hi", ALTIVEC_BUILTIN_PREDICATE_V8HI },
+   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, 
"__builtin_altivec_predicate_v16qi", ALTIVEC_BUILTIN_PREDICATE_V16QI },
+ };
+
   /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
      foo (VECa).  */

*************** altivec_expand_unop_builtin (icode, argl
*** 3422,3427 ****
--- 3420,3426 ----

     return target;
   }
+
   static rtx
   altivec_expand_binop_builtin (icode, arglist, target)
        enum insn_code icode;
*************** altivec_expand_binop_builtin (icode, arg
*** 3460,3465 ****
--- 3459,3563 ----
   }

   static rtx
+ altivec_expand_predicate_builtin (icode, arglist, target)
+      enum insn_code icode;
+      tree arglist;
+      rtx target;
+ {
+   rtx pat, scratch;
+   tree opcode_str = TREE_VALUE (arglist);
+   tree cr6_form = TREE_VALUE (TREE_CHAIN (arglist));
+   tree arg0 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
+   tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN 
(arglist))));
+   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
+   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
+   enum machine_mode tmode = SImode;
+   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
+   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
+   int cr6_form_int;
+   char *opcode;
+
+   if (TREE_CODE (cr6_form) != INTEGER_CST)
+     {
+       error ("argument 2 of __builtin_altivec_predicate must be a 
constant");
+       return NULL_RTX;
+     }
+   else
+     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
+
+   /* There has got to be a better way to get a string out.  */
+   while (TREE_CODE (opcode_str) == NOP_EXPR
+ 	 || TREE_CODE (opcode_str) == CONVERT_EXPR)
+     opcode_str = TREE_OPERAND (opcode_str, 0);
+   if (TREE_CODE (opcode_str) != ADDR_EXPR)
+     {
+       error ("argument 1 of __builtin_altivec_predicate must be a 
string constant");
+       return NULL_RTX;
+     }
+   opcode_str = TREE_OPERAND (opcode_str, 0);
+   if (TREE_CODE (opcode_str) != STRING_CST)
+     {
+       error ("argument 1 of __builtin_altivec_predicate must be a 
string constant");
+       return NULL_RTX;
+     }
+   opcode = TREE_STRING_POINTER (opcode_str);
+
+   if (mode0 != mode1)
+     abort ();
+
+   /* If we have invalid arguments, bail out before generating bad 
rtl.  */
+   if (arg0 == error_mark_node || arg1 == error_mark_node)
+     return NULL_RTX;
+
+   if (target == 0
+       || GET_MODE (target) != tmode
+       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
+     target = gen_reg_rtx (tmode);
+
+   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
+     op0 = copy_to_mode_reg (mode0, op0);
+   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
+     op1 = copy_to_mode_reg (mode1, op1);
+
+   scratch = gen_reg_rtx (mode0);
+
+   pat = GEN_FCN (icode) (scratch, op0, op1,
+ 			 gen_rtx (SYMBOL_REF, Pmode, opcode));
+   if (! pat)
+     return 0;
+   emit_insn (pat);
+
+   /* The vec_any* and vec_all* predicates use the same opcodes for two
+      different operations, but the bits in CR6 will be different
+      depending on what information we want.  So we have to play tricks
+      with CR6 to get the right bits out.
+
+      If you think this is disgusting, look at the specs for the
+      AltiVec predicates.  */
+
+      switch (cr6_form_int)
+        {
+        case 0:
+ 	 emit_insn (gen_cr6_test_for_zero (target));
+ 	 break;
+        case 1:
+ 	 emit_insn (gen_cr6_test_for_zero_reverse (target));
+ 	 break;
+        case 2:
+ 	 emit_insn (gen_cr6_test_for_lt (target));
+ 	 break;
+        case 3:
+ 	 emit_insn (gen_cr6_test_for_lt_reverse (target));
+ 	 break;
+        default:
+ 	 error ("argument 2 of __builtin_altivec_predicate is out of range");
+ 	 break;
+        }
+
+   return target;
+ }
+
+ static rtx
   altivec_expand_stv_builtin (icode, arglist)
        enum insn_code icode;
        tree arglist;
*************** altivec_expand_builtin (exp, target)
*** 3830,3835 ****
--- 3928,3939 ----
       if (d->code == fcode)
         return altivec_expand_binop_builtin (d->icode, arglist, target);

+   /* Expand the AltiVec predicates.  */
+   d = (struct builtin_description *) bdesc_altivec_preds;
+   for (i = 0; i < sizeof (bdesc_altivec_preds) / sizeof *d; i++, d++)
+     if (d->code == fcode)
+       return altivec_expand_predicate_builtin (d->icode, arglist, 
target);
+
     /* LV* are funky.  We initialized them differently.  */
     switch (fcode)
       {
*************** altivec_init_builtins (void)
*** 4265,4270 ****
--- 4369,4410 ----
   				      tree_cons (NULL_TREE, V16QI_type_node,
   						 endlink)));

+   tree int_ftype_pchar_int_v4si_v4si
+     = build_function_type
+     (integer_type_node,
+      tree_cons (NULL_TREE, pchar_type_node,
+ 		tree_cons (NULL_TREE, integer_type_node,
+ 			   tree_cons (NULL_TREE, V4SI_type_node,
+ 				      tree_cons (NULL_TREE, V4SI_type_node,
+ 						 endlink)))));
+
+   tree int_ftype_pchar_int_v4sf_v4sf
+     = build_function_type
+     (integer_type_node,
+      tree_cons (NULL_TREE, pchar_type_node,
+ 		tree_cons (NULL_TREE, integer_type_node,
+ 			   tree_cons (NULL_TREE, V4SF_type_node,
+ 				      tree_cons (NULL_TREE, V4SF_type_node,
+ 						 endlink)))));
+
+   tree int_ftype_pchar_int_v8hi_v8hi
+     = build_function_type
+     (integer_type_node,
+      tree_cons (NULL_TREE, pchar_type_node,
+ 		tree_cons (NULL_TREE, integer_type_node,
+ 			   tree_cons (NULL_TREE, V8HI_type_node,
+ 				      tree_cons (NULL_TREE, V8HI_type_node,
+ 						 endlink)))));
+
+   tree int_ftype_pchar_int_v16qi_v16qi
+     = build_function_type
+     (integer_type_node,
+      tree_cons (NULL_TREE, pchar_type_node,
+ 		tree_cons (NULL_TREE, integer_type_node,
+ 			   tree_cons (NULL_TREE, V16QI_type_node,
+ 				      tree_cons (NULL_TREE, V16QI_type_node,
+ 						 endlink)))));
+
     tree v16qi_ftype_int_pvoid
       = build_function_type (V16QI_type_node,
   			   tree_cons (NULL_TREE, integer_type_node,
*************** altivec_init_builtins (void)
*** 4411,4416 ****
--- 4551,4586 ----
     d = (struct builtin_description *) bdesc_dst;
     for (i = 0; i < sizeof (bdesc_dst) / sizeof *d; i++, d++)
       def_builtin (d->mask, d->name, void_ftype_pvoid_int_char, d->code);
+
+   /* Initialize the predicates.  */
+   d = (struct builtin_description *) bdesc_altivec_preds;
+   for (i = 0; i < sizeof (bdesc_altivec_preds) / sizeof *d; i++, d++)
+     {
+       enum machine_mode mode1;
+       tree type;
+
+       mode1 = insn_data[d->icode].operand[1].mode;
+
+       switch (mode1)
+ 	{
+ 	case V4SImode:
+ 	  type = int_ftype_pchar_int_v4si_v4si;
+ 	  break;
+ 	case V8HImode:
+ 	  type = int_ftype_pchar_int_v8hi_v8hi;
+ 	  break;
+ 	case V16QImode:
+ 	  type = int_ftype_pchar_int_v16qi_v16qi;
+ 	  break;
+ 	case V4SFmode:
+ 	  type = int_ftype_pchar_int_v4sf_v4sf;
+ 	  break;
+ 	default:
+ 	  abort ();
+ 	}
+
+       def_builtin (d->mask, d->name, type, d->code);
+     }

     /* Add the simple binary operators.  */
     d = (struct builtin_description *) bdesc_2arg;
Index: config/rs6000/rs6000.h
===================================================================
RCS file: /cvs/uberbaum/gcc/config/rs6000/rs6000.h,v
retrieving revision 1.176
diff -c -p -r1.176 rs6000.h
*** rs6000.h	2002/01/22 02:36:52	1.176
--- rs6000.h	2002/01/31 04:17:11
*************** enum rs6000_builtins
*** 2938,2956 ****
     ALTIVEC_BUILTIN_VUPKLSB,
     ALTIVEC_BUILTIN_VUPKLPX,
     ALTIVEC_BUILTIN_VUPKLSH,
-   ALTIVEC_BUILTIN_VCMPBFP_P,
-   ALTIVEC_BUILTIN_VCMPEQFP_P,
-   ALTIVEC_BUILTIN_VCMPEQUB_P,
-   ALTIVEC_BUILTIN_VCMPEQUH_P,
-   ALTIVEC_BUILTIN_VCMPEQUW_P,
-   ALTIVEC_BUILTIN_VCMPGEFP_P,
-   ALTIVEC_BUILTIN_VCMPGTFP_P,
-   ALTIVEC_BUILTIN_VCMPGTSB_P,
-   ALTIVEC_BUILTIN_VCMPGTSH_P,
-   ALTIVEC_BUILTIN_VCMPGTSW_P,
-   ALTIVEC_BUILTIN_VCMPGTUB_P,
-   ALTIVEC_BUILTIN_VCMPGTUH_P,
-   ALTIVEC_BUILTIN_VCMPGTUW_P,
     ALTIVEC_BUILTIN_MTVSCR,
     ALTIVEC_BUILTIN_MFVSCR,
     ALTIVEC_BUILTIN_DSSALL,
--- 2938,2943 ----
*************** enum rs6000_builtins
*** 2970,2974 ****
     ALTIVEC_BUILTIN_STVEBX,
     ALTIVEC_BUILTIN_STVEHX,
     ALTIVEC_BUILTIN_STVEWX,
!   ALTIVEC_BUILTIN_STVXL
   };
--- 2957,2965 ----
     ALTIVEC_BUILTIN_STVEBX,
     ALTIVEC_BUILTIN_STVEHX,
     ALTIVEC_BUILTIN_STVEWX,
!   ALTIVEC_BUILTIN_STVXL,
!   ALTIVEC_BUILTIN_PREDICATE_V4SI,
!   ALTIVEC_BUILTIN_PREDICATE_V4SF,
!   ALTIVEC_BUILTIN_PREDICATE_V8HI,
!   ALTIVEC_BUILTIN_PREDICATE_V16QI
   };
Index: config/rs6000/rs6000.md
===================================================================
RCS file: /cvs/uberbaum/gcc/config/rs6000/rs6000.md,v
retrieving revision 1.162
diff -c -p -r1.162 rs6000.md
*** rs6000.md	2002/01/29 22:49:55	1.162
--- rs6000.md	2002/01/31 04:17:18
***************
*** 15318,15426 ****

   ;; AltiVec predicates.

! (define_insn "altivec_vcmpequb_p"
!   [(set (match_operand:V4SI 0 "register_operand" "=v")
!         (unspec:V4SI [(match_operand:V16QI 1 "register_operand" "v")
!                       (match_operand:V16QI 2 "register_operand" "v")] 
173))]
     "TARGET_ALTIVEC"
!   "vcmpequb. %0,%1,%2"
! [(set_attr "type" "veccmp")])

! (define_insn "altivec_vcmpequh_p"
!   [(set (match_operand:V4SI 0 "register_operand" "=v")
!         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
!                       (match_operand:V8HI 2 "register_operand" "v")] 
174))]
     "TARGET_ALTIVEC"
!   "vcmpequh. %0,%1,%2"
! [(set_attr "type" "veccmp")])

! (define_insn "altivec_vcmpequw_p"
!   [(set (match_operand:V4SI 0 "register_operand" "=v")
!         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
!                       (match_operand:V4SI 2 "register_operand" "v")] 
175))]
     "TARGET_ALTIVEC"
!   "vcmpequw. %0,%1,%2"
! [(set_attr "type" "veccmp")])

! (define_insn "altivec_vcmpeqfp_p"
!   [(set (match_operand:V4SI 0 "register_operand" "=v")
!         (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
!                       (match_operand:V4SF 2 "register_operand" "v")] 
176))]
     "TARGET_ALTIVEC"
!   "vcmpeqfp. %0,%1,%2"
! [(set_attr "type" "veccmp")])

! (define_insn "altivec_vcmpgtub_p"
!   [(set (match_operand:V4SI 0 "register_operand" "=v")
!         (unspec:V4SI [(match_operand:V16QI 1 "register_operand" "v")
!                       (match_operand:V16QI 2 "register_operand" "v")] 
177))]
!   "TARGET_ALTIVEC"
!   "vcmpgtub. %0,%1,%2"
! [(set_attr "type" "veccmp")])
!
! (define_insn "altivec_vcmpgtsb_p"
!   [(set (match_operand:V4SI 0 "register_operand" "=v")
!         (unspec:V4SI [(match_operand:V16QI 1 "register_operand" "v")
!                       (match_operand:V16QI 2 "register_operand" "v")] 
178))]
!   "TARGET_ALTIVEC"
!   "vcmpgtsb. %0,%1,%2"
! [(set_attr "type" "veccmp")])

! (define_insn "altivec_vcmpgtuw_p"
!   [(set (match_operand:V4SI 0 "register_operand" "=v")
!         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
!                       (match_operand:V4SI 2 "register_operand" "v")] 
179))]
     "TARGET_ALTIVEC"
!   "vcmpgtuw. %0,%1,%2"
   [(set_attr "type" "veccmp")])

! (define_insn "altivec_vcmpgtsw_p"
!   [(set (match_operand:V4SI 0 "register_operand" "=v")
!         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
!                       (match_operand:V4SI 2 "register_operand" "v")] 
180))]
     "TARGET_ALTIVEC"
!   "vcmpgtsw. %0,%1,%2"
   [(set_attr "type" "veccmp")])

! (define_insn "altivec_vcmpgefp_p"
!   [(set (match_operand:V4SI 0 "register_operand" "=v")
!         (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
!                       (match_operand:V4SF 2 "register_operand" "v")] 
181))]
     "TARGET_ALTIVEC"
!   "vcmpgefp. %0,%1,%2"
   [(set_attr "type" "veccmp")])

! (define_insn "altivec_vcmpgtfp_p"
!   [(set (match_operand:V4SI 0 "register_operand" "=v")
!         (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
!                       (match_operand:V4SF 2 "register_operand" "v")] 
182))]
     "TARGET_ALTIVEC"
!   "vcmpgtfp. %0,%1,%2"
   [(set_attr "type" "veccmp")])
-
- (define_insn "altivec_vcmpbfp_p"
-   [(set (match_operand:V4SI 0 "register_operand" "=v")
-         (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
-                       (match_operand:V4SF 2 "register_operand" "v")] 
183))]
-   "TARGET_ALTIVEC"
-   "vcmpbfp. %0,%1,%2"
- [(set_attr "type" "veccmp")])
-
- (define_insn "altivec_vcmpgtuh_p"
-   [(set (match_operand:V4SI 0 "register_operand" "=v")
-         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
-                       (match_operand:V8HI 2 "register_operand" "v")] 
184))]
-   "TARGET_ALTIVEC"
-   "vcmpgtuh. %0,%1,%2"
- [(set_attr "type" "veccmp")])
-
- (define_insn "altivec_vcmpgtsh_p"
-   [(set (match_operand:V4SI 0 "register_operand" "=v")
-         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
-                       (match_operand:V8HI 2 "register_operand" "v")] 
185))]
-   "TARGET_ALTIVEC"
-   "vcmpgtsh. %0,%1,%2"
-   [(set_attr "type" "veccmp")])

   (define_insn "altivec_mtvscr"
     [(unspec [(match_operand:V4SI 0 "register_operand" "v")] 186)]
--- 15318,15395 ----

   ;; AltiVec predicates.

! (define_expand "cr6_test_for_zero"
!   [(set (match_operand:SI 0 "register_operand" "=r")
! 	(eq:SI (reg:CC 74)
! 	       (const_int 0)))]
     "TARGET_ALTIVEC"
!   "")

! (define_expand "cr6_test_for_zero_reverse"
!   [(set (match_operand:SI 0 "register_operand" "=r")
! 	(eq:SI (reg:CC 74)
! 	       (const_int 0)))
!    (set (match_dup 0) (minus:SI (const_int 1) (match_dup 0)))]
     "TARGET_ALTIVEC"
!   "")

! (define_expand "cr6_test_for_lt"
!   [(set (match_operand:SI 0 "register_operand" "=r")
! 	(lt:SI (reg:CC 74)
! 	       (const_int 0)))]
     "TARGET_ALTIVEC"
!   "")

! (define_expand "cr6_test_for_lt_reverse"
!   [(set (match_operand:SI 0 "register_operand" "=r")
! 	(lt:SI (reg:CC 74)
! 	       (const_int 0)))
!    (set (match_dup 0) (minus:SI (const_int 1) (match_dup 0)))]
     "TARGET_ALTIVEC"
!   "")

! ;; We can get away with generating the opcode on the fly (%3 below)
! ;; because all the predicates have the same scheduling parameters.

! (define_insn "altivec_predicate_v4si"
!   [(set (reg:CC 74)
! 	(unspec:CC [(match_operand:V4SI 1 "register_operand" "v")
! 		    (match_operand:V4SI 2 "register_operand" "v")
! 		    (match_operand 3 "any_operand" "")] 173))
!    (clobber (match_scratch:V4SI 0 "=v"))]
     "TARGET_ALTIVEC"
!   "%3 %0,%1,%2"
   [(set_attr "type" "veccmp")])

! (define_insn "altivec_predicate_v4sf"
!   [(set (reg:CC 74)
! 	(unspec:CC [(match_operand:V4SF 1 "register_operand" "v")
! 		    (match_operand:V4SF 2 "register_operand" "v")
! 		    (match_operand 3 "any_operand" "")] 174))
!    (clobber (match_scratch:V4SF 0 "=v"))]
     "TARGET_ALTIVEC"
!   "%3 %0,%1,%2"
   [(set_attr "type" "veccmp")])

! (define_insn "altivec_predicate_v8hi"
!   [(set (reg:CC 74)
! 	(unspec:CC [(match_operand:V8HI 1 "register_operand" "v")
! 		    (match_operand:V8HI 2 "register_operand" "v")
! 		    (match_operand 3 "any_operand" "")] 175))
!    (clobber (match_scratch:V8HI 0 "=v"))]
     "TARGET_ALTIVEC"
!   "%3 %0,%1,%2"
   [(set_attr "type" "veccmp")])

! (define_insn "altivec_predicate_v16qi"
!   [(set (reg:CC 74)
! 	(unspec:CC [(match_operand:V16QI 1 "register_operand" "v")
! 		    (match_operand:V16QI 2 "register_operand" "v")
! 		    (match_operand 3 "any_operand" "")] 175))
!    (clobber (match_scratch:V16QI 0 "=v"))]
     "TARGET_ALTIVEC"
!   "%3 %0,%1,%2"
   [(set_attr "type" "veccmp")])

   (define_insn "altivec_mtvscr"
     [(unspec [(match_operand:V4SI 0 "register_operand" "v")] 186)]
Index: config/rs6000/altivec.h
===================================================================
RCS file: /cvs/uberbaum/gcc/config/rs6000/altivec.h,v
retrieving revision 1.4
diff -c -p -r1.4 altivec.h
*** altivec.h	2002/01/28 07:14:46	1.4
--- altivec.h	2002/01/31 04:17:19
*************** extern void __altivec_link_error_invalid
*** 47,52 ****
--- 47,57 ----

   /* Helper macros.  */

+ #define __CR6_EQ		0
+ #define __CR6_EQ_REV		1
+ #define __CR6_LT		2
+ #define __CR6_LT_REV		3
+
   #define __bin_args_eq(xtype, x, ytype, y)				\
   	(__builtin_types_compatible_p (xtype, typeof (x))		\
   	 && __builtin_types_compatible_p (ytype, typeof (y)))
*************** extern void __altivec_link_error_invalid
*** 67,74 ****

   #else /* not C++ */

! /* Hairy macros that implement the AltiVec high-level programming
!    interface for C.  */

   #define vec_add(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
--- 72,79 ----

   #else /* not C++ */

! /* You have entered the pit of despair.  Abandon all hope.  */
! /* --More-- You die.  */

   #define vec_add(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
*************** __ch (__bin_args_eq (vector unsigned cha
*** 1078,1458 ****
         (vector unsigned char) __builtin_altivec_vxor ((vector signed 
int) a1, (vector signed int) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))))

   #define vec_all_eq(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_all_ge(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_all_gt(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

! #define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (a1, a2)

   #define vec_all_le(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_all_lt(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

! #define vec_all_nan(a1) __builtin_altivec_vcmpeqfp_p (a1)

   #define vec_all_ne(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

! #define vec_all_nge(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)

! #define vec_all_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)

! #define vec_all_nle(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)

! #define vec_all_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)

! #define vec_all_numeric(a1) __builtin_altivec_vcmpeqfp_p (a1)

   #define vec_any_eq(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_any_ge(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_any_gt(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_any_le(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_any_lt(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

! #define vec_any_nan(a1) __builtin_altivec_vcmpeqfp_p (a1)

   #define vec_any_ne(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed 
char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed 
short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed 
int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) 
a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

! #define vec_any_nge(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)

! #define vec_any_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)

! #define vec_any_nle(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)

! #define vec_any_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)

! #define vec_any_numeric(a1) __builtin_altivec_vcmpeqfp_p (a1)

! #define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (a1, a2)

   #endif /* __cplusplus */

--- 1083,1465 ----
         (vector unsigned char) __builtin_altivec_vxor ((vector signed 
int) a1, (vector signed int) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))))

+ /* Predicates.  */
+
   #define vec_all_eq(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_LT, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_LT, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_LT, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_LT, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_LT, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_LT, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_LT, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_LT, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_LT, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_LT, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_LT, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_LT, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpeqfp.", __CR6_LT, 
(vector float) a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_all_ge(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_vcmpgtub_p ("*vcmpgtub.", __CR6_EQ, (vector 
signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtsb.", __CR6_EQ, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtsh.", __CR6_EQ, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtsw.", __CR6_EQ, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpgefp.", __CR6_EQ, 
(vector float) a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_all_gt(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtsb.", __CR6_LT, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtsh.", __CR6_LT, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtsw.", __CR6_LT, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpgtfp.", __CR6_LT, 
(vector float) a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

! #define vec_all_in(a1, a2) __builtin_altivec_predicate_v4sf 
("*vcmpbfp.", __CR6_EQ, a1, a2)

   #define vec_all_le(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtsb.", __CR6_EQ, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtsh.", __CR6_EQ, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtsw.", __CR6_EQ, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpgefp.", __CR6_LT, 
(vector float) a2, (vector float) a1), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_all_lt(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtsb.", __CR6_LT, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtsh.", __CR6_LT, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtsw.", __CR6_LT, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpgtfp.", __CR6_LT, 
(vector float) a2, (vector float) a1), \
       __altivec_link_error_invalid_argument ())))))))))))))

! #define vec_all_nan(a1) __builtin_altivec_predicate_v4sf 
("*vcmpeqfp.", __CR6_EQ, a1, a1)

   #define vec_all_ne(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_EQ, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_EQ, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_EQ, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_EQ, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_EQ, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_EQ, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_EQ, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_EQ, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_EQ, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_EQ, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_EQ, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_EQ, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpeqfp.", __CR6_EQ, 
(vector float) a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

! #define vec_all_nge(a1, a2) __builtin_altivec_predicate_v4sf 
("*vcmpgefp.", __CR6_EQ, a1, a2)

! #define vec_all_ngt(a1, a2) __builtin_altivec_predicate_v4sf 
("*vcmpgtfp.", __CR6_EQ, a1, a2)

! #define vec_all_nle(a1, a2) __builtin_altivec_predicate_v4sf 
("*vcmpgefp.", __CR6_EQ, a2, a1)

! #define vec_all_nlt(a1, a2) __builtin_altivec_predicate_v4sf 
("*vcmpgtfp.", __CR6_EQ, a2, a1)

! #define vec_all_numeric(a1) __builtin_altivec_predicate_v4sf 
("*vcmpeqfp.", __CR6_EQ, a1, a1)

   #define vec_any_eq(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_EQ_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_EQ_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_EQ_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_EQ_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_EQ_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_EQ_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_EQ_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_EQ_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_EQ_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_EQ_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_EQ_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_EQ_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpeqfp.", __CR6_EQ_REV, 
(vector float) a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_any_ge(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT_REV, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT_REV, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT_REV, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtsb.", __CR6_LT_REV, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT_REV, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT_REV, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT_REV, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtsh.", __CR6_LT_REV, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT_REV, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT_REV, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT_REV, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtsw.", __CR6_LT_REV, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpgefp.", __CR6_EQ_REV, 
(vector float) a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_any_gt(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtsb.", __CR6_EQ_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtsh.", __CR6_EQ_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtsw.", __CR6_EQ_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpgtfp.", __CR6_EQ_REV, 
(vector float) a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_any_le(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_LT_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtsb.", __CR6_LT_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_LT_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtsh.", __CR6_LT_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_LT_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtsw.", __CR6_LT_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpgefp.", __CR6_EQ_REV, 
(vector float) a2, (vector float) a1), \
       __altivec_link_error_invalid_argument ())))))))))))))

   #define vec_any_lt(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ_REV, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ_REV, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtub.", __CR6_EQ_REV, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpgtsb.", __CR6_EQ_REV, 
(vector signed char) a2, (vector signed char) a1), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ_REV, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ_REV, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtuh.", __CR6_EQ_REV, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpgtsh.", __CR6_EQ_REV, 
(vector signed short) a2, (vector signed short) a1), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ_REV, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ_REV, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtuw.", __CR6_EQ_REV, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpgtsw.", __CR6_EQ_REV, 
(vector signed int) a2, (vector signed int) a1), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpgtfp.", __CR6_EQ_REV, 
(vector float) a2, (vector float) a1), \
       __altivec_link_error_invalid_argument ())))))))))))))

! #define vec_any_nan(a1) __builtin_altivec_predicate_v4sf 
("*vcmpeqfp.", __CR6_LT_REV, a1, a1)

   #define vec_any_ne(a1, a2) \
   __ch (__bin_args_eq (vector signed char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_LT_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_LT_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector signed char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_LT_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, 
a2), \
!       __builtin_altivec_predicate_v16qi ("*vcmpequb.", __CR6_LT_REV, 
(vector signed char) a1, (vector signed char) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_LT_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_LT_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector signed short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_LT_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, 
a2), \
!       __builtin_altivec_predicate_v8hi ("*vcmpequh.", __CR6_LT_REV, 
(vector signed short) a1, (vector signed short) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_LT_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_LT_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_LT_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, 
a2), \
!       __builtin_altivec_predicate_v4si ("*vcmpequw.", __CR6_LT_REV, 
(vector signed int) a1, (vector signed int) a2), \
   __ch (__bin_args_eq (vector float, a1, vector float, a2), \
!       __builtin_altivec_predicate_v4sf ("*vcmpeqfp.", __CR6_LT_REV, 
(vector float) a1, (vector float) a2), \
       __altivec_link_error_invalid_argument ())))))))))))))

! #define vec_any_nge(a1, a2) __builtin_altivec_predicate_v4sf 
("*vcmpgefp.", __CR6_LT_REV, a1, a2)

! #define vec_any_ngt(a1, a2) __builtin_altivec_predicate_v4sf 
("*vcmpgtfp.", __CR6_LT_REV, a1, a2)

! #define vec_any_nle(a1, a2) __builtin_altivec_predicate_v4sf 
("*vcmpgefp.", __CR6_LT_REV, a2, a1)

! #define vec_any_nlt(a1, a2) __builtin_altivec_predicate_v4sf 
("*vcmpgtfp.", __CR6_LT_REV, a2, a1)

! #define vec_any_numeric(a1) __builtin_altivec_predicate_v4sf 
("*vcmpeqfp.", __CR6_EQ_REV, a1, a1)

! #define vec_any_out(a1, a2) __builtin_altivec_predicate_v4sf 
("*vcmpbfp.", __CR6_EQ_REV, a1, a2)

   #endif /* __cplusplus */


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