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]

Patch to allow strcmpsi to fail


Hi

While experimenting with my "pure" function code I found some problems by the
way. The expand_builtin_memcmp is not prepared for failure from cmpstrsi
pattern, so I've added code to fall back to memcmp libcall (currently only pure
libcall emited by the compiler).

Tue Apr  4 20:49:01 MET DST 2000  Jan Hubicka  <jh@suse.cz>
	* builtins.c (expand_builtin_memcmp): Do expansion even with
	!HAVE_cmpstrsi, do libcall when gen_strcmpsi fails.
Index: egcs/gcc/builtins.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/builtins.c,v
retrieving revision 1.44
diff -c -3 -p -r1.44 builtins.c
*** builtins.c	2000/04/01 00:09:21	1.44
--- builtins.c	2000/04/04 18:47:32
*************** expand_builtin_memcmp (exp, arglist, tar
*** 1627,1641 ****
        || TREE_CHAIN (TREE_CHAIN (arglist)) == 0
        || TREE_CODE (TREE_TYPE (TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))))) != INTEGER_TYPE)
      return 0;
-   else if (!HAVE_cmpstrsi)
-     return 0;
  
    {
      enum machine_mode mode;
      tree arg1 = TREE_VALUE (arglist);
      tree arg2 = TREE_VALUE (TREE_CHAIN (arglist));
      tree len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
      rtx result;
  
      int arg1_align
        = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
--- 1627,1641 ----
        || TREE_CHAIN (TREE_CHAIN (arglist)) == 0
        || TREE_CODE (TREE_TYPE (TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))))) != INTEGER_TYPE)
      return 0;
  
    {
      enum machine_mode mode;
      tree arg1 = TREE_VALUE (arglist);
      tree arg2 = TREE_VALUE (TREE_CHAIN (arglist));
      tree len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
+     rtx arg1_rtx, arg2_rtx, arg3_rtx;
      rtx result;
+     rtx insn;
  
      int arg1_align
        = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
*************** expand_builtin_memcmp (exp, arglist, tar
*** 1655,1664 ****
  	   && REGNO (result) >= FIRST_PSEUDO_REGISTER))
        result = gen_reg_rtx (insn_mode);
  
!     emit_insn (gen_cmpstrsi (result, get_memory_rtx (arg1),
! 			     get_memory_rtx (arg2),
! 			     expand_expr (len, NULL_RTX, VOIDmode, 0),
! 			     GEN_INT (MIN (arg1_align, arg2_align))));
  
      /* Return the value in the proper mode for this function.  */
      mode = TYPE_MODE (TREE_TYPE (exp));
--- 1655,1679 ----
  	   && REGNO (result) >= FIRST_PSEUDO_REGISTER))
        result = gen_reg_rtx (insn_mode);
  
!     arg1_rtx = get_memory_rtx (arg1);
!     arg2_rtx = get_memory_rtx (arg2);
!     arg3_rtx = expand_expr (len, NULL_RTX, VOIDmode, 0);
!     if (!HAVE_cmpstrsi)
!       insn = NULL_RTX;
!     else
!       insn = gen_cmpstrsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
! 			   GEN_INT (MIN (arg1_align, arg2_align)));
! 
!     if (insn)
!       emit_insn (insn);
!     else
!       emit_library_call_value (memcmp_libfunc, result, 2,
! 			       TYPE_MODE (integer_type_node), 3,
! 			       XEXP (arg1_rtx, 0), Pmode,
! 			       XEXP (arg2_rtx, 0), Pmode,
! 			       convert_to_mode (TYPE_MODE (sizetype), arg3_rtx,
! 						TREE_UNSIGNED (sizetype)),
! 			       TYPE_MODE (sizetype));
  
      /* Return the value in the proper mode for this function.  */
      mode = TYPE_MODE (TREE_TYPE (exp));

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