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