From: Mike Newsgroups: comp.os.msdos.djgpp Subject: float to int conversion question Date: Fri, 28 Nov 1997 00:32:04 -0500 Organization: Digital Equipment Corporation - Marlboro, MA Lines: 101 Message-ID: <347E55F7.14688311@no.email> NNTP-Posting-Host: hlorem105.hlo.dec.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk When converting a group of floating point values to integer values, the compiled code seems to unnecessarily set and reset the FP Control Word every time. Is there a compiler switch or #pragma that can help here, or do I have to clean this up by hand? ============================ #include int main (void) { int i0, i1, i2; float f0, f1, f2, f3; f0 = 1.0 * f3; f1 = 2.0 * f3; f2 = 3.0 * f3; i0 = (int)f0; i1 = (int)f1; i2 = (int)f2; cout << i0 << i1 << i2; } ============================ Compiled like this: gcc -O2 -i486 -fomit-frame-pointer -ffast-math -S junk.cc ============================ .file "junk.cc" gcc2_compiled.: ___gnu_compiled_cplusplus: .text .align 2 LC0: .long 0x0,0x40080000 .align 2 .globl _main _main: subl $16,%esp pushl %ebx call ___main flds 4(%esp) fld %st(0) fadd %st(1),%st fstps 16(%esp) flds 16(%esp) fldl LC0 fmulp %st,%st(2) fxch %st(1) fstps 16(%esp) flds 16(%esp) flds 4(%esp) fnstcw 12(%esp) movl 12(%esp),%eax movb $12,%ah movl %eax,8(%esp) fldcw 8(%esp) subl $4,%esp fistpl (%esp) popl %ecx fldcw 12(%esp) fxch %st(1) fnstcw 12(%esp) movl 12(%esp),%eax movb $12,%ah movl %eax,8(%esp) fldcw 8(%esp) subl $4,%esp fistpl (%esp) popl %edx fldcw 12(%esp) fnstcw 12(%esp) movl 12(%esp),%ebx movb $12,%bh movl %ebx,8(%esp) fldcw 8(%esp) subl $4,%esp fistpl (%esp) popl %eax fldcw 12(%esp) pushl %eax pushl %edx pushl %ecx pushl $_cout call ___ls__7ostreami addl $8,%esp pushl %eax call ___ls__7ostreami addl $8,%esp pushl %eax call ___ls__7ostreami addl $8,%esp xorl %eax,%eax popl %ebx addl $16,%esp ret