lkml.org 
[lkml]   [1999]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: goto's ???

Thank you for taking the time to explain. The gcc -S option is a great
debugging tool, which I have just added to my debugging methods, Thank
you.

I new there was a reason for the code being written in such a way. I am
glad I asked the question, as know I can actually write faster code.

Cheers Mof.

On Tue, 25 May 1999, Richard B. Johnson wrote:

> Compile questionable code with the -S option, with output to a file.
> Check the assembly. Usually, the gotos are important to maintain
> straight-through code for the normal case. If you put a return in
> the middle of the code, it doesn't return. It jumps to somewhere
> where the saved registers are restored, the stack leveled, and then
> a return. In other words, there is only one exit path anyway. So
> the designer designed in the exit path so the compiler is less likely
> to muck with the straight through code.
>
> Given:
>
> int foo(int bar)
> {
> if (bar == 1)
> goto end;
> if (bar == 2)
> goto end;
> printf("%d\n", bar);
> end:;
> return 0;
> }
>
> You get:
>
> foo:
> pushl %ebp
> movl %esp,%ebp
> cmpl $1,8(%ebp) ; if (bar == 1)
> jne .L2 ; Not a 1, try next
> jmp .L3 ; This is the goto
> .align 4
> .L2:
> cmpl $2,8(%ebp) ; if (bar == 2)
> jne .L4 ; Not a 2
> jmp .L3 ; This is the goto
> .align 4
> .L4:
> movl 8(%ebp),%eax ; This is where we print it.
> pushl %eax
> pushl $.LC0
> call printf
> addl $8,%esp
> .L3: ; Common exit
> xorl %eax,%eax
> jmp .L1
> .align 4
> .L1:
> movl %ebp,%esp
> popl %ebp
> ret
>
> Now, you may say; "Nobody writes code like that!". True, it's a demo,
> one would probably write such trivial code as:
>
> int foo(int bar)
> {
> if ((bar != 1) && (bar != 2))
> printf("%d\n", bar);
> return 0;
> }
>
> How, guess what this produces?!!
>
> foo:
> pushl %ebp
> movl %esp,%ebp
> cmpl $1,8(%ebp) ; (foo != 1)
> je .L2 ; The goto
> cmpl $2,8(%ebp) ; (foo != 2)
> je .L2 ; Another goto
> movl 8(%ebp),%eax ; Now we print it.
> pushl %eax
> pushl $.LC0
> call printf
> addl $8,%esp
> .L2:
> xorl %eax,%eax
> jmp .L1
> .align 4
> .L1:
> movl %ebp,%esp
> popl %ebp
> ret
> .Lfe1:
>
>
> By checking what the compiler produces, you can see if it might be
> best to put a goto in your code even though it might bring up shreeks
> of horror from some.
>
> You will find that just ordering something a bit differently, while
> maintaining the same logic, may produce a better straight-through path.
> For instance everybody loves 'switches'. They make coding clear and
> straight forward, however, unless the 'case' is sequential, better
> code may be obtained by using 'if() else if()'.
>
> Cheers,
> Dick Johnson
> ***** FILE SYSTEM WAS MODIFIED *****
> Penguin : Linux version 2.2.6 on an i686 machine (400.59 BogoMips).
> Warning : It's hard to remain at the trailing edge of technology.
>


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:51    [W:0.096 / U:0.600 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site