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