+ int rs = get_reg(regmap,-1);
+ int rt = get_reg(regmap,target);
+ assert(rs >= 0);
+ assert(rt >= 0);
+ uintptr_t host_addr = 0;
+ void *handler = get_direct_memhandler(mem_wtab, addr, type, &host_addr);
+ if (handler == NULL) {
+ if (addr != host_addr)
+ emit_movimm_from(addr, rs, host_addr, rs);
+ switch(type) {
+ case STOREB_STUB: emit_writebyte_indexed(rt, 0, rs); break;
+ case STOREH_STUB: emit_writehword_indexed(rt, 0, rs); break;
+ case STOREW_STUB: emit_writeword_indexed(rt, 0, rs); break;
+ default: assert(0);
+ }
+ return;
+ }
+
+ // call a memhandler
+ save_regs(reglist);
+ //pass_args(rs, rt);
+ int cc = get_reg(regmap, CCREG);
+ assert(cc >= 0);
+ emit_addimm(cc, CLOCK_ADJUST(adj+1), 2);
+ //emit_movimm((uintptr_t)handler, 3);
+ // returns new cycle_count
+
+ emit_readword(&last_count, HOST_TEMPREG);
+ emit_writeword(rs, &address); // some handlers still need it
+ emit_add(2, HOST_TEMPREG, 2);
+ emit_writeword(2, &Count);
+ emit_mov(1, 0);
+ emit_call(handler);
+ emit_readword(&next_interupt, 0);
+ emit_readword(&Count, 1);
+ emit_writeword(0, &last_count);
+ emit_sub(1, 0, cc);
+
+ emit_addimm(cc,-CLOCK_ADJUST(adj+1),cc);
+ restore_regs(reglist);