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 + -
显示快捷键?