i86rgtbl.c

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

C
947
字号
/* AX   CX     DX     WD     2B     IX     SG     TI     WS*/
RL_AX, RL_,   RL_,   RL_AX, RL_AX, RL_,   RL_,   RL_,   RL_AX,  /* AX*/
RL_,   RL_CX, RL_,   RL_CX, RL_CX, RL_,   RL_,   RL_,   RL_CX,  /* CX*/
RL_,   RL_,   RL_DX, RL_DX, RL_DX, RL_,   RL_,   RL_,   RL_DX,  /* DX*/
RL_AX, RL_CX, RL_DX, RL_WD, RL_2B, RL_IX, RL_,   RL_TI, RL_WD,  /* WD*/
RL_AX, RL_CX, RL_CX, RL_2B, RL_2B, RL_,   RL_,   RL_,   RL_2B,  /* 2B*/
RL_,   RL_,   RL_,   RL_IX, RL_,   RL_IX, RL_,   RL_TI, RL_IX,  /* IX*/
RL_,   RL_,   RL_,   RL_,   RL_,   RL_,   RL_SG, RL_,   RL_SG,  /* SG*/
RL_,   RL_,   RL_,   RL_TI, RL_,   RL_TI, RL_,   RL_TI, RL_TI,  /* TI*/
RL_AX, RL_CX, RL_DX, RL_WD, RL_2B, RL_IX, RL_SG, RL_TI, RL_WS,  /* WS*/
RL_ };

static  reg_set_index   FourByteInter[] = {
/* DX_AX     ES_BX       CX_BX       LONG_INDEX  DOUBLE      DBL_OR_PTR*/
RL_DX_AX,   RL_,        RL_,        RL_,        RL_DX_AX,   RL_DX_AX,   /*DX_AX*/
RL_,        RL_ES_BX,   RL_,        RL_ES_BX,   RL_,        RL_ES_BX,   /*ES_BX*/
RL_,        RL_,        RL_CX_BX,   RL_,        RL_CX_BX,   RL_CX_BX,   /*CX_BX*/
RL_,        RL_ES_BX,   RL_,      RL_LONG_INDEX,RL_,      RL_LONG_INDEX,/*LINDEX*/
RL_DX_AX,   RL_,        RL_CX_BX,   RL_,        RL_DOUBLE,  RL_DOUBLE,  /*DOUBLE*/
RL_DX_AX,   RL_ES_BX,   RL_CX_BX, RL_LONG_INDEX,RL_DOUBLE,RL_DBL_OR_PTR /*DBLPTR*/
};


static  reg_set_index   EightByteInter[] = {
/*       RL_8*/
        RL_8 }; /* RL_8*/

static  reg_set_index   FloatingInter[] = {
/*       RL_ST0  RL_STI*/
        RL_ST0, RL_,      /*  RL_ST0*/
        RL_,    RL_STI }; /*  RL_STI*/

static  reg_set_index   OtherInter[] = {
        RL_ };

static  reg_set_index   *InterTable[] = {
        OneByteInter,          /* ONE_BYTE*/
        TwoByteInter,          /* TWO_BYTE*/
        FourByteInter,         /* FOUR_BYTE*/
        EightByteInter,        /* EIGHT_BYTE*/
        FloatingInter,         /* FLOATING*/
        OtherInter };          /* others*/

extern  void            InitRegTbl( void ) {
/************************************/

    if( _FPULevel( FPU_87 ) ) {
        HW_CAsgn( STParmReg[ Max87Stk ], HW_EMPTY );
    }
}


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  hw_reg_set        *ParmChoices( type_class_def class ) {
/************************************************************/

    hw_reg_set  *list;

    if( _FPULevel( FPU_87 ) ) {
        list = ParmSets8087[  class  ];
    } else {
        list = ParmSets[  class  ];
    }
    return( list );
}


extern  hw_reg_set      InLineParm( hw_reg_set regs, hw_reg_set used ) {
/**********************************************************************/

    if( HW_COvlap( regs, HW_FLTS ) ) {
        HW_CAsgn( regs, HW_EMPTY );
        if( HW_COvlap( used, HW_ST4 ) ) {
            /*regs = EMPTY;*/
        } else if( HW_COvlap( used, HW_ST3 ) ) {
            HW_CTurnOn( regs, HW_ST4 );
        } else if( HW_COvlap( used, HW_ST2 ) ) {
            HW_CTurnOn( regs, HW_ST3 );
        } else if( HW_COvlap( used, HW_ST1 ) ) {
            HW_CTurnOn( regs, HW_ST2 );
        } else {
            HW_CTurnOn( regs, HW_ST1 );
        }
    }
    return( regs );
}


extern  hw_reg_set      StructReg( void ) {
/***********************************/

    return( HW_SI );
}


extern  hw_reg_set      ReturnReg( type_class_def class, bool use_87 ) {
/**********************************************************************/

    hw_reg_set          *list;

    if( _FPULevel( FPU_87 ) && use_87 ) {
        list = RegSets[  Return8087[  class  ]  ];
    } else {
        list = RegSets[  ReturnSets[  class  ]  ];
    }
    return( *list );
}


extern  reg_set_index   SegIndex( void ) {
/**********************************/

    return( RL_SEG );
}


extern  reg_set_index   NoSegments( reg_set_index idx ) {
/*******************************************************/

    if( idx == RL_ANYWORD ) {
        idx = RL_WORD;
    }
    return( idx );
}


extern  reg_set_index   IndexIntersect( reg_set_index curr,
                                       type_class_def class,
                                       bool is_temp_index ) {
/***********************************************************/

    if( is_temp_index ) {
        curr = RegIntersect( curr, RL_TEMP_INDEX );
    } else {
        curr = RegIntersect( curr, IndexSets[  class  ] );
    }
    return( curr );
}


extern  bool    IsIndexReg( hw_reg_set reg, type_class_def class,
                            bool is_temp_index ) {
/************************************************/


    hw_reg_set  *list;

    if( is_temp_index ) {
        list = RegSets[  RL_TEMP_INDEX  ];
    } else {
        list = RegSets[  IndexSets[  class  ]  ];
    }
    while( !HW_CEqual( *list, HW_EMPTY ) ) {
        if( HW_Equal( *list, reg ) ) break;
        ++ list;
    }
    return( HW_Equal( *list, reg ) );
}


extern  type_class_def  RegClass( hw_reg_set regs ) {
/***************************************************/

    hw_reg_set          *possible;
    type_class_def      class;

    if( HW_COvlap( regs, HW_FLTS ) ) {
        if( HW_CEqual( regs, HW_ST0 ) ) return( FD );
        possible = STIReg;
        while( !HW_CEqual( *possible, HW_EMPTY ) ) {
            if( HW_Equal( regs, *possible ) ) return( FD );
            ++possible;
        }
        return( XX );
    } else {
        class = U1;
        for(;;) {
            possible = RegSets[  ClassSets[  class  ]  ];
            while( !HW_CEqual( *possible, HW_EMPTY ) ) {
                if( HW_Equal( *possible, regs ) ) return( class );
                ++ possible;
            }
            ++ class;
            if( class == XX ) break;
        }
    }
    return( class );
}


extern  bool    IndexRegOk( hw_reg_set reg, bool is_temp_index ) {
/****************************************************************/

    hw_reg_set  *list;

    if( RegClass( reg ) != U2 ) {
        list = RegSets[  RL_LONG_INDEX  ];
    } else if( is_temp_index ) {
        list = RegSets[  RL_TEMP_INDEX  ];
    } else {
        list = RegSets[  RL_INDEX  ];
    }
    while( !HW_CEqual( *list, HW_EMPTY ) ) {
        if( HW_Equal( *list, reg ) ) break;
        ++ list;
    }
    return( HW_Equal( *list, reg ) );
}


extern  bool    IsSegReg( hw_reg_set regs ) {
/*******************************************/

    hw_reg_set  tmp;

    tmp = regs;
    HW_COnlyOn( tmp, HW_SEGS );
    return( HW_Equal( tmp, regs ) );
}


extern  hw_reg_set      Low16Reg( hw_reg_set regs ) {
/***************************************************/

    HW_COnlyOn( regs, HW_AL_BL_CL_DL );
    return( regs );
}


extern  hw_reg_set      High16Reg( hw_reg_set regs ) {
/****************************************************/

    HW_COnlyOn( regs, HW_AH_BH_CH_DH );
    return( regs );
}


extern  hw_reg_set      Low32Reg( hw_reg_set regs ) {
/***************************************************/

    hw_reg_set  low;
    hw_reg_set  *order;

    if( HW_CEqual( regs, HW_EMPTY ) ) return( HW_EMPTY );
    order = Reg32Order;
    for(;;) {
        if( HW_Ovlap( *order, regs ) ) break;
        ++order;
    }
    low = regs;
    HW_OnlyOn( low, *order );
    if( HW_Equal( low, regs ) ) {
        HW_CAsgn( low, HW_EMPTY );
    }
    return( low );
}


extern  hw_reg_set      High32Reg( hw_reg_set regs ) {
/****************************************************/

    hw_reg_set  high;

    high = Low32Reg( regs );
    if( !HW_CEqual( high, HW_EMPTY ) ) {
        HW_TurnOff( regs, high );
        return( regs );
    }
    return( high );
}


extern  hw_reg_set      HighReg( hw_reg_set regs ) {
/**************************************************/

    hw_reg_set  high;

    if( HW_CEqual( regs, HW_ABCD ) ) {
        HW_CAsgn( high, HW_EMPTY );
    } else {
        high = High32Reg( regs );
        if( HW_CEqual( high, HW_EMPTY ) ) {
            high = High16Reg( regs );
            if( HW_Equal( high, regs ) ) {
                HW_CAsgn( high, HW_EMPTY );
            }
        }
    }
    return( high );
}


extern  hw_reg_set      HighOffsetReg( hw_reg_set regs ) {
/*******************************************************/

    return( HighReg( regs ) );
}

extern  hw_reg_set      HighTreePart( hw_reg_set regs ) {
/*******************************************************/

    return( HighReg( regs ) );
}

extern  hw_reg_set      LowReg( hw_reg_set regs ) {
/*************************************************/

    hw_reg_set  low;

    if( HW_CEqual( regs, HW_ABCD ) ) {
        HW_CAsgn( low, HW_EMPTY );
    } else {
        low = Low32Reg( regs );
        if( HW_CEqual( low, HW_EMPTY ) ) {
            low = Low16Reg( regs );
            if( HW_Equal( low, regs ) ) {
                HW_CAsgn( low, HW_EMPTY );
            }
        }
    }
    return( low );
}

extern  hw_reg_set      LowOffsetReg( hw_reg_set regs ) {
/*******************************************************/

    return( LowReg( regs ) );
}

extern  hw_reg_set      LowTreePart( hw_reg_set regs ) {
/*******************************************************/

    return( LowReg( regs ) );
}

extern  hw_reg_set      FullReg( hw_reg_set regs ) {
/****************************************************/

    if( HW_COvlap( regs, HW_AX ) ) {
        HW_CTurnOn( regs, HW_AX );
    }
    if( HW_COvlap( regs, HW_BX ) ) {
        HW_CTurnOn( regs, HW_BX );
    }
    if( HW_COvlap( regs, HW_CX ) ) {
        HW_CTurnOn( regs, HW_CX );
    }
    if( HW_COvlap( regs, HW_DX ) ) {
        HW_CTurnOn( regs, HW_DX );
    }
    return( regs );
}


extern  bool    IsRegClass( hw_reg_set regs, type_class_def class ) {
/*******************************************************************/

    hw_reg_set  *list;

    list = RegSets[  IsSets[  class  ]  ];
    while( !HW_CEqual( *list, HW_EMPTY ) ) {
        if( HW_Equal( *list, regs ) ) break;
        ++ list;
    }
    return( !HW_CEqual( *list, HW_EMPTY ) );
}


extern  hw_reg_set      ActualParmReg( hw_reg_set reg ) {
/*******************************************************/

    if( HW_COvlap( reg, HW_FLTS ) ) {
        HW_CAsgn( reg, HW_ST0 );
    }
    return( reg );
}


extern  hw_reg_set      FixedRegs( void ) {
/***********************************/

    hw_reg_set  tmp;

    HW_CAsgn( tmp, HW_SP );
    HW_CTurnOn( tmp, HW_BP );
    HW_CTurnOn( tmp, HW_SS );
    HW_CTurnOn( tmp, HW_CS );
    if( _IsntTargetModel( FLOATING_DS ) ) HW_CTurnOn( tmp, HW_DS );
    if( _IsntTargetModel( FLOATING_ES ) ) HW_CTurnOn( tmp, HW_ES );
    if( _IsntTargetModel( FLOATING_FS ) ) HW_CTurnOn( tmp, HW_FS );
    if( _IsntTargetModel( FLOATING_GS ) ) HW_CTurnOn( tmp, HW_GS );
    return( tmp );
}


extern  bool    IsStackReg( name *sp ) {
/**************************************/

    if( sp == NULL ) return( FALSE );
    if( sp->n.class != N_REGISTER ) return( FALSE );
    if( !HW_CEqual( sp->r.reg, HW_SP ) ) return( FALSE );
    return( TRUE );
}


extern  hw_reg_set      StackReg( void ) {
/**********************************/

    return( HW_SP );
}


extern  hw_reg_set      DisplayReg( void ) {
/************************************/

    return( HW_BP );
}


extern  int     SizeDisplayReg( void ) {
/********************************/

    return( WORD_SIZE );
}


extern  hw_reg_set      AllCacheRegs( void ) {
/**************************************/

    hw_reg_set  tmp;

    HW_CAsgn( tmp, HW_FLTS );
    HW_CTurnOn( tmp, HW_ABCD );
    HW_CTurnOn( tmp, HW_SI );
    HW_CTurnOn( tmp, HW_DI );
    if( _IsTargetModel( FLOATING_DS ) ) HW_CTurnOn( tmp, HW_DS );
    if( _IsTargetModel( FLOATING_ES ) ) HW_CTurnOn( tmp, HW_ES );
    if( _IsTargetModel( FLOATING_FS ) ) HW_CTurnOn( tmp, HW_FS );
    if( _IsTargetModel( FLOATING_GS ) ) HW_CTurnOn( tmp, HW_GS );
    return( tmp );
}

extern  hw_reg_set      *IdxRegs( void ) {
/**********************************/

    return( IndexRegs );
}

⌨️ 快捷键说明

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