optabs.c (prepare_cmp_insn): If unbaised and unsigned then bias the comparison routine return.
gcc/ 2006-01-30 Carlos O'Donell <carlos@codesourcery.com> * optabs.c (prepare_cmp_insn): If unbaised and unsigned then bias the comparison routine return. gcc/testsuite/ 2006-01-30 Carlos O'Donell <carlos@codesourcery.com> * gcc.dg/unsigned-long-compare.c: New test. From-SVN: r110409
This commit is contained in:
parent
b39f98f94d
commit
f34312c23c
@ -1,3 +1,8 @@
|
|||||||
|
2006-01-30 Carlos O'Donell <carlos@codesourcery.com>
|
||||||
|
|
||||||
|
* optabs.c (prepare_cmp_insn): If unbaised and unsigned then bias
|
||||||
|
the comparison routine return.
|
||||||
|
|
||||||
2006-01-30 Michael Matz <matz@suse.de>
|
2006-01-30 Michael Matz <matz@suse.de>
|
||||||
|
|
||||||
* global.c (find_reg): Only evict for global regs.
|
* global.c (find_reg): Only evict for global regs.
|
||||||
|
20
gcc/optabs.c
20
gcc/optabs.c
@ -3711,18 +3711,24 @@ prepare_cmp_insn (rtx *px, rtx *py, enum rtx_code *pcomparison, rtx size,
|
|||||||
result = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST_MAKE_BLOCK,
|
result = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST_MAKE_BLOCK,
|
||||||
word_mode, 2, x, mode, y, mode);
|
word_mode, 2, x, mode, y, mode);
|
||||||
|
|
||||||
|
/* There are two kinds of comparison routines. Biased routines
|
||||||
|
return 0/1/2, and unbiased routines return -1/0/1. Other parts
|
||||||
|
of gcc expect that the comparison operation is equivalent
|
||||||
|
to the modified comparison. For signed comparisons compare the
|
||||||
|
result against 1 in the biased case, and zero in the unbiased
|
||||||
|
case. For unsigned comparisons always compare against 1 after
|
||||||
|
biasing the unbased result by adding 1. This gives us a way to
|
||||||
|
represent LTU. */
|
||||||
*px = result;
|
*px = result;
|
||||||
*pmode = word_mode;
|
*pmode = word_mode;
|
||||||
if (TARGET_LIB_INT_CMP_BIASED)
|
|
||||||
/* Integer comparison returns a result that must be compared
|
|
||||||
against 1, so that even if we do an unsigned compare
|
|
||||||
afterward, there is still a value that can represent the
|
|
||||||
result "less than". */
|
|
||||||
*py = const1_rtx;
|
*py = const1_rtx;
|
||||||
else
|
|
||||||
|
if (!TARGET_LIB_INT_CMP_BIASED)
|
||||||
{
|
{
|
||||||
|
if (*punsignedp)
|
||||||
|
*px = plus_constant (result, 1);
|
||||||
|
else
|
||||||
*py = const0_rtx;
|
*py = const0_rtx;
|
||||||
*punsignedp = 1;
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
2006-01-30 Carlos O'Donell <carlos@codesourcery.com>
|
||||||
|
|
||||||
|
* gcc.dg/unsigned-long-compare.c: New test.
|
||||||
|
|
||||||
2006-01-30 Steve Ellcey <sje@cup.hp.com>
|
2006-01-30 Steve Ellcey <sje@cup.hp.com>
|
||||||
|
|
||||||
PR testsuite/25318
|
PR testsuite/25318
|
||||||
|
24
gcc/testsuite/gcc.dg/unsigned-long-compare.c
Normal file
24
gcc/testsuite/gcc.dg/unsigned-long-compare.c
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/* Copyright (C) 2006 Free Software Foundation, Inc. */
|
||||||
|
/* Contributed by Carlos O'Donell on 2006-01-30 */
|
||||||
|
|
||||||
|
/* Test a division corner case where the expression simplifies
|
||||||
|
to a comparison, and the optab expansion is wrong. The optab
|
||||||
|
expansion emits a function whose return is unbiased and needs
|
||||||
|
adjustment. */
|
||||||
|
/* Origin: Carlos O'Donell <carlos@codesourcery.com> */
|
||||||
|
/* { dg-do run { target arm-*-*eabi* } } */
|
||||||
|
/* { dg-options "" } */
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define BIG_CONSTANT 0xFFFFFFFF80000000ULL
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
{
|
||||||
|
unsigned long long OneULL = 1ULL;
|
||||||
|
unsigned long long result;
|
||||||
|
|
||||||
|
result = OneULL / BIG_CONSTANT;
|
||||||
|
if (result)
|
||||||
|
abort ();
|
||||||
|
exit (0);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user