-minline-all-stringops
           By default GCC inlines string operations only when destination is
           known to be aligned at least to 4 byte boundary.  This enables more
           inlining, increase code size, but may improve performance of code
           that depends on fast memcpy, strlen and memset for short lengths.

So I guess it's alignment, not the fact the size is variable?  This
type of pattern could hurt MSVC, where it usually inlines the memcpy
as a rep movsd, rep movsb.  So now we're going to generate code for
two mostly identical copy looks, then branch to pick one.

On Wed, Oct 8, 2008 at 12:58 PM, Erik Corry <[EMAIL PROTECTED]> wrote:
>
>
> On Wed, Oct 8, 2008 at 12:10 PM, Dean McNamee <[EMAIL PROTECTED]> wrote:
>>
>> Won't memcpy always be an inlined intrinsic?
>
> Not with variable size:
>
> $ cat copy.cc
> #include <string.h>
>
> extern void foo(char* a, char* b, int size) {
>  memcpy(a, b, size);
> }
> $ g++ -S -O3 copy.cc
> $ cat copy.s
>        .file "copy.cc"
>        .text
>        .align 2
> .globl _Z3fooPcS_i
>        .type _Z3fooPcS_i, @function
> _Z3fooPcS_i:
> .LFB2:
>        pushl %ebp
> .LCFI0:
>        movl %esp, %ebp
> .LCFI1:
>        popl %ebp
>        jmp  memcpy
> .LFE2:
>        .size _Z3fooPcS_i, .-_Z3fooPcS_i
>        .ident  "GCC: (GNU) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)"
>        .section        .note.GNU-stack,"",@progbits
>
>
>
>
>>
>> On Wed, Oct 8, 2008 at 10:38 AM, Kevin Millikin <[EMAIL PROTECTED]>
>> wrote:
>>> LGTM.
>>>
>>> On Wed, Oct 8, 2008 at 10:31 AM, <[EMAIL PROTECTED]> wrote:
>>>>
>>>> Reviewers: Kevin Millikin,
>>>>
>>>> Description:
>>>> Minor adjustments to the object migration code: When copying
>>>> large objects we use memcpy. If this turns out to be a wash
>>>> on the benchmarks, I'd be happy to rip it out again.
>>>>
>>>> Please review this at http://codereview.chromium.org/6576
>>>>
>>>> Affected files:
>>>>   M     src/heap.cc
>>>>
>>>>
>>>> Index: src/heap.cc
>>>> ===================================================================
>>>> --- src/heap.cc (revision 465)
>>>> +++ src/heap.cc (working copy)
>>>> @@ -733,11 +733,21 @@
>>>>                                  int size) {
>>>>    void** src = reinterpret_cast<void**>((*source_p)->address());
>>>>    void** dst = reinterpret_cast<void**>(target->address());
>>>> -  int counter = size/kPointerSize - 1;
>>>> -  do {
>>>> -    *dst++ = *src++;
>>>> -  } while (counter-- > 0);
>>>>
>>>> +  // Use block copying memcpy if the object we're migrating is big
>>>> +  // enough to justify the extra call/setup overhead.
>>>> +  static const int kBlockCopyLimit = 16 * kPointerSize;
>>>> +
>>>> +  if (size >= kBlockCopyLimit) {
>>>> +    memcpy(dst, src, size);
>>>> +  } else {
>>>> +    int remaining = size / kPointerSize;
>>>> +    do {
>>>> +      remaining--;
>>>> +      *dst++ = *src++;
>>>> +    } while (remaining > 0);
>>>> +  }
>>>> +
>>>>    // Set the forwarding address.
>>>>    (*source_p)->set_map_word(MapWord::FromForwardingAddress(target));
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Google Denmark ApS
>>> CVR nr. 28 86 69 84
>>> c/o Philip & Partners, 7 Vognmagergade, P.O. Box 2227, DK-1018 Copenhagen
>>> K,
>>> Denmark
>>>
>>> >
>>>
>>
>> Google Denmark ApS.  CVR nr. 28 86 69 84
> c/o Philip & Partners, 7 Vognmagergade, P.O. Box 2227, DK-1018 Copenhagen K,
> Denmark.
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to