rs6000-string.c (expand_strn_compare): Handle -m32 correctly.
authorAaron Sawdey <acsawdey@linux.ibm.com>
Fri, 22 Jun 2018 15:36:31 +0000 (15:36 +0000)
committerAaron Sawdey <acsawdey@gcc.gnu.org>
Fri, 22 Jun 2018 15:36:31 +0000 (10:36 -0500)
2018-06-22  Aaron Sawdey  <acsawdey@linux.ibm.com>

* config/rs6000/rs6000-string.c (expand_strn_compare): Handle -m32
correctly.

From-SVN: r261905

gcc/ChangeLog
gcc/config/rs6000/rs6000-string.c

index 58729e76dbbde995429195443b9e41733bde116a..30dbbbdbd179595a0c88808b41219574e25400c9 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-22  Aaron Sawdey  <acsawdey@linux.ibm.com>
+
+       * config/rs6000/rs6000-string.c (expand_strn_compare): Handle -m32
+       correctly.
+
 2018-06-22  Martin Liska  <mliska@suse.cz>
 
         PR tree-optimization/86263
index 8d9afc41b8f48108f84f04d5994b6bf902e935df..7e49568a1ed9ea375078d7141733ecc74585f28a 100644 (file)
@@ -1925,20 +1925,15 @@ expand_strn_compare (rtx operands[], int no_length)
          /* -m32 -mpowerpc64 results in word_mode being DImode even
             though otherwise it is 32-bit. The length arg to strncmp
             is a size_t which will be the same size as pointers.  */
-         rtx len_rtx;
-         if (TARGET_64BIT)
-           len_rtx = gen_reg_rtx (DImode);
-         else
-           len_rtx = gen_reg_rtx (SImode);
-
-         emit_move_insn (len_rtx, bytes_rtx);
+         rtx len_rtx = gen_reg_rtx (Pmode);
+         emit_move_insn (len_rtx, gen_int_mode (bytes, Pmode));
 
          tree fun = builtin_decl_explicit (BUILT_IN_STRNCMP);
          emit_library_call_value (XEXP (DECL_RTL (fun), 0),
                                   target, LCT_NORMAL, GET_MODE (target),
                                   force_reg (Pmode, src1_addr), Pmode,
                                   force_reg (Pmode, src2_addr), Pmode,
-                                  len_rtx, GET_MODE (len_rtx));
+                                  len_rtx, Pmode);
        }
 
       rtx fin_ref = gen_rtx_LABEL_REF (VOIDmode, final_label);
@@ -2126,18 +2121,12 @@ expand_strn_compare (rtx operands[], int no_length)
        }
       else
        {
-         rtx len_rtx;
-         if (TARGET_64BIT)
-           len_rtx = gen_reg_rtx (DImode);
-         else
-           len_rtx = gen_reg_rtx (SImode);
-
-         emit_move_insn (len_rtx, GEN_INT (bytes - compare_length));
+         rtx len_rtx = gen_reg_rtx (Pmode);
+         emit_move_insn (len_rtx, gen_int_mode (bytes - compare_length, Pmode));
          tree fun = builtin_decl_explicit (BUILT_IN_STRNCMP);
          emit_library_call_value (XEXP (DECL_RTL (fun), 0),
                                   target, LCT_NORMAL, GET_MODE (target),
-                                  src1, Pmode, src2, Pmode,
-                                  len_rtx, GET_MODE (len_rtx));
+                                  src1, Pmode, src2, Pmode, len_rtx, Pmode);
        }
 
       rtx fin_ref = gen_rtx_LABEL_REF (VOIDmode, final_label);