void DoCmplxOp( RTCODE rtn_id, cg_name a, cg_name b, cg_name c, cg_name d ) { //=========================================================================== // Do a complex operation. call_handle handle; cg_type typ; cg_type r_typ; typ = ResCGType( CGType( a ), CGType( c ) ); if( typ == TY_DOUBLE ) { rtn_id += RT_C_DOUBLE; r_typ = TY_DCOMPLEX; } else if( typ == TY_LONGDOUBLE ) { rtn_id += RT_C_EXTENDED; r_typ = TY_XCOMPLEX; } else { r_typ = TY_COMPLEX; } handle = InitCall( rtn_id ); CGAddParm( handle, a, typ ); CGAddParm( handle, b, typ ); CGAddParm( handle, c, typ ); CGAddParm( handle, d, typ ); SplitCmplx( CGCall( handle ), r_typ ); }
void FCSetNoFmt( void ) { //==================== // Set "not formatted i/o". CGDone( CGCall( InitCall( RT_SET_NOFMT ) ) ); }
void FCDeAllocate( void ) { //============================== call_handle handle; sym_id arr; uint num; num = 0; handle = InitCall( RT_DEALLOCATE ); for(;;) { arr = GetPtr(); if( arr == NULL ) break; CGAddParm( handle, CGFEName( arr, T_POINTER ), T_POINTER ); CGAddParm( handle, getFlags( arr ), FLAG_PARM_TYPE ); ++num; } CGAddParm( handle, CGInteger( num, T_INTEGER ), T_INTEGER ); if( GetU16() & ALLOC_STAT ) { FCodeSequence(); CGAddParm( handle, XPop(), T_POINTER ); } else { CGAddParm( handle, CGInteger( 0, T_POINTER ), T_POINTER ); } CGDone( CGCall( handle ) ); }
static void DbSubscript( sym_id arr ) { //========================================= // Generate call to debugging subscript routine. act_dim_list *dim_ptr; int dims_no; int i; call_handle call; cg_name offset; cg_name subscripts[MAX_DIM]; dim_ptr = arr->u.ns.si.va.u.dim_ext; dims_no = _DimCount( dim_ptr->dim_flags ); call = InitCall( RT_SUBSCRIPT ); for( i = 0; i < dims_no; ++i ) { subscripts[ i ] = GetTypedValue(); } for( i = 1; i <= dims_no; ++i ) { CGAddParm( call, subscripts[ dims_no - i ], TY_INT_4 ); } CGAddParm( call, GetAdv( arr ), TY_LOCAL_POINTER ); CGAddParm( call, CGInteger( _DimCount( dim_ptr->dim_flags ), TY_INTEGER ), TY_INTEGER ); offset = CGUnary( O_POINTS, CGCall( call ), TY_INT_4 ); Index( arr, offset ); }
static void DoCmplxScalarOp( RTCODE rtn_id, cg_name a, cg_name b, cg_name s ) { //========================================================================= // Do a complex operation. call_handle handle; cg_type typ; cg_type r_typ; typ = CGType( a ); if( typ == TY_DOUBLE ) { rtn_id += RT_C_DOUBLE; r_typ = TY_DCOMPLEX; } else if( typ == TY_LONGDOUBLE ) { rtn_id += RT_C_EXTENDED; r_typ = TY_XCOMPLEX; } else { r_typ = TY_COMPLEX; } handle = InitCall( rtn_id ); CGAddParm( handle, a, typ ); CGAddParm( handle, b, typ ); CGAddParm( handle, s, PromoteIntType( CGType( s ) ) ); SplitCmplx( CGCall( handle ), r_typ ); }
cg_name Concat( uint num_args, cg_name dest ) { //============================================= // Do concatenation operation. int count; call_handle call; cg_name dest_1; cg_name dest_2; if( num_args & CAT_TEMP ) { call = InitCall( RT_TCAT ); num_args &= ~CAT_TEMP; } else if( num_args == 1 ) { call = InitCall( RT_MOVE ); } else { call = InitCall( RT_CAT ); } count = num_args; while( count > 0 ) { CGAddParm( call, StkElement( count ), TY_LOCAL_POINTER ); --count; } PopStkElements( num_args ); CloneCGName( dest, &dest_1, &dest_2 ); CGAddParm( call, dest_1, TY_LOCAL_POINTER ); if( num_args != 1 ) { CGAddParm( call, CGInteger( num_args, TY_UNSIGNED ), TY_UNSIGNED ); } return( CGBinary( O_COMMA, CGCall( call ), dest_2, TY_LOCAL_POINTER ) ); }
void FCSetAtEnd( void ) { //==================== // Set END= for ATEND statement. CGDone( CGCall( InitCall( RT_SET_END ) ) ); EndEqLabel = GetU16(); }
static void IOString( RTCODE rtn ) { //====================================== call_handle handle; handle = InitCall( rtn ); CGAddParm( handle, XPop(), TY_INTEGER ); CGAddParm( handle, XPop(), TY_POINTER ); CGDone( CGCall( handle ) ); }
static void IOStatement( RTCODE stmt ) { //========================================== // don't need label generated for IOSTAT unless it's a READ or WRITE // statement that is not NAMELIST-directed if( ( (stmt != RT_EX_READ) && (stmt != RT_EX_WRITE) ) || NmlSpecified ) { IOStatSpecified = FALSE; } ChkIOErr( CGCall( InitCall( stmt ) ) ); }
static cg_name finiDtorCall( // COMPLETE DTOR CALL call_handle handle, // - call handle unsigned cdtor ) // - cdtor arg to use { cg_name n; CgBackCallGened( handle ); n = CgFetchPtr( CGCall( handle ) ); CallStabCdArgSet( handle, cdtor ); return( n ); }
void FCSetFmt( void ) { //================== // Set format string from FORMAT statement. call_handle handle; handle = InitCall( RT_SET_FMT ); CGAddParm( handle, CGBackName( (back_handle)GetStmtLabel( GetPtr() ), TY_POINTER ), TY_POINTER ); CGDone( CGCall( handle ) ); }
static void Input( RTCODE rtn ) { //=================================== // Common input routine. call_handle handle; handle = InitCall( rtn ); CGAddParm( handle, XPop(), TY_POINTER ); CGDone( CGCall( handle ) ); }
void FCPassLabel( void ) { //===================== // Pass label to run-time routine. call_handle handle; handle = InitCall( GetU16() ); CGAddParm( handle, CGBackName( (back_handle)GetLabel( GetU16() ), TY_POINTER ), TY_POINTER ); CGDone( CGCall( handle ) ); }
static void Output( RTCODE rtn, cg_type arg_type ) { //====================================================== // Call runtime routine to output elemental types value. call_handle handle; handle = InitCall( rtn ); CGAddParm( handle, XPopValue( arg_type ), PromoteToBaseType( arg_type ) ); CGDone( CGCall( handle ) ); }
static void IOCallValue( RTCODE rtn ) { //========================================= // Call i/o run-time routine with one argument. call_handle handle; handle = InitCall( rtn ); CGAddParm( handle, GetTypedValue(), TY_INT_4 ); CGDone( CGCall( handle ) ); }
static void IOCall( RTCODE rtn ) { //==================================== // Call i/o run-time routine with one argument. call_handle handle; handle = InitCall( rtn ); CGAddParm( handle, XPop(), TY_POINTER ); CGDone( CGCall( handle ) ); }
void FCOutCHAR( void ) { //=================== // Call runtime routine to output CHARACTER*n value. call_handle handle; handle = InitCall( RT_OUT_CHAR ); CGAddParm( handle, XPop(), TY_POINTER ); CGDone( CGCall( handle ) ); }
void FCSetIntl( void ) { //=================== // Call runtime routine to set internal file to character item (not array). call_handle handle; handle = InitCall( RT_SET_INTL ); CGAddParm( handle, CGInteger( 1, TY_INT_4 ), TY_INT_4 ); CGAddParm( handle, XPop(), TY_POINTER ); CGDone( CGCall( handle ) ); }
static void ChrArrayIO( RTCODE rtn, cg_name arr, cg_name num_elts, cg_name elt_size ) { //==================================================================== call_handle call; call = InitCall( rtn ); CGAddParm( call, elt_size, TY_INTEGER ); CGAddParm( call, num_elts, TY_INT_4 ); CGAddParm( call, arr, TY_POINTER ); CGDone( CGCall( call ) ); }
void FCEndIO( void ) { //================= // Call runtime routine to terminate i/o processing. CGDone( CGCall( InitCall( RT_ENDIO ) ) ); FCChkIOStmtLabel(); if( ( ErrEqLabel == 0 ) && ( EndEqLabel == 0 ) && IOStatSpecified ) { CGControl( O_LABEL, NULL, IOSLabel ); BEFiniLabel( IOSLabel ); } }
static void NumArrayIO( RTCODE rtn, cg_name arr, cg_name num_elts, uint typ ) { //==================================================================== call_handle call; call = InitCall( rtn ); CGAddParm( call, CGInteger( typ, TY_INTEGER ), TY_INTEGER ); CGAddParm( call, num_elts, TY_INT_4 ); CGAddParm( call, arr, TY_POINTER ); CGDone( CGCall( call ) ); }
void FCFmtScan( void ) { //=================== // Call runtime routine to scan a format specification from a character // expression. call_handle handle; handle = InitCall( RT_FMT_SCAN ); CGAddParm( handle, CGInteger( GetU16(), TY_UNSIGNED ), TY_UNSIGNED ); CGAddParm( handle, XPop(), TY_POINTER ); CGDone( CGCall( handle ) ); }
void FCFmtAssign( void ) { //===================== // Set FORMAT string for: // ASSIGN 10 TO I // PRINT I, ... // 10 FORMAT( ... ) call_handle handle; handle = InitCall( RT_SET_FMT ); CGAddParm( handle, CGUnary( O_POINTS, SymAddr( GetPtr() ), TY_POINTER ), TY_POINTER ); CGDone( CGCall( handle ) ); }
void FCSetLine( void ) { //=================== // Generate run-time call to ISN routine. call_handle handle; unsigned_16 line_num; line_num = GetU16(); if( ( SubProgId->ns.flags & SY_SUBPROG_TYPE ) == SY_BLOCK_DATA ) return; handle = InitCall( RT_SET_LINE ); CGAddParm( handle, CGInteger( line_num, TY_INTEGER ), TY_INTEGER ); CGDone( CGCall( handle ) ); }
static void OutCplx( RTCODE rtn, cg_type typ ) { //=============================================== // Call runtime routine to input COMPLEX value. call_handle handle; cg_cmplx z; handle = InitCall( rtn ); XPopCmplx( &z, typ ); typ = CmplxBaseType( typ ); CGAddParm( handle, z.imagpart, typ ); CGAddParm( handle, z.realpart, typ ); CGDone( CGCall( handle ) ); }
void FCAdvFillHi( void ) { //===================== // Fill hi bound of a dimension (actually computes # of elements in dimension). sym_id arr; act_dim_list *dim_ptr; uint lo_size; uint hi_size; int hi_offset; int ss; cg_name num_elts; cg_name hi; cg_name adv; call_handle call; arr = GetPtr(); dim_ptr = arr->u.ns.si.va.u.dim_ext; adv = GetAdv( arr ); hi_size = BETypeLength( TY_ADV_HI ); lo_size = BETypeLength( TY_ADV_LO ); ss = GetU16(); hi = GetTypedValue(); if( CGOpts & CGOPT_DI_CV ) { hi_offset = _DimCount( dim_ptr->dim_flags ) * BETypeLength( TY_ADV_ENTRY ); if( Options & OPT_BOUNDS ) { hi_offset += BETypeLength( TY_POINTER ); } hi_offset += (ss - 1) * (lo_size + BETypeLength( TY_ADV_HI_CV )) + lo_size; hi = CGAssign( StructRef( adv, hi_offset ), hi, TY_ADV_HI_CV ); adv = GetAdv( arr ); } if( Options & OPT_BOUNDS ) { call = InitCall( RT_ADV_FILL_HI ); CGAddParm( call, hi, TY_INT_4 ); CGAddParm( call, CGInteger( ss, TY_UNSIGNED ), TY_UNSIGNED ); CGAddParm( call, adv, TY_LOCAL_POINTER ); CGDone( CGUnary( O_POINTS, CGCall( call ), TY_INT_4 ) ); } else { hi_offset = (ss - 1) * ( lo_size + hi_size ) + lo_size; num_elts = CGBinary( O_PLUS, hi, CGBinary( O_MINUS, CGInteger( 1, TY_INTEGER ), LoBound( arr, ss - 1 ), TY_ADV_HI ), TY_ADV_HI ); CGDone( CGAssign( StructRef( adv, hi_offset ), num_elts, TY_ADV_HI ) ); } }
void FCSetEnd( void ) { //================== // Set END=. sym_id sn; CGDone( CGCall( InitCall( RT_SET_END ) ) ); sn = GetPtr(); // Don't call RefStmtLabel() for 'sn' yet since we will be referencing // the label for error checking after an i/o operation. RefStmtLabel() // may call DoneLabel() if this is the last reference to the statement // label. EndEqStmt = sn; EndEqLabel = sn->st.address; }
void FCFmtArrScan( void ) { //====================== // Call runtime routine to scan a format specification from a character // array. call_handle handle; sym_id sym; sym = GetPtr(); handle = InitCall( RT_FMT_ARR_SCAN ); CGAddParm( handle, CGInteger( GetU16(), TY_UNSIGNED ), TY_UNSIGNED ); CGAddParm( handle, ArrayEltSize( sym ), TY_UNSIGNED ); CGAddParm( handle, ArrayNumElts( sym ), TY_INT_4 ); CGAddParm( handle, SymAddr( sym ), TY_POINTER ); CGDone( CGCall( handle ) ); }
static void Break( RTCODE routine ) { //======================================= // Process PAUSE/STOP statement. call_handle handle; sym_id lit; cg_name arg; handle = InitCall( routine ); lit = GetPtr(); if( lit == NULL ) { arg = CGInteger( 0, TY_LOCAL_POINTER ); } else { arg = CGBackName( ConstBack( lit ), TY_LOCAL_POINTER ); } CGAddParm( handle, arg, TY_LOCAL_POINTER ); CGDone( CGCall( handle ) ); }
void FCIntlArrSet( void ) { //====================== // Call runtime routine to set internal file to character array. call_handle handle; sym_id sym; sym_id scb; sym = GetPtr(); scb = GetPtr(); CGTrash( CGAssign( SCBLenAddr( CGFEName( scb, TY_POINTER ) ), ArrayEltSize( sym ), TY_INTEGER ) ); CGTrash( CGAssign( SCBPtrAddr( CGFEName( scb, TY_POINTER ) ), SymAddr( sym ), TY_POINTER ) ); handle = InitCall( RT_SET_INTL ); CGAddParm( handle, ArrayNumElts( sym ), TY_INT_4 ); CGAddParm( handle, CGFEName( scb, TY_POINTER ), TY_POINTER ); CGDone( CGCall( handle ) ); }