Change data heap alignment to 16 bytes

db4
Slava Pestov 2009-10-20 12:45:00 -05:00
parent 50f9bf67a7
commit d85d84697a
18 changed files with 39 additions and 28 deletions

View File

@ -218,8 +218,12 @@ USERENV: undefined-quot 60
: here-as ( tag -- pointer ) here bitor ;
: (align-here) ( alignment -- )
[ here neg ] dip rem
[ bootstrap-cell /i [ 0 emit ] times ] unless-zero ;
: align-here ( -- )
here 8 mod 4 = [ 0 emit ] when ;
data-alignment get (align-here) ;
: emit-fixnum ( n -- ) tag-fixnum emit ;
@ -293,7 +297,7 @@ M: fake-bignum ' n>> tag-fixnum ;
M: float '
[
float [
align-here double>bits emit-64
8 (align-here) double>bits emit-64
] emit-object
] cache-eql-object ;
@ -411,6 +415,7 @@ M: byte-array '
[
byte-array [
dup length emit-fixnum
bootstrap-cell 4 = [ 0 emit 0 emit ] when
pad-bytes emit-bytes
] emit-object
] cache-eq-object ;

View File

@ -17,7 +17,7 @@ CONSTANT: deck-bits 18
: string-offset ( -- n ) 4 string tag-number slot-offset ; inline
: string-aux-offset ( -- n ) 2 string tag-number slot-offset ; inline
: profile-count-offset ( -- n ) 8 \ word tag-number slot-offset ; inline
: byte-array-offset ( -- n ) 2 byte-array tag-number slot-offset ; inline
: byte-array-offset ( -- n ) 16 byte-array tag-number - ; inline
: alien-offset ( -- n ) 3 alien tag-number slot-offset ; inline
: underlying-alien-offset ( -- n ) 1 alien tag-number slot-offset ; inline
: tuple-class-offset ( -- n ) 1 tuple tag-number slot-offset ; inline

View File

@ -374,7 +374,7 @@ M: ppc %set-alien-double -rot STFD ;
[ drop load-zone-ptr ] [ swap 0 LWZ ] 2bi ;
:: inc-allot-ptr ( nursery-ptr allot-ptr n -- )
scratch-reg allot-ptr n 8 align ADDI
scratch-reg allot-ptr n data-alignment get align ADDI
scratch-reg nursery-ptr 0 STW ;
:: store-header ( dst class -- )

View File

@ -388,7 +388,7 @@ M: x86 %vm-field-ptr ( dst field -- )
[ drop "nursery" %vm-field-ptr ] [ swap [] MOV ] 2bi ;
: inc-allot-ptr ( nursery-ptr n -- )
[ [] ] dip 8 align ADD ;
[ [] ] dip data-alignment get align ADD ;
: store-header ( temp class -- )
[ [] ] [ type-number tag-fixnum ] bi* MOV ;

View File

@ -5,6 +5,8 @@ hashtables vectors strings sbufs arrays
quotations assocs layouts classes.tuple.private
kernel.private ;
16 data-alignment set
BIN: 111 tag-mask set
8 num-tags set
3 tag-bits set

View File

@ -4,6 +4,8 @@ USING: namespaces math words kernel assocs classes
math.order kernel.private ;
IN: layouts
SYMBOL: data-alignment
SYMBOL: tag-mask
SYMBOL: num-tags

View File

