# New Ticket Created by Andy Dougherty # Please include the string: [perl #42772] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=42772 >
On Thu, 26 Apr 2007, Leopold Toetsch wrote: > Am Donnerstag, 26. April 2007 21:44 schrieb Andy Dougherty: > > Does anyone understand the 'dummy' element in > > include/parrot/stacks.h? Here is the relevant snippet: > > > > typedef struct Stack_Chunk { > > pobj_t obj; > > int size; > > const char * name; > > struct Stack_Chunk *prev; > > #if ! DISABLE_GC_DEBUG && defined(I386) > > void * dummy; /* force 8 byte align for mmx and sse moves */ > > #endif > > union { /* force appropriate alignment of 'data' */ > > void *data; > > #ifndef I386 > > double d_dummy; /* align double values on stack */ > > #endif > > } u; > > } Stack_Chunk_t; > At some earlier time in parrot history, there was a (32 bit, pointer-sized) > 'version' [1] structure item in pobj_t, which was active > with !DISABLE_GC_DEBUG. The dummy was needed for i386 (when x86_64 didn't > even exist) to align the data pointer at an 8-byte boundary. Ah, yes. Thanks for the detailed reply. At this point, removing the dummy will put u.data back on an 8-byte boundary (for i386), so that's probably a good thing all around. I'd suggest the following patch: diff -ru parrot-current/include/parrot/stacks.h parrot-andy/include/parrot/stacks.h --- parrot-current/include/parrot/stacks.h 2006-11-12 03:15:19.000000000 -0500 +++ parrot-andy/include/parrot/stacks.h 2007-04-27 09:24:04.000000000 -0400 @@ -29,13 +29,11 @@ int size; const char * name; struct Stack_Chunk *prev; -#if ! DISABLE_GC_DEBUG && defined(I386) - void * dummy; /* force 8 byte align for mmx and sse moves */ -#endif - union { /* force appropriate alignment of 'data' */ + union { /* force appropriate alignment of 'data'. If alignment + is necessary, assume double is good enough. 27-04-2007. */ void *data; -#ifndef I386 - double d_dummy; /* align double values on stack */ +#if PARROT_PTR_ALIGNMENT > 1 + double d_dummy; #endif } u; } Stack_Chunk_t; --- parrot-current/src/stack_common.c Thu Apr 26 19:15:14 2007 +++ parrot-andy/src/stack_common.c Fri Apr 27 11:49:53 2007 @@ -59,9 +59,6 @@ Stack_Chunk_t *chunk; item_size += offsetof(Stack_Chunk_t, u.data); - item_size += 7; - item_size &= ~7; /* round up to 8 so that the chunk is aligned at - the same size - the aligned MMX memcpy needs it */ make_bufferlike_pool(interp, item_size); chunk = (Stack_Chunk_t *)new_bufferlike_header(interp, item_size); chunk->prev = chunk; /* mark the top of the stack */ > As the past tense is indicating, above dummy is totally obsolete and the copy > functions[2] are unused. The latter could be removed too, but might be a > nice-to-have, when something faster than memcpy(3) is wanted or needed, > albeit only on restricted (but common) platforms and for aligned memory only. > Some recent CPUs do have special instructions for copying unaligned memory > reegions too. Yes, indeed. I could see a future optimization pairing memalign(3C) with specialized copy functions. Thanks again, -- Andy Dougherty [EMAIL PROTECTED]