Was just looking again at the assembly file generated by GCC, and noted this pattern I have already seen - maybe beginning with 4.0. In short:
[EMAIL PROTECTED]:~/projet/gujin$ /home/etienne/projet/toolchain/bin/gcc -v Using built-in specs. Target: i686-pc-linux-gnu Configured with: ../configure --prefix=/home/etienne/projet/toolchain --enable-languages=c Thread model: posix gcc version 4.1.1 20060517 (prerelease) [EMAIL PROTECTED]:~/projet/gujin$ cat tmp.c unsigned short nbinch (unsigned short Hsize_cm) { return (3 * Hsize_cm / 4 + 2) / 3; } [EMAIL PROTECTED]:~/projet/gujin$ /home/etienne/projet/toolchain/bin/gcc tmp.c -S -Os -o tmp.s -fomit-frame-pointer -fverbose-asm -march=i386 [EMAIL PROTECTED]:~/projet/gujin$ cat tmp.s .file "tmp.c" # GNU C version 4.1.1 20060517 (prerelease) (i686-pc-linux-gnu) # compiled by GNU C version 4.1.1 20060517 (prerelease). # GGC heuristics: --param ggc-min-expand=62 --param ggc-min-heapsize=60570 # options passed: -iprefix -march=i386 -auxbase-strip -Os # -fomit-frame-pointer -fverbose-asm # options enabled: -falign-loops -fargument-alias -fbranch-count-reg # -fcaller-saves -fcommon -fcprop-registers -fcrossjumping # -fcse-follow-jumps -fcse-skip-blocks -fdefer-pop # -fdelete-null-pointer-checks -fearly-inlining # -feliminate-unused-debug-types -fexpensive-optimizations -ffunction-cse # -fgcse -fgcse-lm -fguess-branch-probability -fident -fif-conversion # -fif-conversion2 -finline-functions -finline-functions-called-once # -fipa-pure-const -fipa-reference -fipa-type-escape -fivopts # -fkeep-static-consts -fleading-underscore -floop-optimize # -floop-optimize2 -fmath-errno -fmerge-constants -fomit-frame-pointer # -foptimize-register-move -foptimize-sibling-calls -fpcc-struct-return # -fpeephole -fpeephole2 -fregmove -freorder-functions # -frerun-cse-after-loop -frerun-loop-opt -fsched-interblock -fsched-spec # -fsched-stalled-insns-dep -fshow-column -fsplit-ivs-in-unroller # -fstrength-reduce -fstrict-aliasing -fthread-jumps -ftrapping-math # -ftree-ccp -ftree-copy-prop -ftree-copyrename -ftree-dce # -ftree-dominator-opts -ftree-dse -ftree-fre -ftree-loop-im # -ftree-loop-ivcanon -ftree-loop-optimize -ftree-lrs -ftree-salias # -ftree-sink -ftree-sra -ftree-store-ccp -ftree-store-copy-prop -ftree-ter # -ftree-vect-loop-version -ftree-vrp -funit-at-a-time -fverbose-asm # -fzero-initialized-in-bss -m32 -m80387 -m96bit-long-double # -malign-stringops -mfancy-math-387 -mfp-ret-in-387 -mieee-fp # -mno-red-zone -mpush-args -mtls-direct-seg-refs # Compiler executable checksum: b39e0195e7cdfc211bb5a7d4c9f1eb60 .text .globl nbinch .type nbinch, @function nbinch: movzwl 4(%esp), %eax # Hsize_cm, Hsize_cm leal (%eax,%eax,2), %eax #, tmp63 movl $4, %edx #, tmp67 movl %edx, %ecx # tmp67, cltd idivl %ecx # addl $2, %eax #, tmp68 movl $3, %edx #, tmp72 movl %edx, %ecx # tmp72, cltd idivl %ecx # movzwl %ax, %eax # tmp70, tmp61 ret .size nbinch, .-nbinch .ident "GCC: (GNU) 4.1.1 20060517 (prerelease)" .section .note.GNU-stack,"",@progbits The extra options "-fomit-frame-pointer -fverbose-asm -march=i386" are just there to simplify the output; the temporary variables tmp67 and tmp72 are created even without, and the %edx register is only used once to initialise the %ecx register. The %edx register is cleared by "cltd" instruction because "%eax" is positive. Is there any reason why: movl $4, %edx #, tmp67 movl %edx, %ecx # tmp67, is not replaced by: movl $4, %ecx and: movl $3, %edx #, tmp72 movl %edx, %ecx # tmp72, is not replaced by: movl $3, %ecx Etienne. ___________________________________________________________________________ Yahoo! Mail réinvente le mail ! Découvrez le nouveau Yahoo! Mail et son interface révolutionnaire. http://fr.mail.yahoo.com