vm: rt-vm relocation now supports accessing a field directly

db4
Slava Pestov 2009-10-14 19:24:23 -05:00
parent ae90ebe3be
commit 38d120f92e
14 changed files with 48 additions and 25 deletions

View File

@ -111,18 +111,25 @@ SYMBOL: jit-relocations
: jit-rel ( rc rt -- ) : jit-rel ( rc rt -- )
over compute-offset 3array jit-relocations get push-all ; over compute-offset 3array jit-relocations get push-all ;
: make-jit ( quot -- jit-data ) SYMBOL: jit-literals
: jit-literal ( literal -- )
jit-literals get push ;
: make-jit ( quot -- jit-literals jit-data )
[ [
V{ } clone jit-literals set
V{ } clone jit-relocations set V{ } clone jit-relocations set
call( -- ) call( -- )
jit-literals get >array
jit-relocations get >array jit-relocations get >array
] B{ } make prefix ; ] B{ } make prefix ;
: jit-define ( quot name -- ) : jit-define ( quot name -- )
[ make-jit ] dip set ; [ make-jit nip ] dip set ;
: define-sub-primitive ( quot word -- ) : define-sub-primitive ( quot word -- )
[ make-jit ] dip sub-primitives get set-at ; [ make-jit 2array ] dip sub-primitives get set-at ;
! The image being constructed; a vector of word-size integers ! The image being constructed; a vector of word-size integers
SYMBOL: image SYMBOL: image

View File

@ -63,7 +63,7 @@ M: ##no-tco generate-insn drop ;
M: ##call generate-insn M: ##call generate-insn
word>> dup sub-primitive>> word>> dup sub-primitive>>
[ first % ] [ [ add-call ] [ %call ] bi ] ?if ; [ second first % ] [ [ add-call ] [ %call ] bi ] ?if ;
M: ##jump generate-insn word>> [ add-call ] [ %jump ] bi ; M: ##jump generate-insn word>> [ add-call ] [ %jump ] bi ;

View File

@ -77,8 +77,8 @@ SYMBOL: relocation-table
: rel-here ( offset class -- ) : rel-here ( offset class -- )
[ add-literal ] dip rt-here rel-fixup ; [ add-literal ] dip rt-here rel-fixup ;
: rel-vm ( class -- ) : rel-vm ( offset class -- )
rt-vm rel-fixup ; [ add-literal ] dip rt-vm rel-fixup ;
: rel-cards-offset ( class -- ) : rel-cards-offset ( class -- )
rt-cards-offset rel-fixup ; rt-cards-offset rel-fixup ;

View File

@ -50,7 +50,7 @@ M: x86.32 reserved-area-size 0 ;
M: x86.32 %alien-invoke 0 CALL rc-relative rel-dlsym ; M: x86.32 %alien-invoke 0 CALL rc-relative rel-dlsym ;
: push-vm-ptr ( -- ) : push-vm-ptr ( -- )
0 PUSH rc-absolute-cell rel-vm ; ! push the vm ptr as an argument 0 PUSH 0 rc-absolute-cell rel-vm ; ! push the vm ptr as an argument
M: x86.32 return-struct-in-registers? ( c-type -- ? ) M: x86.32 return-struct-in-registers? ( c-type -- ? )
c-type c-type

View File

@ -26,10 +26,10 @@ IN: bootstrap.x86
temp0 temp0 [] MOV temp0 temp0 [] MOV
! save stack pointer ! save stack pointer
temp0 [] stack-reg MOV temp0 [] stack-reg MOV
! load XT
temp1 0 MOV rc-absolute-cell rt-primitive jit-rel
! load vm ptr ! load vm ptr
arg1 0 MOV rc-absolute-cell rt-vm jit-rel arg1 0 MOV rc-absolute-cell rt-vm jit-rel
! load XT
temp1 0 MOV rc-absolute-cell rt-primitive jit-rel
! go ! go
temp1 JMP temp1 JMP
] jit-primitive jit-define ] jit-primitive jit-define

View File

@ -252,7 +252,7 @@ big-endian off
! pop stack ! pop stack
ds-reg bootstrap-cell SUB ds-reg bootstrap-cell SUB
! pass vm pointer ! pass vm pointer
arg2 0 MOV rc-absolute-cell rt-vm jit-rel arg2 0 MOV 0 jit-literal rc-absolute-cell rt-vm jit-rel
! call quotation ! call quotation
arg1 quot-xt-offset [+] JMP arg1 quot-xt-offset [+] JMP
] \ (call) define-sub-primitive ] \ (call) define-sub-primitive
@ -402,6 +402,7 @@ big-endian off
! Comparisons ! Comparisons
: jit-compare ( insn -- ) : jit-compare ( insn -- )
! load t ! load t
t jit-literal
temp3 0 MOV rc-absolute-cell rt-immediate jit-rel temp3 0 MOV rc-absolute-cell rt-immediate jit-rel
! load f ! load f
temp1 \ f tag-number MOV temp1 \ f tag-number MOV

View File

