s37rgtbl.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 701 行 · 第 1/2 页
C
701 行
/****************************************************************************
*
* 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 "procdef.h"
#include "model.h"
#include "s37rgtbl.def"
extern proc_def *CurrProc;
static hw_reg_set Empty[] = {
EMPTY };
static hw_reg_set G0Reg[] = {
HW_D_1( HW_G0 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set Y0Reg[] = {
HW_D_1( HW_Y0 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set D0Reg[] = {
HW_D_1( HW_D0 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set G11Reg[] = {
HW_D_1( HW_G11 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set G15Reg[] = {
HW_D_1( HW_G15 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set WordRegs[] = {
HW_D_1( HW_G0 ),
HW_D_1( HW_G1 ),
HW_D_1( HW_G2 ),
HW_D_1( HW_G3 ),
HW_D_1( HW_G4 ),
HW_D_1( HW_G5 ),
HW_D_1( HW_G6 ),
HW_D_1( HW_G7 ),
HW_D_1( HW_G8 ),
HW_D_1( HW_G9 ),
HW_D_1( HW_G10 ),
HW_D_1( HW_G11 ),
HW_D_1( HW_G12 ),
HW_D_1( HW_G13 ),
HW_D_1( HW_G14 ),
HW_D_1( HW_G15 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set IndexRegs[] = {
HW_D_1( HW_G1 ),
HW_D_1( HW_G2 ),
HW_D_1( HW_G3 ),
HW_D_1( HW_G4 ),
HW_D_1( HW_G5 ),
HW_D_1( HW_G6 ),
HW_D_1( HW_G7 ),
HW_D_1( HW_G8 ),
HW_D_1( HW_G9 ),
HW_D_1( HW_G10 ),
HW_D_1( HW_G11 ),
HW_D_1( HW_G12 ),
HW_D_1( HW_G13 ),
HW_D_1( HW_G14 ),
HW_D_1( HW_G15 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set PairRegs[] = {
HW_D_2( HW_G0,HW_G1 ),
HW_D_2( HW_G2,HW_G3 ),
HW_D_2( HW_G4,HW_G5 ),
HW_D_2( HW_G6,HW_G7 ),
HW_D_2( HW_G8,HW_G9 ),
HW_D_2( HW_G10,HW_G11 ),
HW_D_2( HW_G12,HW_G13 ),
HW_D_2( HW_G14,HW_G15 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set TwoPairRegs[] = {
HW_D_4( HW_G0 ,HW_G1 , HW_G2 ,HW_G3 ),
HW_D_4( HW_G0 ,HW_G1 , HW_G4 ,HW_G5 ),
HW_D_4( HW_G0 ,HW_G1 , HW_G6 ,HW_G7 ),
HW_D_4( HW_G0 ,HW_G1 , HW_G8 ,HW_G9 ),
HW_D_4( HW_G0 ,HW_G1 , HW_G10,HW_G11 ),
HW_D_4( HW_G0 ,HW_G1 , HW_G12,HW_G13 ),
HW_D_4( HW_G0 ,HW_G1 , HW_G14,HW_G15 ),
HW_D_4( HW_G2 ,HW_G3 , HW_G4 ,HW_G5 ),
HW_D_4( HW_G2 ,HW_G3 , HW_G6 ,HW_G7 ),
HW_D_4( HW_G2 ,HW_G3 , HW_G8 ,HW_G9 ),
HW_D_4( HW_G2 ,HW_G3 , HW_G10,HW_G11 ),
HW_D_4( HW_G2 ,HW_G3 , HW_G12,HW_G13 ),
HW_D_4( HW_G2 ,HW_G3 , HW_G14,HW_G15 ),
HW_D_4( HW_G4 ,HW_G5 , HW_G6 ,HW_G7 ),
HW_D_4( HW_G4 ,HW_G5 , HW_G8 ,HW_G9 ),
HW_D_4( HW_G4 ,HW_G5 , HW_G10,HW_G11 ),
HW_D_4( HW_G4 ,HW_G5 , HW_G12,HW_G13 ),
HW_D_4( HW_G4 ,HW_G5 , HW_G14,HW_G15 ),
HW_D_4( HW_G6 ,HW_G7 , HW_G8 ,HW_G9 ),
HW_D_4( HW_G6 ,HW_G7 , HW_G10,HW_G11 ),
HW_D_4( HW_G6 ,HW_G7 , HW_G12,HW_G13 ),
HW_D_4( HW_G6 ,HW_G7 , HW_G14,HW_G15 ),
HW_D_4( HW_G8 ,HW_G9 , HW_G10,HW_G11 ),
HW_D_4( HW_G8 ,HW_G9 , HW_G12,HW_G13 ),
HW_D_4( HW_G8 ,HW_G9 , HW_G14,HW_G15 ),
HW_D_4( HW_G10,HW_G11 , HW_G12,HW_G13 ),
HW_D_4( HW_G10,HW_G11 , HW_G14,HW_G15 ),
HW_D_4( HW_G12,HW_G13 , HW_G14,HW_G15 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set SingleRegs[] = {
HW_D_1( HW_Y0 ),
HW_D_1( HW_Y2 ),
HW_D_1( HW_Y4 ),
HW_D_1( HW_Y6 ),
HW_D_1( HW_EMPTY ) };
static hw_reg_set DoubleRegs[] = {
HW_D_1( HW_D0 ),
HW_D_1( HW_D2 ),
HW_D_1( HW_D4 ),
HW_D_1( HW_D6 ),
HW_D_1( HW_EMPTY ) };
reg_list *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_, /* U1*/
RL_, /* I1*/
RL_, /* U2*/
RL_, /* I2*//*(put segs here so their size is OK)*/
RL_WORD, /* U4*/
RL_WORD, /* I4*//* for IDIV instructions */
RL_, /* CP*/
RL_WORD, /* PT*/
RL_SINGLE, /* FS*/
RL_DOUBLE, /* FD*/
RL_PAIR }; /* XX*/
static reg_set_index IsSets[] = {
RL_, /* U1*/
RL_, /* I1*/
RL_, /* U2*/
RL_, /* I2*/
RL_WORD, /* U4*/
RL_WORD, /* I4*/
RL_, /* CP*/
RL_WORD, /* PT*/
RL_SINGLE, /* FS*/
RL_DOUBLE, /* FD*/
RL_ }; /* XX*/
static reg_set_index ReturnSets[] = {
RL_G11, /* U1*/
RL_G11, /* I1*/
RL_G11, /* U2*/
RL_G11, /* I2*/
RL_G11, /* U4*/
RL_G11, /* I4*/
RL_, /* CP*/
RL_G11, /* PT*/
RL_, /* FS*/
RL_, /* FD*/
RL_ }; /* XX*/
static reg_set_index OSReturnSets[] = {
RL_G15, /* U1*/
RL_G15, /* I1*/
RL_G15, /* U2*/
RL_G15, /* I2*/
RL_G15, /* U4*/
RL_G15, /* I4*/
RL_, /* CP*/
RL_G15, /* PT*/
RL_Y0, /* FS*/
RL_D0, /* FD*/
RL_ }; /* XX*/
static reg_set_index IndexSets[] = {
RL_, /* U1*/
RL_, /* I1*/
RL_, /* U2*/
RL_, /* I2*/
RL_INDEX, /* U4*/
RL_, /* I4*/
RL_, /* CP*/
RL_INDEX, /* PT*/
RL_, /* FS*/
RL_, /* FD*/
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 {
FOUR_BYTE,
EIGHT_BYTE,
SINGLE,
DOUBLE,
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, /* FOUR_BYTE */
1, /* EIGHT_BYTE*/
2, /* SINGLE */
2, /* DOUBLE */
0}; /* OTHER */
static reg_set_index FourByteInter[] = {
/*RL_G0 RL_G11 RL_INDEX RL_WORD RL_G15*/
RL_G0, RL_, RL_, RL_G0, RL_, /*RL_G0*/
RL_, RL_G11, RL_G11, RL_G11, RL_, /*RL_G11*/
RL_, RL_G11, RL_INDEX, RL_INDEX, RL_G15, /*RL_INDEX*/
RL_G0, RL_G11, RL_INDEX, RL_WORD, RL_G15, /*RL_WORD*/
RL_, RL_, RL_G15, RL_G15, RL_G15 /*RL_G15*/
};
static reg_set_index EightByteInter[] = {
RL_PAIR
};
static reg_set_index SingleInter[] = {
/* RL_SINGLE RL_Y0 */
RL_SINGLE, RL_Y0, /* RL_SINGLE */
RL_Y0, RL_Y0 /* RL_Y0 */
};
static reg_set_index DoubleInter[] = {
/* RL_DOUBLE RL_D0 */
RL_DOUBLE, RL_D0, /* RL_DOUBLE */
RL_D0, RL_D0 /* RL_D0 */
};
static reg_set_index OtherInter[] = {
RL_
};
static reg_set_index *InterTable[] = {
&FourByteInter, /* FOUR_BYTE */
&EightByteInter, /* EIGHT_BYTE*/
&SingleInter, /* SINGLE */
&DoubleInter, /* DOUBLE */
&OtherInter}; /* OTHERS */
extern void InitRegTbl() {
/************************************/
}
extern reg_set_index RegIntersect( reg_set_index s1, reg_set_index s2 ) {
/**************************************************************************/
reg_class *set1;
reg_class *set2;
intersect_class class;
reg_set_index result;
set1 = & IntersectInfo[ s1 ];
set2 = & IntersectInfo[ s2 ];
class = set1->class;
if( class == set2->class ) {
result = InterTable[ class ]
[ set1->index * Width[ class ] + set2->index ];
} else if( s1 == RL_NUMBER_OF_SETS ) {
result = s2;
} else if( s2 == RL_NUMBER_OF_SETS ) {
result = s1;
} else {
result = RL_;
}
return( result );
}
extern reg_list *ParmChoices( type_class_def class ) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?