static mad_status AddSubList( unsigned idx, const sublist_data *sub, unsigned num ) { unsigned i; unsigned j; i = RegList[idx].info.bit_start / (sizeof( unsigned_64 )*BITS_PER_BYTE); if( RegSubList[i] != NULL ) return( MS_OK ); RegSubList[i] = MCAlloc( sizeof( ppc_reg_info ) * (num+1) ); if( RegSubList[i] == NULL ) return( MS_ERR|MS_NO_MEM ); memset( RegSubList[i], 0, sizeof( ppc_reg_info ) * (num+1) ); for( j = 0; j < num; ++j ) { RegSubList[i][j] = RegList[idx]; RegSubList[i][j].info.name = sub[j].name; RegSubList[i][j].info.type = sub[j].mth; RegSubList[i][j].info.bit_start += sub[j].start; RegSubList[i][j].info.bit_size = TypeArray[ sub[j].mth ].u.b->bits; RegSubList[i][j].sublist_code = RS_NONE; } return( MS_OK ); }
mad_status RegInit() { unsigned i; unsigned max; unsigned curr; unsigned half_idx = 0; mad_status ms; max = 0; for( i = 0; i < NUM_ELTS( RegList ); ++i ) { switch( RegList[i].sublist_code ) { case RS_DWORD: curr = TYPEIDX( RegList[i].info.bit_start, unsigned_64 ); if( curr > max ) max = curr; RegListHalf[half_idx] = RegList[i]; #if defined( __BIG_ENDIAN__ ) // kludge for 64-bit registers displayed as 32-bit - need to // skip 32 bits! RegListHalf[half_idx].info.bit_start += 32; #endif RegListHalf[half_idx].info.bit_size = 32; ++half_idx; break; } } RegSubList = MCAlloc( ( max + 1 ) * sizeof( *RegSubList ) ); if( RegSubList == NULL ) return( MS_ERR | MS_NO_MEM ); memset( RegSubList, 0, ( max + 1 ) * sizeof( *RegSubList ) ); for( i = 0; i < NUM_ELTS( RegList ); ++i ) { switch( RegList[i].sublist_code ) { case RS_DWORD: ms = AddSubList( i, IntRegSubData, NUM_ELTS( IntRegSubData ) ); if( ms != MS_OK ) return( ms ); break; } } return( MS_OK ); }
mad_status RegInit( void ) { unsigned i; unsigned max; unsigned curr; mad_status ms; max = 0; for( i = 0; i < NUM_ELTS( RegList ); ++i ) { switch( RegList[i].sublist_code ) { case RS_INT: case RS_FLT: curr = TYPEIDX( RegList[i].info.bit_start, axpreg ); if( curr > max ) max = curr; break; } } RegSubList = MCAlloc( ( max + 1 ) * sizeof( *RegSubList ) ); if( RegSubList == NULL ) return( MS_ERR | MS_NO_MEM ); memset( RegSubList, 0, ( max + 1 ) * sizeof( *RegSubList ) ); for( i = 0; i < NUM_ELTS( RegList ); ++i ) { switch( RegList[i].sublist_code ) { case RS_INT: ms = AddSubList( i, IntRegSubData, NUM_ELTS( IntRegSubData ) ); if( ms != MS_OK ) return( ms ); break; case RS_FLT: ms = AddSubList( i, FltRegSubData, NUM_ELTS( FltRegSubData ) ); if( ms != MS_OK ) return( ms ); break; } } return( MS_OK ); }