mipstable.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 489 行 · 第 1/2 页

C
489
字号
/*       op1   op2   res           verify     gen           reg            fu */
_Un(     ANY,  ANY,  NONE ),       V_NO,      R_POPTOMOV,   RG_DWORD,      FU_NO,
};

opcode_entry    Un1[] = {
/***********************/
/*      op1   res   eq             verify     gen           reg            fu */
_Un(    R,    R,    NONE ),        V_NO,      G_UNARY,      RG_BYTE,       FU_ALU,
_Un(    C|M,  ANY,  NONE ),        V_NO,      R_MOVOP1TEMP, RG_BYTE,       FU_NO,
_Un(    ANY,  M,    NONE ),        V_NO,      R_MOVRESTEMP, RG_BYTE,       FU_NO,
_Un(    ANY,  ANY,  NONE ),        V_NO,      G_UNKNOWN,    RG_BYTE_NEED,  FU_NO,
};

opcode_entry    Un2[] = {
/***********************/
/*      op1   res   eq             verify     gen           reg            fu */
_Un(    R,    R,    NONE ),        V_NO,      G_UNARY,      RG_WORD,       FU_ALU,
_Un(    C|M,  ANY,  NONE ),        V_NO,      R_MOVOP1TEMP, RG_WORD,       FU_NO,
_Un(    ANY,  M,    NONE ),        V_NO,      R_MOVRESTEMP, RG_WORD,       FU_NO,
_Un(    ANY,  ANY,  NONE ),        V_NO,      G_UNKNOWN,    RG_WORD_NEED,  FU_NO,
};

opcode_entry    Alloca4[] = {
/***************************/
/*      op1   res   eq             verify     gen           reg            fu */
_Un(    ANY,  ANY,  NONE ),        V_NO,      R_ALLOCA,     RG_DWORD,      FU_NO,
};

opcode_entry    Un4[] = {
/***********************/
/*      op1   res   eq             verify     gen           reg            fu */
_Un(    R,    R,    NONE ),        V_NO,      G_UNARY,      RG_DWORD,      FU_ALU,
_Un(    C|M,  ANY,  NONE ),        V_NO,      R_MOVOP1TEMP, RG_DWORD,      FU_NO,
_Un(    ANY,  M,    NONE ),        V_NO,      R_MOVRESTEMP, RG_DWORD,      FU_NO,
_Un(    ANY,  ANY,  NONE ),        V_NO,      G_UNKNOWN,    RG_DWORD_NEED, FU_NO,
};

opcode_entry    Un8[] = {
/***********************/
/*      op1   res   eq             verify     gen           reg            fu */
_Un(    ANY,  ANY,  NONE ),        V_NO,      R_SPLITUNARY, RG_QWORD,      FU_NO,
};

opcode_entry    Neg8[] = {
/***********************/
/*      op1   res   eq             verify     gen           reg            fu */
_Un(    ANY,  ANY,  NONE ),        V_NO,      R_SPLITNEG,   RG_QWORD,      FU_NO,
};

opcode_entry    MoveF[] = {
/*************************/
/*       op1   res   eq            verify          gen           reg            fu */
_Un(     ANY,  ANY,  EQ_R1 ),      NVI(V_NO),      G_NO,         RG_,           FU_NO,
_Un(     M,    M,    NONE ),       V_SAME_LOCN,    G_NO,         RG_,           FU_NO,
_Un(     R,    R,    NONE ),       V_NO,           G_MOVE_FP,    RG_FLOAT,      FU_NO,
_Un(     R,    M,    NONE ),       V_NO,           G_STORE,      RG_FLOAT,      FU_NO,
_Un(     M,    R,    NONE ),       V_NO,           G_LOAD,       RG_FLOAT,      FU_NO,
_Un(     C,    U,    NONE ),       V_RESCONSTTEMP, G_UNKNOWN,    RG_FLOAT_NEED, FU_NO,
_Un(     C,    ANY,  NONE ),       V_NO,           R_FORCEOP1CMEM,RG_,          FU_NO,
_Un(     M,    M,    NONE ),       V_NO,           R_MOVOP1TEMP, RG_,           FU_NO,
_Un(     ANY,  ANY,  NONE ),       V_NO,           G_UNKNOWN,    RG_FLOAT_NEED, FU_NO,
};

