Boost logo

Boost :

From: Greg Colvin (gcolvin_at_[hidden])
Date: 2001-10-23 12:39:27


From: Paul A. Bristow <boost_at_[hidden]>
> Thanks for this - agrees with my naiver tests.
>
> It looks promising to me - but what of other compilers - you gcc fans etc?

 .file "pi_test.cc"
gcc2_compiled.:
___gnu_compiled_cplusplus:
.text
 .align 8
LC3:
 .long 0x54442d18,0x400921fb
 .align 4
.globl _pi_test__Fv
 .def _pi_test__Fv; .scl 2; .type 32; .endef
_pi_test__Fv:
 fldl LC3
 pushl %ebp
 movl %esp,%ebp
 subl $48,%esp
 fstl -40(%ebp)
 fstl -32(%ebp)
 fstl -24(%ebp)
 fstl -16(%ebp)
 fstpl -8(%ebp)
 leal -8(%ebp),%eax
 pushl %eax
 leal -16(%ebp),%eax
 pushl %eax
 leal -24(%ebp),%eax
 pushl %eax
 leal -32(%ebp),%eax
 pushl %eax
 leal -40(%ebp),%eax
 pushl %eax
 call _f__FRdN40
 movl %ebp,%esp
 popl %ebp
 ret
 .def _f__FRdN40; .scl 2; .type 32; .endef

