//      OPCODE          negated   swaped    float  arity, flags

OPCODE(BADOP,           BADOP,    BADOP,    BADOP, 0, OPF_NONE)

/* Entry */
OPCODE(ENTRY,           BADOP,    BADOP,    BADOP, 0, OPF_NONE)

/* Terminator */
OPCODE(RET,             BADOP,    BADOP,    BADOP, 1, OPF_NONE)
OPCODE(BR,              BADOP,    BADOP,    BADOP, 0, OPF_NONE)
OPCODE(CBR,             BADOP,    BADOP,    BADOP, 1, OPF_NONE)
OPCODE(SWITCH,          BADOP,    BADOP,    BADOP, 1, OPF_NONE)
OPCODE(UNREACH,         BADOP,    BADOP,    BADOP, 0, OPF_NONE)
OPCODE(COMPUTEDGOTO,    BADOP,    BADOP,    BADOP, 1, OPF_NONE)
OPCODE_RANGE(TERMINATOR, RET, COMPUTEDGOTO)

/* Binary */
OPCODE(ADD,             BADOP,    BADOP,    FADD,  2, OPF_TARGET)
OPCODE(SUB,             BADOP,    BADOP,    FSUB,  2, OPF_TARGET)
OPCODE(MUL,             BADOP,    BADOP,    FMUL,  2, OPF_TARGET)
OPCODE(DIVU,            BADOP,    BADOP,    FDIV,  2, OPF_TARGET)
OPCODE(DIVS,            BADOP,    BADOP,    FDIV,  2, OPF_TARGET)
OPCODE(MODU,            BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(MODS,            BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(SHL,             BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(LSR,             BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(ASR,             BADOP,    BADOP,    BADOP, 2, OPF_TARGET)

/* Floating-point binops */
OPCODE(FADD,            BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(FSUB,            BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(FMUL,            BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(FDIV,            BADOP,    BADOP,    BADOP, 2, OPF_TARGET)

/* Logical */
OPCODE(AND_BOOL,        BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(OR_BOOL,         BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(AND,             BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(OR,              BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE(XOR,             BADOP,    BADOP,    BADOP, 2, OPF_TARGET)
OPCODE_RANGE(BINARY, ADD, XOR)

/* floating-point comparison */
OPCODE(FCMP_ORD,        FCMP_UNO, FCMP_ORD, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_OEQ,        FCMP_UNE, FCMP_OEQ, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_ONE,        FCMP_UEQ, FCMP_ONE, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_UEQ,        FCMP_ONE, FCMP_UEQ, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_UNE,        FCMP_OEQ, FCMP_UNE, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_OLT,        FCMP_UGE, FCMP_OGT, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_OLE,        FCMP_UGT, FCMP_OGE, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_OGE,        FCMP_ULT, FCMP_OLE, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_OGT,        FCMP_ULE, FCMP_OLT, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_ULT,        FCMP_OGE, FCMP_UGT, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_ULE,        FCMP_OGT, FCMP_UGE, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_UGE,        FCMP_OLT, FCMP_ULE, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_UGT,        FCMP_OLE, FCMP_ULT, BADOP, 2, OPF_TARGET)
OPCODE(FCMP_UNO,        FCMP_ORD, FCMP_UNO, BADOP, 2, OPF_TARGET)
OPCODE_RANGE(FPCMP, FCMP_ORD, FCMP_UNO)

/* Binary comparison */
OPCODE(SET_EQ,          SET_NE,   SET_EQ,   FCMP_OEQ, 2, OPF_TARGET)
OPCODE(SET_LT,          SET_GE,   SET_GT,   FCMP_OLT, 2, OPF_TARGET)
OPCODE(SET_LE,          SET_GT,   SET_GE,   FCMP_OLE, 2, OPF_TARGET)
OPCODE(SET_GE,          SET_LT,   SET_LE,   FCMP_OGE, 2, OPF_TARGET)
OPCODE(SET_GT,          SET_LE,   SET_LT,   FCMP_OGT, 2, OPF_TARGET)
OPCODE(SET_B,           SET_AE,   SET_A,    FCMP_OLT, 2, OPF_TARGET)
OPCODE(SET_BE,          SET_A,    SET_AE,   FCMP_OLE, 2, OPF_TARGET)
OPCODE(SET_AE,          SET_B,    SET_BE,   FCMP_OGE, 2, OPF_TARGET)
OPCODE(SET_A,           SET_BE,   SET_B,    FCMP_OGT, 2, OPF_TARGET)
OPCODE(SET_NE,          SET_EQ,   SET_NE,   FCMP_UNE, 2, OPF_TARGET)
OPCODE_RANGE(BINCMP, SET_EQ, SET_NE)

/* Uni */
OPCODE(NOT,             BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(NEG,             BADOP,    BADOP,    FNEG,  1, OPF_TARGET)
OPCODE(FNEG,            BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(TRUNC,           BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(ZEXT,            BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(SEXT,            BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(FCVTU,           BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(FCVTS,           BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(UCVTF,           BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(SCVTF,           BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(FCVTF,           BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(UTPTR,           BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(PTRTU,           BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(PTRCAST,         BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE_RANGE(UNOP, NOT, PTRCAST)
OPCODE(SYMADDR,         BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(SLICE,           BADOP,    BADOP,    BADOP, 1, OPF_TARGET)

/* Select - three input values */
OPCODE(SEL,             BADOP,    BADOP,    BADOP, 3, OPF_TARGET)

/* Memory */
OPCODE(LOAD,            BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(STORE,           BADOP,    BADOP,    BADOP, 1, OPF_NONE)

/* Other */
OPCODE(PHISOURCE,       BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(PHI,             BADOP,    BADOP,    BADOP, 0, OPF_TARGET)
OPCODE(SETVAL,          BADOP,    BADOP,    BADOP, 0, OPF_TARGET)
OPCODE(SETFVAL,         BADOP,    BADOP,    BADOP, 0, OPF_TARGET)
OPCODE(CALL,            BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
OPCODE(INLINED_CALL,    BADOP,    BADOP,    BADOP, 0, OPF_NONE)
OPCODE(NOP,             BADOP,    BADOP,    BADOP, 0, OPF_NONE)
OPCODE(DEATHNOTE,       BADOP,    BADOP,    BADOP, 0, OPF_NONE)
OPCODE(ASM,             BADOP,    BADOP,    BADOP, 0, OPF_NONE)

/* Sparse tagging (line numbers, context, whatever) */
OPCODE(CONTEXT,         BADOP,    BADOP,    BADOP, 0, OPF_NONE)
OPCODE(RANGE,           BADOP,    BADOP,    BADOP, 3, OPF_NONE)

/* Needed to translate SSA back to normal form */
OPCODE(COPY,            BADOP,    BADOP,    BADOP, 1, OPF_TARGET)