opcode_entry    FloatBinary[] = {
/*******************************/
/*       op1   op2   res   eq      verify     gen           reg            fu */
_Bin(    R,    R,    R,    NONE ), V_NO,      G_BINARY_FP,  RG_FLOAT,      FU_ALU,
_Bin(    C,    ANY,  ANY,  NONE ), V_NO,      R_FORCEOP1CMEM,RG_FLOAT,     FU_NO,
_Bin(    ANY,  C,    ANY,  NONE ), V_NO,      R_FORCEOP2CMEM,RG_FLOAT,     FU_NO,
_Bin(    M,    ANY,  ANY,  NONE ), V_NO,      R_MOVOP1REG,  RG_FLOAT,      FU_NO,
_Bin(    ANY,  M,    ANY,  NONE ), V_NO,      R_MOVOP2REG,  RG_FLOAT,      FU_NO,
_Bin(    ANY,  ANY,  M,    NONE ), V_NO,      R_MOVRESTEMP, RG_FLOAT,      FU_NO,
_Bin(    ANY,  ANY,  ANY,  NONE ), V_NO,      G_UNKNOWN,    RG_FLOAT_NEED, FU_NO,
};


opcode_entry    DoNop[] = {
/*************************/
/*       op1   op2   res   eq      verify     gen           reg         fu */
_BinPP( ANY,  ANY,  ANY,  NONE ),  V_NO,      G_NO,         RG_,        FU_NO,
};

opcode_entry    Set4[] = {
/************************/
/*       op1   op2   res   eq      verify     gen           reg         fu */
_Bin(    ANY,  ANY,  ANY,  NONE ), V_NO,      R_DOSET,      RG_,        FU_ALU,
};

opcode_entry    Test4[] = {
/*************************/
/*       op1   op2   res   eq      verify     gen           reg         fu */
_Bin(    ANY,  ANY,  ANY,  NONE ), V_NO,      R_DOTEST,     RG_,        FU_ALU,
};

/* V_MIPSBRANCH is true if condition is OP_CMP_NOT_EQUAL or OP_CMP_EQUAL.
 * Such condition can be encoded as beq/bne using registers as operands.
 */
opcode_entry    Cmp4[] = {
/************************/
/*      op1   op2       verify          gen             reg             fu */
_Side(  R,    R ),      V_MIPSBRANCH,   G_CONDBR,       RG_DWORD,       FU_NO,
_Side(  R,    R ),      V_NO,           R_M_SIMPCMP,    RG_DWORD,       FU_NO,
_Side(  R,    C ),      V_OP2ZERO,      G_CONDBR,       RG_DWORD,       FU_NO,
_Side(  R,    C ),      V_MIPSBRANCH,   R_MOVOP2TEMP,   RG_DWORD,       FU_NO,
_Side(  R,    C ),      V_NO,           R_M_SIMPCMP,    RG_DWORD,       FU_NO,
_Side(  C,    C ),      V_NO,           R_MOVOP1TEMP,   RG_DWORD,       FU_NO,
_Side(  C,    R ),      V_NO,           R_SWAPCMP,      RG_DWORD,       FU_NO,
_Side(  M,    ANY ),    V_NO,           R_MOVOP1REG,    RG_DWORD,       FU_NO,
_Side(  ANY,  M ),      V_NO,           R_MOVOP2REG,   RG_DWORD,       FU_NO,
_Side(  ANY,  ANY ),    V_NO,           G_UNKNOWN,      RG_DWORD_NEED,  FU_NO,
};

opcode_entry    Cmp8[] = {
/************************/
/*      op1   op2       verify          gen             reg             fu */
_Side(  ANY,  ANY ),    V_NO,           R_SPLITCMP,     RG_QWORD,       FU_NO,
};

opcode_entry    CmpF[] = {
/************************/
/*      op1   op2       verify          gen             reg             fu */
_Side(  R,    R ),      V_NO,           R_SIMPCMP,      RG_FLOAT,       FU_NO,
_Side(  R,    C ),      V_OP2ZERO,      G_CONDBR,       RG_FLOAT,       FU_NO,
_Side(  R,    C ),      V_NO,           R_FORCEOP2CMEM, RG_FLOAT,       FU_NO,
_Side(  C,    R ),      V_NO,           R_SWAPCMP,      RG_FLOAT,       FU_NO,
_Side(  C,    C ),      V_NO,           R_FORCEOP1CMEM, RG_FLOAT,       FU_NO,
_Side(  M,    ANY ),    V_NO,           R_MOVOP1REG,    RG_FLOAT,       FU_NO,
_Side(  ANY,  M ),      V_NO,           R_MOVOP2REG,    RG_FLOAT,       FU_NO,
_Side(  ANY,  ANY ),    V_NO,           G_UNKNOWN,      RG_FLOAT_NEED,  FU_NO,
};

