Hi All,
I'm seeing some problems with 64-bit integer multiplication when using
the optimiser. Can somebody confirm whether there are any known problems?
I have created a minimal test program to hopefully demonstrate the
issue, (see attached). The program does the same multiply twice; first
time to show the result we are expecting, and the second time using a
little extra code to force the optimiser into having to do some
non-trivial work.
The output is written to a file in the root. The results should clearly
be the same each case, but with optimisation enabled the results are as
follows:
a = 1000
b = 4294967295
a * b = 4294967295000
a = 1000
b = 4294967295
a * b = 18446744073709550616
(0x3e7fffffc18 compared to 0xfffffffffffffc18).
Looks like the most significant word is being miscalculated. With
optimisation switched off -O0 or a different value for 'b' the second
answer is correct, matching the first.
I'm using the 0.51 release. I haven't been able to test with 0.55 (no
Cygwin release) and the latest SVN sources have trouble building.
$ arm-wince-mingw32ce-gcc -v
Using built-in specs.
Target: arm-wince-mingw32ce
Configured with: /home/pedro/cegcc/0.51/src/gcc/configure --with-gcc
--with-gnu-ld --with-gnu-as --target=arm-wince-mingw32ce
--prefix=/opt/mingw32ce --enable-threads=win32 --disable-nls
--enable-languages=c,c++ --disable-win32-registry --disable-multilib
--disable-interwork --without-newlib --enable-checking --with-headers
Thread model: win32
gcc version 4.1.0
I would be pleased for any guidance on this matter and indeed whether
others experience the same thing.
--
Matt
#include <windows.h>
#include <inttypes.h>
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPWSTR lpCmdLine, int nCmdShow)
{
FILE *f;
if ((f = fopen("output.txt", "w")))
{
uint64_t a, b, result;
b = 0xffffffffULL;
a = 1000;
{
result = a * b;
fprintf(f, "a = %"PRIu64"\n", a);
fprintf(f, "b = %"PRIu64"\n", b);
fprintf(f, "a * b = %"PRIu64"\n\n", result);
}
for (a = 1000; a < 1001; a += 1+(rand()%2))
{
result = a * b;
fprintf(f, "a = %"PRIu64"\n", a);
fprintf(f, "b = %"PRIu64"\n", b);
fprintf(f, "a * b = %"PRIu64"\n\n", result);
}
fclose(f);
}
MessageBoxW(0, L"", L"Done", 0);
return 0;
}
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Cegcc-devel mailing list
Cegcc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cegcc-devel