s37table.c

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

C
818
字号
_UnPP(  M,    M,    NONE ),        V_NO,           R_MVC,        RG_,FU_NO,\
_Un(    ANY,  ANY,  NONE ),        V_NO,           G_UNKNOWN,    RG_##tipe,FU_NO

#define _MoveFlt( tipe, l, lr, st ) \
_MoveP1( tipe, l, lr, st ) \
_MoveP2( tipe, l, lr, st )

#define _MoveInt( tipe, l, lr, st ) \
_MoveP1( tipe, l, lr, st ) \
_UnPP(  C,    R,    NONE ),        V_OP1SMALL,     G_LA1,        RG_WORD,FU_NO,\
_UnPP(  C,    M,    NONE ),        V_OP1SMALL,     R_MOVOP1REG,  RG_WORD,FU_NO,\
_MoveP2( tipe, l, lr, st )

opcode_entry    Move2[] = {
/*************************/
_UnPP(  M,    M,    NONE  ),       V_SAME_LOCN,    G_NO,         RG_,FU_NO,
_UnPP(  C,    M,    NONE ),        V_NO,           G_MVC,        RG_,FU_NO,
_UnPP(  M,    M,    NONE ),        V_NO,           R_MVC,        RG_,FU_NO,
_Un(    ANY,  ANY,  NONE ),        V_NO,           G_UNKNOWN,    RG_,FU_NO
};

opcode_entry    Move4[] = {
/*************************/
_MoveInt( WORD, L, LR, ST )
};

opcode_entry    MoveFS[] = {
/**************************/
_MoveFlt( SINGLE, LE, LER, STE )
};

opcode_entry    MoveFD[] = {
/**************************/
_MoveFlt( DOUBLE, LD, LDR, STD )
};

opcode_entry    MVCL[] = {
/*       op1   res                 verify          gen           reg*/
_Un(    ANY,  ANY,  NONE ),        V_NO,           G_MVCL,       RG_MVCL,FU_NO,
_Un(    ANY,  ANY,  NONE ),        V_NO,           G_UNKNOWN,    RG_,FU_NO,
};

opcode_entry    MVC[] = { /* this is a kludge to reserve an extra index reg */
/***********************/
/*      op1   res                  verify          gen           reg*/
_UnPP(  M,    M,    NONE ),        V_NO,           G_MVC,        RG_INDEX_NEED,FU_NO,
_Un(    ANY,  ANY,  NONE ),        V_NO,           G_UNKNOWN,    RG_,FU_NO,
};

opcode_entry    MoveXX[] = {
/**************************/
/*       op1   res                 verify          gen           reg*/
_UnPP(  M,    M,    NONE ),        V_SIZE_SMALL,   R_MVC,        RG_,FU_NO,
_Un(    M,    M,    NONE ),        V_NO,           R_MVCL,       RG_,FU_NO,
_Un(    ANY,  M,    NONE ),        V_NO,           R_FORCEOP1MEM,RG_,FU_NO,
_Un(    ANY,  ANY,  NONE ),        V_NO,           R_FORCERESMEM,RG_,FU_NO,
};

/**************************************************************************/
/*                             UNARY                                      */
/**************************************************************************/

#define _Neg( op, type ) \
_UnCC(  R,    R,    EQ_R1 ),       V_NO,           G_##op,       RG_##type,FU_NO,\
_Un(    R|M|C,R|M,  NONE ),        V_NO,           R_USEREGISTER,RG_##type,FU_NO,\
_Un(    ANY,  ANY,  NONE  ),       V_NO,           G_UNKNOWN,  RG_##type##_NEED,FU_NO


opcode_entry    Neg4[] = {
/**************************/
_Neg( LCR, WORD )
};

opcode_entry    NegFS[] = {
/**************************/
_Neg( LCER, SINGLE )
};

opcode_entry    NegFD[] = {
/**************************/
_Neg( LCDR, DOUBLE )
};

opcode_entry    Not4[] = {
/**************************/
/*       op1   res                 verify          gen          reg*/
_UnCC(  R,     ANY,  NONE ),       V_NO,           R_NEGDEC,    RG_WORD,FU_NO,
_UnCC(  ANY,   R,    NONE ),       V_NO,           R_NEGDEC,    RG_WORD,FU_NO,
_UnCC(  M,     M,    EQ_R1 ),      V_NO,           R_NOT2XOR,   RG_,FU_NO,
_UnCC(  M,     M,    NONE ),       V_NO,           R_NEGDEC,    RG_,FU_NO,
_UnCC(  ANY,   ANY,  NONE ),       V_NO,           G_UNKNOWN,   RG_WORD_NEED,FU_NO
};


/**************************************************************************/
/*                             CVT                                        */
/**************************************************************************/

static  opcode_entry    Cvt[] = {
/***********************/
/*       op1   op2   eq            verify          gen           reg*/
_Un(    ANY,  ANY,  NONE ),        V_NO,           R_DOCVT,      RG_,FU_NO
};

/**************************************************************************/
/*                             LEA                                        */
/**************************************************************************/

static  opcode_entry    LoadA4[] = {
/**************************/
/*       op    res   eq            verify          gen           reg*/
_Un(    M,    ANY,  NONE ),        V_OFFSETZERO,   R_MOVEINDEX,  RG_WORD,FU_NO,
_Un(    M,    R,    NONE ),        V_OP1ADDR,      R_MOVEADDR,   RG_WORD,FU_NO,
_Un(    M,    R,    NONE ),        V_NO,           G_LA,         RG_WORD,FU_NO,
_Un(    M,    M,    NONE ),        V_NO,           R_MOVRESREG,  RG_WORD,FU_NO,
_Un(    ANY,  ANY,  NONE ),        V_NO,           G_UNKNOWN,    RG_WORD,FU_NO
};

