remove some indirections in thread-local lookup

svn: r16890
This commit is contained in:
Matthew Flatt 2009-11-19 14:22:08 +00:00
parent 4ade4cf9ef
commit 837c057ca9
6 changed files with 77 additions and 99 deletions

View File

@ -247,7 +247,7 @@ inline static void BTC_memory_account_mark(NewGC *gc, mpage *page, void *ptr)
if(info->btc_mark == gc->old_btc_mark) { if(info->btc_mark == gc->old_btc_mark) {
info->btc_mark = gc->new_btc_mark; info->btc_mark = gc->new_btc_mark;
account_memory(gc, gc->current_mark_owner, gcBYTES_TO_WORDS(page->size)); account_memory(gc, gc->current_mark_owner, gcBYTES_TO_WORDS(page->size));
push_ptr(TAG_AS_BIG_PAGE_PTR(ptr)); push_ptr(gc, TAG_AS_BIG_PAGE_PTR(ptr));
} }
} else { } else {
/* medium page */ /* medium page */
@ -257,7 +257,7 @@ inline static void BTC_memory_account_mark(NewGC *gc, mpage *page, void *ptr)
info->btc_mark = gc->new_btc_mark; info->btc_mark = gc->new_btc_mark;
account_memory(gc, gc->current_mark_owner, info->size); account_memory(gc, gc->current_mark_owner, info->size);
ptr = OBJHEAD_TO_OBJPTR(info); ptr = OBJHEAD_TO_OBJPTR(info);
push_ptr(ptr); push_ptr(gc, ptr);
} }
} }
} else { } else {
@ -266,7 +266,7 @@ inline static void BTC_memory_account_mark(NewGC *gc, mpage *page, void *ptr)
if(info->btc_mark == gc->old_btc_mark) { if(info->btc_mark == gc->old_btc_mark) {
info->btc_mark = gc->new_btc_mark; info->btc_mark = gc->new_btc_mark;
account_memory(gc, gc->current_mark_owner, info->size); account_memory(gc, gc->current_mark_owner, info->size);
push_ptr(ptr); push_ptr(gc, ptr);
} }
} }
} }
@ -341,12 +341,12 @@ static void propagate_accounting_marks(NewGC *gc)
PageMap pagemap = gc->page_maps; PageMap pagemap = gc->page_maps;
Mark_Proc *mark_table = gc->mark_table; Mark_Proc *mark_table = gc->mark_table;
while(pop_ptr(&p) && !gc->kill_propagation_loop) { while(pop_ptr(gc, &p) && !gc->kill_propagation_loop) {
/* GCDEBUG((DEBUGOUTF, "btc_account: popped off page %p:%p, ptr %p\n", page, page->addr, p)); */ /* GCDEBUG((DEBUGOUTF, "btc_account: popped off page %p:%p, ptr %p\n", page, page->addr, p)); */
propagate_marks_worker(pagemap, mark_table, p); propagate_marks_worker(pagemap, mark_table, p);
} }
if(gc->kill_propagation_loop) if(gc->kill_propagation_loop)
reset_pointer_stack(); reset_pointer_stack(gc);
} }
inline static void BTC_initialize_mark_table(NewGC *gc) { inline static void BTC_initialize_mark_table(NewGC *gc) {
@ -428,7 +428,7 @@ static void BTC_do_accounting(NewGC *gc)
gc->new_btc_mark = !gc->new_btc_mark; gc->new_btc_mark = !gc->new_btc_mark;
} }
clear_stack_pages(); clear_stack_pages(gc);
} }
inline static void BTC_add_account_hook(int type,void *c1,void *c2,unsigned long b) inline static void BTC_add_account_hook(int type,void *c1,void *c2,unsigned long b)

View File

