386rgtbl.c

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

C
1,144
字号
/****************************************************************************
*
*                            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"
#include "procdef.h"

extern  int             Max87Stk;
extern  proc_def        *CurrProc;

/* 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

static  hw_reg_set      Reg64Order[] = {
                HW_D_1( HW_EAX ),
                HW_D_1( HW_EBX ),
                HW_D_1( HW_ESI ),
                HW_D_1( HW_EDI ),
                HW_D_1( HW_EDX ),
                HW_D_1( HW_ECX ),
                HW_D_1( HW_BP ),
                HW_D_1( HW_SP ),
                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      EAXReg[] = {
                HW_D_1( HW_EAX ),
                HW_D_1( HW_EMPTY ) };
static  hw_reg_set      ECXReg[] = {
                HW_D_1( HW_ECX ),
                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      EDXReg[] = {
                HW_D_1( HW_EDX ),
                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      DXEAXReg[] = {
                HW_D_2( HW_DX, HW_EAX ),
                HW_D_1( HW_EMPTY ) };
static  hw_reg_set      EDXEAXReg[] = {
                HW_D_2( HW_EDX, HW_EAX ),
                HW_D_1( HW_EMPTY ) };
static  hw_reg_set      FPParm2Reg[] = {
                HW_D_1( HW_EMPTY ),         /* filled in by InitRegTbl */
                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      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_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_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      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       FarPointerRegs[] = {

                HW_D_2( HW_DX, HW_EAX ),
                HW_D_2( HW_CX, HW_EBX ),
                HW_D_2( HW_CX, HW_EAX ),
                HW_D_2( HW_CX, HW_ESI ),
                HW_D_2( HW_DX, HW_EBX ),
                HW_D_2( HW_DI, HW_EAX ),
                HW_D_2( HW_CX, HW_EDI ),
                HW_D_2( HW_DX, HW_ESI ),
                HW_D_2( HW_DI, HW_EBX ),
                HW_D_2( HW_SI, HW_EAX ),
                HW_D_2( HW_CX, HW_EDX ),
                HW_D_2( HW_DX, HW_EDI ),
                HW_D_2( HW_DI, HW_ESI ),
                HW_D_2( HW_SI, HW_EBX ),
                HW_D_2( HW_BX, HW_EAX ),

                HW_D_2( HW_DS, HW_EAX ),
                HW_D_2( HW_DS, HW_EDX ),
                HW_D_2( HW_DS, HW_EBX ),
                HW_D_2( HW_DS, HW_ECX ),
                HW_D_2( HW_DS, HW_ESI ),
                HW_D_2( HW_DS, HW_EDI ),
                HW_D_2( HW_DS, HW_BP ),

                HW_D_2( HW_ES, HW_EAX ),
                HW_D_2( HW_ES, HW_EDX ),
                HW_D_2( HW_ES, HW_EBX ),
                HW_D_2( HW_ES, HW_ECX ),
                HW_D_2( HW_ES, HW_ESI ),
                HW_D_2( HW_ES, HW_EDI ),
                HW_D_2( HW_ES, HW_BP ),

                HW_D_2( HW_FS, HW_EAX ),
                HW_D_2( HW_FS, HW_EDX ),
                HW_D_2( HW_FS, HW_EBX ),
                HW_D_2( HW_FS, HW_ECX ),
                HW_D_2( HW_FS, HW_ESI ),
                HW_D_2( HW_FS, HW_EDI ),
                HW_D_2( HW_FS, HW_BP ),

                HW_D_2( HW_GS, HW_EAX ),
                HW_D_2( HW_GS, HW_EDX ),
                HW_D_2( HW_GS, HW_EBX ),
                HW_D_2( HW_GS, HW_ECX ),
                HW_D_2( HW_GS, HW_ESI ),
                HW_D_2( HW_GS, HW_EDI ),
                HW_D_2( HW_GS, HW_BP ),

                HW_D_2( HW_SS, HW_EAX ),
                HW_D_2( HW_SS, HW_EDX ),
                HW_D_2( HW_SS, HW_EBX ),
                HW_D_2( HW_SS, HW_ECX ),
                HW_D_2( HW_SS, HW_ESI ),
                HW_D_2( HW_SS, HW_EDI ),
                HW_D_2( HW_SS, HW_BP ),

                HW_D_1( HW_EMPTY ) };
