mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-28 14:24:43 +08:00
re PR c/5304 (gcc-20011231 generates incorrect divmod code for chars)
PR c/5304: * expmed.c (expand_mult_highpart): Use immed_double_const for wide_op1 unconditionally. * gcc.c-torture/execute/20020201-1.c: New test. From-SVN: r49416
This commit is contained in:
parent
02c5a3bd59
commit
d3c5265862
@ -1,3 +1,9 @@
|
||||
2002-02-02 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c/5304:
|
||||
* expmed.c (expand_mult_highpart): Use immed_double_const for wide_op1
|
||||
unconditionally.
|
||||
|
||||
2002-02-01 Janis Johnson <janis187@us.ibm.com>
|
||||
|
||||
* cfganal.c: Include tm_p.h.
|
||||
|
15
gcc/expmed.c
15
gcc/expmed.c
@ -2760,15 +2760,12 @@ expand_mult_highpart (mode, op0, cnst1, target, unsignedp, max_cost)
|
||||
|
||||
op1 = GEN_INT (trunc_int_for_mode (cnst1, mode));
|
||||
|
||||
if (GET_MODE_BITSIZE (wider_mode) <= HOST_BITS_PER_INT)
|
||||
wide_op1 = op1;
|
||||
else
|
||||
wide_op1
|
||||
= immed_double_const (cnst1,
|
||||
(unsignedp
|
||||
? (HOST_WIDE_INT) 0
|
||||
: -(cnst1 >> (HOST_BITS_PER_WIDE_INT - 1))),
|
||||
wider_mode);
|
||||
wide_op1
|
||||
= immed_double_const (cnst1,
|
||||
(unsignedp
|
||||
? (HOST_WIDE_INT) 0
|
||||
: -(cnst1 >> (HOST_BITS_PER_WIDE_INT - 1))),
|
||||
wider_mode);
|
||||
|
||||
/* expand_mult handles constant multiplication of word_mode
|
||||
or narrower. It does a poor job for large modes. */
|
||||
|
@ -1,3 +1,7 @@
|
||||
2002-02-02 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gcc.c-torture/execute/20020201-1.c: New test.
|
||||
|
||||
2002-02-01 Janis Johnson <janis187@us.ibm.com>
|
||||
|
||||
PR target/5469
|
||||
|
37
gcc/testsuite/gcc.c-torture/execute/20020201-1.c
Normal file
37
gcc/testsuite/gcc.c-torture/execute/20020201-1.c
Normal file
@ -0,0 +1,37 @@
|
||||
/* Test whether division by constant works properly. */
|
||||
|
||||
extern void abort (void);
|
||||
extern void exit (int);
|
||||
|
||||
unsigned char cx = 7;
|
||||
unsigned short sx = 14;
|
||||
unsigned int ix = 21;
|
||||
unsigned long lx = 28;
|
||||
unsigned long long Lx = 35;
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
unsigned char cy;
|
||||
unsigned short sy;
|
||||
unsigned int iy;
|
||||
unsigned long ly;
|
||||
unsigned long long Ly;
|
||||
|
||||
cy = cx / 6; if (cy != 1) abort ();
|
||||
cy = cx % 6; if (cy != 1) abort ();
|
||||
|
||||
sy = sx / 6; if (sy != 2) abort ();
|
||||
sy = sx % 6; if (sy != 2) abort ();
|
||||
|
||||
iy = ix / 6; if (iy != 3) abort ();
|
||||
iy = ix % 6; if (iy != 3) abort ();
|
||||
|
||||
ly = lx / 6; if (ly != 4) abort ();
|
||||
ly = lx % 6; if (ly != 4) abort ();
|
||||
|
||||
Ly = Lx / 6; if (Ly != 5) abort ();
|
||||
Ly = Lx % 6; if (Ly != 5) abort ();
|
||||
|
||||
exit(0);
|
||||
}
|
Loading…
Reference in New Issue
Block a user