Hi Samuel,
On Friday 11 February 2005 16:38, you wrote:
> I think Intel's confusing numbering system has confused
> you. All ix86 processors, if the expression
> x in first ix86 < x in second ix86
> holds true, then second ix86 is compatible. The i586 is
> NOT the Pentium. Nor is the i686. But the i686 was one of
> the first Intel processors with built-in FPU. If you are
> asking for Pentium, try the following switches:
> -march=pentium
> -march=pentium -mmmx # Pentium MMX
> -march=pentium2
> -march=pentium3
> -march=celron
> -march=pentium4
> -march=prescott # this will probably get you in trouble
>
> If you use any of these switches, it will add FP
> instruction calls. -march=prescott has caused more than
> one problem elsewhere.
This is what the GCC manual says, I added the '***'s
<quote>
-mcpu=cpu-type
Tune to cpu-type everything applicable about the generated code, except
for the ABI and the set of available instructions. The choices for cpu-type
are i386, i486, i586, i686, pentium, pentium-mmx, pentiumpro, pentium2,
pentium3, pentium4, prescott, nocona, k6, k6-2, k6-3, athlon, athlon-tbird,
athlon-4, athlon-xp, athlon-mp, winchip-c6, winchip2 and c3.
While picking a specific cpu-type will schedule things appropriately for
that particular chip, the compiler will not generate any code that does not
run on the i386 without the -march=cpu-type option being used. ***i586 is
equivalent to pentium and i686 is equivalent to pentiumpro***. k6 and athlon
are the AMD chips as opposed to the Intel ones.
-march=cpu-type
Generate instructions for the machine type cpu-type. The choices for
cpu-type are the same as for -mcpu. Moreover, specifying -march=cpu-type
implies -mcpu=cpu-type.
</quote>
My experiments with setting options confirms the ***'d part, wrt the FPU
opcodes being used : i586, pentium and pentium-mmx generate the same (non
fpu-using) code, while i686 and pentiumpro generate the fpu-using code.
Any other hints ?
Peter
PS : please CC me since I'm not on the list. Thank you.
>
> Samuel Lauber
>
> > I was wondering why the above gcc parameter does not enable the use of
> > the fst/fld opcodes for pentium processors, while -march=i686 does. The
> > Intel manuals specifically say that they can be used across all pentium
> > processors.
> >
> > Example :
> > $ gcc -g -c -mcpu=i586 mdouble.cpp -o mdouble.o
> > $ objdump -dS -M intel mdouble.o
> > <...>
> > void foo()
> > {
> > 0: 55 push ebp
> > 1: 89 e5 mov ebp,esp
> > 3: 83 ec 10 sub esp,0x10
> > double d;
> > double a;
> > d = 3.0;
> > 6: b8 00 00 00 00 mov eax,0x0
> > b: ba 00 00 08 40 mov edx,0x40080000
> > 10: 89 45 f8 mov DWORD PTR [ebp-8],eax
> > 13: 89 55 fc mov DWORD PTR [ebp-4],edx
> > a = d;
> > 16: 8b 45 f8 mov eax,DWORD PTR [ebp-8]
> > 19: 8b 55 fc mov edx,DWORD PTR [ebp-4]
> > 1c: 89 45 f0 mov DWORD PTR [ebp-16],eax
> > 1f: 89 55 f4 mov DWORD PTR [ebp-12],edx
> > }
> > 22: c9 leave
> > 23: c3 ret
> >
> > While :
> > $ gcc -g -c -mcpu=i686 mdouble.cpp -o mdouble.o
> > $ objdump -dS -M intel mdouble.o
> > <...>
> > void foo()
> > {
> > 0: 55 push ebp
> > 1: 89 e5 mov ebp,esp
> > 3: 83 ec 10 sub esp,0x10
> > double d;
> > double a;
> > d = 3.0;
> > 6: dd 05 00 00 00 00 fld ds:0x0
> > c: dd 5d f8 fstp QWORD PTR [ebp-8]
> > a = d;
> > f: dd 45 f8 fld QWORD PTR [ebp-8]
> > 12: dd 5d f0 fstp QWORD PTR [ebp-16]
> > }
> > 15: c9 leave
> > 16: c3 ret
> >
> > FLD and FSTP are available on all pentium processors.
> > Is there a chance, for other reasons, that my code will not run on a
> > pentium if I use -march=i686 ?
--
------------------------------------------------------------------------
Peter Soetens, Research Assistant http://www.orocos.org
Katholieke Universiteit Leuven
Division Production Engineering, tel. +32 16 322773
Machine Design and Automation fax. +32 16 322987
Celestijnenlaan 300B [EMAIL PROTECTED]
B-3001 Leuven Belgium http://www.mech.kuleuven.ac.be/pma
------------------------------------------------------------------------