@ -370,10 +370,10 @@ M: x86 %shr int-rep two-operand [ SHR ] emit-shift ;
M: x86 %sar int-rep two-operand [ SAR ] emit-shift ; M: x86 %sar int-rep two-operand [ SAR ] emit-shift ;
: %mov-vm-ptr ( reg -- ) : %mov-vm-ptr ( reg -- )
0 MOV rc-absolute-cell rel-vm ; 0 MOV 0 rc-absolute-cell rel-vm ;
M: x86 %vm-field-ptr ( dst field -- ) M: x86 %vm-field-ptr ( dst field -- )
[ drop %mov-vm-ptr ] [ vm-field-offset ADD ] 2bi ; [ 0 MOV ] dip vm-field-offset rc-absolute-cell rel-vm ;
: load-allot-ptr ( nursery-ptr allot-ptr -- ) : load-allot-ptr ( nursery-ptr allot-ptr -- )
[ drop "nursery" %vm-field-ptr ] [ swap [] MOV ] 2bi ; [ drop "nursery" %vm-field-ptr ] [ swap [] MOV ] 2bi ;

View File

@ -8,10 +8,10 @@ IN: quotations
<PRIVATE <PRIVATE
: uncurry ( curry -- obj quot ) : uncurry ( curry -- obj quot )
dup 2 slot swap 3 slot ; inline { curry } declare dup 2 slot swap 3 slot ; inline
: uncompose ( compose -- quot quot2 ) : uncompose ( compose -- quot quot2 )
dup 2 slot swap 3 slot ; inline { compose } declare dup 2 slot swap 3 slot ; inline
PRIVATE> PRIVATE>

View File

@ -79,6 +79,21 @@ void growable_array::add(cell elt_)
parent_vm->set_array_nth(elements.untagged(),count++,elt.value()); parent_vm->set_array_nth(elements.untagged(),count++,elt.value());
} }
void growable_array::append(array *elts_)
{
factor_vm *parent_vm = elements.parent_vm;
gc_root<array> elts(elts_,parent_vm);
cell capacity = array_capacity(elts.untagged());
if(count + capacity > array_capacity(elements.untagged()))
{
elements = parent_vm->reallot_array(elements.untagged(),
(count + capacity) * 2);
}
for(cell index = 0; index < capacity; index++)
parent_vm->set_array_nth(elements.untagged(),count++,array_nth(elts.untagged(),index));
}
void growable_array::trim() void growable_array::trim()
{ {
factor_vm *parent_vm = elements.parent_vm; factor_vm *parent_vm = elements.parent_vm;

View File

@ -29,6 +29,7 @@ struct growable_array {
explicit growable_array(factor_vm *myvm, cell capacity = 10) : count(0), elements(myvm->allot_array(capacity,F),myvm) {} explicit growable_array(factor_vm *myvm, cell capacity = 10) : count(0), elements(myvm->allot_array(capacity,F),myvm) {}
void add(cell elt); void add(cell elt);
void append(array *elts);
void trim(); void trim();
}; };

View File

@ -34,13 +34,13 @@ int factor_vm::number_of_parameters(relocation_type type)
case RT_IMMEDIATE: case RT_IMMEDIATE:
case RT_HERE: case RT_HERE:
case RT_UNTAGGED: case RT_UNTAGGED:
case RT_VM:
return 1; return 1;
case RT_DLSYM: case RT_DLSYM:
return 2; return 2;
case RT_THIS: case RT_THIS:
case RT_STACK_CHAIN: case RT_STACK_CHAIN:
case RT_MEGAMORPHIC_CACHE_HITS: case RT_MEGAMORPHIC_CACHE_HITS:
case RT_VM:
case RT_CARDS_OFFSET: case RT_CARDS_OFFSET:
case RT_DECKS_OFFSET: case RT_DECKS_OFFSET:
return 0; return 0;
@ -181,7 +181,7 @@ cell factor_vm::compute_relocation(relocation_entry rel, cell index, code_block
case RT_MEGAMORPHIC_CACHE_HITS: case RT_MEGAMORPHIC_CACHE_HITS:
return (cell)&megamorphic_cache_hits; return (cell)&megamorphic_cache_hits;
case RT_VM: case RT_VM:
return (cell)this; return (cell)this + untag_fixnum(ARG);
case RT_CARDS_OFFSET: case RT_CARDS_OFFSET:
return cards_offset; return cards_offset;
case RT_DECKS_OFFSET: case RT_DECKS_OFFSET:

View File

@ -41,9 +41,9 @@ struct jit {
void emit_subprimitive(cell word_) { void emit_subprimitive(cell word_) {
gc_root<word> word(word_,parent_vm); gc_root<word> word(word_,parent_vm);
gc_root<array> code_template(word->subprimitive,parent_vm); gc_root<array> code_pair(word->subprimitive,parent_vm);
if(array_capacity(code_template.untagged()) > 1) literal(parent_vm->T); literals.append(parent_vm->untag<array>(array_nth(code_pair.untagged(),0)));
emit(code_template.value()); emit(array_nth(code_pair.untagged(),1));
} }
void emit_class_lookup(fixnum index, cell type); void emit_class_lookup(fixnum index, cell type);

View File

@ -199,9 +199,6 @@ struct string : public object {
/* The compiled code heap is structured into blocks. */ /* The compiled code heap is structured into blocks. */
struct heap_block struct heap_block
{ {
/* Bit 0: mark
Bit 1-7: type
Bit 8-...: size */
cell header; cell header;
bool marked_p() { return header & 1; } bool marked_p() { return header & 1; }

View File

@ -199,7 +199,9 @@ void quotation_jit::iterate_quotation()
/* Primitive calls */ /* Primitive calls */
if(primitive_call_p(i,length)) if(primitive_call_p(i,length))
{ {
emit_with(parent_vm->userenv[JIT_PRIMITIVE],obj.value()); literal(tag_fixnum(0));
literal(obj.value());
emit(parent_vm->userenv[JIT_PRIMITIVE]);
i++; i++;