Commit 9725066d by Jeff Law

optabs.c (emit_cmp_insn): Immediately copy the return value from the library…

optabs.c (emit_cmp_insn): Immediately copy the return value from the library call into a pseudo register.

        * optabs.c (emit_cmp_insn): Immediately copy the return
        value from the library call into a pseudo register.
        (emit_float_lib_cmp): Likewise.

From-SVN: r11398
parent fff4998b
...@@ -2743,6 +2743,8 @@ emit_cmp_insn (x, y, comparison, size, mode, unsignedp, align) ...@@ -2743,6 +2743,8 @@ emit_cmp_insn (x, y, comparison, size, mode, unsignedp, align)
else else
#endif #endif
{ {
rtx result;
#ifdef TARGET_MEM_FUNCTIONS #ifdef TARGET_MEM_FUNCTIONS
emit_library_call (memcmp_libfunc, 0, emit_library_call (memcmp_libfunc, 0,
TYPE_MODE (integer_type_node), 3, TYPE_MODE (integer_type_node), 3,
...@@ -2759,7 +2761,14 @@ emit_cmp_insn (x, y, comparison, size, mode, unsignedp, align) ...@@ -2759,7 +2761,14 @@ emit_cmp_insn (x, y, comparison, size, mode, unsignedp, align)
TREE_UNSIGNED (integer_type_node)), TREE_UNSIGNED (integer_type_node)),
TYPE_MODE (integer_type_node)); TYPE_MODE (integer_type_node));
#endif #endif
emit_cmp_insn (hard_libcall_value (TYPE_MODE (integer_type_node)),
/* Immediately move the result of the libcall into a pseudo
register so reload doesn't clobber the value if it needs
the return register for a spill reg. */
result = gen_reg_rtx (TYPE_MODE (integer_type_node));
emit_move_insn (result,
hard_libcall_value (TYPE_MODE (integer_type_node)));
emit_cmp_insn (result,
const0_rtx, comparison, NULL_RTX, const0_rtx, comparison, NULL_RTX,
TYPE_MODE (integer_type_node), 0, 0); TYPE_MODE (integer_type_node), 0, 0);
} }
...@@ -2836,6 +2845,8 @@ emit_cmp_insn (x, y, comparison, size, mode, unsignedp, align) ...@@ -2836,6 +2845,8 @@ emit_cmp_insn (x, y, comparison, size, mode, unsignedp, align)
&& class != MODE_FLOAT) && class != MODE_FLOAT)
{ {
rtx libfunc = cmp_optab->handlers[(int) mode].libfunc; rtx libfunc = cmp_optab->handlers[(int) mode].libfunc;
rtx result;
/* If we want unsigned, and this mode has a distinct unsigned /* If we want unsigned, and this mode has a distinct unsigned
comparison routine, use that. */ comparison routine, use that. */
if (unsignedp && ucmp_optab->handlers[(int) mode].libfunc) if (unsignedp && ucmp_optab->handlers[(int) mode].libfunc)
...@@ -2844,11 +2855,16 @@ emit_cmp_insn (x, y, comparison, size, mode, unsignedp, align) ...@@ -2844,11 +2855,16 @@ emit_cmp_insn (x, y, comparison, size, mode, unsignedp, align)
emit_library_call (libfunc, 1, emit_library_call (libfunc, 1,
word_mode, 2, x, mode, y, mode); word_mode, 2, x, mode, y, mode);
/* Immediately move the result of the libcall into a pseudo
register so reload doesn't clobber the value if it needs
the return register for a spill reg. */
result = gen_reg_rtx (word_mode);
emit_move_insn (result, hard_libcall_value (word_mode));
/* Integer comparison returns a result that must be compared against 1, /* Integer comparison returns a result that must be compared against 1,
so that even if we do an unsigned compare afterward, so that even if we do an unsigned compare afterward,
there is still a value that can represent the result "less than". */ there is still a value that can represent the result "less than". */
emit_cmp_insn (result, const1_rtx,
emit_cmp_insn (hard_libcall_value (word_mode), const1_rtx,
comparison, NULL_RTX, word_mode, unsignedp, 0); comparison, NULL_RTX, word_mode, unsignedp, 0);
return; return;
} }
...@@ -2887,6 +2903,7 @@ emit_float_lib_cmp (x, y, comparison) ...@@ -2887,6 +2903,7 @@ emit_float_lib_cmp (x, y, comparison)
{ {
enum machine_mode mode = GET_MODE (x); enum machine_mode mode = GET_MODE (x);
rtx libfunc = 0; rtx libfunc = 0;
rtx result;
if (mode == HFmode) if (mode == HFmode)
switch (comparison) switch (comparison)
...@@ -3051,7 +3068,13 @@ emit_float_lib_cmp (x, y, comparison) ...@@ -3051,7 +3068,13 @@ emit_float_lib_cmp (x, y, comparison)
emit_library_call (libfunc, 1, emit_library_call (libfunc, 1,
word_mode, 2, x, mode, y, mode); word_mode, 2, x, mode, y, mode);
emit_cmp_insn (hard_libcall_value (word_mode), const0_rtx, comparison, /* Immediately move the result of the libcall into a pseudo
register so reload doesn't clobber the value if it needs
the return register for a spill reg. */
result = gen_reg_rtx (word_mode);
emit_move_insn (result, hard_libcall_value (word_mode));
emit_cmp_insn (result, const0_rtx, comparison,
NULL_RTX, word_mode, 0, 0); NULL_RTX, word_mode, 0, 0);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment