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]

patch: ppc-e500 evsplat*i fixes


The instructions evsplati and evsplatfi should take a 5-bit signed
char, not an unsigned char.  The current mechanism was working for C,
but not for C++.

Fixed thusly.

Committed to mainline and e500 branch.

Aldy

2003-08-11  Aldy Hernandez  <aldyh@redhat.com>

	* config/rs6000/rs6000.c (spe_init_builtins): Handle evsplati and
	evsplatfi here.
	(bdesc_1arg): Remove evsplati and evsplatfi.

Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.510
diff -c -p -r1.510 rs6000.c
*** config/rs6000/rs6000.c	26 Jul 2003 07:34:21 -0000	1.510
--- config/rs6000/rs6000.c	11 Aug 2003 15:21:57 -0000
*************** static struct builtin_description bdesc_
*** 5010,5017 ****
    { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
    { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
    { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
-   { 0, CODE_FOR_spe_evsplatfi, "__builtin_spe_evsplatfi", SPE_BUILTIN_EVSPLATFI },
-   { 0, CODE_FOR_spe_evsplati, "__builtin_spe_evsplati", SPE_BUILTIN_EVSPLATI },
  
    /* Place-holder.  Leave as last unary SPE builtin.  */
    { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
--- 5010,5015 ----
*************** spe_expand_builtin (exp, target, expande
*** 5754,5759 ****
--- 5752,5770 ----
        break;
      }
  
+   /* The evsplat*i instructions are not quite generic.  */
+   switch (fcode)
+     {
+     case SPE_BUILTIN_EVSPLATFI:
+       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
+ 					 arglist, target);
+     case SPE_BUILTIN_EVSPLATI:
+       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
+ 					 arglist, target);
+     default:
+       break;
+     }
+ 
    d = (struct builtin_description *) bdesc_2arg_spe;
    for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
      if (d->code == fcode)
*************** spe_init_builtins ()
*** 6209,6214 ****
--- 6220,6230 ----
  				      tree_cons (NULL_TREE, integer_type_node,
  						 endlink)));
  
+   tree v2si_ftype_signed_char
+     = build_function_type (opaque_V2SI_type_node,
+ 			   tree_cons (NULL_TREE, signed_char_type_node,
+ 				      endlink));
+ 
    /* The initialization of the simple binary and unary builtins is
       done in rs6000_common_init_builtins, but we have to enable the
       mask bits here manually because we have run out of `target_flags'
*************** spe_init_builtins ()
*** 6253,6258 ****
--- 6269,6276 ----
    def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
    def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
    def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
+   def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
+   def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
  
    /* Loads.  */
    def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);


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