@ -32,7 +32,6 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
#include "pthread.h"
#include "platforms.h" #include "platforms.h"
#include "../src/schpriv.h" #include "../src/schpriv.h"
#include "gc2.h" #include "gc2.h"
@ -1544,8 +1543,6 @@ inline static void reset_weak_finalizers(NewGC *gc)
#define MARK_STACK_START(ms) ((void **)(void *)&ms[1]) #define MARK_STACK_START(ms) ((void **)(void *)&ms[1])
#define MARK_STACK_END(ms) ((void **)((char *)ms + STACK_PART_SIZE)) #define MARK_STACK_END(ms) ((void **)((char *)ms + STACK_PART_SIZE))
THREAD_LOCAL_DECL(static MarkSegment *mark_stack = NULL);
inline static MarkSegment* mark_stack_create_frame() { inline static MarkSegment* mark_stack_create_frame() {
MarkSegment *mark_frame = (MarkSegment*)ofm_malloc(STACK_PART_SIZE); MarkSegment *mark_frame = (MarkSegment*)ofm_malloc(STACK_PART_SIZE);
mark_frame->next = NULL; mark_frame->next = NULL;
@ -1553,41 +1550,41 @@ inline static MarkSegment* mark_stack_create_frame() {
return mark_frame; return mark_frame;
} }
inline static void mark_stack_initialize() { inline static void mark_stack_initialize(NewGC *gc) {
/* This happens at the very beginning */ /* This happens at the very beginning */
if(!mark_stack) { if(!gc->mark_stack) {
mark_stack = mark_stack_create_frame(); gc->mark_stack = mark_stack_create_frame();
mark_stack->prev = NULL; gc->mark_stack->prev = NULL;
} }
} }
inline static void push_ptr(void *ptr) inline static void push_ptr(NewGC *gc, void *ptr)
{ {
/* This happens during propagation if we go past the end of this MarkSegment*/ /* This happens during propagation if we go past the end of this MarkSegment*/
if(mark_stack->top == MARK_STACK_END(mark_stack)) { if(gc->mark_stack->top == MARK_STACK_END(gc->mark_stack)) {
/* test to see if we already have another stack page ready */ /* test to see if we already have another stack page ready */
if(mark_stack->next) { if(gc->mark_stack->next) {
/* we do, so just use it */ /* we do, so just use it */
mark_stack = mark_stack->next; gc->mark_stack = gc->mark_stack->next;
mark_stack->top = MARK_STACK_START(mark_stack); gc->mark_stack->top = MARK_STACK_START(gc->mark_stack);
} else { } else {
/* we don't, so we need to allocate one */ /* we don't, so we need to allocate one */
mark_stack->next = mark_stack_create_frame(); gc->mark_stack->next = mark_stack_create_frame(gc);
mark_stack->next->prev = mark_stack; gc->mark_stack->next->prev = gc->mark_stack;
mark_stack = mark_stack->next; gc->mark_stack = gc->mark_stack->next;
} }
} }
/* at this point, we're guaranteed to be good to push pointers */ /* at this point, we're guaranteed to be good to push pointers */
*(mark_stack->top++) = ptr; *(gc->mark_stack->top++) = ptr;
} }
inline static int pop_ptr(void **ptr) inline static int pop_ptr(NewGC *gc, void **ptr)
{ {
if(mark_stack->top == MARK_STACK_START(mark_stack)) { if(gc->mark_stack->top == MARK_STACK_START(gc->mark_stack)) {
if(mark_stack->prev) { if(gc->mark_stack->prev) {
/* if there is a previous page, go to it */ /* if there is a previous page, go to it */
mark_stack = mark_stack->prev; gc->mark_stack = gc->mark_stack->prev;
} else { } else {
/* if there isn't a previous page, then we've hit the bottom of the stack */ /* if there isn't a previous page, then we've hit the bottom of the stack */
return 0; return 0;
@ -1595,41 +1592,41 @@ inline static int pop_ptr(void **ptr)
} }
/* if we get here, we're guaranteed to have data */ /* if we get here, we're guaranteed to have data */
*ptr = *(--mark_stack->top); *ptr = *(--gc->mark_stack->top);
return 1; return 1;
} }
inline static void clear_stack_pages(void) inline static void clear_stack_pages(NewGC *gc)
{ {
if(mark_stack) { if(gc->mark_stack) {
MarkSegment *temp; MarkSegment *temp;
MarkSegment *base; MarkSegment *base;
int keep = 2; int keep = 2;
/* go to the head of the list */ /* go to the head of the list */
for(; mark_stack->prev; mark_stack = mark_stack->prev) {} for(; gc->mark_stack->prev; gc->mark_stack = gc->mark_stack->prev) {}
/* then go through and clear them out */ /* then go through and clear them out */
base = mark_stack; base = gc->mark_stack;
for(; mark_stack; mark_stack = temp) { for(; gc->mark_stack; gc->mark_stack = temp) {
temp = mark_stack->next; temp = gc->mark_stack->next;
if(keep) { if(keep) {
keep--; keep--;
if (!keep) if (!keep)
mark_stack->next = NULL; gc->mark_stack->next = NULL;
} else } else
free(mark_stack); free(gc->mark_stack);
} }
mark_stack = base; gc->mark_stack = base;
mark_stack->top = MARK_STACK_START(mark_stack); gc->mark_stack->top = MARK_STACK_START(gc->mark_stack);
} }
} }
inline static void reset_pointer_stack(void) inline static void reset_pointer_stack(NewGC *gc)
{ {
/* go to the head of the list */ /* go to the head of the list */
for(; mark_stack->prev; mark_stack = mark_stack->prev) {} for(; gc->mark_stack->prev; gc->mark_stack = gc->mark_stack->prev) {}
/* reset the stack */ /* reset the stack */
mark_stack->top = MARK_STACK_START(mark_stack); gc->mark_stack->top = MARK_STACK_START(gc->mark_stack);
} }
static inline void propagate_marks_worker(PageMap pagemap, Mark_Proc *mark_table, void *p); static inline void propagate_marks_worker(PageMap pagemap, Mark_Proc *mark_table, void *p);
@ -1769,7 +1766,7 @@ static void NewGC_initialize(NewGC *newgc, NewGC *parentgc) {
NewGCMasterInfo_get_next_id(newgc); NewGCMasterInfo_get_next_id(newgc);
#endif #endif
mark_stack_initialize(); mark_stack_initialize(newgc);
#ifdef SIXTY_FOUR_BIT_INTEGERS #ifdef SIXTY_FOUR_BIT_INTEGERS
newgc->page_maps = ofm_malloc_zero(PAGEMAP64_LEVEL1_SIZE * sizeof (mpage***)); newgc->page_maps = ofm_malloc_zero(PAGEMAP64_LEVEL1_SIZE * sizeof (mpage***));
@ -2033,7 +2030,7 @@ void GC_mark(const void *const_p)
GCDEBUG((DEBUGOUTF, "Marking %p on big page %p\n", p, page)); GCDEBUG((DEBUGOUTF, "Marking %p on big page %p\n", p, page));
/* Finally, we want to add this to our mark queue, so we can /* Finally, we want to add this to our mark queue, so we can
propagate its pointers */ propagate its pointers */
push_ptr(TAG_AS_BIG_PAGE_PTR(p)); push_ptr(gc, TAG_AS_BIG_PAGE_PTR(p));
} else { } else {
/* A medium page. */ /* A medium page. */
objhead *info = MED_OBJHEAD(p, page->size); objhead *info = MED_OBJHEAD(p, page->size);
@ -2046,7 +2043,7 @@ void GC_mark(const void *const_p)
p = OBJHEAD_TO_OBJPTR(info); p = OBJHEAD_TO_OBJPTR(info);
backtrace_new_page_if_needed(gc, page); backtrace_new_page_if_needed(gc, page);
record_backtrace(page, p); record_backtrace(page, p);
push_ptr(p); push_ptr(gc, p);
} }
} else { } else {
objhead *ohead = OBJPTR_TO_OBJHEAD(p); objhead *ohead = OBJPTR_TO_OBJHEAD(p);
@ -2071,7 +2068,7 @@ void GC_mark(const void *const_p)
page->previous_size = PREFIX_SIZE; page->previous_size = PREFIX_SIZE;
page->live_size += ohead->size; page->live_size += ohead->size;
record_backtrace(page, p); record_backtrace(page, p);
push_ptr(p); push_ptr(gc, p);
} else GCDEBUG((DEBUGOUTF, "Not marking %p (it's old; %p / %i)\n", } else GCDEBUG((DEBUGOUTF, "Not marking %p (it's old; %p / %i)\n",
p, page, page->previous_size)); p, page, page->previous_size));
} else { } else {
@ -2158,7 +2155,7 @@ void GC_mark(const void *const_p)
/* set forwarding pointer */ /* set forwarding pointer */
GCDEBUG((DEBUGOUTF,"Marking %p (moved to %p on page %p)\n", p, newp, work)); GCDEBUG((DEBUGOUTF,"Marking %p (moved to %p on page %p)\n", p, newp, work));
*(void**)p = newp; *(void**)p = newp;
push_ptr(newp); push_ptr(gc, newp);
} }
} }
} }
@ -2233,7 +2230,7 @@ static void propagate_marks(NewGC *gc)
PageMap pagemap = gc->page_maps; PageMap pagemap = gc->page_maps;
Mark_Proc *mark_table = gc->mark_table; Mark_Proc *mark_table = gc->mark_table;
while(pop_ptr(&p)) { while(pop_ptr(gc, &p)) {
GCDEBUG((DEBUGOUTF, "Popped pointer %p\n", p)); GCDEBUG((DEBUGOUTF, "Popped pointer %p\n", p));
propagate_marks_worker(pagemap, mark_table, p); propagate_marks_worker(pagemap, mark_table, p);
} }
@ -2606,7 +2603,7 @@ static void mark_backpointers(NewGC *gc)
if(work->size_class) { if(work->size_class) {
/* must be a big page */ /* must be a big page */
work->size_class = 3; work->size_class = 3;
push_ptr(TAG_AS_BIG_PAGE_PTR(BIG_PAGE_TO_OBJECT(work))); push_ptr(gc, TAG_AS_BIG_PAGE_PTR(BIG_PAGE_TO_OBJECT(work)));
} else { } else {
if(work->page_type != PAGE_ATOMIC) { if(work->page_type != PAGE_ATOMIC) {
void **start = PAGE_START_VSS(work); void **start = PAGE_START_VSS(work);
@ -2620,7 +2617,7 @@ static void mark_backpointers(NewGC *gc)
internal_mark. This is because we need every object internal_mark. This is because we need every object
in the older heap to be marked out of and noted as in the older heap to be marked out of and noted as
marked before we do anything else */ marked before we do anything else */
push_ptr(OBJHEAD_TO_OBJPTR(start)); push_ptr(gc, OBJHEAD_TO_OBJPTR(start));
} }
start += info->size; start += info->size;
} }
@ -2649,7 +2646,7 @@ static void mark_backpointers(NewGC *gc)
if(!info->dead) { if(!info->dead) {
info->mark = 1; info->mark = 1;
/* This must be a push_ptr (see above) */ /* This must be a push_ptr (see above) */
push_ptr(OBJHEAD_TO_OBJPTR(info)); push_ptr(gc, OBJHEAD_TO_OBJPTR(info));
} }
start += info->size; start += info->size;
} }
@ -3210,7 +3207,7 @@ static void garbage_collect(NewGC *gc, int force_full)
system clear them later. Better then freeing them, at least. If we're system clear them later. Better then freeing them, at least. If we're
not doing accounting, though, there is no "later" where they'll get not doing accounting, though, there is no "later" where they'll get
removed */ removed */
clear_stack_pages(); clear_stack_pages(gc);
#endif #endif
TIME_STEP("marked"); TIME_STEP("marked");

