builtins.c (expand_builtin_memcmp): Do expansion even with !HAVE_cmpstrsi, do libcall...
authorJan Hubicka <jh@suse.cz>
Wed, 12 Apr 2000 14:18:56 +0000 (14:18 +0000)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 12 Apr 2000 14:18:56 +0000 (14:18 +0000)
* builtins.c (expand_builtin_memcmp): Do expansion even with
!HAVE_cmpstrsi, do libcall when gen_strcmpsi fails.

From-SVN: r33107

gcc/ChangeLog
gcc/builtins.c

index c36a8d31f37bc71ee26fd278e9e0cc0b84530f96..b06b6472d0d5b950374c9f364e8a5e5178df9663 100644 (file)
@@ -1,5 +1,8 @@
 Wed Apr 12 15:54:11 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.
+
        * calls.c (expand_call): Do NO_DEFER_POP unconditionally once
        stack is propertly aligned; add sanity checking for aligned
        stack pointer.
index 1590d38c873e9161b92ec46880ed65d94b169136..9159a1b2c8f51e7dfb0418b9383ade291586ab3e 100644 (file)
@@ -1628,15 +1628,15 @@ expand_builtin_memcmp (exp, arglist, target)
       || 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 arg1_rtx, arg2_rtx, arg3_rtx;
     rtx result;
+    rtx insn;
 
     int arg1_align
       = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
@@ -1656,10 +1656,25 @@ expand_builtin_memcmp (exp, arglist, target)
           && 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))));
+    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));