i86rgtbl.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 947 行 · 第 1/2 页
C
947 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#include "standard.h"
#include "coderep.h"
#include "regset.h"
#include "model.h"
extern int Max87Stk;
/* some short forms*/
#define RL_DP RL_DBL_OR_PTR
#define RL_WS RL_ANYWORD
#define RL_2B RL_TWOBYTE
#define RL_IX RL_INDEX
#define RL_TI RL_TEMP_INDEX
#define RL_WD RL_WORD
#define RL_SG RL_SEG
#define HW_SEG (HW_DS + HW_ES + HW_SS + HW_CS + HW_FS + HW_GS)
#define HW_D1 (HW_DX + HW_AX); /* double register on*/
#define HW_D2 (HW_CX + HW_BX); /* double register tw*/
/* Note : 32 bit registers are composed of two 16 bit registers*/
/* Each 16 bit register is used only as a high or a low register,*/
/* never both. Index register never high.*/
/**/
/* High Low*/
/* CS,SS,ES,DS,CX,DX AX,BX,SI,DI*/
static hw_reg_set Reg32Order[] = {
HW_D_1( HW_AX ),
HW_D_1( HW_BX ),
HW_D_1( HW_SI ),
HW_D_1( HW_DI ),
HW_D_1( HW_DX ),
HW_D_1( HW_CX ),
HW_D_1( HW_SP ),
HW_D_1( HW_BP ),
HW_D_1( HW_SEGS ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set Empty[] = {
HW_D_1( HW_EMPTY ) };
static hw_reg_set ALReg[] = {
HW_D_1( HW_AL ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set AHReg[] = {
HW_D_1( HW_AH ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set AXReg[] = {
HW_D_1( HW_AX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set CLReg[] = {
HW_D_1( HW_CL ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set CXReg[] = {
HW_D_1( HW_CX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set DXReg[] = {
HW_D_1( HW_DX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set DXAXReg[] = {
HW_D_2( HW_DX, HW_AX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set CXBXReg[] = {
HW_D_2( HW_CX, HW_BX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set ESBXReg[] = {
HW_D_2( HW_ES, HW_BX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set ByteRegs[] = {
HW_D_1( HW_AL ),
HW_D_1( HW_AH ),
HW_D_1( HW_DL ),
HW_D_1( HW_DH ),
HW_D_1( HW_BL ),
HW_D_1( HW_BH ),
HW_D_1( HW_CL ),
HW_D_1( HW_CH ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set LowByteRegs[] = {
HW_D_1( HW_AL ),
HW_D_1( HW_DL ),
HW_D_1( HW_BL ),
HW_D_1( HW_CL ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set WordOrSegReg[] = {
HW_D_1( HW_AX ),
HW_D_1( HW_DX ),
HW_D_1( HW_BX ),
HW_D_1( HW_CX ),
HW_D_1( HW_SI ),
HW_D_1( HW_DI ),
HW_D_1( HW_BP ),
HW_D_1( HW_SP ),
HW_D_1( HW_DS ),
HW_D_1( HW_ES ),
HW_D_1( HW_FS ),
HW_D_1( HW_GS ),
HW_D_1( HW_CS ),
HW_D_1( HW_SS ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set WordRegs[] = {
HW_D_1( HW_AX ),
HW_D_1( HW_DX ),
HW_D_1( HW_BX ),
HW_D_1( HW_CX ),
HW_D_1( HW_SI ),
HW_D_1( HW_DI ),
HW_D_1( HW_BP ),
HW_D_1( HW_SP ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set TwoByteRegs[] = {
HW_D_1( HW_AX ),
HW_D_1( HW_DX ),
HW_D_1( HW_BX ),
HW_D_1( HW_CX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set IndexRegs[] = {
HW_D_1( HW_BX ),
HW_D_1( HW_SI ),
HW_D_1( HW_DI ),
HW_D_1( HW_BP ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set SegRegs[] = {
HW_D_1( HW_DS ),
HW_D_1( HW_ES ),
HW_D_1( HW_FS ),
HW_D_1( HW_GS ),
HW_D_1( HW_CS ),
HW_D_1( HW_SS ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set LongIndexRegs[] = {
HW_D_2( HW_DS, HW_SI ),
HW_D_2( HW_DS, HW_DI ),
HW_D_2( HW_DS, HW_BX ),
HW_D_2( HW_ES, HW_DI ),
HW_D_2( HW_ES, HW_SI ),
HW_D_2( HW_ES, HW_BX ),
HW_D_2( HW_FS, HW_DI ),
HW_D_2( HW_FS, HW_SI ),
HW_D_2( HW_FS, HW_BX ),
HW_D_2( HW_GS, HW_DI ),
HW_D_2( HW_GS, HW_SI ),
HW_D_2( HW_GS, HW_BX ),
HW_D_2( HW_SS, HW_DI ),
HW_D_2( HW_SS, HW_SI ),
HW_D_2( HW_SS, HW_BX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set DoubleRegs[] = {
HW_D_2( HW_DX, HW_AX ),
HW_D_2( HW_CX, HW_BX ),
HW_D_2( HW_CX, HW_AX ),
HW_D_2( HW_CX, HW_SI ),
HW_D_2( HW_DX, HW_BX ),
HW_D_2( HW_DI, HW_AX ),
HW_D_2( HW_CX, HW_DI ),
HW_D_2( HW_DX, HW_SI ),
HW_D_2( HW_DI, HW_BX ),
HW_D_2( HW_SI, HW_AX ),
HW_D_2( HW_CX, HW_DX ),
HW_D_2( HW_DX, HW_DI ),
HW_D_2( HW_DI, HW_SI ),
HW_D_2( HW_SI, HW_BX ),
HW_D_2( HW_BX, HW_AX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set DblPtrRegs[] = {
HW_D_2( HW_DX, HW_AX ),
HW_D_2( HW_CX, HW_BX ),
HW_D_2( HW_CX, HW_AX ),
HW_D_2( HW_CX, HW_SI ),
HW_D_2( HW_DX, HW_BX ),
HW_D_2( HW_DI, HW_AX ),
HW_D_2( HW_CX, HW_DI ),
HW_D_2( HW_DX, HW_SI ),
HW_D_2( HW_DI, HW_BX ),
HW_D_2( HW_SI, HW_AX ),
HW_D_2( HW_CX, HW_DX ),
HW_D_2( HW_DX, HW_DI ),
HW_D_2( HW_DI, HW_SI ),
HW_D_2( HW_SI, HW_BX ),
HW_D_2( HW_BX, HW_AX ),
HW_D_2( HW_DS, HW_CX ),
HW_D_2( HW_DS, HW_DX ),
HW_D_2( HW_DS, HW_DI ),
HW_D_2( HW_DS, HW_SI ),
HW_D_2( HW_DS, HW_BX ),
HW_D_2( HW_DS, HW_AX ),
HW_D_2( HW_ES, HW_CX ),
HW_D_2( HW_ES, HW_DX ),
HW_D_2( HW_ES, HW_DI ),
HW_D_2( HW_ES, HW_SI ),
HW_D_2( HW_ES, HW_BX ),
HW_D_2( HW_ES, HW_AX ),
HW_D_2( HW_FS, HW_CX ),
HW_D_2( HW_FS, HW_DX ),
HW_D_2( HW_FS, HW_DI ),
HW_D_2( HW_FS, HW_SI ),
HW_D_2( HW_FS, HW_BX ),
HW_D_2( HW_FS, HW_AX ),
HW_D_2( HW_GS, HW_CX ),
HW_D_2( HW_GS, HW_DX ),
HW_D_2( HW_GS, HW_DI ),
HW_D_2( HW_GS, HW_SI ),
HW_D_2( HW_GS, HW_BX ),
HW_D_2( HW_GS, HW_AX ),
HW_D_2( HW_SS, HW_CX ),
HW_D_2( HW_SS, HW_DX ),
HW_D_2( HW_SS, HW_DI ),
HW_D_2( HW_SS, HW_SI ),
HW_D_2( HW_SS, HW_BX ),
HW_D_2( HW_SS, HW_AX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set QuadReg[] = {
HW_D_4( HW_AX, HW_BX, HW_CX, HW_DX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set TempIndex[] = {
HW_D_1( HW_SI ),
HW_D_1( HW_DI ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set ST0Reg[] = {
HW_D_1( HW_ST0 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set STIReg[] = {
HW_D_1( HW_ST1 ),
HW_D_1( HW_ST2 ),
HW_D_1( HW_ST3 ),
HW_D_1( HW_ST4 ),
HW_D_1( HW_ST5 ),
HW_D_1( HW_ST6 ),
HW_D_1( HW_ST7 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set STParmReg[] = {
HW_D_1( HW_ST1 ),
HW_D_1( HW_ST2 ),
HW_D_1( HW_ST3 ),
HW_D_1( HW_ST4 ),
HW_D_1( HW_ST5 ),
HW_D_1( HW_ST6 ),
HW_D_1( HW_ST7 ),
HW_D_1( HW_EMPTY ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set EEch[] = {
HW_D_3( HW_DX, HW_AX, HW_CX ),
HW_D_3( HW_DX, HW_BX, HW_CX ),
HW_D_3( HW_DI, HW_AX, HW_CX ),
HW_D_3( HW_DX, HW_SI, HW_CX ),
HW_D_3( HW_DI, HW_BX, HW_CX ),
HW_D_3( HW_SI, HW_AX, HW_CX ),
HW_D_3( HW_DX, HW_DI, HW_CX ),
HW_D_3( HW_DI, HW_SI, HW_CX ),
HW_D_3( HW_SI, HW_BX, HW_CX ),
HW_D_3( HW_BX, HW_AX, HW_CX ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set DXCLReg[] = {
HW_D_2( HW_DX, HW_CL ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set AHCLReg[] = {
HW_D_2( HW_AH, HW_CL ),
HW_D_1( HW_EMPTY ) };
hw_reg_set *RegSets[] = {
#undef RL
#define RL(a,b,c,d) a
#include "rl.h"
NULL
};
op_regs RegList[] = {
#undef RG
#define RG( a,b,c,d,e,f ) {a,b,c,d,e}
#include "rg.h"
{RL_}
};
static reg_set_index ClassSets[] = {
/* RL_ indicates that the class is already identified*/
/* (e.g. I1 already identified as U1*/
/**/
RL_BYTE, /* U1*/
RL_, /* I1*/
RL_WORD, /* U2*/
RL_SEG, /* I2 (put segs here so their size is OK)*/
RL_DBL_OR_PTR, /* U4*/
RL_, /* I4*/
RL_8, /* U8*/
RL_, /* I8*/
RL_, /* CP*/
RL_, /* PT*/
RL_, /* FS*/
RL_8, /* FD*/
RL_, /* FL*/
RL_ }; /* XX*/
static hw_reg_set *ParmSets[] = {
ByteRegs, /* U1*/
ByteRegs, /* I1*/
WordRegs, /* U2*/
WordRegs, /* I2*/
DoubleRegs, /* U4*/
DoubleRegs, /* I4*/
QuadReg, /* U8*/
QuadReg, /* I8*/
DblPtrRegs, /* CP*/
DblPtrRegs, /* PT*/
DoubleRegs, /* FS*/
QuadReg, /* FD*/
QuadReg, /* FL*/
Empty }; /* XX*/
static hw_reg_set *ParmSets8087[] = {
ByteRegs, /* U1*/
ByteRegs, /* I1*/
WordRegs, /* U2*/
WordRegs, /* I2*/
DoubleRegs, /* U4*/
DoubleRegs, /* I4*/
QuadReg, /* U8*/
QuadReg, /* I8*/
DblPtrRegs, /* CP*/
DblPtrRegs, /* PT*/
STParmReg, /* FS*/
STParmReg, /* FD*/
STParmReg, /* FL*/
Empty }; /* XX*/
static reg_set_index IsSets[] = {
RL_BYTE, /* U1*/
RL_BYTE, /* I1*/
RL_WORD, /* U2*/
RL_WORD, /* I2*/
RL_DOUBLE, /* U4*/
RL_DOUBLE, /* I4*/
RL_DOUBLE, /* U8*/
RL_DOUBLE, /* I8*/
RL_DBL_OR_PTR, /* CP*/
RL_DBL_OR_PTR, /* PT*/
RL_DOUBLE, /* FS*/
RL_8, /* FD*/
RL_8, /* FL*/
RL_ }; /* XX*/
static reg_set_index ReturnSets[] = {
RL_AL, /* U1*/
RL_AL, /* I1*/
RL_AX, /* U2*/
RL_AX, /* I2*/
RL_DX_AX, /* U4*/
RL_DX_AX, /* I4*/
RL_8, /* U8*/
RL_8, /* I8*/
RL_DX_AX, /* CP*/
RL_DX_AX, /* PT*/
RL_DX_AX, /* FS*/
RL_8, /* FD*/
RL_8, /* FL*/
RL_ }; /* XX*/
static reg_set_index Return8087[] = {
RL_AL, /* U1*/
RL_AL, /* I1*/
RL_AX, /* U2*/
RL_AX, /* I2*/
RL_DX_AX, /* U4*/
RL_DX_AX, /* I4*/
RL_8, /* U8*/
RL_8, /* I8*/
RL_DX_AX, /* CP*/
RL_DX_AX, /* PT*/
RL_ST0, /* FS*/
RL_ST0, /* FD*/
RL_ST0, /* FL*/
RL_ }; /* XX*/
static reg_set_index IndexSets[] = {
RL_, /* U1*/
RL_, /* I1*/
RL_INDEX, /* U2*/
RL_INDEX, /* I2*/
RL_, /* U4*/
RL_, /* I4*/
RL_, /* U8*/
RL_, /* I8*/
RL_LONG_INDEX, /* CP*/
RL_LONG_INDEX, /* PT*/
RL_, /* FS*/
RL_, /* FD*/
RL_, /* FL*/
RL_ }; /* XX*/
/* Information for register set intersections*/
/* if sets are of different classes*/
/* intersection is empty*/
/* } else {*/
/* intersection given in square matrix for class*/
/* }*/
typedef enum {
ONE_BYTE,
TWO_BYTE,
FOUR_BYTE,
EIGHT_BYTE,
FLOATING,
OTHER
} intersect_class;
typedef struct reg_class {
intersect_class class;
byte index;
} reg_class;
static reg_class IntersectInfo[] = {
#undef RL
#define RL(a,b,c,d) {c,d}
#include "rl.h"
{OTHER, 0} }; /* RL_NUMBER_OF_SETS*/
static byte Width[] = {
5, /* ONE_BYTE*/
9, /* TWO_BYTE*/
6, /* FOUR_BYTE*/
1, /* EIGHT_BYTE*/
2, /* FLOATING*/
0 }; /* OTHER*/
static reg_set_index OneByteInter[] = {
/* AL AH CL BYTE LOWBYTE*/
RL_AL, RL_, RL_, RL_AL, RL_AL, /* AL*/
RL_, RL_AH, RL_, RL_AH, RL_, /* AH*/
RL_, RL_, RL_CL, RL_CL, RL_CL, /* CL*/
RL_AL, RL_AH, RL_CL, RL_BYTE,RL_LOWBYTE, /* BYTE*/
RL_AL, RL_, RL_CL, RL_LOWBYTE,RL_LOWBYTE };/* LOWBYTE*/
/* short forms used in this table*/
/* - RL_WD == RL_WORD*/
/* - RL_IX == RL_INDEX*/
/* - RL_TI == RL_TEMP_INDEX*/
/* - RL_2B == RL_TWOBYTE*/
/* - RL_WS == RL_ANYWORD*/
/* - RL_SG == RL_SEG*/
static reg_set_index TwoByteInter[] = {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?