/* new bytecodes */
/* This file contains the actual definition list of bytecodes emitted by
* the compiler. It is included into bytecode.h, which defines the ins()
* macro appropriately to generate a typedef'd enumeration.
* The list of instructions and the actual enumeration are separated into
* two files because there is an older (obsolete) output format that can
* be generated by the nhc98 compiler. The obsolete format expects the
* bytecode to be available as ordinary #defines, not as an enum. In order
* to keep the obsolete format in synch with the new format, there is a
* script which can process the file you are reading now, to generate the
* older format. See script/mangler.
*/
#define INSTRUCTION_LIST \
ins(DUMMY_FOR_ZERO), \
\
ins(NEEDHEAP_P1), \
ins(NEEDHEAP_P2), \
ins(JUMP), \
ins(JUMPFALSE), \
ins(NOP), \
\
ins(PUSH_CADR_N2), \
ins(PUSH_CADR_N1), \
ins(PUSH_CADR_P1), \
ins(PUSH_CADR_P2), \
ins(PUSH_CVAL_N2), \
ins(PUSH_CVAL_N1), \
ins(PUSH_CVAL_P1), \
ins(PUSH_CVAL_P2), \
ins(PUSH_INT_N2), \
ins(PUSH_INT_N1), \
ins(PUSH_INT_P1), \
ins(PUSH_INT_P2), \
ins(PUSH_ARG), \
ins(PUSH_P1), \
ins(PUSH_P2), \
\
ins(POP_P1), \
ins(POP_P2), \
ins(SLIDE_P1), \
ins(SLIDE_P2), \
ins(UNPACK), \
\
ins(APPLY), \
ins(EVAL), \
\
ins(RETURN), \
ins(RETURN_EVAL), \
\
ins(HEAP_CADR_N2), \
ins(HEAP_CADR_N1), \
ins(HEAP_CADR_P1), \
ins(HEAP_CADR_P2), \
ins(HEAP_CVAL_N2), \
ins(HEAP_CVAL_N1), \
ins(HEAP_CVAL_P1), \
ins(HEAP_CVAL_P2), \
ins(HEAP_INT_N2), \
ins(HEAP_INT_N1), \
ins(HEAP_INT_P1), \
ins(HEAP_INT_P2), \
ins(HEAP_ARG), \
ins(HEAP_ARG_ARG), \
ins(HEAP_ARG_ARG_RET_EVAL), \
ins(HEAP_P1), \
ins(HEAP_P2), \
\
ins(ADD_W), \
ins(ADD_F), \
ins(ADD_D), \
ins(SUB_W), \
ins(SUB_F), \
ins(SUB_D), \
ins(MUL_W), \
ins(MUL_F), \
ins(MUL_D), \
ins(ABS_W), \
ins(ABS_F), \
ins(ABS_D), \
ins(SIGNUM_W), \
ins(SIGNUM_F), \
ins(SIGNUM_D), \
ins(EXP_F), \
ins(EXP_D), \
ins(LOG_F), \
ins(LOG_D), \
ins(SQRT_F), \
ins(SQRT_D), \
ins(SIN_F), \
ins(SIN_D), \
ins(COS_F), \
ins(COS_D), \
ins(TAN_F), \
ins(TAN_D), \
ins(ASIN_F), \
ins(ASIN_D), \
ins(ACOS_F), \
ins(ACOS_D), \
ins(ATAN_F), \
ins(ATAN_D), \
ins(SLASH_F), \
ins(SLASH_D), \
ins(EQ_W), \
ins(EQ_F), \
ins(EQ_D), \
ins(NE_W), \
ins(NE_F), \
ins(NE_D), \
ins(LT_W), \
ins(LT_F), \
ins(LT_D), \
ins(LE_W), \
ins(LE_F), \
ins(LE_D), \
ins(GT_W), \
ins(GT_F), \
ins(GT_D), \
ins(GE_W), \
ins(GE_F), \
ins(GE_D), \
ins(NEG_W), \
ins(NEG_F), \
ins(NEG_D), \
\
ins(QUOT), \
ins(REM), \
ins(AND), \
ins(OR), \
ins(NOT), \
ins(ORD), \
ins(CHR), \
ins(SEQ), \
ins(STRING), \
\
ins(PRIMITIVE), \
ins(PUSH_HEAP), \
ins(EXIT), \
\
ins(NEEDSTACK_P1), \
ins(NEEDSTACK_P2), \
\
ins(HEAP_OFF_N2), \
ins(HEAP_OFF_N1), \
ins(HEAP_OFF_P1), \
ins(HEAP_OFF_P2), \
\
ins(HEAP_CREATE), \
ins(HEAP_SPACE), \
\
ins(SELECTOR_EVAL), \
ins(SELECT), \
\
ins(ZAP_ARG), \
ins(ZAP_STACK_P1), \
ins(ZAP_STACK_P2), \
\
ins(NEEDHEAP_I32), \
ins(NEEDSTACK_I16), \
\
ins(PUSH_I1), \
ins(POP_I1), \
\
ins(PUSH_ARG_I1), \
ins(PUSH_ARG_I2), \
ins(PUSH_ARG_I3), \
\
ins(ZAP_ARG_I1), \
ins(ZAP_ARG_I2), \
ins(ZAP_ARG_I3), \
\
ins(HEAP_CVAL_I3), \
ins(HEAP_CVAL_I4), \
ins(HEAP_CVAL_I5), \
\
ins(HEAP_CVAL_IN3), \
\
ins(HEAP_I1), \
ins(HEAP_I2), \
\
ins(HPUTC), \
ins(HGETC), \
ins(HGETS), \
\
ins(PUSH_CHAR_N1), \
ins(PUSH_CHAR_P1), \
ins(HEAP_CHAR_N1), \
ins(HEAP_CHAR_P1), \
\
ins(TABLESWITCH), \
ins(LOOKUPSWITCH), \
ins(MKIORETURN), \
\
ins(PUSH_ZAP_ARG_I1), \
ins(PUSH_ZAP_ARG_I2), \
ins(PUSH_ZAP_ARG_I3), \
ins(PUSH_ZAP_ARG), \
\
ins(ENDCODE), \
\
ins(POW_F), \
ins(POW_D)
#define UNUSED_INSTRUCTIONS \
Case(DUMMY_FOR_ZERO): \
Case(SEQ): \
Case(NOT): \
Case(OR): \
Case(AND): \
Case(HEAP_INT_P2): \
Case(HEAP_INT_N2): \
Case(PUSH_INT_P2): \
Case(PUSH_INT_N2):
|