local void GetSaveInfo( void ) /****************************/ { struct { unsigned f_exact : 1; unsigned f_nomemory : 1; unsigned f_list : 1; } have; have.f_exact = 0; have.f_nomemory = 0; have.f_list = 0; for( ;; ) { if( !have.f_exact && PragRecog( "exact" ) ) { AuxInfo.cclass |= MODIFY_EXACT; have.f_exact = 1; } else if( !have.f_nomemory && PragRecog( "nomemory" ) ) { AuxInfo.cclass |= NO_MEMORY_CHANGED; have.f_nomemory = 1; } else if( !have.f_list && PragRegSet() != T_NULL ) { HW_TurnOn( AuxInfo.save, PragRegList() ); have.f_list = 1; } else { break; } } }
local void GetRetInfo( void ) /***************************/ { struct { unsigned f_no8087 : 1; unsigned f_list : 1; unsigned f_struct : 1; } have; have.f_no8087 = 0; have.f_list = 0; have.f_struct = 0; AuxInfo.cclass &= ~ NO_8087_RETURNS; /* 29-mar-90 */ AuxInfoFlg.f_8087_returns = 1; for( ;; ) { if( !have.f_no8087 && PragRecog( "no8087" ) ) { have.f_no8087 = 1; HW_CTurnOff( AuxInfo.returns, HW_FLTS ); AuxInfo.cclass |= NO_8087_RETURNS; } else if( !have.f_list && PragRegSet() != T_NULL ) { have.f_list = 1; AuxInfo.cclass |= SPECIAL_RETURN; AuxInfo.returns = PragRegList(); } else if( !have.f_struct && PragRecog( "struct" ) ) { have.f_struct = 1; GetSTRetInfo(); } else { break; } } }
hw_reg_set PragRegList( void ) /****************************/ { hw_reg_set res, reg; TOKEN close; char buf[ 80 ]; HW_CAsgn( res, HW_EMPTY ); HW_CAsgn( reg, HW_EMPTY ); close = PragRegSet(); if( close != T_NULL ) { PPCTL_ENABLE_MACROS(); NextToken(); *buf = '\0'; for( ; CurToken != close; ) { strcat( buf, Buffer ); if( CurToken != T_BAD_CHAR ) { reg = PragRegName( buf ); HW_TurnOn( res, reg ); *buf = '\0'; } NextToken(); } PPCTL_DISABLE_MACROS(); MustRecog( close ); } return( res ); }
static void GetRetInfo( void ) /***************************/ { struct { bool f_no8087 : 1; bool f_list : 1; bool f_struct : 1; } have; have.f_no8087 = false; have.f_list = false; have.f_struct = false; AuxInfo.cclass &= ~ NO_8087_RETURNS; AuxInfoFlg.f_8087_returns = true; for( ;; ) { if( !have.f_no8087 && PragRecog( "no8087" ) ) { have.f_no8087 = true; HW_CTurnOff( AuxInfo.returns, HW_FLTS ); AuxInfo.cclass |= NO_8087_RETURNS; } else if( !have.f_list && PragRegSet() != T_NULL ) { have.f_list = true; AuxInfo.cclass |= SPECIAL_RETURN; AuxInfo.returns = PragRegList(); } else if( !have.f_struct && PragRecog( "struct" ) ) { have.f_struct = true; GetSTRetInfo(); } else { break; } } }
local void GetParmInfo( void ) /****************************/ { struct { unsigned f_pop : 1; unsigned f_reverse : 1; unsigned f_loadds : 1; unsigned f_nomemory : 1; unsigned f_list : 1; } have; have.f_pop = 0; have.f_reverse = 0; have.f_loadds = 0; have.f_nomemory = 0; have.f_list = 0; for( ;; ) { if( !have.f_pop && PragRecog( "caller" ) ) { AuxInfo.cclass |= CALLER_POPS; have.f_pop = 1; } else if( !have.f_pop && PragRecog( "routine" ) ) { AuxInfo.cclass &= ~ CALLER_POPS; AuxInfoFlg.f_routine_pops = 1; have.f_pop = 1; } else if( !have.f_reverse && PragRecog( "reverse" ) ) { AuxInfo.cclass |= REVERSE_PARMS; have.f_reverse = 1; } else if( !have.f_nomemory && PragRecog( "nomemory" ) ) { AuxInfo.cclass |= NO_MEMORY_READ; have.f_nomemory = 1; } else if( !have.f_loadds && PragRecog( "loadds" ) ) { AuxInfo.cclass |= LOAD_DS_ON_CALL; have.f_loadds = 1; } else if( !have.f_list && PragRegSet() != T_NULL ) { AuxInfo.parms = PragManyRegSets(); have.f_list = 1; } else { break; } } }
local void GetSTRetInfo( void ) /*****************************/ { struct { unsigned f_float : 1; unsigned f_struct : 1; unsigned f_allocs : 1; unsigned f_list : 1; } have; have.f_float = 0; have.f_struct = 0; have.f_allocs = 0; have.f_list = 0; for( ;; ) { if( !have.f_float && PragRecog( "float" ) ) { have.f_float = 1; AuxInfo.cclass |= NO_FLOAT_REG_RETURNS; } else if( !have.f_struct && PragRecog( "struct" ) ) { have.f_struct = 1; AuxInfo.cclass |= NO_STRUCT_REG_RETURNS; } else if( !have.f_allocs && PragRecog( "routine" ) ) { have.f_allocs = 1; AuxInfo.cclass |= ROUTINE_RETURN; } else if( !have.f_allocs && PragRecog( "caller" ) ) { have.f_allocs = 1; AuxInfo.cclass &= ~ROUTINE_RETURN; AuxInfoFlg.f_caller_return = 1; } else if( !have.f_list && PragRegSet() != T_NULL ) { have.f_list = 1; AuxInfo.cclass |= SPECIAL_STRUCT_RETURN; AuxInfo.streturn = PragRegList(); } else { break; } } }