/**************************************************************************/
/*                             CALL                                       */
/**************************************************************************/

static  opcode_entry    Parm[] = {
/************************/
/*       op    res   eq            verify          gen             reg*/
_Un(    ANY,  ANY,  NONE ),        V_NO,           G_NO,           RG_,FU_NO
};
/*   Calls always have their return value put in a register name*/

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

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

/**************************************************************************/
/*                             NOP                                        */
/**************************************************************************/

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

/**************************************************************************/
/*                             CONVERT                                    */
/**************************************************************************/

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

static  opcode_entry    UnToInt[] = {
/************************/
/*       op1  res   eq             verify          gen           reg*/
_Un(    ANY,  ANY,  NONE ),        V_NO,           R_UN2INT,     RG_,FU_NO
};

static  opcode_entry    SideToInt[] = {
/************************/
/*       op1  op2          verify          gen           reg*/
_Side(  ANY,  ANY ),       V_NO,           R_SIDE2INT,   RG_,FU_NO
};

/**************************************************************************/
/*                             Select                                     */
/**************************************************************************/

static  opcode_entry    Select[] = {
_Bin(   ANY, R,  R, NONE ), V_NO,       G_SELECT, RG_INDEX,FU_NO,      /* NYI */
_Bin(   ANY, ANY, ANY, NONE ), V_NO,    G_UNKNOWN,RG_INDEX_NEED,FU_NO  /* NYI */
};

static  opcode_entry    *OpcodeList[] = {
        NULL,                   /* NO*/
        &BinToInt,              /* ADD1*/
        &BinToInt,              /* ADD2*/
        &AddU4,                 /* ADDU4*/
        &AddI4,                 /* ADDI4*/
        &AddPT,                 /* ADDPT*/
        &AddFS,                 /* ADDFS */
        &AddFD,                 /* ADDFD*/
        &BinToInt,              /* SUB1*/
        &BinToInt,              /* SUB2*/
        &SubU4,                 /* SUBU4*/
        &SubI4,                 /* SUBI4*/
        &SubU4,                 /* SUBPT*/
        &SubFS,                 /* SUBFS */
        &SubFD,                 /* SUBFD */
        &Or1,                   /* OR1 */
        &Or2,                   /* OR2 */
        &Or4,                   /* OR4 */
        &Xor1,                  /* XOR1 */
        &Xor2,                  /* XOR2 */
        &Xor4,                  /* XOR4 */
        &And1,                  /* AND1 */
        &And2,                  /* AND2 */
        &And4,                  /* AND4 */
        &BinToInt,              /* MUL1*/
        &BinToInt,              /* MUL2*/
        &Mul4,                  /* MUL4*/
        &MulFS,                 /* MULFS */
        &MulFD,                 /* MULFD */
        &BinToInt,              /* DIV1*/
        &BinToInt,              /* DIV2*/
        &Div4,                  /* DIV4*/
        &DivFS,                 /* DIVFS */
        &DivFD,                 /* DIVFD */
        &BinToInt,              /* MOD1*/
        &BinToInt,              /* MOD2*/
        &Mod4,                  /* MOD4 */
        &BinToInt,              /* SHFT1 */
        &BinToInt,              /* SHFT2 */
        &RShiftU4,              /* RSHU4 */
        &RShiftI4,              /* RSHI4 */
        &LShiftU4,              /* RSHU4 */
        &LShiftI4,              /* RSHI4 */
        &Test1,                 /* TEST1 */
        &Test2,                 /* TEST2 */
        &Test4,                 /* TEST4 */
        &Test4,                 /* TESTPT */
        &CmpU1,                 /* CMPU1*/
        &SideToInt,             /* CMPI1*/
        &SideToInt,             /* CMPU2*/
        &SideToInt,             /* CMPI2*/
        &CmpU4,                 /* CMPU4*/
        &CmpI4,                 /* CMPI4*/
        &CmpU4,                 /* CMPPT */
        &CmpFS,                 /* CMPFS */
        &CmpFD,                 /* CMPFD */
        &Move1,                 /* MOV1*/
        &Move2,                 /* MOV2*/
        &Move4,                 /* MOV4*/
        &Move4,                 /* MOVPT*/
        &MoveFS,                /* MOVFS*/
        &MoveFD,                /* MOVFD*/
        &MoveXX,                /* MOVX */
        &LoadA4,                /* LA*/
        &LoadA4,                /* LAPT*/
        &UnToInt,               /* NOT1 */
        &UnToInt,               /* NOT2 */
        &Not4,                  /* NOT4 */
        &UnToInt,               /* NEG1 */
        &UnToInt,               /* NEG2 */
        &Neg4,                  /* NEG4 */
        &NegFS,                 /* NEGFS */
        &NegFD,                 /* NEGFD */
        &Call,                  /* CALL*/
        &CallI,                 /* CALLI*/
        &Select,                /* SJUMP */
        &Parm,                  /* DPARM*/
        &Cvt,                   /* CVT*/
        &DoNop,                 /* DONOTHING*/
        NULL };                 /* BAD*/

extern  opcode_entry    *OpcodeTable( table_def i ) {
/****************************************************
    return the address of the appropriate generate table given an index "i"
*/

    return( OpcodeList[ i ] );
}

⌨️ 快捷键说明

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