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