/* rk.sf */ /* Generated by #F $Id$ */ #ifdef PROFILE #define host host_module_rk #endif #define MODULE module_rk #define LOAD() /* standard includes */ #include #include #include #include /* extra includes */ #include #include /* standard definitions */ typedef ptrdiff_t obj; /* pointers are this size, lower bit zero */ typedef ptrdiff_t cxoint_t; /* same thing, used as integer */ typedef struct { /* type descriptor */ const char *tname; /* name (debug) */ void (*free)(void*); /* deallocator */ } cxtype_t; #define notobjptr(o) (((char*)(o) - (char*)cxg_heap) & cxg_hmask) #define isobjptr(o) (!notobjptr(o)) #define notaptr(o) ((o) & 1) #define isaptr(o) (!notaptr(o)) #define obj_from_obj(o) (o) #define obj_from_objptr(p) ((obj)(p)) #define obj_from_size(n) (((cxoint_t)(n) << 1) | 1) #define objptr_from_objptr(p) (p) #define objptr_from_obj(o) ((obj*)(o)) #define size_from_obj(o) ((int)((o) >> 1)) #define obj_from_case(n) obj_from_objptr(cases+(n)) #define case_from_obj(o) (objptr_from_obj(o)-cases) #define obj_from_ktrap() obj_from_size(0x5D56F806) #define obj_from_void(v) ((void)(v), obj_from_size(0x6F56DF77)) #define bool_from_obj(o) (o) #define bool_from_bool(b) (b) #define bool_from_size(s) (s) #define void_from_void(v) (void)(v) #define void_from_obj(o) (void)(o) #define rreserve(m) if (r + (m) >= cxg_rend) r = cxm_rgc(r, m) #define hpushptr(p, pt, l) (hreserve(2, l), *--hp = (obj)(p), *--hp = (obj)(pt), (obj)(hp+1)) #define hbsz(s) ((s) + 1) /* 1 extra word to store block size */ #define hreserve(n, l) ((hp < cxg_heap + (n)) ? hp = cxm_hgc(r, r+(l), hp, n) : hp) #define hendblk(n) (*--hp = obj_from_size(n), (obj)(hp+1)) #define hblklen(p) size_from_obj(((obj*)(p))[-1]) #define hblkref(p, i) (((obj*)(p))[i]) typedef obj (*cxhost_t)(obj); typedef struct cxroot_tag { int globc; obj **globv; struct cxroot_tag *next; } cxroot_t; extern obj *cxg_heap; extern obj *cxg_hp; extern cxoint_t cxg_hmask; extern cxroot_t *cxg_rootp; extern obj *cxm_rgc(obj *regs, size_t needs); extern obj *cxm_hgc(obj *regs, obj *regp, obj *hp, size_t needs); extern obj *cxg_regs, *cxg_rend; extern void cxm_check(int x, char *msg); extern void *cxm_cknull(void *p, char *msg); extern int cxg_rc; extern char **cxg_argv; /* extra definitions */ /* basic object representation */ #define isimm(o, t) (((o) & 0xff) == (((t) << 1) | 1)) int getimmu(obj o, int t) { assert(isimm(o, t)); return (int)((o >> 8) & 0xffffff); } int getimms(obj o, int t) { assert(isimm(o, t)); return (int)((((o >> 8) & 0xffffff) ^ 0x800000) - 0x800000); } #ifdef NDEBUG #define getimmu(o, t) (int)(((o) >> 8) & 0xffffff) #define getimms(o, t) (int)(((((o) >> 8) & 0xffffff) ^ 0x800000) - 0x800000) #else extern int getimmu(obj o, int t); extern int getimms(obj o, int t); #endif #define mkimm(o, t) (obj)((((o) & 0xffffff) << 8) | ((t) << 1) | 1) #ifndef NDEBUG int isnative(obj o, cxtype_t *tp) { return isobjptr(o) && objptr_from_obj(o)[-1] == (obj)tp; } void *getnative(obj o, cxtype_t *tp) { assert(isnative(o, tp)); return (void*)(*objptr_from_obj(o)); } #endif #ifdef NDEBUG static int isnative(obj o, cxtype_t *tp) { return isobjptr(o) && objptr_from_obj(o)[-1] == (obj)tp; } #define getnative(o, t) ((void*)(*objptr_from_obj(o))) #else extern int isnative(obj o, cxtype_t *tp); extern void *getnative(obj o, cxtype_t *tp); #endif int istagged(obj o, int t) { if (!isobjptr(o)) return 0; else { obj h = objptr_from_obj(o)[-1]; return notaptr(h) && size_from_obj(h) >= 1 && hblkref(o, 0) == obj_from_size(t); } } obj cktagged(obj o, int t) { assert(istagged(o, t)); return o; } int taggedlen(obj o, int t) { assert(istagged(o, t)); return hblklen(o) - 1; } obj* taggedref(obj o, int t, int i) { int len; assert(istagged(o, t)); len = hblklen(o); assert(i >= 0 && i < len-1); return &hblkref(o, i+1); } extern int istagged(obj o, int t); #ifdef NDEBUG #define cktagged(o, t) (o) #define taggedlen(o, t) (hblklen(o)-1) #define taggedref(o, t, i) (&hblkref(o, (i)+1)) #else extern obj cktagged(obj o, int t); extern int taggedlen(obj o, int t); extern obj* taggedref(obj o, int t, int i); #endif /* booleans */ #define TRUE_ITAG 0 typedef int bool_t; #define is_bool_obj(o) (!((o) & ~(obj)1)) #define is_bool_bool(b) ((void)(b), 1) #define void_from_bool(b) (void)(b) #define obj_from_bool(b) ((b) ? mkimm(0, TRUE_ITAG) : 0) /* fixnums */ #define FIXNUM_ITAG 1 typedef int fixnum_t; #define is_fixnum_obj(o) (isimm(o, FIXNUM_ITAG)) #define is_fixnum_fixnum(i) ((void)(i), 1) #define fixnum_from_obj(o) (getimms(o, FIXNUM_ITAG)) #define fixnum_from_fixnum(i) (i) #define void_from_fixnum(i) (void)(i) #define obj_from_fixnum(i) mkimm(i, FIXNUM_ITAG) #define FIXNUM_MIN -8388608 #define FIXNUM_MAX 8388607 /* flonums */ static cxtype_t cxt_flonum = { "flonum", free }; cxtype_t *FLONUM_NTAG = &cxt_flonum; extern cxtype_t *FLONUM_NTAG; typedef double flonum_t; #define is_flonum_obj(o) (isnative(o, FLONUM_NTAG)) #define is_flonum_flonum(f) ((void)(f), 1) #define flonum_from_obj(o) (*(flonum_t*)getnative(o, FLONUM_NTAG)) #define flonum_from_flonum(l, f) (f) #define void_from_flonum(l, f) (void)(f) #define obj_from_flonum(l, f) hpushptr(dupflonum(f), FLONUM_NTAG, l) extern flonum_t *dupflonum(flonum_t f); flonum_t *dupflonum(flonum_t f) { flonum_t *pf = cxm_cknull(malloc(sizeof(flonum_t)), "malloc(flonum)"); *pf = f; return pf; } /* pairs */ #define PAIR_BTAG 1 #define ispair(o) istagged(o, PAIR_BTAG) #define car(o) *taggedref(o, PAIR_BTAG, 0) #define cdr(o) *taggedref(o, PAIR_BTAG, 1) /* vectors */ #define VECTOR_BTAG 2 #define isvector(o) istagged(o, VECTOR_BTAG) #define vectorref(v, i) *taggedref(v, VECTOR_BTAG, i) #define vectorlen(v) taggedlen(v, VECTOR_BTAG) /* cx globals */ extern obj cx_head; /* head */ extern obj cx_map_2Dstreams; /* map-streams */ extern obj cx_runge_2Dkutta_2D4; /* runge-kutta-4 */ extern obj cx_tail; /* tail */ obj cx_add_2Dvectors; /* add-vectors */ obj cx_damped_2Doscillator; /* damped-oscillator */ obj cx_elementwise1; /* elementwise1 */ obj cx_elementwise2; /* elementwise2 */ obj cx_generate_2Dvector; /* generate-vector */ obj cx_head; /* head */ obj cx_integrate_2Dsystem; /* integrate-system */ obj cx_main; /* main */ obj cx_make_2Dpromise; /* make-promise */ obj cx_map_2Dstreams; /* map-streams */ obj cx_runge_2Dkutta_2D4; /* runge-kutta-4 */ obj cx_scale_2Dvector; /* scale-vector */ obj cx_show_2Dstates; /* show-states */ obj cx_tail; /* tail */ obj cx_the_2Dstates; /* the-states */ obj cx_write; /* write */ static obj cx__2333; /* constant #33 */ static obj cx__2334; /* constant #34 */ static obj cx__2336; /* constant #36 */ static obj cx__2383; /* constant #83 */ static obj cx__2385; /* constant #85 */ static obj cx__2386; /* constant #86 */ static obj cx__2387; /* constant #87 */ static obj cx__2388; /* constant #88 */ /* gc roots */ static obj *globv[] = { &cx_add_2Dvectors, &cx_the_2Dstates, &cx__2333, &cx__2334, &cx__2336, &cx__2383, &cx__2385, &cx__2386, &cx__2387, &cx__2388, }; static cxroot_t root = { sizeof(globv)/sizeof(obj *), globv, NULL }; /* entry points */ static obj host(obj); static obj cases[81] = { (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, (obj)host, }; /* host procedure */ #define MAX_HOSTREGS 42 static obj host(obj pc) { register obj *r = cxg_regs; register obj *hp = cxg_hp; register int rc = cxg_rc; rreserve(MAX_HOSTREGS); jump: switch (case_from_obj(pc)) { case 0: /* load module */ cx__2333 = obj_from_flonum(0, 6.0e0); cx__2334 = obj_from_flonum(0, 1.0e0); cx__2336 = obj_from_flonum(0, 2.0e0); cx__2383 = obj_from_flonum(0, 0.0e0); cx__2385 = obj_from_flonum(0, 0.01e0); cx__2386 = obj_from_flonum(0, 0.001e0); cx__2387 = obj_from_flonum(0, 1000.0e0); cx__2388 = obj_from_flonum(0, 10000.0e0); { static obj c[] = { obj_from_case(1) }; cx_make_2Dpromise = (obj)c; } { static obj c[] = { obj_from_case(4) }; cx_write = (obj)c; } { static obj c[] = { obj_from_case(8) }; cx_integrate_2Dsystem = (obj)c; } { static obj c[] = { obj_from_case(17) }; cx_runge_2Dkutta_2D4 = (obj)c; } { static obj c[] = { obj_from_case(42) }; cx_elementwise1 = (obj)c; } { static obj c[] = { obj_from_case(45) }; cx_elementwise2 = (obj)c; } { static obj c[] = { obj_from_case(48) }; cx_generate_2Dvector = (obj)c; } hreserve(hbsz(0+1), 0); /* 0 live regs */ *--hp = obj_from_case(51); r[0] = (hendblk(0+1)); hreserve(hbsz(0+1), 1); /* 1 live regs */ *--hp = obj_from_case(80); r[1] = (hendblk(0+1)); r[2+0] = r[0]; r[2+1] = r[1]; r += 2; /* shift reg wnd */ rreserve(MAX_HOSTREGS); goto gs_elementwise2; case 1: /* make-promise k proc */ assert(rc == 3); r += 1; /* shift reg. wnd */ gs_make_2Dpromise: /* k proc */ hreserve(hbsz(1), 2); /* 2 live regs */ *--hp = obj_from_bool(0); r[2] = (hendblk(1)); hreserve(hbsz(1), 3); /* 3 live regs */ *--hp = obj_from_bool(0); r[3] = (hendblk(1)); hreserve(hbsz(3+1), 4); /* 4 live regs */ *--hp = r[2]; *--hp = r[3]; *--hp = r[1]; *--hp = obj_from_case(2); r[2] = (hendblk(3+1)); r[3+0] = r[0]; pc = objptr_from_obj(r[3+0])[0]; r[3+1] = obj_from_ktrap(); r[3+2] = r[2]; r += 3; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 2: /* clo k */ assert(rc == 2); { obj* p = objptr_from_obj(r[0]); r[1+1] = p[1]; r[1+2] = p[2]; r[1+3] = p[3]; } r += 1; /* shift reg. wnd */ /* k proc result result-ready? */ if (bool_from_obj(objptr_from_obj(r[3])[0])) { /* r[0] */ pc = objptr_from_obj(r[0])[0]; r[1] = obj_from_ktrap(); r[2] = (objptr_from_obj(r[2])[0]); rreserve(MAX_HOSTREGS); rc = 3; goto jump; } else { hreserve(hbsz(3+1), 4); /* 4 live regs */ *--hp = r[3]; *--hp = r[2]; *--hp = r[0]; *--hp = obj_from_case(3); r[4] = (hendblk(3+1)); r[5+0] = r[1]; pc = objptr_from_obj(r[5+0])[0]; r[5+1] = r[4]; r += 5; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 2; goto jump; } case 3: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek r k result result-ready? */ if (bool_from_obj(objptr_from_obj(r[4])[0])) { r[5] = (objptr_from_obj(r[3])[0]); } else { (void)(objptr_from_obj(r[4])[0] = obj_from_bool(1)); (void)(objptr_from_obj(r[3])[0] = (r[1])); r[5] = (objptr_from_obj(r[3])[0]); } r[6+0] = r[2]; pc = objptr_from_obj(r[6+0])[0]; r[6+1] = obj_from_ktrap(); r[6+2] = r[5]; r += 6; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 4: /* write k o */ assert(rc == 3); r += 1; /* shift reg. wnd */ gs_write: /* k o */ if ((isvector((r[1])))) { (void)(fputs("#(", stdout)); hreserve(hbsz(1+1), 2); /* 2 live regs */ *--hp = r[0]; *--hp = obj_from_case(7); r[2] = (hendblk(1+1)); r[3+0] = r[2]; r[3+1] = obj_from_fixnum(0); r[3+2] = obj_from_fixnum(vectorlen((r[1]))); r[3+3] = r[1]; r += 3; /* shift reg wnd */ rreserve(MAX_HOSTREGS); goto s_loop; } else { r[2+0] = r[0]; pc = objptr_from_obj(r[2+0])[0]; r[2+1] = obj_from_ktrap(); r[2+2] = obj_from_void(printf("%.15g", flonum_from_obj(r[1]))); r += 2; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; } case 5: /* clo k i l */ assert(rc == 4); { obj* p = objptr_from_obj(r[0]); r[1+3] = p[1]; } r += 1; /* shift reg. wnd */ s_loop: /* k i l o */ if ((fixnum_from_obj(r[1]) == fixnum_from_obj(r[2]))) { /* r[0] */ pc = objptr_from_obj(r[0])[0]; r[1] = obj_from_ktrap(); r[2] = ((0) ? obj_from_bool(0) : obj_from_void(0)); rreserve(MAX_HOSTREGS); rc = 3; goto jump; } else { (void)((fixnum_from_obj(r[1]) == 0) ? obj_from_bool(0) : obj_from_void(fputc(' ', stdout))); hreserve(hbsz(1+1), 4); /* 4 live regs */ *--hp = r[3]; *--hp = obj_from_case(5); r[4] = (hendblk(1+1)); hreserve(hbsz(4+1), 5); /* 5 live regs */ *--hp = r[0]; *--hp = r[1]; *--hp = r[2]; *--hp = r[4]; *--hp = obj_from_case(6); r[4] = (hendblk(4+1)); r[0] = r[4]; r[1] = (vectorref((r[3]), fixnum_from_obj(r[1]))); goto gs_write; } case 6: /* clo ek . */ assert(rc >= 2); r[2] = obj_from_void(0); /* ignored */ { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; } r += 1; /* shift reg. wnd */ /* ek . loop l i k */ r[0] = r[2]; pc = objptr_from_obj(r[0])[0]; r[1] = r[5]; r[2] = obj_from_fixnum(fixnum_from_obj(r[4]) + (1)); /* r[3] */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 7: /* clo ek . */ assert(rc >= 2); r[2] = obj_from_void(0); /* ignored */ { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; } r += 1; /* shift reg. wnd */ /* ek . k */ r[0] = r[2]; pc = objptr_from_obj(r[0])[0]; r[1] = obj_from_ktrap(); r[2] = obj_from_void(fputc(')', stdout)); rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 8: /* integrate-system k system-derivative initial-state h */ assert(rc == 5); r += 1; /* shift reg. wnd */ /* k system-derivative initial-state h */ hreserve(hbsz(2+1), 4); /* 4 live regs */ *--hp = r[2]; *--hp = r[0]; *--hp = obj_from_case(9); r[4] = (hendblk(2+1)); r[0] = r[4]; /* r[1] */ r[2] = r[3]; goto gs_runge_2Dkutta_2D4; case 9: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* ek r k initial-state */ hreserve(hbsz(1), 4); /* 4 live regs */ *--hp = obj_from_void(0); r[4] = (hendblk(1)); hreserve(hbsz(3+1), 5); /* 5 live regs */ *--hp = r[3]; *--hp = r[4]; *--hp = r[2]; *--hp = obj_from_case(10); r[5] = (hendblk(3+1)); hreserve(hbsz(2+1), 6); /* 6 live regs */ *--hp = r[4]; *--hp = r[1]; *--hp = obj_from_case(11); r[6] = (hendblk(2+1)); r[0] = r[5]; r[1] = r[6]; goto gs_make_2Dpromise; case 10: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek r k states initial-state */ { /* cons */ hreserve(hbsz(3), 5); /* 5 live regs */ *--hp = r[1]; *--hp = r[4]; *--hp = obj_from_size(PAIR_BTAG); r[5] = (hendblk(3)); } (void)(objptr_from_obj(r[3])[0] = (r[5])); r[0] = r[2]; pc = objptr_from_obj(r[0])[0]; r[1] = obj_from_ktrap(); r[2] = (objptr_from_obj(r[3])[0]); rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 11: /* clo k */ assert(rc == 2); { obj* p = objptr_from_obj(r[0]); r[1+1] = p[1]; r[1+2] = p[2]; } r += 1; /* shift reg. wnd */ /* k r states */ r[3] = (objptr_from_obj(r[2])[0]); hreserve(hbsz(3+1), 4); /* 4 live regs */ *--hp = r[0]; *--hp = r[1]; *--hp = r[3]; *--hp = obj_from_case(12); r[4] = (hendblk(3+1)); hreserve(hbsz(2+1), 5); /* 5 live regs */ *--hp = r[1]; *--hp = r[3]; *--hp = obj_from_case(15); r[5] = (hendblk(2+1)); r[0] = r[4]; r[1] = r[5]; goto gs_make_2Dpromise; case 12: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek r s r k */ hreserve(hbsz(3+1), 5); /* 5 live regs */ *--hp = r[1]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(13); r[5] = (hendblk(3+1)); r[0] = (cx_head); pc = objptr_from_obj(r[0])[0]; r[1] = r[5]; /* r[2] */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 13: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek r r k r */ hreserve(hbsz(2+1), 5); /* 5 live regs */ *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(14); r[5] = (hendblk(2+1)); r[6+0] = r[2]; pc = objptr_from_obj(r[6+0])[0]; r[6+1] = r[5]; r[6+2] = r[1]; r += 6; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 14: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* ek r k r */ { /* cons */ hreserve(hbsz(3), 4); /* 4 live regs */ *--hp = r[3]; *--hp = r[1]; *--hp = obj_from_size(PAIR_BTAG); r[4] = (hendblk(3)); } r[5+0] = r[2]; pc = objptr_from_obj(r[5+0])[0]; r[5+1] = obj_from_ktrap(); r[5+2] = r[4]; r += 5; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 15: /* clo k */ assert(rc == 2); { obj* p = objptr_from_obj(r[0]); r[1+1] = p[1]; r[1+2] = p[2]; } r += 1; /* shift reg. wnd */ /* k s r */ hreserve(hbsz(2+1), 3); /* 3 live regs */ *--hp = r[0]; *--hp = r[2]; *--hp = obj_from_case(16); r[3] = (hendblk(2+1)); r[4+0] = (cx_tail); pc = objptr_from_obj(r[4+0])[0]; r[4+1] = r[3]; r[4+2] = r[1]; r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 16: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* ek r r k */ r[4+0] = (cx_map_2Dstreams); pc = objptr_from_obj(r[4+0])[0]; r[4+1] = r[3]; r[4+2] = r[2]; r[4+3] = r[1]; r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 17: /* runge-kutta-4 k f h */ assert(rc == 4); r += 1; /* shift reg. wnd */ gs_runge_2Dkutta_2D4: /* k f h */ hreserve(hbsz(3+1), 3); /* 3 live regs */ *--hp = r[1]; *--hp = r[0]; *--hp = r[2]; *--hp = obj_from_case(18); r[3] = (hendblk(3+1)); r[4] = obj_from_flonum(4, flonum_from_obj(cx__2334) / flonum_from_obj(cx__2333)); r[0] = r[3]; r[1] = r[4]; goto gs_scale_2Dvector; case 18: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek r h k f */ hreserve(hbsz(4+1), 5); /* 5 live regs */ *--hp = r[1]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(19); r[5] = (hendblk(4+1)); r[6] = obj_from_flonum(6, flonum_from_obj(cx__2334) / flonum_from_obj(cx__2336)); r[0] = r[5]; r[1] = r[6]; goto gs_scale_2Dvector; case 19: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; } r += 1; /* shift reg. wnd */ /* ek r h k f r */ hreserve(hbsz(5+1), 6); /* 6 live regs */ *--hp = r[5]; *--hp = r[4]; *--hp = r[1]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(20); r[6] = (hendblk(5+1)); r[0] = r[6]; r[1] = (cx__2336); goto gs_scale_2Dvector; case 20: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; } r += 1; /* shift reg. wnd */ /* ek r h k r f r */ hreserve(hbsz(5+1), 7); /* 7 live regs */ *--hp = r[6]; *--hp = r[1]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(21); r[7] = (hendblk(5+1)); r[0] = r[7]; r[1] = r[2]; goto gs_scale_2Dvector; case 21: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; } r += 1; /* shift reg. wnd */ /* ek r k r f r r */ hreserve(hbsz(5+1), 7); /* 7 live regs */ *--hp = r[6]; *--hp = r[5]; *--hp = r[1]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(22); r[7] = (hendblk(5+1)); r[8+0] = r[2]; pc = objptr_from_obj(r[8+0])[0]; r[8+1] = obj_from_ktrap(); r[8+2] = r[7]; r += 8; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 22: /* clo k y */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; } r += 1; /* shift reg. wnd */ /* k y r f r r r */ hreserve(hbsz(7+1), 7); /* 7 live regs */ *--hp = r[0]; *--hp = r[1]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(23); r[7] = (hendblk(7+1)); r[8+0] = r[3]; pc = objptr_from_obj(r[8+0])[0]; r[8+1] = r[7]; r[8+2] = r[1]; r += 8; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 23: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; } r += 1; /* shift reg. wnd */ /* ek r r f r r r y k */ hreserve(hbsz(7+1), 9); /* 9 live regs */ *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(24); r[9] = (hendblk(7+1)); r[10+0] = r[4]; pc = objptr_from_obj(r[10+0])[0]; r[10+1] = r[9]; r[10+2] = r[1]; r += 10; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 24: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; } r += 1; /* shift reg. wnd */ /* ek r r f r r r y k */ hreserve(hbsz(8+1), 9); /* 9 live regs */ *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[1]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(25); r[9] = (hendblk(8+1)); r[10+0] = r[2]; pc = objptr_from_obj(r[10+0])[0]; r[10+1] = r[9]; r[10+2] = r[1]; r += 10; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 25: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; r[1+9] = p[8]; } r += 1; /* shift reg. wnd */ /* ek r r f r r r r y k */ hreserve(hbsz(8+1), 10); /* 10 live regs */ *--hp = r[9]; *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(26); r[10] = (hendblk(8+1)); r[11+0] = (cx_add_2Dvectors); pc = objptr_from_obj(r[11+0])[0]; r[11+1] = (r[10]); r[11+2] = r[8]; r[11+3] = r[1]; r += 11; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 26: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; r[1+9] = p[8]; } r += 1; /* shift reg. wnd */ /* ek r r f r r r r y k */ hreserve(hbsz(8+1), 10); /* 10 live regs */ *--hp = r[9]; *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(27); r[10] = (hendblk(8+1)); r[11+0] = r[3]; pc = objptr_from_obj(r[11+0])[0]; r[11+1] = (r[10]); r[11+2] = r[1]; r += 11; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 27: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; r[1+9] = p[8]; } r += 1; /* shift reg. wnd */ /* ek r r f r r r r y k */ hreserve(hbsz(8+1), 10); /* 10 live regs */ *--hp = r[9]; *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(28); r[10] = (hendblk(8+1)); r[11+0] = r[4]; pc = objptr_from_obj(r[11+0])[0]; r[11+1] = (r[10]); r[11+2] = r[1]; r += 11; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 28: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; r[1+9] = p[8]; } r += 1; /* shift reg. wnd */ /* ek r r f r r r r y k */ hreserve(hbsz(8+1), 10); /* 10 live regs */ *--hp = r[9]; *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[1]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(29); r[10] = (hendblk(8+1)); r[11+0] = r[2]; pc = objptr_from_obj(r[11+0])[0]; r[11+1] = (r[10]); r[11+2] = r[1]; r += 11; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 29: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; r[1+9] = p[8]; } r += 1; /* shift reg. wnd */ /* ek r f r r r r r y k */ hreserve(hbsz(8+1), 10); /* 10 live regs */ *--hp = r[9]; *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(30); r[10] = (hendblk(8+1)); r[11+0] = (cx_add_2Dvectors); pc = objptr_from_obj(r[11+0])[0]; r[11+1] = (r[10]); r[11+2] = r[8]; r[11+3] = r[1]; r += 11; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 30: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; r[1+9] = p[8]; } r += 1; /* shift reg. wnd */ /* ek r f r r r r r y k */ hreserve(hbsz(8+1), 10); /* 10 live regs */ *--hp = r[9]; *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(31); r[10] = (hendblk(8+1)); r[11+0] = r[2]; pc = objptr_from_obj(r[11+0])[0]; r[11+1] = (r[10]); r[11+2] = r[1]; r += 11; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 31: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; r[1+9] = p[8]; } r += 1; /* shift reg. wnd */ /* ek r f r r r r r y k */ hreserve(hbsz(8+1), 10); /* 10 live regs */ *--hp = r[9]; *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(32); r[10] = (hendblk(8+1)); r[11+0] = r[3]; pc = objptr_from_obj(r[11+0])[0]; r[11+1] = (r[10]); r[11+2] = r[1]; r += 11; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 32: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; r[1+9] = p[8]; } r += 1; /* shift reg. wnd */ /* ek r f r r r r r y k */ hreserve(hbsz(9+1), 10); /* 10 live regs */ *--hp = r[9]; *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[1]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(33); r[10] = (hendblk(9+1)); r[11+0] = (cx_add_2Dvectors); pc = objptr_from_obj(r[11+0])[0]; r[11+1] = (r[10]); r[11+2] = r[8]; r[11+3] = r[1]; r += 11; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 33: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; r[1+9] = p[8]; r[1+10] = p[9]; } r += 1; /* shift reg. wnd */ /* ek r f r r r r r r y k */ hreserve(hbsz(8+1), 11); /* 11 live regs */ *--hp = (r[10]); *--hp = r[9]; *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(34); r[11] = (hendblk(8+1)); r[12+0] = r[2]; pc = objptr_from_obj(r[12+0])[0]; r[12+1] = (r[11]); r[12+2] = r[1]; r += 12; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 34: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; r[1+9] = p[8]; } r += 1; /* shift reg. wnd */ /* ek r r r r r r r y k */ hreserve(hbsz(7+1), 10); /* 10 live regs */ *--hp = r[9]; *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(35); r[10] = (hendblk(7+1)); r[11+0] = r[2]; pc = objptr_from_obj(r[11+0])[0]; r[11+1] = (r[10]); r[11+2] = r[1]; r += 11; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 35: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; } r += 1; /* shift reg. wnd */ /* ek r r r r r r y k */ hreserve(hbsz(7+1), 9); /* 9 live regs */ *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[1]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(36); r[9] = (hendblk(7+1)); r[0] = r[3]; pc = objptr_from_obj(r[0])[0]; r[1] = r[9]; /* r[2] */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 36: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; r[1+8] = p[7]; } r += 1; /* shift reg. wnd */ /* ek r r r r r r y k */ hreserve(hbsz(6+1), 9); /* 9 live regs */ *--hp = r[8]; *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[1]; *--hp = r[4]; *--hp = obj_from_case(37); r[9] = (hendblk(6+1)); r[0] = r[2]; pc = objptr_from_obj(r[0])[0]; r[1] = r[9]; r[2] = r[3]; rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 37: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; r[1+7] = p[6]; } r += 1; /* shift reg. wnd */ /* ek r r r r r y k */ hreserve(hbsz(5+1), 8); /* 8 live regs */ *--hp = r[7]; *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(38); r[8] = (hendblk(5+1)); r[9+0] = (cx_add_2Dvectors); pc = objptr_from_obj(r[9+0])[0]; r[9+1] = r[8]; r[9+2] = r[1]; r[9+3] = r[2]; r += 9; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 38: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; r[1+6] = p[5]; } r += 1; /* shift reg. wnd */ /* ek r r r r y k */ hreserve(hbsz(4+1), 7); /* 7 live regs */ *--hp = r[6]; *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(39); r[7] = (hendblk(4+1)); r[8+0] = (cx_add_2Dvectors); pc = objptr_from_obj(r[8+0])[0]; r[8+1] = r[7]; r[8+2] = r[2]; r[8+3] = r[1]; r += 8; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 39: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; } r += 1; /* shift reg. wnd */ /* ek r r r y k */ hreserve(hbsz(3+1), 6); /* 6 live regs */ *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(40); r[6] = (hendblk(3+1)); r[7+0] = (cx_add_2Dvectors); pc = objptr_from_obj(r[7+0])[0]; r[7+1] = r[6]; r[7+2] = r[2]; r[7+3] = r[1]; r += 7; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 40: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek r r y k */ hreserve(hbsz(2+1), 5); /* 5 live regs */ *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(41); r[5] = (hendblk(2+1)); r[6+0] = r[2]; pc = objptr_from_obj(r[6+0])[0]; r[6+1] = r[5]; r[6+2] = r[1]; r += 6; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 41: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* ek r y k */ r[4+0] = (cx_add_2Dvectors); pc = objptr_from_obj(r[4+0])[0]; r[4+1] = r[3]; r[4+2] = r[2]; r[4+3] = r[1]; r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 42: /* elementwise1 k f */ assert(rc == 3); r += 1; /* shift reg. wnd */ gs_elementwise1: /* k f */ hreserve(hbsz(1+1), 2); /* 2 live regs */ *--hp = r[1]; *--hp = obj_from_case(43); r[2] = (hendblk(1+1)); r[3+0] = r[0]; pc = objptr_from_obj(r[3+0])[0]; r[3+1] = obj_from_ktrap(); r[3+2] = r[2]; r += 3; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 43: /* clo k v */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; } r += 1; /* shift reg. wnd */ /* k v f */ hreserve(hbsz(2+1), 3); /* 3 live regs */ *--hp = r[1]; *--hp = r[2]; *--hp = obj_from_case(44); r[3] = (hendblk(2+1)); r[4+0] = r[0]; r[4+1] = obj_from_fixnum(vectorlen((r[1]))); r[4+2] = r[3]; r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); goto gs_generate_2Dvector; case 44: /* clo k i */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* k i f v */ r[4+0] = r[2]; pc = objptr_from_obj(r[4+0])[0]; r[4+1] = r[0]; r[4+2] = (vectorref((r[3]), fixnum_from_obj(r[1]))); r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 45: /* elementwise2 k f */ assert(rc == 3); r += 1; /* shift reg. wnd */ gs_elementwise2: /* k f */ hreserve(hbsz(1+1), 2); /* 2 live regs */ *--hp = r[1]; *--hp = obj_from_case(46); r[2] = (hendblk(1+1)); r[3+0] = r[0]; pc = objptr_from_obj(r[3+0])[0]; r[3+1] = obj_from_ktrap(); r[3+2] = r[2]; r += 3; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 46: /* clo k v1 v2 */ assert(rc == 4); { obj* p = objptr_from_obj(r[0]); r[1+3] = p[1]; } r += 1; /* shift reg. wnd */ /* k v1 v2 f */ hreserve(hbsz(3+1), 4); /* 4 live regs */ *--hp = r[1]; *--hp = r[2]; *--hp = r[3]; *--hp = obj_from_case(47); r[4] = (hendblk(3+1)); r[5+0] = r[0]; r[5+1] = obj_from_fixnum(vectorlen((r[1]))); r[5+2] = r[4]; r += 5; /* shift reg wnd */ rreserve(MAX_HOSTREGS); goto gs_generate_2Dvector; case 47: /* clo k i */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* k i f v2 v1 */ { const fixnum_t v909_i = fixnum_from_obj(r[1]); r[5+0] = r[2]; pc = objptr_from_obj(r[5+0])[0]; r[5+1] = r[0]; r[5+2] = (vectorref((r[4]), (v909_i))); r[5+3] = (vectorref((r[3]), (v909_i))); r += 5; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; } case 48: /* generate-vector k size proc */ assert(rc == 4); r += 1; /* shift reg. wnd */ gs_generate_2Dvector: /* k size proc */ { /* make-vector */ obj o; int i = 0, c = fixnum_from_obj(r[1]); hreserve(hbsz(c+1), 3); /* 3 live regs */ o = obj_from_bool(0); /* gc-safe */ while (i++ < c) *--hp = o; *--hp = obj_from_size(VECTOR_BTAG); r[3] = (hendblk(c+1)); } r[4+0] = r[0]; r[4+1] = obj_from_fixnum(0); r[4+2] = r[2]; r[4+3] = r[3]; r[4+4] = r[1]; r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); goto s_loop_v601; case 49: /* clo k i */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ s_loop_v601: /* k i proc ans size */ if ((fixnum_from_obj(r[1]) == fixnum_from_obj(r[4]))) { /* r[0] */ pc = objptr_from_obj(r[0])[0]; r[1] = obj_from_ktrap(); r[2] = r[3]; rreserve(MAX_HOSTREGS); rc = 3; goto jump; } else { hreserve(hbsz(3+1), 5); /* 5 live regs */ *--hp = r[4]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(49); r[5] = (hendblk(3+1)); hreserve(hbsz(4+1), 6); /* 6 live regs */ *--hp = r[1]; *--hp = r[3]; *--hp = r[0]; *--hp = r[5]; *--hp = obj_from_case(50); r[5] = (hendblk(4+1)); r[6+0] = r[2]; pc = objptr_from_obj(r[6+0])[0]; r[6+1] = r[5]; r[6+2] = r[1]; r += 6; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; } case 50: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; } r += 1; /* shift reg. wnd */ /* ek r loop k ans i */ { const fixnum_t v908_i = fixnum_from_obj(r[5]); (void)(vectorref((r[4]), (v908_i)) = (r[1])); r[0] = r[2]; pc = objptr_from_obj(r[0])[0]; r[1] = r[3]; r[2] = obj_from_fixnum((v908_i) + (1)); rreserve(MAX_HOSTREGS); rc = 3; goto jump; } case 51: /* clo ek r */ assert(rc == 3); r += 1; /* shift reg. wnd */ /* ek r */ cx_add_2Dvectors = r[1]; { static obj c[] = { obj_from_case(52) }; cx_scale_2Dvector = (obj)c; } { static obj c[] = { obj_from_case(54) }; cx_map_2Dstreams = (obj)c; } { static obj c[] = { obj_from_case(64) }; cx_head = (obj)c; } { static obj c[] = { obj_from_case(65) }; cx_tail = (obj)c; } { static obj c[] = { obj_from_case(66) }; cx_damped_2Doscillator = (obj)c; } hreserve(hbsz(0+1), 2); /* 2 live regs */ *--hp = obj_from_case(68); r[2] = (hendblk(0+1)); r[3+0] = r[2]; r[3+1] = (cx__2388); r[3+2] = (cx__2387); r[3+3] = (cx__2386); r += 3; /* shift reg wnd */ rreserve(MAX_HOSTREGS); goto gs_damped_2Doscillator; case 52: /* scale-vector k s */ assert(rc == 3); r += 1; /* shift reg. wnd */ gs_scale_2Dvector: /* k s */ hreserve(hbsz(1+1), 2); /* 2 live regs */ *--hp = r[1]; *--hp = obj_from_case(53); r[2] = (hendblk(1+1)); /* r[0] */ r[1] = r[2]; goto gs_elementwise1; case 53: /* clo k x */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; } r += 1; /* shift reg. wnd */ /* k x s */ r[3] = obj_from_flonum(3, flonum_from_obj(r[1]) * flonum_from_obj(r[2])); r[4+0] = r[0]; pc = objptr_from_obj(r[4+0])[0]; r[4+1] = obj_from_ktrap(); r[4+2] = r[3]; r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 54: /* map-streams k f s */ assert(rc == 4); r += 1; /* shift reg. wnd */ /* k f s */ hreserve(hbsz(3+1), 3); /* 3 live regs */ *--hp = r[0]; *--hp = r[2]; *--hp = r[1]; *--hp = obj_from_case(55); r[3] = (hendblk(3+1)); hreserve(hbsz(2+1), 4); /* 4 live regs */ *--hp = r[1]; *--hp = r[2]; *--hp = obj_from_case(57); r[4] = (hendblk(2+1)); r[0] = r[3]; r[1] = r[4]; goto gs_make_2Dpromise; case 55: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek r f s k */ hreserve(hbsz(2+1), 5); /* 5 live regs */ *--hp = r[1]; *--hp = r[4]; *--hp = obj_from_case(56); r[5] = (hendblk(2+1)); r[0] = r[2]; pc = objptr_from_obj(r[0])[0]; r[1] = r[5]; r[2] = (car((r[3]))); rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 56: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* ek r k r */ { /* cons */ hreserve(hbsz(3), 4); /* 4 live regs */ *--hp = r[3]; *--hp = r[1]; *--hp = obj_from_size(PAIR_BTAG); r[4] = (hendblk(3)); } r[5+0] = r[2]; pc = objptr_from_obj(r[5+0])[0]; r[5+1] = obj_from_ktrap(); r[5+2] = r[4]; r += 5; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 57: /* clo k */ assert(rc == 2); { obj* p = objptr_from_obj(r[0]); r[1+1] = p[1]; r[1+2] = p[2]; } r += 1; /* shift reg. wnd */ /* k s f */ hreserve(hbsz(2+1), 3); /* 3 live regs */ *--hp = r[0]; *--hp = r[2]; *--hp = obj_from_case(58); r[3] = (hendblk(2+1)); r[0] = r[3]; /* r[1] */ goto gs_tail; case 58: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* ek r f k */ hreserve(hbsz(3+1), 4); /* 4 live regs */ *--hp = r[3]; *--hp = r[2]; *--hp = r[1]; *--hp = obj_from_case(59); r[4] = (hendblk(3+1)); hreserve(hbsz(2+1), 5); /* 5 live regs */ *--hp = r[2]; *--hp = r[1]; *--hp = obj_from_case(62); r[5] = (hendblk(2+1)); r[0] = r[4]; r[1] = r[5]; goto gs_make_2Dpromise; case 59: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek r r f k */ hreserve(hbsz(3+1), 5); /* 5 live regs */ *--hp = r[1]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(60); r[5] = (hendblk(3+1)); r[0] = (cx_head); pc = objptr_from_obj(r[0])[0]; r[1] = r[5]; /* r[2] */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 60: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek r f k r */ hreserve(hbsz(2+1), 5); /* 5 live regs */ *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(61); r[5] = (hendblk(2+1)); r[6+0] = r[2]; pc = objptr_from_obj(r[6+0])[0]; r[6+1] = r[5]; r[6+2] = r[1]; r += 6; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 61: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* ek r k r */ { /* cons */ hreserve(hbsz(3), 4); /* 4 live regs */ *--hp = r[3]; *--hp = r[1]; *--hp = obj_from_size(PAIR_BTAG); r[4] = (hendblk(3)); } r[5+0] = r[2]; pc = objptr_from_obj(r[5+0])[0]; r[5+1] = obj_from_ktrap(); r[5+2] = r[4]; r += 5; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 62: /* clo k */ assert(rc == 2); { obj* p = objptr_from_obj(r[0]); r[1+1] = p[1]; r[1+2] = p[2]; } r += 1; /* shift reg. wnd */ /* k r f */ hreserve(hbsz(2+1), 3); /* 3 live regs */ *--hp = r[0]; *--hp = r[2]; *--hp = obj_from_case(63); r[3] = (hendblk(2+1)); r[4+0] = (cx_tail); pc = objptr_from_obj(r[4+0])[0]; r[4+1] = r[3]; r[4+2] = r[1]; r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 63: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* ek r f k */ r[4+0] = (cx_map_2Dstreams); pc = objptr_from_obj(r[4+0])[0]; r[4+1] = r[3]; r[4+2] = r[2]; r[4+3] = r[1]; r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 64: /* head k stream */ assert(rc == 3); r += 1; /* shift reg. wnd */ /* k stream */ r[2+0] = r[0]; pc = objptr_from_obj(r[2+0])[0]; r[2+1] = obj_from_ktrap(); r[2+2] = (car((r[1]))); r += 2; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 65: /* tail k stream */ assert(rc == 3); r += 1; /* shift reg. wnd */ gs_tail: /* k stream */ r[2+0] = (cdr((r[1]))); pc = objptr_from_obj(r[2+0])[0]; r[2+1] = r[0]; r += 2; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 2; goto jump; case 66: /* damped-oscillator k R L C */ assert(rc == 5); r += 1; /* shift reg. wnd */ gs_damped_2Doscillator: /* k R L C */ hreserve(hbsz(3+1), 4); /* 4 live regs */ *--hp = r[2]; *--hp = r[3]; *--hp = r[1]; *--hp = obj_from_case(67); r[4] = (hendblk(3+1)); r[5+0] = r[0]; pc = objptr_from_obj(r[5+0])[0]; r[5+1] = obj_from_ktrap(); r[5+2] = r[4]; r += 5; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 67: /* clo k state */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* k state R C L */ { const flonum_t v903_C = flonum_from_obj(r[3]); r[5] = (vectorref((r[1]), (0))); r[6] = (vectorref((r[1]), (1))); r[7] = obj_from_flonum(7, flonum_from_obj(r[5]) / flonum_from_obj(r[4])); { flonum_t v907_tmp; { flonum_t v906_tmp; { const flonum_t v905_tmp = (flonum_from_obj(r[6]) / (v903_C)); { const flonum_t v904_tmp = (flonum_from_obj(r[2]) * (v903_C)); v906_tmp = (flonum_from_obj(r[5]) / (v904_tmp)); } v907_tmp = ((v906_tmp) + (v905_tmp)); } } r[8] = obj_from_flonum(8, flonum_from_obj(cx__2383) - (v907_tmp)); } { /* vector */ hreserve(hbsz(2+1), 9); /* 9 live regs */ *--hp = r[7]; *--hp = r[8]; *--hp = obj_from_size(VECTOR_BTAG); r[5] = (hendblk(2+1)); } r[6+0] = r[0]; pc = objptr_from_obj(r[6+0])[0]; r[6+1] = obj_from_ktrap(); r[6+2] = r[5]; r += 6; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; } case 68: /* clo ek r */ assert(rc == 3); r += 1; /* shift reg. wnd */ /* ek r */ { /* vector */ hreserve(hbsz(2+1), 2); /* 2 live regs */ *--hp = (cx__2383); *--hp = (cx__2334); *--hp = obj_from_size(VECTOR_BTAG); r[2] = (hendblk(2+1)); } hreserve(hbsz(1+1), 3); /* 3 live regs */ *--hp = r[2]; *--hp = obj_from_case(69); r[3] = (hendblk(1+1)); r[4+0] = (cx_runge_2Dkutta_2D4); pc = objptr_from_obj(r[4+0])[0]; r[4+1] = r[3]; r[4+2] = r[1]; r[4+3] = (cx__2385); r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 69: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; } r += 1; /* shift reg. wnd */ /* ek r initial-state */ hreserve(hbsz(1), 3); /* 3 live regs */ *--hp = obj_from_void(0); r[3] = (hendblk(1)); hreserve(hbsz(2+1), 4); /* 4 live regs */ *--hp = r[2]; *--hp = r[3]; *--hp = obj_from_case(70); r[4] = (hendblk(2+1)); hreserve(hbsz(2+1), 5); /* 5 live regs */ *--hp = r[1]; *--hp = r[3]; *--hp = obj_from_case(79); r[5] = (hendblk(2+1)); r[0] = r[4]; r[1] = r[5]; goto gs_make_2Dpromise; case 70: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* ek r states initial-state */ { /* cons */ hreserve(hbsz(3), 4); /* 4 live regs */ *--hp = r[1]; *--hp = r[3]; *--hp = obj_from_size(PAIR_BTAG); r[4] = (hendblk(3)); } (void)(objptr_from_obj(r[2])[0] = (r[4])); r[5] = (objptr_from_obj(r[2])[0]); cx_the_2Dstates = r[5]; { static obj c[] = { obj_from_case(71) }; cx_show_2Dstates = (obj)c; } { static obj c[] = { obj_from_case(74) }; cx_main = (obj)c; } r[6] = obj_from_void(0); r[7+0] = r[0]; pc = 0; /* exit from module init */ r[7+1] = r[6]; r += 7; /* shift reg wnd */ rc = 2; goto jump; case 71: /* show-states k s n */ assert(rc == 4); r += 1; /* shift reg. wnd */ gs_show_2Dstates: /* k s n */ (void)(fputc('\n', stdout)); if ((fixnum_from_obj(r[2]) > (0))) { hreserve(hbsz(3+1), 3); /* 3 live regs */ *--hp = r[0]; *--hp = r[2]; *--hp = r[1]; *--hp = obj_from_case(72); r[3] = (hendblk(3+1)); r[0] = r[3]; r[1] = (car((r[1]))); goto gs_write; } else { /* r[0] */ pc = objptr_from_obj(r[0])[0]; r[1] = obj_from_ktrap(); r[2] = obj_from_void(0); rreserve(MAX_HOSTREGS); rc = 3; goto jump; } case 72: /* clo ek . */ assert(rc >= 2); r[2] = obj_from_void(0); /* ignored */ { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek . s n k */ hreserve(hbsz(2+1), 5); /* 5 live regs */ *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(73); r[5] = (hendblk(2+1)); r[0] = r[5]; r[1] = r[2]; goto gs_tail; case 73: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; } r += 1; /* shift reg. wnd */ /* ek r n k */ r[0] = r[3]; /* r[1] */ r[2] = obj_from_fixnum(fixnum_from_obj(r[2]) - (1)); goto gs_show_2Dstates; case 74: /* main k argv */ assert(rc == 3); r += 1; /* shift reg. wnd */ /* k argv */ hreserve(hbsz(1+1), 2); /* 2 live regs */ *--hp = r[0]; *--hp = obj_from_case(78); r[2] = (hendblk(1+1)); r[3+0] = r[2]; r[3+1] = obj_from_fixnum(10); r[3+2] = (cx_the_2Dstates); r += 3; /* shift reg wnd */ rreserve(MAX_HOSTREGS); goto s_loop_v442; case 75: /* clo k i s */ assert(rc == 4); r += 1; /* shift reg. wnd */ s_loop_v442: /* k i s */ if ((fixnum_from_obj(r[1]) == 0)) { /* r[0] */ pc = objptr_from_obj(r[0])[0]; r[1] = obj_from_ktrap(); r[2] = obj_from_void(fputc('\n', stdout)); rreserve(MAX_HOSTREGS); rc = 3; goto jump; } else { (void)(fputc('\n', stdout)); hreserve(hbsz(0+1), 3); /* 3 live regs */ *--hp = obj_from_case(75); r[3] = (hendblk(0+1)); hreserve(hbsz(4+1), 4); /* 4 live regs */ *--hp = r[0]; *--hp = r[1]; *--hp = r[3]; *--hp = r[2]; *--hp = obj_from_case(76); r[3] = (hendblk(4+1)); r[0] = r[3]; r[1] = (car((r[2]))); goto gs_write; } case 76: /* clo ek . */ assert(rc >= 2); r[2] = obj_from_void(0); /* ignored */ { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; r[1+5] = p[4]; } r += 1; /* shift reg. wnd */ /* ek . s loop i k */ hreserve(hbsz(3+1), 6); /* 6 live regs */ *--hp = r[5]; *--hp = r[4]; *--hp = r[3]; *--hp = obj_from_case(77); r[6] = (hendblk(3+1)); r[0] = r[6]; r[1] = r[2]; goto gs_tail; case 77: /* clo ek r */ assert(rc == 3); { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; r[1+3] = p[2]; r[1+4] = p[3]; } r += 1; /* shift reg. wnd */ /* ek r loop i k */ r[5+0] = r[2]; pc = objptr_from_obj(r[5+0])[0]; r[5+1] = r[4]; r[5+2] = obj_from_fixnum(fixnum_from_obj(r[3]) - (1)); r[5+3] = r[1]; r += 5; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 78: /* clo ek . */ assert(rc >= 2); r[2] = obj_from_void(0); /* ignored */ { obj* p = objptr_from_obj(r[0]); r[1+2] = p[1]; } r += 1; /* shift reg. wnd */ /* ek . k */ r[0] = r[2]; pc = objptr_from_obj(r[0])[0]; r[1] = obj_from_ktrap(); r[2] = obj_from_bool(0); rreserve(MAX_HOSTREGS); rc = 3; goto jump; case 79: /* clo k */ assert(rc == 2); { obj* p = objptr_from_obj(r[0]); r[1+1] = p[1]; r[1+2] = p[2]; } r += 1; /* shift reg. wnd */ /* k states r */ r[3+0] = (cx_map_2Dstreams); pc = objptr_from_obj(r[3+0])[0]; r[3+1] = r[0]; r[3+2] = r[2]; r[3+3] = (objptr_from_obj(r[1])[0]); r += 3; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 4; goto jump; case 80: /* clo k x y */ assert(rc == 4); r += 1; /* shift reg. wnd */ /* k x y */ r[3] = obj_from_flonum(3, flonum_from_obj(r[1]) + flonum_from_obj(r[2])); r[4+0] = r[0]; pc = objptr_from_obj(r[4+0])[0]; r[4+1] = obj_from_ktrap(); r[4+2] = r[3]; r += 4; /* shift reg wnd */ rreserve(MAX_HOSTREGS); rc = 3; goto jump; default: /* inter-host call */ cxg_hp = hp; cxm_rgc(r, MAX_HOSTREGS); cxg_rc = rc; return pc; } } /* module load */ void MODULE(void) { obj pc; if (!root.next) { root.next = cxg_rootp; cxg_rootp = &root; LOAD(); pc = obj_from_case(0); cxg_rc = 0; while (pc) pc = (*(cxhost_t*)pc)(pc); assert(cxg_rc == 2); } } /* basic runtime */ #define HEAP_SIZE 131072 /* 2^17 */ #define REGS_SIZE 4092 obj *cxg_heap = NULL; cxoint_t cxg_hmask = 0; obj *cxg_hp = NULL; static cxroot_t cxg_root = { 0, NULL, NULL }; cxroot_t *cxg_rootp = &cxg_root; obj *cxg_regs = NULL, *cxg_rend = NULL; int cxg_rc = 0; char **cxg_argv = NULL; static obj *cxg_heap2 = NULL; static size_t cxg_hsize = 0; static cxoint_t cxg_hmask2 = 0; static int cxg_gccount = 0, cxg_bumpcount = 0; static obj *toheap2(obj* p, obj *hp, obj *h1, cxoint_t m1, obj *h2, cxoint_t m2) { obj o = *p, *op, fo, *fop; if (((char*)(o) - (char*)h1) & m1) return hp; fo = (op = objptr_from_obj(o))[-1]; assert(fo); if (notaptr(fo)) { fop = op + size_from_obj(fo); while (fop >= op) *--hp = *--fop; *p = *fop = obj_from_objptr(hp+1); } else if (((char*)(fo) - (char*)h2) & m2) { *--hp = *op--; *--hp = *op; *p = *op = obj_from_objptr(hp+1); } else *p = fo; return hp; } static void finalize(obj *hp1, obj *he1, obj *h2, cxoint_t m2) { while (hp1 < he1) { obj fo = *hp1++; assert(fo); if (notaptr(fo)) hp1 += size_from_obj(fo); else if (((char*)(fo) - (char*)h2) & m2) ((cxtype_t*)fo)->free((void*)*hp1++); else if (notaptr(fo = objptr_from_obj(fo)[-1])) hp1 += size_from_obj(fo); else ++hp1; } assert(hp1 == he1); } static obj *relocate(cxroot_t *pr, obj *regs, obj *regp, obj *he2, obj *he1, obj *hp, obj *h1, cxoint_t m1, obj *h2, cxoint_t m2) { obj *p, *hp1 = hp; hp = he2; for (p = regs; p < regp; ++p) hp = toheap2(p, hp, h1, m1, h2, m2); for (; pr; pr = pr->next) { obj **pp = pr->globv; int c = pr->globc; while (c-- > 0) hp = toheap2(*pp++, hp, h1, m1, h2, m2); } for (p = he2; p > hp; --p) hp = toheap2(p-1, hp, h1, m1, h2, m2); if (he1) finalize(hp1, he1, h2, m2); return hp; } obj *cxm_hgc(obj *regs, obj *regp, obj *hp, size_t needs) { obj *h1 = cxg_heap, *h2 = cxg_heap2; cxoint_t m1 = cxg_hmask, m2 = cxg_hmask2; size_t hs = cxg_hsize; cxroot_t *pr = cxg_rootp; obj *h = h1, *he1 = h1 + hs, *he2 = h2 + hs; ++cxg_gccount; if (h1) hp = relocate(pr, regs, regp, he2, he1, hp, h1, m1, h2, m2), needs += (h2 + hs - hp)*2; /* make heap half empty */ else hp = h2 + hs; if (hs < needs) { size_t s = HEAP_SIZE; while (s < needs) s *= 2; m2 = 1 | ~(s*sizeof(obj)-1); if (!(h = realloc(h1, s*sizeof(obj)))) { perror("alloc[h]"); exit(2); } h1 = h2; h2 = h; he2 = h2 + s; he1 = 0; /* no finalize flag */ if (h1) hp = relocate(pr, regs, regp, he2, he1, hp, h1, m1, h2, m2); else hp = h2 + s; if (!(h = realloc(h1, s*sizeof(obj)))) { perror("alloc[h]"); exit(2); } hs = s; m1 = m2; ++cxg_bumpcount; } h1 = h2; h2 = h; cxg_heap = h1; cxg_hmask = m1; cxg_heap2 = h2; cxg_hmask2 = m2; cxg_hsize = hs; return cxg_hp = hp; } obj *cxm_rgc(obj *regs, size_t needs) { obj *p = cxg_regs; assert(needs > 0); if (!p || cxg_rend < p + needs) { size_t roff = regs ? regs - p : 0; if (!(p = realloc(p, needs*sizeof(obj)))) { perror("alloc[r]"); exit(2); } cxg_regs = p; cxg_rend = p + needs; regs = p + roff; } if (regs && regs > p) while (needs--) *p++ = *regs++; return cxg_regs; } void cxm_check(int x, char *msg) { if (!x) { perror(msg); exit(2); } } void *cxm_cknull(void *p, char *msg) { cxm_check(p != NULL, msg); return p; } /* os entry point */ int main(int argc, char **argv) { int res; obj pc; obj retcl[1] = { 0 }; cxm_rgc(NULL, REGS_SIZE); cxg_argv = argv; MODULE(); cxg_regs[0] = cx_main; cxg_regs[1] = (obj)retcl; cxg_regs[2] = (obj)argv; cxg_rc = 3; pc = objptr_from_obj(cx_main)[0]; while (pc) pc = (*(cxhost_t*)pc)(pc); assert(cxg_rc == 3); res = (cxg_regs[2] != 0); /* fprintf(stderr, "%d collections, %d reallocs\n", cxg_gccount, cxg_bumpcount); */ return res; }