static void GetArraySize( imp_image_handle *ii, imp_type_handle *it, location_context *lc ) { //Calculate size of array starting at it->array.index; dr_handle dim; array_wlk_wlk df; uint_32 base_stride; uint_32 n_el; df.ii = ii; df.it = it; df.lc = lc; df.count = 1; df.dim = 0; df.cont = FALSE; DRWalkArraySibs( it->array.index, ArrayWlk, &df ); it->array.num_elts = df.count; it->array.low = df.low; df.cont = TRUE; dim = GetArrayDim( it->array.index, 1 ); if( dim != DR_HANDLE_NUL ) { DRWalkArraySibs( dim, ArrayWlk, &df ); } it->array.dims = df.dim; it->typeinfo.size = df.count * it->array.base_stride; if( !it->array.column_major ) { base_stride = it->typeinfo.size; n_el = it->array.num_elts; base_stride = n_el ? base_stride / n_el : 0; it->array.base_stride = base_stride; } it->array.is_set = TRUE; it->array.is_based = FALSE; }
static void GetArraySubSize( imp_image_handle *ii, imp_type_handle *it, location_context *lc ) { // Calc array size one in from previous dim array_wlk_wlk df; uint_32 new_size; uint_32 base_stride; uint_32 n_el; df.ii = ii; df.it = it; df.lc = lc; df.count = 1; df.dim = 0; df.cont = FALSE; DRWalkArraySibs( it->array.index, ArrayWlk, &df ); new_size = it->typeinfo.size; n_el = it->array.num_elts; new_size = n_el ? new_size / n_el : 0; if( it->array.column_major ) { base_stride = it->array.base_stride; base_stride *= it->array.num_elts; it->array.base_stride = base_stride; } else { base_stride = it->typeinfo.size; base_stride = df.count ? base_stride / df.count : 0; it->array.base_stride = base_stride; } it->typeinfo.size = new_size; it->array.num_elts = df.count; it->array.low = df.low; --it->array.dims; it->array.is_set = TRUE; it->array.is_based = FALSE; }
static dr_handle GetArrayDim( dr_handle index, int skip ) { // Get current or next dim handle array_wlk_skip df; df.skip = skip; if( !DRWalkArraySibs( index, ArrayWlkNext, &df ) ) { index = df.curr; } else { index = DR_HANDLE_NUL; } return( index ); }
static drmem_hdl GetArrayDim( drmem_hdl index, int skip ){ // Get current or next dim handle array_wlk_skip df; df.skip = skip; if( !DRWalkArraySibs( index, ArrayWlkNext, &df ) ){ index = df.curr; }else{ index = DRMEM_HDL_NULL; } return( index ); }