re PR middle-end/37731 (long long may not work correctly on 32bit host)

gcc/

2008-10-07  H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/37731
	* expmed.c (expand_mult): Properly check DImode constant in
	CONST_DOUBLE.

gcc/testsuite/

2008-10-07  H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/37731
	* gcc.dg/torture/pr37731-1.c: New.
	* gcc.dg/torture/pr37731-2.c: Likewise.

From-SVN: r140947
This commit is contained in:
H.J. Lu 2008-10-07 18:45:56 +00:00 committed by H.J. Lu
parent c7c79a09d6
commit aee857a2f4
5 changed files with 48 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2008-10-07 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/37731
* expmed.c (expand_mult): Properly check DImode constant in
CONST_DOUBLE.
2008-10-07 Jakub Jelinek <jakub@redhat.com>
PR debug/37738

View file

@ -3075,7 +3075,8 @@ expand_mult (enum machine_mode mode, rtx op0, rtx op1, rtx target,
{
/* If we are multiplying in DImode, it may still be a win
to try to work with shifts and adds. */
if (CONST_DOUBLE_HIGH (op1) == 0)
if (CONST_DOUBLE_HIGH (op1) == 0
&& CONST_DOUBLE_LOW (op1) > 0)
coeff = CONST_DOUBLE_LOW (op1);
else if (CONST_DOUBLE_LOW (op1) == 0
&& EXACT_POWER_OF_2_OR_ZERO_P (CONST_DOUBLE_HIGH (op1)))

View file

@ -1,3 +1,9 @@
2008-10-07 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/37731
* gcc.dg/torture/pr37731-1.c: New.
* gcc.dg/torture/pr37731-2.c: Likewise.
2008-10-07 Jakub Jelinek <jakub@redhat.com>
PR debug/37738

View file

@ -0,0 +1,17 @@
/* { dg-do run } */
extern void abort ();
unsigned long long xh = 1;
int
main ()
{
unsigned long long yh = 0xffffffffull;
unsigned long long z = xh * yh;
if (z != yh)
abort ();
return 0;
}

View file

@ -0,0 +1,17 @@
/* { dg-do run } */
extern void abort ();
long long xh = 1;
int
main ()
{
long long yh = 0xffffffffll;
long long z = xh * yh;
if (z != yh)
abort ();
return 0;
}