static  hw_reg_set      LongIndexRegs[] = {
                HW_D_2( HW_DS, HW_EAX ),
                HW_D_2( HW_DS, HW_EDX ),
                HW_D_2( HW_DS, HW_EBX ),
                HW_D_2( HW_DS, HW_ECX ),
                HW_D_2( HW_DS, HW_ESI ),
                HW_D_2( HW_DS, HW_EDI ),
                HW_D_2( HW_DS, HW_BP ),

                HW_D_2( HW_ES, HW_EAX ),
                HW_D_2( HW_ES, HW_EDX ),
                HW_D_2( HW_ES, HW_EBX ),
                HW_D_2( HW_ES, HW_ECX ),
                HW_D_2( HW_ES, HW_ESI ),
                HW_D_2( HW_ES, HW_EDI ),
                HW_D_2( HW_ES, HW_BP ),

                HW_D_2( HW_FS, HW_EAX ),
                HW_D_2( HW_FS, HW_EDX ),
                HW_D_2( HW_FS, HW_EBX ),
                HW_D_2( HW_FS, HW_ECX ),
                HW_D_2( HW_FS, HW_ESI ),
                HW_D_2( HW_FS, HW_EDI ),
                HW_D_2( HW_FS, HW_BP ),

                HW_D_2( HW_GS, HW_EAX ),
                HW_D_2( HW_GS, HW_EDX ),
                HW_D_2( HW_GS, HW_EBX ),
                HW_D_2( HW_GS, HW_ECX ),
                HW_D_2( HW_GS, HW_ESI ),
                HW_D_2( HW_GS, HW_EDI ),
                HW_D_2( HW_GS, HW_BP ),

                HW_D_2( HW_SS, HW_EAX ),
                HW_D_2( HW_SS, HW_EDX ),
                HW_D_2( HW_SS, HW_EBX ),
                HW_D_2( HW_SS, HW_ECX ),
                HW_D_2( HW_SS, HW_ESI ),
                HW_D_2( HW_SS, HW_EDI ),
                HW_D_2( HW_SS, HW_BP ),

                HW_D_2( HW_CS, HW_EAX ),
                HW_D_2( HW_CS, HW_EDX ),
                HW_D_2( HW_CS, HW_EBX ),
                HW_D_2( HW_CS, HW_ECX ),
                HW_D_2( HW_CS, HW_ESI ),
                HW_D_2( HW_CS, HW_EDI ),
                HW_D_2( HW_CS, HW_BP ),

                HW_D_1( HW_EMPTY ) };
static  hw_reg_set      ABCDRegs[] = {
                HW_D_1( HW_EAX ),
                HW_D_1( HW_EDX ),
                HW_D_1( HW_EBX ),
                HW_D_1( HW_ECX ),
                HW_D_1( HW_EMPTY ) };
static  hw_reg_set      DoubleRegs[] = {
                HW_D_1( HW_EAX ),
                HW_D_1( HW_EDX ),
                HW_D_1( HW_ECX ),
                HW_D_1( HW_EBX ),
                HW_D_1( HW_ESI ),
                HW_D_1( HW_EDI ),
                HW_D_1( HW_BP ),
                HW_D_1( HW_SP ),
                HW_D_1( HW_EMPTY ) };
static  hw_reg_set      DoubleParmRegs[] = {
                HW_D_1( HW_EAX ),
                HW_D_1( HW_EDX ),
                HW_D_1( HW_EBX ),
                HW_D_1( HW_ECX ),
                HW_D_1( HW_ESI ),
                HW_D_1( HW_EDI ),
                HW_D_1( HW_BP ),
                HW_D_1( HW_SP ),
                HW_D_1( HW_EMPTY ) };
static  hw_reg_set      QuadReg[] = {
                HW_D_2( HW_EDX, HW_EAX ),
                HW_D_2( HW_ECX, HW_EBX ),
                HW_D_2( HW_ECX, HW_EAX ),
                HW_D_2( HW_ECX, HW_ESI ),
                HW_D_2( HW_EDX, HW_EBX ),
                HW_D_2( HW_EDI, HW_EAX ),
                HW_D_2( HW_ECX, HW_EDI ),
                HW_D_2( HW_EDX, HW_ESI ),
                HW_D_2( HW_EDI, HW_EBX ),
                HW_D_2( HW_ESI, HW_EAX ),
                HW_D_2( HW_ECX, HW_EDX ),
                HW_D_2( HW_EDX, HW_EDI ),
                HW_D_2( HW_EDI, HW_ESI ),
                HW_D_2( HW_ESI, HW_EBX ),
                HW_D_2( HW_EBX, HW_EAX ),
                HW_D_2( HW_BP,  HW_EAX ),
                HW_D_2( HW_BP,  HW_EDX ),
                HW_D_2( HW_BP,  HW_EBX ),
                HW_D_2( HW_BP,  HW_ECX ),
                HW_D_2( HW_BP,  HW_ESI ),
                HW_D_2( HW_BP,  HW_EDI ),
                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 ) };

reg_list        *RegSets[] = {
/*****************************
    define the possible register lists
*/
        #undef RL
        #define RL(a,b,c,d) a
        #include "rl.h"
        NULL
};

op_regs RegList[] = {
/********************
    define the possible combinations of register lists for operands/results
*/
        #undef RG
        #define RG( a,b,c,d,e,f ) a,b,c,d,e
        #include "rg.h"
        RL_
};

static  reg_set_index   ClassSets[] = {
/**************************************
       define the class set associated with a given register set
       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_DOUBLE,              /* U4*/
        RL_DX_AX,               /* I4*//* for IDIV instructions */
        RL_8,                   /* U8*/
        RL_8,                   /* I8*/
        RL_FAR_POINTER,         /* CP*/
        RL_,                    /* PT*/
        RL_,                    /* FS*/
        RL_8,                   /* FD*/
        RL_8,                   /* FL*/ // FIXME - long double
        RL_ };                  /* XX*/

static  reg_list        *ParmSets[] = {
/**************************************
    define the set of register that a parameter of a given class could use
*/
        &ByteRegs,              /* U1*/
        &ByteRegs,              /* I1*/
        &WordRegs,              /* U2*/
        &WordRegs,              /* I2*/
        &DoubleParmRegs,        /* U4*/
        &DoubleParmRegs,        /* I4*/
        &QuadReg,               /* U8*/

⌨️ 快捷键说明

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