axptable.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 449 行 · 第 1/2 页
C
449 行
opcode_entry Push[] = {
/************************/
/* op1 op2 res verify gen reg fu */
_Un( ANY, ANY, NONE ), V_NO, R_PUSHTOMOV, RG_DWORD, FU_NO,
};
opcode_entry Pop[] = {
/***********************/
/* 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( R, R, NONE ), V_NO, G_UNARY, RG_QWORD, FU_ALU,
_Un( C|M, ANY, NONE ), V_NO, R_MOVOP1TEMP, RG_QWORD, FU_NO,
_Un( ANY, M, NONE ), V_NO, R_MOVRESTEMP, RG_QWORD, FU_NO,
_Un( ANY, ANY, NONE ), V_NO, G_UNKNOWN, RG_QWORD_NEED, 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,
};
opcode_entry Cmp8[] = {
/************************/
/* op1 op2 verify gen reg fu*/
_Side( R, R ), V_NO, R_SIMPCMP, RG_QWORD,FU_NO,
_Side( R, C ), V_OP2ZERO, G_CONDBR, RG_QWORD,FU_NO,
_Side( R, C ), V_NO, R_SIMPCMP, RG_QWORD,FU_NO,
_Side( C, C ), V_NO, R_MOVOP1TEMP, RG_QWORD,FU_NO,
_Side( C, R ), V_NO, R_SWAPCMP, RG_QWORD,FU_NO,
_Side( M, ANY ), V_NO, R_MOVOP1REG, RG_QWORD,FU_NO,
_Side( ANY, M ), V_NO, R_MOVOP2REG, RG_QWORD,FU_NO,
_Side( ANY, ANY ), V_NO, G_UNKNOWN, RG_QWORD_NEED,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[] = {
/************************************/
/**/
_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 */
Un1, /* UN1 */
Un2, /* UN2 */
Un4, /* UN4 */
Un8, /* UN8 */
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 */
StubBinary, /* CMP4 */
Cmp8, /* CMP8 */
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 + -
显示快捷键?