@ -7,7 +7,7 @@ namespace factor
array *factor_vm::allot_array(cell capacity, cell fill_)
{
gc_root<object> fill(fill_,this);
gc_root<array> new_array(allot_array_internal<array>(capacity),this);
gc_root<array> new_array(allot_uninitialized_array<array>(capacity),this);
if(fill.value() == tag_fixnum(0))
memset(new_array->data(),'\0',capacity * sizeof(cell));
@ -33,7 +33,7 @@ void factor_vm::primitive_array()
cell factor_vm::allot_array_1(cell obj_)
{
gc_root<object> obj(obj_,this);
gc_root<array> a(allot_array_internal<array>(1),this);
gc_root<array> a(allot_uninitialized_array<array>(1),this);
set_array_nth(a.untagged(),0,obj.value());
return a.value();
}
@ -42,7 +42,7 @@ cell factor_vm::allot_array_2(cell v1_, cell v2_)
{
gc_root<object> v1(v1_,this);
gc_root<object> v2(v2_,this);
gc_root<array> a(allot_array_internal<array>(2),this);
gc_root<array> a(allot_uninitialized_array<array>(2),this);
set_array_nth(a.untagged(),0,v1.value());
set_array_nth(a.untagged(),1,v2.value());
return a.value();
@ -54,7 +54,7 @@ cell factor_vm::allot_array_4(cell v1_, cell v2_, cell v3_, cell v4_)
gc_root<object> v2(v2_,this);
gc_root<object> v3(v3_,this);
gc_root<object> v4(v4_,this);
gc_root<array> a(allot_array_internal<array>(4),this);
gc_root<array> a(allot_uninitialized_array<array>(4),this);
set_array_nth(a.untagged(),0,v1.value());
set_array_nth(a.untagged(),1,v2.value());
set_array_nth(a.untagged(),2,v3.value());

View File

@ -1299,7 +1299,7 @@ bignum *factor_vm::bignum_digit_to_bignum(bignum_digit_type digit, int negative_
bignum *factor_vm::allot_bignum(bignum_length_type length, int negative_p)
{
BIGNUM_ASSERT ((length >= 0) || (length < BIGNUM_RADIX));
bignum * result = allot_array_internal<bignum>(length + 1);
bignum * result = allot_uninitialized_array<bignum>(length + 1);
BIGNUM_SET_NEGATIVE_P (result, negative_p);
return (result);
}

View File

@ -5,7 +5,7 @@ namespace factor
byte_array *factor_vm::allot_byte_array(cell size)
{
byte_array *array = allot_array_internal<byte_array>(size);
byte_array *array = allot_uninitialized_array<byte_array>(size);
memset(array + 1,0,size);
return array;
}
@ -19,7 +19,7 @@ void factor_vm::primitive_byte_array()
void factor_vm::primitive_uninitialized_byte_array()
{
cell size = unbox_array_size();
dpush(tag<byte_array>(allot_array_internal<byte_array>(size)));
dpush(tag<byte_array>(allot_uninitialized_array<byte_array>(size)));
}
void factor_vm::primitive_resize_byte_array()

View File

@ -39,14 +39,14 @@ callback *callback_heap::add(code_block *compiled)
tagged<byte_array> insns(array_nth(code_template.untagged(),0));
cell size = array_capacity(insns.untagged());
cell bump = align8(size) + sizeof(callback);
cell bump = align(size,sizeof(cell)) + sizeof(callback);
if(here + bump > seg->end) fatal_error("Out of callback space",0);
callback *stub = (callback *)here;
stub->compiled = compiled;
memcpy(stub + 1,insns->data<void>(),size);
stub->size = align8(size);
stub->size = align(size,sizeof(cell));
here += bump;
update(stub);

View File

@ -133,7 +133,7 @@ bool factor_vm::stack_to_array(cell bottom, cell top)
return false;
else
{
array *a = allot_array_internal<array>(depth / sizeof(cell));
array *a = allot_uninitialized_array<array>(depth / sizeof(cell));
memcpy(a + 1,(void*)bottom,depth);
dpush(tag<array>(a));
return true;

View File

@ -119,7 +119,7 @@ cell factor_vm::object_size(cell tagged)
/* Size of the object pointed to by an untagged pointer */
cell factor_vm::untagged_object_size(object *pointer)
{
return align8(unaligned_object_size(pointer));
return align(unaligned_object_size(pointer),data_alignment);
}
/* Size of the data area of an object pointed to by an untagged pointer */

View File

@ -19,7 +19,7 @@ template<typename Array> cell array_size(Array *array)
return array_size<Array>(array_capacity(array));
}
template<typename Array> Array *factor_vm::allot_array_internal(cell capacity)
template<typename Array> Array *factor_vm::allot_uninitialized_array(cell capacity)
{
Array *array = allot<Array>(array_size<Array>(capacity));
array->capacity = tag_fixnum(capacity);
@ -46,7 +46,7 @@ template<typename Array> Array *factor_vm::reallot_array(Array *array_, cell cap
if(capacity < to_copy)
to_copy = capacity;
Array *new_array = allot_array_internal<Array>(capacity);
Array *new_array = allot_uninitialized_array<Array>(capacity);
memcpy(new_array + 1,array.untagged() + 1,to_copy * Array::element_size);
memset((char *)(new_array + 1) + to_copy * Array::element_size,

View File

@ -88,7 +88,7 @@ void factor_vm::primitive_fread()
return;
}
gc_root<byte_array> buf(allot_array_internal<byte_array>(size),this);
gc_root<byte_array> buf(allot_uninitialized_array<byte_array>(size),this);
for(;;)
{

View File

@ -23,10 +23,7 @@ inline static cell align(cell a, cell b)
return (a + (b-1)) & ~(b-1);
}
inline static cell align8(cell a)
{
return align(a,8);
}
static const cell data_alignment = 16;
#define WORD_SIZE (signed)(sizeof(cell)*8)
@ -186,6 +183,11 @@ struct byte_array : public object {
/* tagged */
cell capacity;
#ifndef FACTOR_64
cell padding0;
cell padding1;
#endif
template<typename Scalar> Scalar *data() { return (Scalar *)(this + 1); }
};
@ -249,9 +251,9 @@ struct code_block : public heap_block
return (void *)(this + 1);
}
cell type()
code_block_type type()
{
return (header >> 1) & 0x3;
return (code_block_type)((header >> 1) & 0x3);
}
void set_type(code_block_type type)

View File

@ -45,7 +45,7 @@ void factor_vm::set_string_nth_slow(string *str_, cell index, cell ch)
if the most significant bit of a
character is set. Initially all of
the bits are clear. */
aux = allot_array_internal<byte_array>(untag_fixnum(str->length) * sizeof(u16));
aux = allot_uninitialized_array<byte_array>(untag_fixnum(str->length) * sizeof(u16));
str->aux = tag<byte_array>(aux);
write_barrier(&str->aux);

View File

@ -298,7 +298,7 @@ struct factor_vm
}
// generic arrays
template<typename Array> Array *allot_array_internal(cell capacity);
template<typename Array> Array *allot_uninitialized_array(cell capacity);
template<typename Array> bool reallot_array_in_place_p(Array *array, cell capacity);
template<typename Array> Array *reallot_array(Array *array_, cell capacity);

View File

@ -18,7 +18,7 @@ struct zone {
inline object *allot(cell size)
{
cell h = here;
here = h + align8(size);
here = h + align(size,data_alignment);
return (object *)h;
}
};