New JIt system, developed by George Oliveira and Anderson Faustino.
This commit is contained in:
374
JIT/HPP/singlecode_write.h
Normal file
374
JIT/HPP/singlecode_write.h
Normal file
@@ -0,0 +1,374 @@
|
||||
#define WRITE_X_VAR_INSTINIT \
|
||||
XREG((*_PREG)->u.x.x) = Unsigned((*_SREG)); \
|
||||
(*_PREG) = NEXTOP((*_PREG), x); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONext();
|
||||
|
||||
#define WRITE_VOID_INSTINIT \
|
||||
(*_PREG) = NEXTOP((*_PREG), e); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONext();
|
||||
|
||||
#define WRITE_N_VOIDS_INSTINIT \
|
||||
register CELL d0; \
|
||||
d0 = (*_PREG)->u.s.s; \
|
||||
(*_PREG) = NEXTOP((*_PREG), s); \
|
||||
for (; d0 > 0; d0--) { \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
} \
|
||||
GONext();
|
||||
|
||||
#define _write_y_var_instinit \
|
||||
INITIALIZE_PERMVAR(YREG+(*_PREG)->u.y.y,Unsigned((*_SREG))); \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONEXT();
|
||||
|
||||
#define _write_x_val_instinit \
|
||||
register CELL d0; \
|
||||
d0 = XREG((*_PREG)->u.x.x); \
|
||||
*(*_SREG)++ = d0; \
|
||||
(*_PREG) = NEXTOP((*_PREG), x); \
|
||||
GONEXT();
|
||||
|
||||
#if defined(YAPOR_SBA) && defined(FROZEN_STACKS)
|
||||
#ifdef FROZEN_STACKS
|
||||
#define _write_x_loc_instinit \
|
||||
BEGD(d0); \
|
||||
d0 = XREG((*_PREG)->u.x.x); \
|
||||
(*_PREG) = NEXTOP((*_PREG), x); \
|
||||
deref_head(d0, w_x_unk); \
|
||||
w_x_bound: \
|
||||
*(*_SREG)++ = d0; \
|
||||
GONEXT(); \
|
||||
\
|
||||
BEGP(pt0); \
|
||||
deref_body(d0, pt0, w_x_unk, w_x_bound); \
|
||||
if (pt0 > HR && pt0<(CELL *)B_FZ) { \
|
||||
Bind_Local(pt0, Unsigned((*_SREG))); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONEXT(); \
|
||||
} \
|
||||
else { \
|
||||
*(*_SREG)++ = Unsigned(pt0); \
|
||||
GONEXT(); \
|
||||
} \
|
||||
ENDP(pt0); \
|
||||
ENDD(d0);
|
||||
#else /* FROZEN_STACKS */
|
||||
#define _write_x_loc_instinit \
|
||||
BEGD(d0); \
|
||||
d0 = XREG((*_PREG)->u.x.x); \
|
||||
(*_PREG) = NEXTOP((*_PREG), x); \
|
||||
deref_head(d0, w_x_unk); \
|
||||
w_x_bound: \
|
||||
*(*_SREG)++ = d0; \
|
||||
GONEXT(); \
|
||||
\
|
||||
BEGP(pt0); \
|
||||
deref_body(d0, pt0, w_x_unk, w_x_bound); \
|
||||
if (pt0 > HR && pt0<(CELL *)B_FZ) { \
|
||||
TRAIL_LOCAL(pt0, Unsigned((*_SREG))); \
|
||||
*pt0 = Unsigned((*_SREG)); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONEXT(); \
|
||||
} \
|
||||
else { \
|
||||
*(*_SREG)++ = Unsigned(pt0); \
|
||||
GONEXT(); \
|
||||
} \
|
||||
ENDP(pt0); \
|
||||
ENDD(d0);
|
||||
#endif /* FROZEN_STACKS */
|
||||
#else /* defined(YAPOR_SBA) && defined(FROZEN_STACKS) */
|
||||
#ifdef FROZEN_STACKS
|
||||
#define _write_x_loc_instinit \
|
||||
BEGD(d0); \
|
||||
d0 = XREG((*_PREG)->u.x.x); \
|
||||
(*_PREG) = NEXTOP((*_PREG), x); \
|
||||
deref_head(d0, w_x_unk); \
|
||||
w_x_bound: \
|
||||
*(*_SREG)++ = d0; \
|
||||
GONEXT(); \
|
||||
\
|
||||
BEGP(pt0); \
|
||||
deref_body(d0, pt0, w_x_unk, w_x_bound); \
|
||||
if (pt0 > HR) { \
|
||||
Bind_Local(pt0, Unsigned((*_SREG))); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONEXT(); \
|
||||
} \
|
||||
else { \
|
||||
*(*_SREG)++ = Unsigned(pt0); \
|
||||
GONEXT(); \
|
||||
} \
|
||||
ENDP(pt0); \
|
||||
ENDD(d0);
|
||||
#else /* FROZEN_STACKS */
|
||||
#define _write_x_loc_instinit \
|
||||
BEGD(d0); \
|
||||
d0 = XREG((*_PREG)->u.x.x); \
|
||||
(*_PREG) = NEXTOP((*_PREG), x); \
|
||||
deref_head(d0, w_x_unk); \
|
||||
w_x_bound: \
|
||||
*(*_SREG)++ = d0; \
|
||||
GONEXT(); \
|
||||
\
|
||||
BEGP(pt0); \
|
||||
deref_body(d0, pt0, w_x_unk, w_x_bound); \
|
||||
if (pt0 > HR) { \
|
||||
TRAIL_LOCAL(pt0, Unsigned((*_SREG))); \
|
||||
*pt0 = Unsigned((*_SREG)); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONEXT(); \
|
||||
} \
|
||||
else { \
|
||||
*(*_SREG)++ = Unsigned(pt0); \
|
||||
GONEXT(); \
|
||||
} \
|
||||
ENDP(pt0); \
|
||||
ENDD(d0);
|
||||
#endif /* FROZEN_STACKS */
|
||||
#endif /* defined(YAPOR_SBA) && defined(FROZEN_STACKS) */
|
||||
|
||||
#ifdef YAPOR_SBA
|
||||
#define _write_y_val_instinit \
|
||||
register CELL d0; \
|
||||
d0 = YREG[(*_PREG)->u.y.y]; \
|
||||
if (d0 == 0) \
|
||||
*(*_SREG)++ = (CELL)(YREG+(*_PREG)->u.y.y); \
|
||||
else \
|
||||
*(*_SREG)++ = d0; \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
GONEXT();
|
||||
#else /* YAPOR_SBA */
|
||||
#define _write_y_val_instinit \
|
||||
register CELL d0; \
|
||||
d0 = YREG[(*_PREG)->u.y.y]; \
|
||||
*(*_SREG)++ = d0; \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
GONEXT();
|
||||
#endif /* YAPOR_SBA */
|
||||
|
||||
#if defined(YAPOR_SBA) && defined(FROZEN_STACKS)
|
||||
#ifdef FROZEN_STACKS
|
||||
#define _write_y_loc_instinit \
|
||||
BEGD(d0); \
|
||||
BEGP(pt0); \
|
||||
pt0 = YREG+(*_PREG)->u.y.y; \
|
||||
d0 = *pt0; \
|
||||
deref_head(d0, w_y_unk); \
|
||||
w_y_bound: \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
*(*_SREG)++ = d0; \
|
||||
GONEXT(); \
|
||||
\
|
||||
derefa_body(d0, pt0, w_y_unk, w_y_bound); \
|
||||
if (pt0 > HR \
|
||||
&& pt0<(CELL *)B_FZ \
|
||||
) { \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
Bind_Local(pt0, Unsigned((*_SREG))); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONEXT(); \
|
||||
} else { \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
*(*_SREG)++ = Unsigned(pt0); \
|
||||
GONEXT(); \
|
||||
} \
|
||||
ENDP(pt0); \
|
||||
ENDD(d0);
|
||||
#else /* FROZEN_STACKS */
|
||||
#define _write_y_loc_instinit \
|
||||
BEGD(d0); \
|
||||
BEGP(pt0); \
|
||||
pt0 = YREG+(*_PREG)->u.y.y; \
|
||||
d0 = *pt0; \
|
||||
deref_head(d0, w_y_unk); \
|
||||
w_y_bound: \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
*(*_SREG)++ = d0; \
|
||||
GONEXT(); \
|
||||
\
|
||||
derefa_body(d0, pt0, w_y_unk, w_y_bound); \
|
||||
if (pt0 > HR \
|
||||
&& pt0<(CELL *)B_FZ \
|
||||
) { \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
*pt0 = Unsigned((*_SREG)); \
|
||||
TRAIL_LOCAL(pt0, Unsigned((*_SREG))); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONEXT(); \
|
||||
} else { \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
*(*_SREG)++ = Unsigned(pt0); \
|
||||
GONEXT(); \
|
||||
} \
|
||||
ENDP(pt0); \
|
||||
ENDD(d0);
|
||||
#endif /* FROZEN_STACKS */
|
||||
#else /* defined(YAPOR_SBA) && defined(FROZEN_STACKS) */
|
||||
#ifdef FROZEN_STACKS
|
||||
#define _write_y_loc_instinit \
|
||||
BEGD(d0); \
|
||||
BEGP(pt0); \
|
||||
pt0 = YREG+(*_PREG)->u.y.y; \
|
||||
d0 = *pt0; \
|
||||
deref_head(d0, w_y_unk); \
|
||||
w_y_bound: \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
*(*_SREG)++ = d0; \
|
||||
GONEXT(); \
|
||||
\
|
||||
derefa_body(d0, pt0, w_y_unk, w_y_bound); \
|
||||
if (pt0 > HR \
|
||||
) { \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
Bind_Local(pt0, Unsigned((*_SREG))); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONEXT(); \
|
||||
} else { \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
*(*_SREG)++ = Unsigned(pt0); \
|
||||
GONEXT(); \
|
||||
} \
|
||||
ENDP(pt0); \
|
||||
ENDD(d0);
|
||||
#else /* FROZEN_STACKS */
|
||||
#define _write_y_loc_instinit \
|
||||
BEGD(d0); \
|
||||
BEGP(pt0); \
|
||||
pt0 = YREG+(*_PREG)->u.y.y; \
|
||||
d0 = *pt0; \
|
||||
deref_head(d0, w_y_unk); \
|
||||
w_y_bound: \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
*(*_SREG)++ = d0; \
|
||||
GONEXT(); \
|
||||
\
|
||||
derefa_body(d0, pt0, w_y_unk, w_y_bound); \
|
||||
if (pt0 > HR \
|
||||
) { \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
*pt0 = Unsigned((*_SREG)); \
|
||||
TRAIL_LOCAL(pt0, Unsigned((*_SREG))); \
|
||||
RESET_VARIABLE((*_SREG)); \
|
||||
(*_SREG)++; \
|
||||
GONEXT(); \
|
||||
} else { \
|
||||
(*_PREG) = NEXTOP((*_PREG), y); \
|
||||
*(*_SREG)++ = Unsigned(pt0); \
|
||||
GONEXT(); \
|
||||
} \
|
||||
ENDP(pt0); \
|
||||
ENDD(d0);
|
||||
#endif /* FROZEN_STACKS */
|
||||
#endif /* defined(YAPOR_SBA) && defined(FROZEN_STACKS) */
|
||||
|
||||
#define _write_atom_instinit \
|
||||
register CELL d0; \
|
||||
d0 = (*_PREG)->u.c.c; \
|
||||
*(*_SREG)++ = d0; \
|
||||
(*_PREG) = NEXTOP((*_PREG), c); \
|
||||
GONEXT();
|
||||
|
||||
#define WRITE_BIGINT_INSTINIT \
|
||||
register CELL d0; \
|
||||
d0 = (*_PREG)->u.N.b; \
|
||||
*(*_SREG)++ = d0; \
|
||||
(*_PREG) = NEXTOP((*_PREG), N); \
|
||||
GONext();
|
||||
|
||||
#define _write_dbterm_instinit \
|
||||
register CELL d0; \
|
||||
d0 = (*_PREG)->u.D.D; \
|
||||
*(*_SREG)++ = d0; \
|
||||
(*_PREG) = NEXTOP((*_PREG), D); \
|
||||
GONEXT();
|
||||
|
||||
#define _write_float_instinit \
|
||||
register CELL d0; \
|
||||
d0 = AbsAppl((*_PREG)->u.d.d); \
|
||||
*(*_SREG)++ = d0; \
|
||||
(*_PREG) = NEXTOP((*_PREG), d); \
|
||||
GONEXT();
|
||||
|
||||
#define WRITE_LONGIT_INSTINIT \
|
||||
register CELL d0; \
|
||||
d0 = AbsAppl((*_PREG)->u.i.i); \
|
||||
*(*_SREG)++ = d0; \
|
||||
(*_PREG) = NEXTOP((*_PREG), i); \
|
||||
GONext();
|
||||
|
||||
#define WRITE_N_ATOMS_INSTINIT \
|
||||
register CELL d0, d1; \
|
||||
d0 = (*_PREG)->u.sc.s; \
|
||||
d1 = (*_PREG)->u.sc.c; \
|
||||
for (; d0 > 0; d0--) { \
|
||||
*(*_SREG)++ = d1; \
|
||||
} \
|
||||
(*_PREG) = NEXTOP((*_PREG), sc); \
|
||||
GONext();
|
||||
|
||||
#define WRITE_LIST_INSTINIT \
|
||||
register CELL d0; \
|
||||
d0 = AbsPair(HR); \
|
||||
*(*_SREG)++ = d0; \
|
||||
SP[-1] = Unsigned((*_SREG)); \
|
||||
SP[-2] = 1; \
|
||||
SP -= 2; \
|
||||
(*_SREG) = HR; \
|
||||
HR += 2; \
|
||||
(*_PREG) = NEXTOP((*_PREG), e); \
|
||||
GONext();
|
||||
|
||||
#define _write_l_list_instinit \
|
||||
register CELL d0; \
|
||||
(*_PREG) = NEXTOP((*_PREG), e); \
|
||||
CACHE_S(); \
|
||||
READ_IN_S(); \
|
||||
d0 = AbsPair(HR); \
|
||||
*S_SREG = d0; \
|
||||
WRITEBACK_S(HR); \
|
||||
HR += 2; \
|
||||
ENDCACHE_S(); \
|
||||
GONEXT(); \
|
||||
|
||||
#define _write_struct_instinit \
|
||||
register CELL d0; \
|
||||
d0 = AbsAppl(HR); \
|
||||
*(*_SREG)++ = d0; \
|
||||
SP[-1] = Unsigned((*_SREG)); \
|
||||
SP[-2] = 1; \
|
||||
SP -= 2; \
|
||||
d0 = (CELL) ((*_PREG)->u.fa.f); \
|
||||
*H++ = d0; \
|
||||
d0 = (*_PREG)->u.fa.a; \
|
||||
(*_PREG) = NEXTOP((*_PREG), fa); \
|
||||
(*_SREG) = HR; \
|
||||
HR += d0; \
|
||||
GONEXT();
|
||||
|
||||
#define _write_l_struc_instinit \
|
||||
register CELL d0; \
|
||||
d0 = AbsAppl(HR); \
|
||||
*(*_SREG) = d0; \
|
||||
d0 = (CELL) ((*_PREG)->u.fa.f); \
|
||||
*H++ = d0; \
|
||||
(*_SREG) = HR; \
|
||||
d0 = (*_PREG)->u.fa.a; \
|
||||
(*_PREG) = NEXTOP((*_PREG), fa); \
|
||||
HR += d0; \
|
||||
GONEXT();
|
||||
|
Reference in New Issue
Block a user