/* i.h -- instructions */ #ifndef glue #define glue(a, b) a##b #endif #ifndef AUTOGL #define AUTOGL NULL #endif #ifndef INLINED #define INLINED "" #endif #if defined(VM_GEN_DEFGLOBAL) #define declare_instruction(name, enc, etyp, igname, arity, lcode) \ declare_instruction_global(name) #define declare_instrshadow(name, enc, etyp, igname, arity, lcode) #define declare_integrable(name, enc, etyp, igname, arity, lcode) #elif defined(VM_GEN_ENCTABLE) #define declare_instruction(name, enc, etyp, igname, arity, lcode) \ declare_enctable_entry(name, enc, etyp) #define declare_instrshadow(name, enc, etyp, igname, arity, lcode) \ declare_enctable_entry(name, enc, etyp) #define declare_integrable(name, enc, etyp, igname, arity, lcode) #elif defined(VM_GEN_INTGTABLE) #define declare_instruction(name, enc, etyp, igname, arity, lcode) \ declare_intgtable_entry(enc, igname, arity, lcode) #define declare_instrshadow(name, enc, etyp, igname, arity, lcode) \ declare_intgtable_entry(enc, igname, arity, lcode) #define declare_integrable(name, enc, etyp, igname, arity, lcode) \ declare_intgtable_entry(enc, igname, arity, lcode) #else /* regular include */ #define declare_instruction(name, enc, etyp, igname, arity, lcode) \ extern obj glue(cx_ins_2D, name); #define declare_instrshadow(name, enc, etyp, igname, arity, lcode) #define declare_integrable(name, enc, etyp, igname, arity, lcode) extern obj vmcases[]; /* vm host */ #endif /* basic vm machinery */ declare_instruction(halt, NULL, 0, NULL, 0, NULL) declare_instruction(litf, "f", 0, NULL, 0, NULL) declare_instruction(litt, "t", 0, NULL, 0, NULL) declare_instruction(litn, "n", 0, NULL, 0, NULL) declare_instruction(lit, "'", 1, NULL, 0, NULL) declare_instruction(sref, ".", 1, NULL, 0, NULL) declare_instruction(dref, ":", 1, NULL, 0, NULL) declare_instruction(gref, "@", 'g', NULL, 0, NULL) declare_instruction(iref, "^", 0, NULL, 0, NULL) declare_instruction(iset, "^!", 0, NULL, 0, NULL) declare_instruction(dclose, "&", 'd', NULL, 0, NULL) declare_instruction(sbox, "#", 1, NULL, 0, NULL) declare_instruction(br, NULL, 'b', NULL, 0, NULL) declare_instruction(brnot, "?", 'b', NULL, 0, NULL) declare_instruction(brt, "~?", 'b', NULL, 0, NULL) declare_instruction(andbo, ";", 'a', NULL, 0, NULL) declare_instruction(sseti, ".!", 1, NULL, 0, NULL) declare_instruction(dseti, ":!", 1, NULL, 0, NULL) declare_instruction(gloc, "`", 'g', NULL, 0, NULL) declare_instruction(gset, "@!", 'g', NULL, 0, NULL) declare_instruction(appl, "K3", 0, NULL, 0, NULL) declare_instruction(cwmv, "K4", 0, NULL, 0, NULL) declare_instruction(rcmv, "K5", 0, NULL, 0, NULL) declare_instruction(sdmv, "K6", 0, NULL, 0, NULL) declare_instruction(lck, "k", 1, NULL, 0, NULL) declare_instruction(lck0, "k0", 0, NULL, 0, NULL) declare_instruction(rck, "k!", 0, NULL, 0, NULL) declare_instruction(wck, "w", 0, NULL, 0, NULL) declare_instruction(wckr, "w!", 0, NULL, 0, NULL) declare_instruction(save, "$", 's', NULL, 0, NULL) declare_instruction(push, ",", 0, NULL, 0, NULL) declare_instruction(jdceq, "|", 2, NULL, 0, NULL) declare_instruction(jdcge, "|!", 2, NULL, 0, NULL) declare_instruction(jdref, "|!0", 1, NULL, 0, NULL) declare_instruction(call, "[0", 1, NULL, 0, NULL) declare_instruction(scall, "[", 2, NULL, 0, NULL) declare_instruction(return, "]0", 0, NULL, 0, NULL) declare_instruction(sreturn, "]", 1, NULL, 0, NULL) declare_instruction(adrop, "_", 1, NULL, 0, NULL) declare_instruction(pop, "_!", 0, NULL, 0, NULL) declare_instruction(atest, "%", 1, NULL, 0, NULL) declare_instruction(shrarg, "%!", 1, NULL, 0, NULL) declare_instruction(aerr, "%%", 0, NULL, 0, NULL) /* popular instruction combos */ declare_instruction(shlit, ",'", 1, NULL, 0, NULL) declare_instruction(shi0, ",'0", 0, NULL, 0, NULL) declare_instruction(pushlitf, "f,", 0, NULL, 0, NULL) declare_instruction(pushlitt, "t,", 0, NULL, 0, NULL) declare_instruction(pushlitn, "n,", 0, NULL, 0, NULL) declare_instruction(lit0, "'0", 0, NULL, 0, NULL) declare_instruction(lit1, "'1", 0, NULL, 0, NULL) declare_instruction(lit2, "'2", 0, NULL, 0, NULL) declare_instruction(lit3, "'3", 0, NULL, 0, NULL) declare_instruction(lit4, "'4", 0, NULL, 0, NULL) declare_instruction(lit5, "'5", 0, NULL, 0, NULL) declare_instruction(lit6, "'6", 0, NULL, 0, NULL) declare_instruction(lit7, "'7", 0, NULL, 0, NULL) declare_instruction(lit8, "'8", 0, NULL, 0, NULL) declare_instruction(lit9, "'9", 0, NULL, 0, NULL) declare_instruction(pushlit0, "'0,", 0, NULL, 0, NULL) declare_instruction(pushlit1, "'1,", 0, NULL, 0, NULL) declare_instruction(pushlit2, "'2,", 0, NULL, 0, NULL) declare_instruction(pushlit3, "'3,", 0, NULL, 0, NULL) declare_instruction(pushlit4, "'4,", 0, NULL, 0, NULL) declare_instruction(pushlit5, "'5,", 0, NULL, 0, NULL) declare_instruction(pushlit6, "'6,", 0, NULL, 0, NULL) declare_instruction(pushlit7, "'7,", 0, NULL, 0, NULL) declare_instruction(pushlit8, "'8,", 0, NULL, 0, NULL) declare_instruction(pushlit9, "'9,", 0, NULL, 0, NULL) declare_instruction(sref0, ".0", 0, NULL, 0, NULL) declare_instruction(sref1, ".1", 0, NULL, 0, NULL) declare_instruction(sref2, ".2", 0, NULL, 0, NULL) declare_instruction(sref3, ".3", 0, NULL, 0, NULL) declare_instruction(sref4, ".4", 0, NULL, 0, NULL) declare_instruction(sref5, ".5", 0, NULL, 0, NULL) declare_instruction(sref6, ".6", 0, NULL, 0, NULL) declare_instruction(sref7, ".7", 0, NULL, 0, NULL) declare_instruction(sref8, ".8", 0, NULL, 0, NULL) declare_instruction(sref9, ".9", 0, NULL, 0, NULL) declare_instruction(pushsref0, ".0,", 0, NULL, 0, NULL) declare_instruction(pushsref1, ".1,", 0, NULL, 0, NULL) declare_instruction(pushsref2, ".2,", 0, NULL, 0, NULL) declare_instruction(pushsref3, ".3,", 0, NULL, 0, NULL) declare_instruction(pushsref4, ".4,", 0, NULL, 0, NULL) declare_instruction(pushsref5, ".5,", 0, NULL, 0, NULL) declare_instruction(pushsref6, ".6,", 0, NULL, 0, NULL) declare_instruction(pushsref7, ".7,", 0, NULL, 0, NULL) declare_instruction(pushsref8, ".8,", 0, NULL, 0, NULL) declare_instruction(pushsref9, ".9,", 0, NULL, 0, NULL) declare_instruction(srefi0, ".0^", 0, NULL, 0, NULL) declare_instruction(srefi1, ".1^", 0, NULL, 0, NULL) declare_instruction(srefi2, ".2^", 0, NULL, 0, NULL) declare_instruction(srefi3, ".3^", 0, NULL, 0, NULL) declare_instruction(srefi4, ".4^", 0, NULL, 0, NULL) declare_instruction(pushsrefi0, ".0^,", 0, NULL, 0, NULL) declare_instruction(pushsrefi1, ".1^,", 0, NULL, 0, NULL) declare_instruction(pushsrefi2, ".2^,", 0, NULL, 0, NULL) declare_instruction(pushsrefi3, ".3^,", 0, NULL, 0, NULL) declare_instruction(pushsrefi4, ".4^,", 0, NULL, 0, NULL) declare_instruction(dref0, ":0", 0, NULL, 0, NULL) declare_instruction(dref1, ":1", 0, NULL, 0, NULL) declare_instruction(dref2, ":2", 0, NULL, 0, NULL) declare_instruction(dref3, ":3", 0, NULL, 0, NULL) declare_instruction(dref4, ":4", 0, NULL, 0, NULL) declare_instruction(pushdref0, ":0,", 0, NULL, 0, NULL) declare_instruction(pushdref1, ":1,", 0, NULL, 0, NULL) declare_instruction(pushdref2, ":2,", 0, NULL, 0, NULL) declare_instruction(pushdref3, ":3,", 0, NULL, 0, NULL) declare_instruction(pushdref4, ":4,", 0, NULL, 0, NULL) declare_instruction(drefi0, ":0^", 0, NULL, 0, NULL) declare_instruction(drefi1, ":1^", 0, NULL, 0, NULL) declare_instruction(drefi2, ":2^", 0, NULL, 0, NULL) declare_instruction(drefi3, ":3^", 0, NULL, 0, NULL) declare_instruction(drefi4, ":4^", 0, NULL, 0, NULL) declare_instruction(pushdrefi0, ":0^,", 0, NULL, 0, NULL) declare_instruction(pushdrefi1, ":1^,", 0, NULL, 0, NULL) declare_instruction(pushdrefi2, ":2^,", 0, NULL, 0, NULL) declare_instruction(pushdrefi3, ":3^,", 0, NULL, 0, NULL) declare_instruction(pushdrefi4, ":4^,", 0, NULL, 0, NULL) declare_instruction(call0, "[00", 0, NULL, 0, NULL) declare_instruction(call1, "[01", 0, NULL, 0, NULL) declare_instruction(call2, "[02", 0, NULL, 0, NULL) declare_instruction(call3, "[03", 0, NULL, 0, NULL) declare_instruction(call4, "[04", 0, NULL, 0, NULL) declare_instruction(scall1, "[1", 1, NULL, 0, NULL) declare_instruction(scall10, "[10", 0, NULL, 0, NULL) declare_instruction(scall11, "[11", 0, NULL, 0, NULL) declare_instruction(scall12, "[12", 0, NULL, 0, NULL) declare_instruction(scall13, "[13", 0, NULL, 0, NULL) declare_instruction(scall14, "[14", 0, NULL, 0, NULL) declare_instruction(scall2, "[2", 1, NULL, 0, NULL) declare_instruction(scall20, "[20", 0, NULL, 0, NULL) declare_instruction(scall21, "[21", 0, NULL, 0, NULL) declare_instruction(scall22, "[22", 0, NULL, 0, NULL) declare_instruction(scall23, "[23", 0, NULL, 0, NULL) declare_instruction(scall24, "[24", 0, NULL, 0, NULL) declare_instruction(scall3, "[3", 1, NULL, 0, NULL) declare_instruction(scall30, "[30", 0, NULL, 0, NULL) declare_instruction(scall31, "[31", 0, NULL, 0, NULL) declare_instruction(scall32, "[32", 0, NULL, 0, NULL) declare_instruction(scall33, "[33", 0, NULL, 0, NULL) declare_instruction(scall34, "[34", 0, NULL, 0, NULL) declare_instruction(scall4, "[4", 1, NULL, 0, NULL) declare_instruction(scall40, "[40", 0, NULL, 0, NULL) declare_instruction(scall41, "[41", 0, NULL, 0, NULL) declare_instruction(scall42, "[42", 0, NULL, 0, NULL) declare_instruction(scall43, "[43", 0, NULL, 0, NULL) declare_instruction(scall44, "[44", 0, NULL, 0, NULL) declare_instruction(sreturn1, "]1", 0, NULL, 0, NULL) declare_instruction(sreturn2, "]2", 0, NULL, 0, NULL) declare_instruction(sreturn3, "]3", 0, NULL, 0, NULL) declare_instruction(sreturn4, "]4", 0, NULL, 0, NULL) declare_instruction(atest0, "%0", 0, NULL, 0, NULL) declare_instruction(atest1, "%1", 0, NULL, 0, NULL) declare_instruction(atest2, "%2", 0, NULL, 0, NULL) declare_instruction(atest3, "%3", 0, NULL, 0, NULL) declare_instruction(atest4, "%4", 0, NULL, 0, NULL) declare_instruction(brnotlt, "0", 0, "fxpositive?", '1', AUTOGL) declare_instruction(inegp, "I<0", 0, "fxnegative?", '1', AUTOGL) declare_instruction(ievnp, "Ie", 0, "fxeven?", '1', AUTOGL) declare_instruction(ioddp, "Io", 0, "fxodd?", '1', AUTOGL) declare_instruction(iadd, "I+", 0, "fx+", '2', AUTOGL) declare_instruction(isub, "I-", 0, "fx-", '2', AUTOGL) declare_instruction(imul, "I*", 0, "fx*", '2', AUTOGL) declare_instruction(idiv, "I/", 0, "fx/", '2', AUTOGL) declare_instruction(iquo, "Iq", 0, "fxquotient", '2', AUTOGL) declare_instruction(irem, "Ir", 0, "fxremainder", '2', AUTOGL) declare_instruction(ilt, "I<", 0, "fx", 0, "fx>?", '2', AUTOGL) declare_instruction(ile, "I>!", 0, "fx<=?", '2', AUTOGL) declare_instruction(ige, "I=?", '2', AUTOGL) declare_instruction(ieq, "I=", 0, "fx=?", '2', AUTOGL) declare_instruction(ine, "I=!", 0, "fx!=?", '2', AUTOGL) declare_instruction(imin, "In", 0, "fxmin", '2', AUTOGL) declare_instruction(imax, "Ix", 0, "fxmax", '2', AUTOGL) declare_instruction(ineg, "I-!", 0, "fxneg", '1', AUTOGL) declare_instruction(iabs, "Ia", 0, "fxabs", '1', AUTOGL) declare_instruction(itoj, "Ij", 0, "fixnum->flonum", '1', AUTOGL) declare_instruction(fixp, "I0", 0, "fixnum?", '1', AUTOGL) declare_instruction(imqu, "I3", 0, "fxmodquo", '2', AUTOGL) declare_instruction(imlo, "I4", 0, "fxmodulo", '2', AUTOGL) declare_instruction(ieuq, "I5", 0, "fxeucquo", '2', AUTOGL) declare_instruction(ieur, "I6", 0, "fxeucrem", '2', AUTOGL) declare_instruction(igcd, "I7", 0, "fxgcd", '2', AUTOGL) declare_instruction(ipow, "I8", 0, "fxexpt", '2', AUTOGL) declare_instruction(isqrt, "I9", 0, "fxsqrt", '1', AUTOGL) declare_instruction(inot, "D0", 0, "fxnot", '1', AUTOGL) declare_instruction(iand, "D1", 0, "fxand", '2', AUTOGL) declare_instruction(iior, "D2", 0, "fxior", '2', AUTOGL) declare_instruction(ixor, "D3", 0, "fxxor", '2', AUTOGL) declare_instruction(iasl, "D4", 0, "fxsll", '2', AUTOGL) declare_instruction(iasr, "D5", 0, "fxsrl", '2', AUTOGL) declare_instruction(jzerop, "J=0", 0, "flzero?", '1', AUTOGL) declare_instruction(jposp, "J>0", 0, "flpositive?", '1', AUTOGL) declare_instruction(jnegp, "J<0", 0, "flnegative?", '1', AUTOGL) declare_instruction(jevnp, "Je", 0, "fleven?", '1', AUTOGL) declare_instruction(joddp, "Jo", 0, "flodd?", '1', AUTOGL) declare_instruction(jintp, "Jw", 0, "flinteger?", '1', AUTOGL) declare_instruction(jnanp, "Ju", 0, "flnan?", '1', AUTOGL) declare_instruction(jfinp, "Jf", 0, "flfinite?", '1', AUTOGL) declare_instruction(jinfp, "Jh", 0, "flinfinite?", '1', AUTOGL) declare_instruction(jadd, "J+\0'(j0)", 0, "fl+", 'p', AUTOGL) declare_instruction(jsub, "J-\0J-!", 0, "fl-", 'm', AUTOGL) declare_instruction(jmul, "J*\0'(j1)", 0, "fl*", 'p', AUTOGL) declare_instruction(jdiv, "J/\0,'(j1)J/", 0, "fl/", 'm', AUTOGL) declare_instruction(jquo, "Jq", 0, "flquotient", '2', AUTOGL) declare_instruction(jrem, "Jr", 0, "flremainder", '2', AUTOGL) declare_instruction(jlt, "J<", 0, "fl", 0, "fl>?", '2', AUTOGL) declare_instruction(jle, "J>!", 0, "fl<=?", '2', AUTOGL) declare_instruction(jge, "J=?", '2', AUTOGL) declare_instruction(jeq, "J=", 0, "fl=?", '2', AUTOGL) declare_instruction(jne, "J=!", 0, "fl!=?", '2', AUTOGL) declare_instruction(jmin, "Jn", 0, "flmin", '2', AUTOGL) declare_instruction(jmax, "Jx", 0, "flmax", '2', AUTOGL) declare_instruction(jneg, "J-!", 0, "flneg", '1', AUTOGL) declare_instruction(jabs, "Ja", 0, "flabs", '1', AUTOGL) declare_instruction(jtoi, "Ji", 0, "flonum->fixnum", '1', AUTOGL) declare_instruction(flop, "J0", 0, "flonum?", '1', AUTOGL) declare_instruction(jmqu, "J3", 0, "flmodquo", '2', AUTOGL) declare_instruction(jmlo, "J4", 0, "flmodulo", '2', AUTOGL) declare_instruction(jfloor, "H0", 0, "flfloor", '1', AUTOGL) declare_instruction(jceil, "H1", 0, "flceiling", '1', AUTOGL) declare_instruction(jtrunc, "H2", 0, "fltruncate", '1', AUTOGL) declare_instruction(jround, "H3", 0, "flround", '1', AUTOGL) declare_instruction(zerop, "=0", 0, "%zerop", 1, INLINED) declare_instruction(posp, ">0", 0, "%posp", 1, INLINED) declare_instruction(negp, "<0", 0, "%negp", 1, INLINED) declare_instruction(add, "+", 0, "%add", 2, INLINED) declare_instruction(sub, "-", 0, "%sub", 2, INLINED) declare_instruction(mul, "*", 0, "%mul", 2, INLINED) declare_instruction(div, "/", 0, "%div", 2, INLINED) declare_instruction(lt, "<", 0, "%lt", 2, INLINED) declare_instruction(gt, ">", 0, "%gt", 2, INLINED) declare_instruction(le, ">!", 0, "%le", 2, INLINED) declare_instruction(ge, "", 0, "%cgt", 2, INLINED) declare_instruction(cle, "C>!", 0, "%cle", 2, INLINED) declare_instruction(cge, "C", 0, "%cigt", 2, INLINED) declare_instruction(cile, "Ci>!", 0, "%cile", 2, INLINED) declare_instruction(cige, "Ci", 0, "%sgt", 2, INLINED) declare_instruction(sle, "S>!", 0, "%sle", 2, INLINED) declare_instruction(sge, "S", 0, "%sigt", 2, INLINED) declare_instruction(sile, "Si>!", 0, "%sile", 2, INLINED) declare_instruction(sige, "Si