This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Patch to allow strcmpsi to fail
- To: egcs-patches at egcs dot cygnus dot com, rth at cygnus dot com
- Subject: Patch to allow strcmpsi to fail
- From: Jan Hubicka <hubicka at atrey dot karlin dot mff dot cuni dot cz>
- Date: Tue, 4 Apr 2000 21:26:13 +0200
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));