@ -3267,11 +3267,12 @@ static bool liveness_pass_2(TCGContext *s)
static void temp_allocate_frame ( TCGContext * s , TCGTemp * ts )
{
int size = tcg_type_size ( ts - > type ) ;
int align ;
intptr_t off ;
int size , align ;
switch ( ts - > type ) {
/* When allocating an object, look at the full type. */
size = tcg_type_size ( ts - > base_type ) ;
switch ( ts - > base_type ) {
case TCG_TYPE_I32 :
align = 4 ;
break ;
@ -3302,13 +3303,30 @@ static void temp_allocate_frame(TCGContext *s, TCGTemp *ts)
tcg_raise_tb_overflow ( s ) ;
}
s - > current_frame_offset = off + size ;
ts - > mem_offset = off ;
# if defined(__sparc__)
ts - > mem_ offset + = TCG_TARGET_STACK_BIAS ;
off + = TCG_TARGET_STACK_BIAS ;
# endif
ts - > mem_base = s - > frame_temp ;
ts - > mem_allocated = 1 ;
/* If the object was subdivided, assign memory to all the parts. */
if ( ts - > base_type ! = ts - > type ) {
int part_size = tcg_type_size ( ts - > type ) ;
int part_count = size / part_size ;
/*
* Each part is allocated sequentially in tcg_temp_new_internal .
* Jump back to the first part by subtracting the current index .
*/
ts - = ts - > temp_subindex ;
for ( int i = 0 ; i < part_count ; + + i ) {
ts [ i ] . mem_offset = off + i * part_size ;
ts [ i ] . mem_base = s - > frame_temp ;
ts [ i ] . mem_allocated = 1 ;
}
} else {
ts - > mem_offset = off ;
ts - > mem_base = s - > frame_temp ;
ts - > mem_allocated = 1 ;
}
}
/* Assign @reg to @ts, and update reg_to_temp[]. */