On Friday 03 February 2006 12:58, Andreas Mohr wrote:
> -       adev->tx_head = (head + 1) % TX_CNT;
> +       /* slower: adev->tx_head = (head + 1) % TX_CNT; */
> +       adev->tx_head = head + 1;
> +       if (adev->tx_head >= TX_CNT)
> +               adev->tx_head = 0;


struct a {
    int tx_head;
};

#define TX_CNT 16

void f(struct a *adev, int head) {
    adev->tx_head = (head + 1) % TX_CNT;
}

void g(struct a *adev, int head) {
    adev->tx_head = head + 1;
    if (adev->tx_head >= TX_CNT)
        adev->tx_head = 0;
}


gcc -Os -S t.c -fomit-frame-pointer -falign-functions=1 -falign-labels=1 
-falign-loops=1 -falign-jumps=1 -mtune=i386 -march=i386
produces:

f:
        movl    8(%esp), %eax
        incl    %eax
        movl    $16, %edx
        movl    %edx, %ecx
        cltd
        idivl   %ecx
        movl    4(%esp), %eax
        movl    %edx, (%eax)
        ret
        .size   f, .-f
.globl g
        .type   g, @function
g:
        movl    4(%esp), %edx
        movl    8(%esp), %eax
        incl    %eax
        movl    %eax, (%edx)
        cmpl    $15, %eax
        jle     .L6
        movl    $0, (%edx)
.L6:
        ret
        .size   g, .-g
        .ident  "GCC: (GNU) 4.0.0"

Well, gcc obviously failed to realize that "% 16" == "& 15".
I'll file a bug. Meanwhile, with & 15 f() is better:

f:
        movl    8(%esp), %eax
        incl    %eax
        andl    $15, %eax
        movl    4(%esp), %edx
        movl    %eax, (%edx)
        ret
        .size   f, .-f
.globl g
        .type   g, @function
g:
        movl    4(%esp), %edx
        movl    8(%esp), %eax
        incl    %eax
        movl    %eax, (%edx)
        cmpl    $15, %eax
        jle     .L6
        movl    $0, (%edx)
.L6:
        ret
        .size   g, .-g
        .ident  "GCC: (GNU) 4.0.0"

--
vda
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to