opcode_entry    Call[] = {
/************************/
/*      op    op2,  res   eq          verify      gen             reg  fu */
_Bin(   ANY,  ANY,  ANY,  NONE ),     V_NO,       G_CALL,         RG_, FU_NO,
};

opcode_entry    CallI[] = {
/*************************/
/*      op    op2,  res   eq          verify      gen             reg  fu */
_Bin(   ANY,  ANY,  ANY,  NONE ),     V_NO,       G_CALLI,        RG_, FU_NO,
};

opcode_entry    Rtn[] = {
/***********************/
/*      op    op2,  res   eq          verify      gen             reg  fu */
_Bin(   ANY,  ANY,  ANY,  NONE ),     V_NO,       R_MAKECALL,     RG_, FU_NO,
};

static  opcode_entry    UnaryRtn[] = {
/************************************/
/*      op    op2,  res               verify      gen             reg  fu */
_Un(    ANY,  ANY,  NONE   ),         V_NO,       R_MAKECALL,     RG_, FU_NO,
};


opcode_entry    Promote[] = {
/***************************/
/*      op    op2,  res   eq          verify      gen             reg  fu */
_Bin(   ANY,  ANY,  ANY,  NONE ),     V_NO,       R_BIN2INT,      RG_, FU_NO,
};

opcode_entry    Promote8[] = {
/****************************/
/*      op    op2,  res   eq           verify     gen             reg  fu */
_Bin(   ANY,  ANY,  ANY,  NONE ),      V_NO,      R_BIN2QUAD,     RG_, FU_NO,
};

static  opcode_entry    *OpcodeList[] = {
        StubUnary,              /* NO    */
        StubUnary,              /* NYI   */
        Binary1,                /* BIN1  */
        Binary2,                /* BIN2  */
        Binary4,                /* BIN4  */
        Binary8,                /* BIN8  */
        BinaryUC1,              /* BINU1 */
        BinaryUC2,              /* BINU2 */
        BinaryUC4,              /* BINU4 */
        Binary8,                /* BINU8 */
        BinaryNI1,              /* BINN1 */
        BinaryNI2,              /* BINN2 */
        BinaryNI4,              /* BINN4 */
        Binary8,                /* BINN8 */
        Un1,                    /* UN1   */
        Un2,                    /* UN2   */
        Un4,                    /* UN4   */
        Un8,                    /* UN8   */
        Neg8,                   /* NEG8  */
        Move1,                  /* MOV1  */
        Move2,                  /* MOV2  */
        Move4,                  /* MOV4  */
        Move8,                  /* MOV8  */
        MoveXX,                 /* MOVXX */
        Conv,                   /* CONV  */
        Conv,                   /* FCONV */
        Call,                   /* CALL  */
        CallI,                  /* CALLI */
        Push,                   /* PUSH  */
        Pop,                    /* POP   */
        LoadAddr2,              /* LA2   */
        LoadAddr4,              /* LA4   */
        LoadAddr8,              /* LA8   */
#if 0   // Maybe for MIPS64?
        StubBinary,             /* CMP4  */
        Cmp8,                   /* CMP8  */
#else
        Cmp4,                   /* CMP4  */
        Cmp8,                   /* CMP8  */
#endif
        Test4,                  /* TEST4 */
        Test4,                  /* TEST8 */
        Set4,                   /* SET4  */
        Set4,                   /* SET8  */
        Binary4,                /* ZAP   */
        Binary4,                /* EXT4  */
        LoadUnaligned,          /* LDQU  */
        StoreUnaligned,         /* STQU  */
        FloatBinary,            /* FBINS */
        FloatBinary,            /* FBIND */
        MoveF,                  /* MOVS  */
        MoveF,                  /* MOVD  */
        CmpF,                   /* CMPS  */
        CmpF,                   /* CMPD  */
        Rtn,                    /* RTN   */
        NegF,                   /* NEGF  */
        Promote,                /* PROM  */
        Promote8,               /* PROM8 */
        Rtn,                    /* BFUNS */
        Rtn,                    /* BFUND */
        Rtn,                    /* BFUNL */
        UnaryRtn,               /* UFUNS */
        UnaryRtn,               /* UFUND */
        UnaryRtn,               /* UFUNL */
        Alloca4,                /* STK4  */
        DoNop,                  /* DONOTHING */
        NULL                    /* BAD   */
};

extern  opcode_entry    *OpcodeTable( table_def i )
/***************************************************/
{
    return( OpcodeList[i] );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?