> Paul
>
> > -----Original Message-----
> > From: Greg Colvin [mailto:gcolvin_at_[hidden]]
> > Sent: Tuesday, October 23, 2001 5:44 PM
> > To: boost_at_[hidden]
> > Subject: Re: [boost] Math constants for naive and gurus? - which
> > constants do you want?
> >
> >
> > For what it is worth, appendedis a very simple test program and
> > the 80x86 assembly language output from MSVC. I had to add the
> > call to f(double&,double&,double&,double&,double&) to prevent the
> > optimizer removing almost all the code. The operations for each
> > way of assigning pi to a local are a bit scrambled up, I assume
> > for optimal scheduling. When I unscamble them they look like:
> >
> > ; double pi_template = constant<pi_tag,double>();
> > mov DWORD PTR _pi_template$[esp+60], 1413754136 ; 54442d18H
> > mov DWORD PTR _pi_template$[esp+64], 1074340347 ; 400921fbH
> >
> > ; double pi_function = pi();
> >
> > mov DWORD PTR _pi_function$[esp+60], 1413754136 ; 54442d18H
> > mov DWORD PTR _pi_function$[esp+64], 1074340347 ; 400921fbH
> >
> > ; double pi_constant = Pi;
> > mov eax, DWORD PTR _Pi$S188
> > mov DWORD PTR _pi_constant$[esp+40], eax
> > mov ecx, DWORD PTR _Pi$S188+4
> > mov DWORD PTR _pi_constant$[esp+52], ecx
> >
> > ; double pi_defined = PI;
> > mov DWORD PTR _pi_defined$[esp+60], 1413754136 ; 54442d18H
> > mov DWORD PTR _pi_defined$[esp+64], 1074340347 ; 400921fbH
> >
> > ; double pi_literal = 3.141592653589793238462643383279502884197;
> > mov DWORD PTR _pi_literal$[esp+60], 1413754136 ; 54442d18H
> > mov DWORD PTR _pi_literal$[esp+64], 1074340347 ; 400921fbH
> >
> > ; return f(pi_template,pi_function,pi_constant,pi_defined,pi_literal);
> > lea edx, DWORD PTR _pi_literal$[esp+40]
> > push edx
> > lea eax, DWORD PTR _pi_defined$[esp+44]
> > push eax
> > lea ecx, DWORD PTR _pi_constant$[esp+48]
> > push ecx
> > lea edx, DWORD PTR _pi_function$[esp+52]
> > push edx
> > lea eax, DWORD PTR _pi_template$[esp+56]
> > push eax
> > call ?f@@YAHAAN0000_at_Z ; f
> >
> > Make of it all what you will.
> >
> >
> > //////////////////////////////////////////////////////////////////
> > // pi_test.cpp
> >
> > template <typename Tag, typename Rep> struct constant {
> > constant() {}
> > operator Rep() const;
> > };
> >
> > struct pi_tag {};
> >
> > template<> inline constant<pi_tag, double>::operator double() const {
> > return 3.141592653589793238462643383279502884197;
> > }
> >
> > inline double pi() {
> > return 3.141592653589793238462643383279502884197;
> > }
> >
> > const double Pi = 3.141592653589793238462643383279502884197;
> >
> > #define PI 3.141592653589793238462643383279502884197
> >
> > extern int f(double&,double&,double&,double&,double&);
> >
> > int pi_test() {
> >
> > double pi_template = constant<pi_tag,double>();
> >
> > double pi_function = pi();
> >
> > double pi_constant = Pi;
> >
> > double pi_defined = PI;
> >
> > double pi_literal = 3.141592653589793238462643383279502884197;
> >
> > return f(pi_template,pi_function,pi_constant,pi_defined,pi_literal);
> > }
> >
> >
> > ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> > TITLE pi_test.cpp
> > .386P
> > include listing.inc
> > if @Version gt 510
> > .model FLAT
> > else
> > _TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
> > _TEXT ENDS
> > _DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
> > _DATA ENDS
> > CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
> > CONST ENDS
> > _BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
> > _BSS ENDS
> > _TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
> > _TLS ENDS
> > ; COMDAT ??B?$constant_at_Upi_tag@@N@@QBENXZ
> > _TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
> > _TEXT ENDS
> > ; COMDAT ?pi@@YANXZ
> > _TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
> > _TEXT ENDS
> > ; COMDAT ??0?$constant_at_Upi_tag@@N@@QAE_at_XZ
> > _TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
> > _TEXT ENDS
> > FLAT GROUP _DATA, CONST, _BSS
> > ASSUME CS: FLAT, DS: FLAT, SS: FLAT
> > endif
> > CONST SEGMENT
> > _Pi$S188 DQ 0400921fb54442d18r ; 3.14159
> > CONST ENDS
> > PUBLIC ?pi_test@@YAHXZ ; pi_test
> > EXTRN ?f@@YAHAAN0000_at_Z:NEAR ; f
> > EXTRN __fltused:NEAR
> > CONST SEGMENT
> > $T214 DQ 0400921fb54442d18r ; 3.14159
> > CONST ENDS
> > _TEXT SEGMENT
> > _pi_template$ = -8
> > _pi_function$ = -16
> > _pi_constant$ = -24
> > _pi_defined$ = -32
> > _pi_literal$ = -40
> > ?pi_test@@YAHXZ PROC NEAR ; pi_test
> >
> > ; 25 : int pi_test() {
> >
> > sub esp, 40 ; 00000028H
> >
> > ; 26 :
> > ; 27 : double pi_template = constant<pi_tag,double>();
> > ; 28 :
> > ; 29 : double pi_function = pi();
> > ; 30 :
> > ; 31 : double pi_constant = Pi;
> >
> > mov eax, DWORD PTR _Pi$S188
> > mov ecx, DWORD PTR _Pi$S188+4
> > mov DWORD PTR _pi_constant$[esp+40], eax
> >
> > ; 32 :
> > ; 33 : double pi_defined = PI;
> > ; 34 :
> > ; 35 : double pi_literal =
> > 3.141592653589793238462643383279502884197;
> > ; 36 :
> > ; 37 : return
> > f(pi_template,pi_function,pi_constant,pi_defined,pi_literal);
> >
> > lea edx, DWORD PTR _pi_literal$[esp+40]
> > mov DWORD PTR _pi_constant$[esp+44], ecx
> > lea eax, DWORD PTR _pi_defined$[esp+40]
> > push edx
> > lea ecx, DWORD PTR _pi_constant$[esp+44]
> > push eax
> > lea edx, DWORD PTR _pi_function$[esp+48]
> > push ecx
> > lea eax, DWORD PTR _pi_template$[esp+52]
> > push edx
> > push eax
> > mov DWORD PTR _pi_template$[esp+60], 1413754136 ; 54442d18H
> > mov DWORD PTR _pi_template$[esp+64], 1074340347 ; 400921fbH
> > mov DWORD PTR _pi_function$[esp+60], 1413754136 ; 54442d18H
> > mov DWORD PTR _pi_function$[esp+64], 1074340347 ; 400921fbH
> > mov DWORD PTR _pi_defined$[esp+60], 1413754136 ; 54442d18H
> > mov DWORD PTR _pi_defined$[esp+64], 1074340347 ; 400921fbH
> > mov DWORD PTR _pi_literal$[esp+60], 1413754136 ; 54442d18H
> > mov DWORD PTR _pi_literal$[esp+64], 1074340347 ; 400921fbH
> > call ?f@@YAHAAN0000_at_Z ; f
> > add esp, 20 ; 00000014H
> >
> > ; 38 : }
> >
> > add esp, 40 ; 00000028H
> > ret 0
> > ?pi_test@@YAHXZ ENDP ; pi_test
> > _TEXT ENDS
> > END
> >
> >
> >
> >
> > Info: http://www.boost.org Unsubscribe:
> > <mailto:boost-unsubscribe_at_[hidden]>
> >
> > Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
> >
> >
> >
> >
>
>
> Info: http://www.boost.org Unsubscribe: <mailto:boost-unsubscribe_at_[hidden]>
>
> Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
>
>
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk