static void ForceTempsMemory( void ) /**************************************/ { name *op; name *next; ParmPropagate(); for( op = Names[N_TEMP]; op != LastTemp; op = next ) { next = op->n.next_name; if( ( op->v.usage & USE_IN_ANOTHER_BLOCK ) || _FrontEndTmp( op ) ) { op = DeAlias( op ); op->v.usage |= NEEDS_MEMORY | USE_MEMORY; while( op->v.conflict != NULL ) { FreeAConflict( op->v.conflict ); } } } AssignOtherLocals(); for( op = Names[N_MEMORY]; op != NULL; op = op->n.next_name ) { op->v.usage |= USE_IN_ANOTHER_BLOCK | USE_MEMORY; if( op->v.conflict != NULL ) { FreeAConflict( op->v.conflict ); op->v.conflict = NULL; } } LastTemp = Names[ N_TEMP ]; }
static void InitVisitedTemps( void ) /*************************************** Mark all N_TEMP and N_MEMORY names as Not visited. If NO_OPTIMIZATION is on, mark them all as visited. */ { name *op; name *alias; op = Names[ N_TEMP ]; while( op != NULL ) { op->t.temp_flags &= ~VISITED; op = op->n.next_name; } op = Names[ N_TEMP ]; while( op != NULL ) { if( op->v.usage & (USE_ADDRESS|VAR_VOLATILE) ) { alias = op; do { alias->t.temp_flags |= VISITED; alias = alias->t.alias; } while( alias != op ); } op = op->n.next_name; } if( _IsModel( NO_OPTIMIZATION ) ) { op = Names[ N_TEMP ]; while( op != NULL ) { if( _FrontEndTmp( op ) ) { op->t.temp_flags |= VISITED; } op = op->n.next_name; } } if( BlockByBlock || _IsModel ( NO_OPTIMIZATION ) ) { op = Names[ N_TEMP ]; while( op != NULL ) { if( op->v.usage & USE_IN_ANOTHER_BLOCK ) { op->t.temp_flags |= VISITED; } op = op->n.next_name; } } }
static void FreeExtraTemps( name *last, block_num id ) /********************************************************/ { name **owner; name *temp; owner = &Names[ N_TEMP ]; for( ;; ) { temp = *owner; if( temp == last ) break; if( ( temp->v.usage & USE_IN_ANOTHER_BLOCK ) == 0 && !_FrontEndTmp( temp ) && temp->t.u.block_id == id ) { *owner = temp->n.next_name; FreeAName( temp ); } else { owner = &temp->n.next_name; } } }
extern void DumpOperand( name *operand ) { /********************************************/ char buffer[20]; hw_reg_set reg; name *base; if( operand->n.class == N_INDEXED ) { if( operand->i.base != NULL ) { if( !( operand->i.index_flags & X_FAKE_BASE ) ) { if( operand->i.index_flags & X_LOW_ADDR_BASE ) { DumpLiteral( "l^" ); } DumpOperand( operand->i.base ); if( operand->i.constant > 0 ) { DumpChar( '+' ); } } } if( operand->i.constant != 0 ) { DumpLong( operand->i.constant ); } DumpChar( '[' ); if( operand->i.index_flags & X_BASE ) { reg = operand->i.index->r.reg; #if _TARGET & ( _TARG_IAPX86 | _TARG_80386 ) if( HW_COvlap( reg, HW_SEGS ) ) { hw_reg_set tmp; tmp = reg; HW_COnlyOn( tmp, HW_SEGS ); DumpRegName( tmp ); DumpChar( ':' ); HW_CTurnOff( reg, HW_SEGS ); } #endif if( operand->i.index_flags & X_HIGH_BASE ) { DumpRegName( HighReg( reg ) ); DumpChar( '+' ); DumpRegName( LowReg( reg ) ); } else { DumpRegName( LowReg( reg ) ); DumpChar( '+' ); DumpRegName( HighReg( reg ) ); } } else { DumpOperand( operand->i.index ); } if( operand->i.scale != 0 ) { DumpChar( '*' ); DumpInt( 1 << operand->i.scale ); } if( operand->i.index_flags & ( X_ALIGNED_1 | X_ALIGNED_2 | X_ALIGNED_4 | X_ALIGNED_8 ) ) { DumpChar( '$' ); DumpInt( FlagsToAlignment( operand->i.index_flags ) ); } DumpChar( ']' ); base = operand->i.base; if( base != NULL ) { if( operand->i.index_flags & X_FAKE_BASE ) { DumpChar( '{' ); if( base->n.class == N_MEMORY ) { DumpXString( AskName(base->v.symbol, base->m.memory_type) ); } else if( base->n.class == N_TEMP ) { if( _FrontEndTmp( base ) ) { DumpXString( FEName( base->v.symbol ) ); } else { DumpOperand( base ); } } DumpChar( '}' ); } }