View File

@ -112,6 +112,8 @@ typedef struct NewGC {
struct mpage *med_pages[NUM_MED_PAGE_SIZES]; struct mpage *med_pages[NUM_MED_PAGE_SIZES];
struct mpage *med_freelist_pages[NUM_MED_PAGE_SIZES]; struct mpage *med_freelist_pages[NUM_MED_PAGE_SIZES];
MarkSegment *mark_stack;
/* Finalization */ /* Finalization */
Fnl *run_queue; Fnl *run_queue;
Fnl *last_in_queue; Fnl *last_in_queue;

View File

@ -41,7 +41,6 @@ extern void scheme_init_os_thread();
#define STACK_COPY_CACHE_SIZE 10 #define STACK_COPY_CACHE_SIZE 10
#define BIGNUM_CACHE_SIZE 16 #define BIGNUM_CACHE_SIZE 16
#define NUM_tl_VARS 14
#define STACK_CACHE_SIZE 32 #define STACK_CACHE_SIZE 32
/* This structure must be 4 words: */ /* This structure must be 4 words: */
@ -85,7 +84,6 @@ typedef struct Thread_Local_Variables {
struct NewGC *GC_; struct NewGC *GC_;
unsigned long GC_gen0_alloc_page_ptr_; unsigned long GC_gen0_alloc_page_ptr_;
unsigned long GC_gen0_alloc_page_end_; unsigned long GC_gen0_alloc_page_end_;
struct MarkSegment *mark_stack_;
void *bignum_cache_[BIGNUM_CACHE_SIZE]; void *bignum_cache_[BIGNUM_CACHE_SIZE];
int cache_count_; int cache_count_;
struct Scheme_Hash_Table *toplevels_ht_; struct Scheme_Hash_Table *toplevels_ht_;
@ -113,7 +111,6 @@ typedef struct Thread_Local_Variables {
struct future_t *current_ft_; struct future_t *current_ft_;
void **codetab_tree_; void **codetab_tree_;
int during_set_; int during_set_;
void *thread_local_pointers_[NUM_tl_VARS];
Stack_Cache_Elem stack_cache_stack_[STACK_CACHE_SIZE]; Stack_Cache_Elem stack_cache_stack_[STACK_CACHE_SIZE];
long stack_cache_stack_pos_; long stack_cache_stack_pos_;
struct Scheme_Object **fixup_runstack_base_; struct Scheme_Object **fixup_runstack_base_;
@ -249,7 +246,6 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL;
#define GC_gen0_alloc_page_ptr XOA (scheme_get_thread_local_variables()->GC_gen0_alloc_page_ptr_) #define GC_gen0_alloc_page_ptr XOA (scheme_get_thread_local_variables()->GC_gen0_alloc_page_ptr_)
#define GC_gen0_alloc_page_end XOA (scheme_get_thread_local_variables()->GC_gen0_alloc_page_end_) #define GC_gen0_alloc_page_end XOA (scheme_get_thread_local_variables()->GC_gen0_alloc_page_end_)
#define GC_variable_stack XOA (scheme_get_thread_local_variables()->GC_variable_stack_) #define GC_variable_stack XOA (scheme_get_thread_local_variables()->GC_variable_stack_)
#define mark_stack XOA (scheme_get_thread_local_variables()->mark_stack_)
#define bignum_cache XOA (scheme_get_thread_local_variables()->bignum_cache_) #define bignum_cache XOA (scheme_get_thread_local_variables()->bignum_cache_)
#define cache_count XOA (scheme_get_thread_local_variables()->cache_count_) #define cache_count XOA (scheme_get_thread_local_variables()->cache_count_)
#define toplevels_ht XOA (scheme_get_thread_local_variables()->toplevels_ht_) #define toplevels_ht XOA (scheme_get_thread_local_variables()->toplevels_ht_)

View File

@ -277,27 +277,27 @@ void scheme_jit_fill_threadlocal_table();
#endif #endif
#ifdef JIT_THREAD_LOCAL #ifdef JIT_THREAD_LOCAL
# define tl_MZ_RUNSTACK 0 # define BOTTOM_VARIABLE GC_variable_stack
# define tl_MZ_RUNSTACK_START 1 # define tl_delta(id) ((unsigned long)&(id) - (unsigned long)&BOTTOM_VARIABLE)
# define tl_GC_gen0_alloc_page_ptr 2 # define tl_MZ_RUNSTACK tl_delta(MZ_RUNSTACK)
# define tl_scheme_current_thread 3 # define tl_MZ_RUNSTACK_START tl_delta(MZ_RUNSTACK_START)
# define tl_scheme_current_cont_mark_pos 4 # define tl_GC_gen0_alloc_page_ptr tl_delta(GC_gen0_alloc_page_ptr)
# define tl_scheme_current_cont_mark_stack 5 # define tl_scheme_current_thread tl_delta(scheme_current_thread)
# define tl_stack_cache_stack_pos 6 # define tl_scheme_current_cont_mark_pos tl_delta(scheme_current_cont_mark_pos)
# define tl_retry_alloc_r1 7 # define tl_scheme_current_cont_mark_stack tl_delta(scheme_current_cont_mark_stack)
# define tl_fixup_runstack_base 8 # define tl_stack_cache_stack_pos tl_delta(stack_cache_stack_pos)
# define tl_fixup_already_in_place 9 # define tl_retry_alloc_r1 tl_delta(retry_alloc_r1)
# define tl_double_result 10 # define tl_fixup_runstack_base tl_delta(fixup_runstack_base)
# define tl_save_fp 11 # define tl_fixup_already_in_place tl_delta(fixup_already_in_place)
# define tl_scheme_fuel_counter 12 # define tl_double_result tl_delta(double_result)
# define tl_scheme_jit_stack_boundary 13 # define tl_save_fp tl_delta(save_fp)
# define tl_scheme_fuel_counter tl_delta(scheme_fuel_counter)
THREAD_LOCAL_DECL(static void *thread_local_pointers[NUM_tl_VARS]); # define tl_scheme_jit_stack_boundary tl_delta(scheme_jit_stack_boundary)
#ifdef MZ_XFORM #ifdef MZ_XFORM
START_XFORM_SKIP; START_XFORM_SKIP;
#endif #endif
static void *get_threadlocal_table() { return &thread_local_pointers; } static void *get_threadlocal_table() { return &BOTTOM_VARIABLE; }
#ifdef MZ_XFORM #ifdef MZ_XFORM
END_XFORM_SKIP; END_XFORM_SKIP;
#endif #endif
@ -305,17 +305,18 @@ END_XFORM_SKIP;
# ifdef JIT_X86_64 # ifdef JIT_X86_64
# define JIT_R10 JIT_R(10) # define JIT_R10 JIT_R(10)
# define JIT_R14 JIT_R(14) # define JIT_R14 JIT_R(14)
# define mz_tl_addr(reg, addr) jit_ldxi_p(reg, JIT_R14, WORDS_TO_BYTES(addr)) # define mz_tl_addr(reg, addr) LEAQmQr((addr), (JIT_R14), 0, 0, (reg))
# define mz_tl_addr_tmp(tmp_reg, addr) (mz_tl_addr(JIT_R10, addr)) # define mz_tl_addr_tmp(tmp_reg, addr) (mz_tl_addr(JIT_R10, addr))
# define mz_tl_addr_untmp(tmp_reg) (void)0 # define mz_tl_addr_untmp(tmp_reg) (void)0
# define mz_tl_tmp_reg(tmp_reg) JIT_R10 # define mz_tl_tmp_reg(tmp_reg) JIT_R10
# else # else
# define mz_tl_addr(reg, addr) (mz_get_local_p(reg, JIT_LOCAL4), jit_ldxi_p(reg, reg, WORDS_TO_BYTES(addr))) # define mz_tl_addr(reg, addr) (mz_get_local_p(reg, JIT_LOCAL4), jit_addi_p(reg, reg, addr))
# define mz_tl_addr_tmp(tmp_reg, addr) (PUSHQr(tmp_reg), mz_tl_addr(tmp_reg, addr)) # define mz_tl_addr_tmp(tmp_reg, addr) (PUSHQr(tmp_reg), mz_tl_addr(tmp_reg, addr))
# define mz_tl_addr_untmp(tmp_reg) POPQr(tmp_reg) # define mz_tl_addr_untmp(tmp_reg) POPQr(tmp_reg)
# define mz_tl_tmp_reg(tmp_reg) tmp_reg # define mz_tl_tmp_reg(tmp_reg) tmp_reg
# endif # endif
/* A given tmp_reg doesn't have to be unused; it just has to be distinct from other arguments. */
# define mz_tl_sti_p(addr, reg, tmp_reg) (mz_tl_addr_tmp(tmp_reg, addr), jit_str_p(mz_tl_tmp_reg(tmp_reg), reg), mz_tl_addr_untmp(tmp_reg)) # define mz_tl_sti_p(addr, reg, tmp_reg) (mz_tl_addr_tmp(tmp_reg, addr), jit_str_p(mz_tl_tmp_reg(tmp_reg), reg), mz_tl_addr_untmp(tmp_reg))
# define mz_tl_sti_l(addr, reg, tmp_reg) (mz_tl_addr_tmp(tmp_reg, addr), jit_str_l(mz_tl_tmp_reg(tmp_reg), reg), mz_tl_addr_untmp(tmp_reg)) # define mz_tl_sti_l(addr, reg, tmp_reg) (mz_tl_addr_tmp(tmp_reg, addr), jit_str_l(mz_tl_tmp_reg(tmp_reg), reg), mz_tl_addr_untmp(tmp_reg))
# define mz_tl_sti_i(addr, reg, tmp_reg) (mz_tl_addr_tmp(tmp_reg, addr), jit_str_i(mz_tl_tmp_reg(tmp_reg), reg), mz_tl_addr_untmp(tmp_reg)) # define mz_tl_sti_i(addr, reg, tmp_reg) (mz_tl_addr_tmp(tmp_reg, addr), jit_str_i(mz_tl_tmp_reg(tmp_reg), reg), mz_tl_addr_untmp(tmp_reg))
@ -1214,6 +1215,13 @@ static void _jit_prolog_again(mz_jit_state *jitter, int n, int ret_addr_reg)
#endif #endif
} }
#else #else
/* From frame pointer, -1 is saved frame pointer, -2 is saved ESI/R12,
and -3 is saved EDI/R13. On entry to a procedure, prolog pushes 4
since the call (which also pushed), so if the stack was 16-bytes
aligned before the call, it is current stack pointer is 1 word
(either 4 or 8 bytes) below alignment (need to push 3 or 1 words to
re-align). Also, for a call without a prolog, th stack pointer is
1 word (for the return address) below alignment. */
# define JIT_LOCAL1 -(JIT_WORD_SIZE * 4) # define JIT_LOCAL1 -(JIT_WORD_SIZE * 4)
# define JIT_LOCAL2 -(JIT_WORD_SIZE * 5) # define JIT_LOCAL2 -(JIT_WORD_SIZE * 5)
# define mz_set_local_p(x, l) jit_stxi_p((l), JIT_FP, (x)) # define mz_set_local_p(x, l) jit_stxi_p((l), JIT_FP, (x))
@ -2245,11 +2253,6 @@ static void ts_on_demand(void)
} }
#ifdef MZ_PRECISE_GC #ifdef MZ_PRECISE_GC
static void *get_new_local_memory(void *p, void *p2)
{
return GC_make_jit_nursery_page();
}
static void *ts_prepare_retry_alloc(void *p, void *p2) static void *ts_prepare_retry_alloc(void *p, void *p2)
{ {
START_XFORM_SKIP; START_XFORM_SKIP;
@ -10296,27 +10299,6 @@ void *scheme_module_start_start(struct Start_Module_Args *a, Scheme_Object *name
/**********************************************************************/ /**********************************************************************/
void scheme_jit_fill_threadlocal_table() { void scheme_jit_fill_threadlocal_table() {
#ifdef JIT_THREAD_LOCAL
thread_local_pointers[tl_MZ_RUNSTACK] = (&MZ_RUNSTACK);
thread_local_pointers[tl_MZ_RUNSTACK_START] = (&MZ_RUNSTACK_START);
thread_local_pointers[tl_scheme_current_thread] = (&scheme_current_thread);
thread_local_pointers[tl_scheme_current_cont_mark_pos] = (&scheme_current_cont_mark_pos);
thread_local_pointers[tl_scheme_current_cont_mark_stack] = (&scheme_current_cont_mark_stack);
thread_local_pointers[tl_stack_cache_stack_pos] = (&stack_cache_stack_pos);
# ifdef CAN_INLINE_ALLOC
thread_local_pointers[tl_GC_gen0_alloc_page_ptr] = (&GC_gen0_alloc_page_ptr);
thread_local_pointers[tl_retry_alloc_r1] = (&retry_alloc_r1);
thread_local_pointers[tl_save_fp] = (&save_fp);
# else
# ifdef INLINE_FP_OPS
thread_local_pointers[tl_double_result] = (&double_result);
# endif
# endif
thread_local_pointers[tl_fixup_runstack_base] = (&fixup_runstack_base);
thread_local_pointers[tl_fixup_already_in_place] = (&fixup_already_in_place);
thread_local_pointers[tl_scheme_fuel_counter] = (void *) (&scheme_fuel_counter);
thread_local_pointers[tl_scheme_jit_stack_boundary] = (void *) (&scheme_jit_stack_boundary);
#endif
} }
/**********************************************************************/ /**********************************************************************/

View File

@ -627,6 +627,7 @@ typedef _uc jit_insn;
#define LAHF_() _O (0x9f ) #define LAHF_() _O (0x9f )
#define LEALmr(MD, MB, MI, MS, RD) _O_r_X (0x8d ,_r4(RD) ,MD,MB,MI,MS ) #define LEALmr(MD, MB, MI, MS, RD) _O_r_X (0x8d ,_r4(RD) ,MD,MB,MI,MS )
#define LEAQmr(MD, MB, MI, MS, RD) _qO_r_X (0x8d ,_r8(RD) ,MD,MB,MI,MS ) #define LEAQmr(MD, MB, MI, MS, RD) _qO_r_X (0x8d ,_r8(RD) ,MD,MB,MI,MS )
#define LEAQmQr(MD, MB, MI, MS, RD) _qO_r_XB (0x8d ,_r8(RD) ,MD,MB,MI,MS )
#define LEAVE_() _O (0xc9 ) #define LEAVE_() _O (0xc9 )