extern instruction *NeedIndex( instruction *ins ) { /******************************************************* Mark conflicts for any name used in instruction as as segment as NEEDS_SEGMENT, or split out the segment if it is marked as NEEDS_SEGMENT_SPLIT (move the segment operand to a temp and use the temp as the segment override). Also, if any index conflicts are marked as NEEDS_INDEX_SPLIT, split them out into a temp as well. */ name *temp; name *index; conflict_node *conf; name *name; if( ins->num_operands > NumOperands( ins ) ) { name = ins->operands[ins->num_operands - 1]; conf = NameConflict( ins, name ); if( conf != NULL && _Isnt( conf, CST_NEEDS_SEGMENT_SPLIT ) ) { _SetTrue( conf, CST_NEEDS_SEGMENT ); MarkSegment( ins, name ); } else if( name->n.class != N_REGISTER ) { if( conf != NULL ) { _SetFalse( conf, CST_NEEDS_SEGMENT ); _SetTrue( conf, CST_WAS_SEGMENT ); } temp = AllocTemp( U2 ); ins->operands[ins->num_operands - 1] = temp; PrefixIns( ins, MakeMove( name, temp, U2 ) ); MarkSegment( ins, temp ); _SetTrue( NameConflict( ins, temp ), CST_SEGMENT_SPLIT ); ins = ins->head.prev; } }
/* 370 */ instruction *rUSEREGISTER( instruction *ins ) /************************************************/ { instruction *new_ins; instruction *ins2; name *name1; name1 = ins->operands[0]; if( CanUseOp1( ins, name1 ) ) { new_ins = MakeMove( name1, ins->result, ins->type_class ); ins->result = name1; MoveSegRes( ins, new_ins ); SuffixIns( ins, new_ins ); new_ins = ins; } else { name1 = AllocTemp( ins->type_class ); new_ins = MakeMove( ins->operands[0], name1, ins->type_class ); CheckCC( ins, new_ins ); ins->operands[0] = name1; MoveSegOp( ins, new_ins, 0 ); PrefixIns( ins, new_ins ); ins2 = MakeMove( name1, ins->result, ins->type_class ); ins->result = name1; MoveSegRes( ins, ins2 ); SuffixIns( ins, ins2 ); MarkPossible( ins, name1, ResultPossible( ins ) ); ins->u.gen_table = NULL; GiveRegister( NameConflict( ins, name1 ), true ); } return( new_ins ); }
extern bool IndexOkay( instruction *ins, name *index ) { /**********************************************************/ name *name; conflict_node *conf; name = index->i.index; if( name->n.class == N_REGISTER ) { return( IsIndexReg( name->r.reg, name->n.name_class, 0 ) ); } if( name->v.conflict == NULL ) return( FALSE ); if( name->v.usage & USE_MEMORY ) return( FALSE ); if( name->n.class != N_TEMP ) return( FALSE ); conf = NameConflict( ins, name ); if( conf == NULL ) return( FALSE ); if( _Is( conf, NEEDS_INDEX_SPLIT ) ) { _SetFalse( conf, NEEDS_INDEX ); return( FALSE ); } else { _SetTrue( conf, NEEDS_INDEX ); ins->head.state = OPERANDS_NEED_WORK; ins->t.index_needs = MarkIndex( ins, name, 0 ); return( TRUE ); } }
/* 370 */ instruction *rMOVRESREG( instruction *ins ) /**********************************************/ { instruction *new_ins; name *name1; name1 = AllocTemp( ins->type_class ); new_ins = MakeMove( name1, ins->result, ins->type_class ); ins->result = name1; MoveSegRes( ins, new_ins ); SuffixIns( ins, new_ins ); MarkPossible( ins, name1, ResPossible( ins ) ); ins->u.gen_table = NULL; GiveRegister( NameConflict( ins, name1 ), true ); return( ins ); }
extern instruction *NeedIndex( instruction *ins ) { /******************************************************/ name *temp; name *index; conflict_node *conf; index = FindIndex( ins ); if( index != NULL ) { temp = IndexToTemp( ins, index ); conf = NameConflict( ins, temp ); _SetTrue( conf, INDEX_SPLIT ); MarkIndex( ins, temp, 0 ); ins = ins->head.prev; } return( ins ); }
instruction *rOP2REG( instruction *ins ) /*******************************************/ { instruction *new_ins; name *name1; type_class_def type_class; type_class = _OpClass( ins ); name1 = AllocTemp( type_class ); new_ins = MakeMove( ins->operands[1], name1, type_class ); ins->operands[1] = name1; MoveSegOp( ins, new_ins, 0 ); PrefixIns( ins, new_ins ); MarkPossible( ins, name1, Op1Possible( ins ) ); ins->u.gen_table = NULL; GiveRegister( NameConflict( ins, name1 ), true ); return( new_ins ); }