-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
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---