Machine code is now stored in a byte array instead of an array for add_code_block()
parent
59d6131c7c
commit
5fb5c19d61
|
@ -111,7 +111,7 @@ SYMBOL: jit-define-offset
|
||||||
jit-define-rc get
|
jit-define-rc get
|
||||||
jit-define-rt get
|
jit-define-rt get
|
||||||
jit-define-offset get 3array
|
jit-define-offset get 3array
|
||||||
] { } make prefix ;
|
] B{ } make prefix ;
|
||||||
|
|
||||||
: jit-define ( quot name -- )
|
: jit-define ( quot name -- )
|
||||||
[ make-jit ] dip set ;
|
[ make-jit ] dip set ;
|
||||||
|
@ -135,7 +135,6 @@ SYMBOL: bootstrap-global
|
||||||
SYMBOL: bootstrap-boot-quot
|
SYMBOL: bootstrap-boot-quot
|
||||||
|
|
||||||
! JIT parameters
|
! JIT parameters
|
||||||
SYMBOL: jit-code-format
|
|
||||||
SYMBOL: jit-prolog
|
SYMBOL: jit-prolog
|
||||||
SYMBOL: jit-primitive-word
|
SYMBOL: jit-primitive-word
|
||||||
SYMBOL: jit-primitive
|
SYMBOL: jit-primitive
|
||||||
|
@ -185,7 +184,6 @@ SYMBOL: undefined-quot
|
||||||
H{
|
H{
|
||||||
{ bootstrap-boot-quot 20 }
|
{ bootstrap-boot-quot 20 }
|
||||||
{ bootstrap-global 21 }
|
{ bootstrap-global 21 }
|
||||||
{ jit-code-format 22 }
|
|
||||||
{ jit-prolog 23 }
|
{ jit-prolog 23 }
|
||||||
{ jit-primitive-word 24 }
|
{ jit-primitive-word 24 }
|
||||||
{ jit-primitive 25 }
|
{ jit-primitive 25 }
|
||||||
|
@ -538,7 +536,6 @@ M: quotation '
|
||||||
\ mega-cache-miss \ mega-miss-word set
|
\ mega-cache-miss \ mega-miss-word set
|
||||||
[ undefined ] undefined-quot set
|
[ undefined ] undefined-quot set
|
||||||
{
|
{
|
||||||
jit-code-format
|
|
||||||
jit-prolog
|
jit-prolog
|
||||||
jit-primitive-word
|
jit-primitive-word
|
||||||
jit-primitive
|
jit-primitive
|
||||||
|
|
|
@ -9,9 +9,7 @@ IN: compiler.codegen.fixup
|
||||||
|
|
||||||
GENERIC: fixup* ( obj -- )
|
GENERIC: fixup* ( obj -- )
|
||||||
|
|
||||||
: code-format ( -- n ) 22 getenv ;
|
: compiled-offset ( -- n ) building get length ;
|
||||||
|
|
||||||
: compiled-offset ( -- n ) building get length code-format * ;
|
|
||||||
|
|
||||||
SYMBOL: relocation-table
|
SYMBOL: relocation-table
|
||||||
SYMBOL: label-table
|
SYMBOL: label-table
|
||||||
|
@ -91,4 +89,4 @@ SYMBOL: literal-table
|
||||||
literal-table get >array
|
literal-table get >array
|
||||||
relocation-table get >byte-array
|
relocation-table get >byte-array
|
||||||
label-table get resolve-labels
|
label-table get resolve-labels
|
||||||
] { } make 4array ;
|
] B{ } make 4array ;
|
||||||
|
|
|
@ -8,8 +8,6 @@ IN: bootstrap.x86
|
||||||
|
|
||||||
big-endian off
|
big-endian off
|
||||||
|
|
||||||
1 jit-code-format set
|
|
||||||
|
|
||||||
[
|
[
|
||||||
! Load word
|
! Load word
|
||||||
temp0 0 MOV rc-absolute-cell rt-immediate jit-rel
|
temp0 0 MOV rc-absolute-cell rt-immediate jit-rel
|
||||||
|
|
|
@ -396,7 +396,7 @@ void relocate_code_block(F_CODE_BLOCK *compiled)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fixup labels. This is done at compile time, not image load time */
|
/* Fixup labels. This is done at compile time, not image load time */
|
||||||
void fixup_labels(F_ARRAY *labels, CELL code_format, F_CODE_BLOCK *compiled)
|
void fixup_labels(F_ARRAY *labels, F_CODE_BLOCK *compiled)
|
||||||
{
|
{
|
||||||
CELL i;
|
CELL i;
|
||||||
CELL size = array_capacity(labels);
|
CELL size = array_capacity(labels);
|
||||||
|
@ -413,31 +413,6 @@ void fixup_labels(F_ARRAY *labels, CELL code_format, F_CODE_BLOCK *compiled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write a sequence of integers to memory, with 'format' bytes per integer */
|
|
||||||
void deposit_integers(CELL here, F_ARRAY *array, CELL format)
|
|
||||||
{
|
|
||||||
CELL count = array_capacity(array);
|
|
||||||
CELL i;
|
|
||||||
|
|
||||||
for(i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
F_FIXNUM value = to_fixnum(array_nth(array,i));
|
|
||||||
if(format == 1)
|
|
||||||
bput(here + i,value);
|
|
||||||
else if(format == sizeof(unsigned int))
|
|
||||||
*(unsigned int *)(here + format * i) = value;
|
|
||||||
else if(format == sizeof(CELL))
|
|
||||||
*(CELL *)(here + format * i) = value;
|
|
||||||
else
|
|
||||||
critical_error("Bad format in deposit_integers()",format);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CELL compiled_code_format(void)
|
|
||||||
{
|
|
||||||
return untag_fixnum_fast(userenv[JIT_CODE_FORMAT]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Might GC */
|
/* Might GC */
|
||||||
F_CODE_BLOCK *allot_code_block(CELL size)
|
F_CODE_BLOCK *allot_code_block(CELL size)
|
||||||
{
|
{
|
||||||
|
@ -469,7 +444,7 @@ F_CODE_BLOCK *allot_code_block(CELL size)
|
||||||
/* Might GC */
|
/* Might GC */
|
||||||
F_CODE_BLOCK *add_code_block(
|
F_CODE_BLOCK *add_code_block(
|
||||||
CELL type,
|
CELL type,
|
||||||
F_ARRAY *code,
|
F_BYTE_ARRAY *code,
|
||||||
F_ARRAY *labels,
|
F_ARRAY *labels,
|
||||||
CELL relocation,
|
CELL relocation,
|
||||||
CELL literals)
|
CELL literals)
|
||||||
|
@ -477,11 +452,10 @@ F_CODE_BLOCK *add_code_block(
|
||||||
#ifdef FACTOR_DEBUG
|
#ifdef FACTOR_DEBUG
|
||||||
type_check(ARRAY_TYPE,literals);
|
type_check(ARRAY_TYPE,literals);
|
||||||
type_check(BYTE_ARRAY_TYPE,relocation);
|
type_check(BYTE_ARRAY_TYPE,relocation);
|
||||||
assert(untag_header(code->header) == ARRAY_TYPE);
|
assert(untag_header(code->header) == BYTE_ARRAY_TYPE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CELL code_format = compiled_code_format();
|
CELL code_length = align8(array_capacity(code));
|
||||||
CELL code_length = align8(array_capacity(code) * code_format);
|
|
||||||
|
|
||||||
REGISTER_ROOT(literals);
|
REGISTER_ROOT(literals);
|
||||||
REGISTER_ROOT(relocation);
|
REGISTER_ROOT(relocation);
|
||||||
|
@ -506,16 +480,11 @@ F_CODE_BLOCK *add_code_block(
|
||||||
compiled->literals = literals;
|
compiled->literals = literals;
|
||||||
compiled->relocation = relocation;
|
compiled->relocation = relocation;
|
||||||
|
|
||||||
#ifdef FACTOR_DEBUG
|
|
||||||
type_check(ARRAY_TYPE,compiled->literals);
|
|
||||||
type_check(BYTE_ARRAY_TYPE,compiled->relocation);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* code */
|
/* code */
|
||||||
deposit_integers((CELL)(compiled + 1),code,code_format);
|
memcpy(compiled + 1,code + 1,code_length);
|
||||||
|
|
||||||
/* fixup labels */
|
/* fixup labels */
|
||||||
if(labels) fixup_labels(labels,code_format,compiled);
|
if(labels) fixup_labels(labels,compiled);
|
||||||
|
|
||||||
/* next time we do a minor GC, we have to scan the code heap for
|
/* next time we do a minor GC, we have to scan the code heap for
|
||||||
literals */
|
literals */
|
||||||
|
|
|
@ -79,8 +79,6 @@ void mark_object_code_block(CELL scan);
|
||||||
|
|
||||||
void relocate_code_block(F_CODE_BLOCK *relocating);
|
void relocate_code_block(F_CODE_BLOCK *relocating);
|
||||||
|
|
||||||
CELL compiled_code_format(void);
|
|
||||||
|
|
||||||
INLINE bool stack_traces_p(void)
|
INLINE bool stack_traces_p(void)
|
||||||
{
|
{
|
||||||
return userenv[STACK_TRACES_ENV] != F;
|
return userenv[STACK_TRACES_ENV] != F;
|
||||||
|
@ -88,7 +86,7 @@ INLINE bool stack_traces_p(void)
|
||||||
|
|
||||||
F_CODE_BLOCK *add_code_block(
|
F_CODE_BLOCK *add_code_block(
|
||||||
CELL type,
|
CELL type,
|
||||||
F_ARRAY *code,
|
F_BYTE_ARRAY *code,
|
||||||
F_ARRAY *labels,
|
F_ARRAY *labels,
|
||||||
CELL relocation,
|
CELL relocation,
|
||||||
CELL literals);
|
CELL literals);
|
||||||
|
|
|
@ -93,7 +93,7 @@ void primitive_modify_code_heap(void)
|
||||||
CELL literals = array_nth(compiled_code,0);
|
CELL literals = array_nth(compiled_code,0);
|
||||||
CELL relocation = array_nth(compiled_code,1);
|
CELL relocation = array_nth(compiled_code,1);
|
||||||
F_ARRAY *labels = untag_array(array_nth(compiled_code,2));
|
F_ARRAY *labels = untag_array(array_nth(compiled_code,2));
|
||||||
F_ARRAY *code = untag_array(array_nth(compiled_code,3));
|
F_BYTE_ARRAY *code = untag_byte_array(array_nth(compiled_code,3));
|
||||||
|
|
||||||
REGISTER_UNTAGGED(alist);
|
REGISTER_UNTAGGED(alist);
|
||||||
REGISTER_UNTAGGED(word);
|
REGISTER_UNTAGGED(word);
|
||||||
|
|
14
vm/jit.c
14
vm/jit.c
|
@ -13,9 +13,8 @@ void jit_init(F_JIT *jit, CELL jit_type, CELL owner)
|
||||||
REGISTER_ROOT(jit->owner);
|
REGISTER_ROOT(jit->owner);
|
||||||
|
|
||||||
jit->type = jit_type;
|
jit->type = jit_type;
|
||||||
jit->code_format = compiled_code_format();
|
|
||||||
|
|
||||||
jit->code = make_growable_array();
|
jit->code = make_growable_byte_array();
|
||||||
REGISTER_ROOT(jit->code.array);
|
REGISTER_ROOT(jit->code.array);
|
||||||
jit->relocation = make_growable_byte_array();
|
jit->relocation = make_growable_byte_array();
|
||||||
REGISTER_ROOT(jit->relocation.array);
|
REGISTER_ROOT(jit->relocation.array);
|
||||||
|
@ -29,7 +28,7 @@ void jit_init(F_JIT *jit, CELL jit_type, CELL owner)
|
||||||
/* Allocates memory */
|
/* Allocates memory */
|
||||||
F_CODE_BLOCK *jit_make_code_block(F_JIT *jit)
|
F_CODE_BLOCK *jit_make_code_block(F_JIT *jit)
|
||||||
{
|
{
|
||||||
growable_array_trim(&jit->code);
|
growable_byte_array_trim(&jit->code);
|
||||||
growable_byte_array_trim(&jit->relocation);
|
growable_byte_array_trim(&jit->relocation);
|
||||||
growable_array_trim(&jit->literals);
|
growable_array_trim(&jit->literals);
|
||||||
|
|
||||||
|
@ -66,9 +65,9 @@ static F_REL rel_to_emit(F_JIT *jit, CELL template, bool *rel_p)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*rel_p = true;
|
*rel_p = true;
|
||||||
return (to_fixnum(rel_type) << 28)
|
return (untag_fixnum_fast(rel_type) << 28)
|
||||||
| (to_fixnum(rel_class) << 24)
|
| (untag_fixnum_fast(rel_class) << 24)
|
||||||
| ((jit->code.count + to_fixnum(offset)) * jit->code_format);
|
| ((jit->code.count + untag_fixnum_fast(offset)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +78,8 @@ void jit_emit(F_JIT *jit, CELL template)
|
||||||
bool rel_p;
|
bool rel_p;
|
||||||
F_REL rel = rel_to_emit(jit,template,&rel_p);
|
F_REL rel = rel_to_emit(jit,template,&rel_p);
|
||||||
if(rel_p) growable_byte_array_append(&jit->relocation,&rel,sizeof(F_REL));
|
if(rel_p) growable_byte_array_append(&jit->relocation,&rel,sizeof(F_REL));
|
||||||
growable_array_append(&jit->code,code_to_emit(template));
|
F_BYTE_ARRAY *code = code_to_emit(template);
|
||||||
|
growable_byte_array_append(&jit->code,code + 1,array_capacity(code));
|
||||||
UNREGISTER_ROOT(template);
|
UNREGISTER_ROOT(template);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
5
vm/jit.h
5
vm/jit.h
|
@ -1,8 +1,7 @@
|
||||||
typedef struct {
|
typedef struct {
|
||||||
CELL type;
|
CELL type;
|
||||||
CELL owner;
|
CELL owner;
|
||||||
CELL code_format;
|
F_GROWABLE_BYTE_ARRAY code;
|
||||||
F_GROWABLE_ARRAY code;
|
|
||||||
F_GROWABLE_BYTE_ARRAY relocation;
|
F_GROWABLE_BYTE_ARRAY relocation;
|
||||||
F_GROWABLE_ARRAY literals;
|
F_GROWABLE_ARRAY literals;
|
||||||
} F_JIT;
|
} F_JIT;
|
||||||
|
@ -11,7 +10,7 @@ void jit_init(F_JIT *jit, CELL jit_type, CELL owner);
|
||||||
F_CODE_BLOCK *jit_make_code_block(F_JIT *jit);
|
F_CODE_BLOCK *jit_make_code_block(F_JIT *jit);
|
||||||
void jit_dispose(F_JIT *jit);
|
void jit_dispose(F_JIT *jit);
|
||||||
|
|
||||||
INLINE F_ARRAY *code_to_emit(CELL template)
|
INLINE F_BYTE_ARRAY *code_to_emit(CELL template)
|
||||||
{
|
{
|
||||||
return untag_object(array_nth(untag_object(template),0));
|
return untag_object(array_nth(untag_object(template),0));
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,7 +310,7 @@ worse than the duplication itself (eg, putting all state in some global
|
||||||
struct.) */
|
struct.) */
|
||||||
#define COUNT(name,scan) \
|
#define COUNT(name,scan) \
|
||||||
{ \
|
{ \
|
||||||
CELL size = array_capacity(code_to_emit(name)) * code_format; \
|
CELL size = array_capacity(code_to_emit(name)); \
|
||||||
if(offset == 0) return scan - 1; \
|
if(offset == 0) return scan - 1; \
|
||||||
if(offset < size) return scan + 1; \
|
if(offset < size) return scan + 1; \
|
||||||
offset -= size; \
|
offset -= size; \
|
||||||
|
@ -324,8 +324,6 @@ struct.) */
|
||||||
|
|
||||||
F_FIXNUM quot_code_offset_to_scan(CELL quot, F_FIXNUM offset)
|
F_FIXNUM quot_code_offset_to_scan(CELL quot, F_FIXNUM offset)
|
||||||
{
|
{
|
||||||
CELL code_format = compiled_code_format();
|
|
||||||
|
|
||||||
CELL array = untag_quotation(quot)->array;
|
CELL array = untag_quotation(quot)->array;
|
||||||
|
|
||||||
bool stack_frame = jit_stack_frame_p(untag_object(array));
|
bool stack_frame = jit_stack_frame_p(untag_object(array));
|
||||||
|
|
3
vm/run.h
3
vm/run.h
|
@ -33,8 +33,7 @@ typedef enum {
|
||||||
GLOBAL_ENV, /* global namespace */
|
GLOBAL_ENV, /* global namespace */
|
||||||
|
|
||||||
/* Quotation compilation in quotations.c */
|
/* Quotation compilation in quotations.c */
|
||||||
JIT_CODE_FORMAT = 22,
|
JIT_PROLOG = 23,
|
||||||
JIT_PROLOG,
|
|
||||||
JIT_PRIMITIVE_WORD,
|
JIT_PRIMITIVE_WORD,
|
||||||
JIT_PRIMITIVE,
|
JIT_PRIMITIVE,
|
||||||
JIT_WORD_JUMP,
|
JIT_WORD_JUMP,
|
||||||
|
|
Loading…
Reference in New Issue