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 ) ); } }
cg_name SCBFlagsAddr( cg_name scb ) { //=================================== // Get pointer to flags in SCB. return( StructRef( scb, BETypeLength( TY_CHAR ) ) ); }
cg_name SCBLenAddr( cg_name scb ) { //================================= // Get pointer to length in SCB. return( StructRef( scb, BETypeLength( TY_GLOBAL_POINTER ) ) ); }
static cg_name HiBound( sym_id arr, int ss_offset ) { //==================================================== // Get hi bound from ADV. ss_offset = BETypeLength( TY_ADV_LO ) * ( ss_offset + 1 ) + BETypeLength( TY_ADV_HI ) * ss_offset; return( CGUnary( O_POINTS, StructRef( GetAdv( arr ), ss_offset ), TY_ADV_HI ) ); }
cg_name ImagPtr( cg_name dest, cg_type typ ) { //============================================ // Get pointer to imaginary part of complex number. dest = StructRef( dest, BETypeLength( typ ) ); if( OZOpts & OZOPT_O_VOLATILE ) { dest = CGVolatile( dest ); } return( dest ); }
void FCAdvFillHiLo1( void ) { //======================== // Fill hi and lo=1 bound of a dimension. sym_id arr; cg_name lo; cg_name hi; cg_name adv; unsigned ss; uint lo_size; uint hi_size; int lo_offset; int hi_offset; call_handle call; // Get general information arr = GetPtr(); ss = GetU16(); adv = GetAdv( arr ); hi_size = BETypeLength( TY_ADV_HI ); lo_size = BETypeLength( TY_ADV_LO ); hi = GetTypedValue(); if( Options & OPT_BOUNDS ) { call = InitCall( RT_ADV_FILL_HI_LO1 ); 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; CGDone( CGAssign( StructRef( adv, hi_offset ), hi, TY_ADV_HI ) ); // set lo bound of the adv lo = CGInteger( 1, TY_INT_4 ); lo_offset = (ss - 1) * BETypeLength( TY_ADV_ENTRY ); adv = GetAdv( arr ); CGDone( CGAssign( StructRef( adv, lo_offset ), lo, TY_ADV_LO ) ); } }
static cg_name getFlags( sym_id sym ) { //====================================== int tlen; cg_name fl; cg_type typ; if( sym->ns.flags & SY_SUBSCRIPTED ) { typ = ArrayPtrType( sym ); tlen = BETypeLength( typ ); } else { tlen = BETypeLength( T_CHAR ); typ = T_CHAR; } fl = StructRef( CGFEName( sym, typ ), tlen ); return( CGUnary( O_POINTS, fl, T_UINT_2 ) ); }
void FCAdvFillLo( void ) { //===================== // Fill lo bound of a dimension. sym_id arr; int lo_offset; cg_name adv; cg_name lo; unsigned ss; arr = GetPtr(); adv = GetAdv( arr ); ss = GetU16(); lo = GetTypedValue(); lo_offset = (ss - 1) * BETypeLength( TY_ADV_ENTRY ); CGDone( CGAssign( StructRef( adv, lo_offset ), lo, TY_ADV_LO ) ); }
static cg_name LoBound( sym_id arr, int ss_offset ) { //==================================================== // Get lo bound from ADV. cg_name lo_bound; act_dim_list *dim_ptr; dim_ptr = arr->u.ns.si.va.u.dim_ext; if( _LoConstBound( dim_ptr->dim_flags, ss_offset + 1 ) ) { lo_bound = CGInteger( ((intstar4 *)(&dim_ptr->subs_1_lo))[2*ss_offset], TY_INT_4 ); } else { lo_bound = CGUnary( O_POINTS, StructRef( GetAdv( arr ), ss_offset*BETypeLength( TY_ADV_ENTRY ) ), TY_ADV_LO ); } return( lo_bound ); }