gcc now generates inline code for memset in some cases.  Broken code.
E.g., compiling the following with -O:

%%%
#include <string.h>

int foo[100];
int x;

main()
{
        memset(&foo[0], 0, x);
}
%%%

gives (at least if you have fixed function alignment):

%%%
        .file   "z.c"
        .text
        .p2align 2,,3
.globl main
        .type   main,@function
main:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %edi
        pushl   %eax
        movl    x, %ecx
        xorl    %eax, %eax
        shrl    $2, %ecx
        movl    $foo, %edi
        cld
        rep
        stosl
        andl    $-16, %esp
                                <-- the lower bits of `len' should be loaded
                                    near here
        testl   $2, %edi        <-- this seems to be meant to test the 2^1
                                    bit in `len' (not alignment of the pointer
                                    like it actually does).  %edi is the wrong
                                    register for holding the bits, since it is
                                    still needed for the pointer.
        je      .L2
        stosw
.L2:
        testl   $1, %edi        <-- similarly for the 2^0 bit.
        je      .L3
        stosb
.L3:
        movl    -4(%ebp), %edi
        leave
        ret
.Lfe1:
        .size   main,.Lfe1-main
        .comm   foo,400,32
        .comm   x,4,4
        .ident  "GCC: (GNU) 3.1 [FreeBSD] 20020509 (prerelease)"
%%%

This broke newfs (newfs left some garbage in a bitmap).

This seems to only result in (len % 3) bytes not being cleared, since gcc
doesn't seem to use the builtin memset unless it knows that the pointer is
aligned.  If %edi could be misaligned, then too many bytes would be set.

Bruce


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to