|
Boost : |
From: Paul A. Bristow (boost_at_[hidden])
Date: 2001-10-23 12:29:41
Thanks for this - agrees with my naiver tests.
It looks promising to me - but what of other compilers - you gcc fans etc?
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/
>
>
>
>
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk