386rgtbl.c

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

C
1,144
字号
    }
    if( HW_COvlap( regs, HW_SEGS ) ) { // a kludge to get GS:[EAX+EDX]
        HW_CTurnOff( regs, HW_SEGS );
        if( NotFloatRegClass( regs ) == FD ) return( CP );
    }
    return( XX );
}

extern  type_class_def  RegClass( hw_reg_set regs ) {
/****************************************************
    return the type associated with "regs".
*/

    hw_reg_set          *possible;

    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 {
        return( NotFloatRegClass( regs ) );
    }
}

extern  bool    IndexRegOk( hw_reg_set reg, bool is_temp_index ) {
/*****************************************************************
    return TRUE if "reg" is ok to be used as in index reg.
    "is_temp_index" means we'll also need to incorporate the
    AR/BP register into the index, since we're indexing an auto
*/

    hw_reg_set  *list;

    is_temp_index = is_temp_index;
    if( RegClass( reg ) == U4 ) {
        list = RegSets[  RL_DOUBLE  ];
    } else {
        list = RegSets[  RL_LONG_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 ) {
/********************************************
    return TRUE if "regs" is a segment register
*/

    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 ) {
/****************************************************
    return the low order part of 16 bit register "regs"
*/

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


extern  hw_reg_set      High16Reg( hw_reg_set regs ) {
/****************************************************
    return the high order part of 16 bit register "regs"
*/

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


extern  hw_reg_set      Low32Reg( hw_reg_set regs ) {
/****************************************************
    return the low order part of 32 bit register "regs"
*/

    if( HW_CEqual( regs, HW_DX_AX ) ) {
        return( HW_AX );
    }
    HW_COnlyOn( regs, HW_AX_BX_CX_DX_SI_DI );
    return( regs );
}


extern  hw_reg_set      High32Reg( hw_reg_set regs ) {
/****************************************************
    return the high order part of 32 bit register "regs"
*/

    if( HW_CEqual( regs, HW_DX_AX ) ) {
        return( HW_DX );
    }
    return( HW_EMPTY );
}

extern  hw_reg_set      FullReg( hw_reg_set regs ) {
/***************************************************
    given a register (eg AL), return the full register (eg EAX)
*/

    if( HW_COvlap( regs, HW_EAX ) ) {
        HW_CTurnOn( regs, HW_EAX );
    }
    if( HW_COvlap( regs, HW_EBX ) ) {
        HW_CTurnOn( regs, HW_EBX );
    }
    if( HW_COvlap( regs, HW_ECX ) ) {
        HW_CTurnOn( regs, HW_ECX );
    }
    if( HW_COvlap( regs, HW_EDX ) ) {
        HW_CTurnOn( regs, HW_EDX );
    }
    if( HW_COvlap( regs, HW_EDI ) ) {
        HW_CTurnOn( regs, HW_EDI );
    }
    if( HW_COvlap( regs, HW_ESI ) ) {
        HW_CTurnOn( regs, HW_ESI );
    }
    return( regs );
}

extern  hw_reg_set      Low48Reg( hw_reg_set regs ) {
/****************************************************
    return the low order part of 48 bit register "regs"
*/

    if( HW_CEqual( regs, HW_EMPTY ) ) return( HW_EMPTY );
    if( HW_COvlap( regs, HW_SEGS ) ) {
        HW_CTurnOff( regs, HW_SEGS );
        return( regs );
    }
    HW_COnlyOn( regs, HW_32 );
    return( FullReg( regs ) );
}


extern  hw_reg_set      High48Reg( hw_reg_set regs ) {
/****************************************************
    return the high order part of 48 bit register "regs"
*/

    hw_reg_set  high;

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

extern  hw_reg_set      Low64Reg( hw_reg_set regs ) {
/****************************************************
    return the low order part of 64 bit register "regs"
*/

    hw_reg_set  low;
    hw_reg_set  *order;

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



extern  hw_reg_set      High64Reg( hw_reg_set regs ) {
/*****************************************************
    return the high order part of 64 bit register "regs"
*/

    hw_reg_set  high;

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



extern  hw_reg_set      HighReg( hw_reg_set regs ) {
/**************************************************
    return the high order portion of "regs"
*/

    switch( RegClass( regs ) ) {
    case CP:
        HW_COnlyOn( regs, HW_SEGS );
        return( regs );
    case FD:
    case U8:
    case I8:
        return( High64Reg( regs ) );
    case U4:
    case I4:
        return( High32Reg( regs ) );
    case U2:
        return( High16Reg( regs ) );
    default:
        return( HW_EMPTY );
    }
}

extern  hw_reg_set      HighOffsetReg( hw_reg_set regs ) {
/********************************************************
    return the portion of "regs" which would occupy the high memory address
*/

    return( HighReg( regs ) );
}


extern  hw_reg_set      LowReg( hw_reg_set regs ) {
/**************************************************
    return the low order portion of "regs"
*/

    switch( RegClass( regs ) ) {
    case CP:
        HW_CTurnOff( regs, HW_SEGS );
        return( regs );
    case U8:
    case I8:
    case FD:
        return( Low64Reg( regs ) );
    case U4:
        return( Low32Reg( regs ) );
    case U2:
        return( Low16Reg( regs ) );
    default:
        return( HW_EMPTY );
    }
}

extern  hw_reg_set      LowOffsetReg( hw_reg_set regs ) {
/********************************************************
    return the portion of "regs" which would occupy the low memory address
*/

    return( LowReg( regs ) );
}



extern  bool    IsRegClass( hw_reg_set regs, type_class_def class ) {
/********************************************************************
    return TRUE if "regs" has type "class" (eg I4, U4, etc)
*/

    hw_reg_set  *list;

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


extern  hw_reg_set      ActualParmReg( hw_reg_set reg ) {
/********************************************************
    given a register "reg", to be used to pass a parameter,
    decide which register name should really be used in
    the instruction generated to load it.
*/

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

extern  hw_reg_set      FixedRegs() {
/************************************
    return the set of register which may not be modified within this routine
*/

    hw_reg_set  fixed;
    HW_CAsgn( fixed, HW_SP );
    HW_CTurnOn( fixed, HW_BP );
    HW_CTurnOn( fixed, HW_SS );
    HW_CTurnOn( fixed, HW_CS );
    if( _IsntTargetModel( FLOATING_DS ) ) HW_CTurnOn( fixed, HW_DS );
    if( _IsntTargetModel( FLOATING_ES ) ) HW_CTurnOn( fixed, HW_ES );
    if( _IsntTargetModel( FLOATING_FS ) ) HW_CTurnOn( fixed, HW_FS );
    if( _IsntTargetModel( FLOATING_GS ) ) HW_CTurnOn( fixed, HW_GS );
    if( _IsTargetModel( INDEXED_GLOBALS ) ) HW_CTurnOn( fixed, HW_EBX );
    return( fixed );
}


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() {
/**********************************/

    return( HW_SP );
}


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

    if( CurrProc->targ.sp_frame ) return( HW_SP );
    return( HW_BP );
}


extern  int     SizeDisplayReg() {
/*********************************
    return the size of the "pascal" display register entry on the stack
*/

    return( WORD_SIZE );
}


extern  hw_reg_set      AllCacheRegs() {
/***************************************
    return the set of all registers that could be used to cache values
*/

    hw_reg_set all;

    HW_CAsgn( all, HW_FLTS );
    HW_CTurnOn( all, HW_EAX );
    HW_CTurnOn( all, HW_EDX );
    HW_CTurnOn( all, HW_EBX );
    HW_CTurnOn( all, HW_ECX );
    HW_CTurnOn( all, HW_ESI );
    HW_CTurnOn( all, HW_EDI );
    HW_CTurnOn( all, HW_ES );
    HW_CTurnOn( all, HW_FS );
    HW_CTurnOn( all, HW_GS );
    if( _IsTargetModel( FLOATING_DS ) ) HW_CTurnOn( all, HW_DS );
    if( _IsTargetModel( INDEXED_GLOBALS ) ) HW_CTurnOff( all, HW_EBX );
    return( all );
}

extern  hw_reg_set      *IdxRegs() {
/***********************************
    return a pointer to the set of "indexable" registers
*/

    return( DoubleRegs );
}

⌨️ 快捷键说明

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