Branch: Tag:

2014-12-04

2014-12-04 19:23:40 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Runtime: Renumbered PIKE_T_*. Breaks ppc32 and ppc64.

Renumber the low PIKE_T_* values so that PIKE_T_INT becomes zero.

This has the feature that zeroed memory becomes filled with Pike
svalues containing integer zeroes (and not NULL pointer arrays).
This will let call_c_initializers() avoid traversing the entire
identifier table for the class.

Note: The serialized representation of types (__parse_pike_type())
is unchanged. As is the {out,in}put for {en,de}code_value().

Updates the code generators for ia32 and amd64.

Breaks the code generators for ppc32 and ppc64.

1034:    mov_reg_mem(REG_RAX, sp_reg, spoff*sizeof(struct svalue)+OFFSETOF(svalue, type));    and_reg_imm(REG_RAX, 0x1f);    mov_reg_mem(REG_RCX, sp_reg, spoff*sizeof(struct svalue)+OFFSETOF(svalue, u.refs)); -  cmp_reg32_imm(REG_RAX, MAX_REF_TYPE); -  jg(&label_A); +  cmp_reg32_imm(REG_RAX, MIN_REF_TYPE); +  jl(&label_A);    add_imm_mem( 1, REG_RCX, OFFSETOF(pike_string, refs));    LABEL_A;   }
1096:    /* load type -> RAX */    mov_sval_type( src, REG_RAX );    -  /* if RAX > MAX_REF_TYPE+1 */ -  cmp_reg32_imm( REG_RAX,MAX_REF_TYPE); -  jg( &label_A ); +  /* if RAX < MIN_REF_TYPE+1 */ +  cmp_reg32_imm( REG_RAX,MIN_REF_TYPE); +  jl( &label_A );       /* Load pointer to refs -> RAX */    mov_mem_reg( src, OFFSETOF(svalue, u.refs), REG_RAX);
1121:    int guaranteed_ref )   {    LABELS(); -  /* if type > MAX_REF_TYPE+1 */ +  /* if type < MIN_REF_TYPE+1 */    if( src == REG_RAX )    Pike_fatal("Clobbering RAX for free-svalue\n");    -  cmp_reg32_imm(type,MAX_REF_TYPE); -  jg( &label_A ); +  cmp_reg32_imm(type,MIN_REF_TYPE); +  jl( &label_A );       /* Load pointer to refs -> RAX */    mov_mem_reg( src, OFFSETOF(svalue, u.refs), REG_RAX);
1153:    else    and_reg_imm( REG_RAX, 0x1f );    -  /* if RAX > MAX_REF_TYPE+1 */ -  cmp_reg32_imm(REG_RAX, MAX_REF_TYPE ); -  jg( &label_A ); +  /* if RAX > MIN_REF_TYPE+1 */ +  cmp_reg32_imm(REG_RAX, MIN_REF_TYPE ); +  jl( &label_A );    /* Load pointer to refs -> RAX */    mov_mem_reg( src, OFFSETOF(svalue, u.refs), REG_RAX);    /* *RAX++ */
2121:       /* inc refs? */    and_reg_imm( REG_RAX, 0x1f ); -  cmp_reg32_imm(REG_RAX, MAX_REF_TYPE); -  jg( &label_B ); +  cmp_reg32_imm(REG_RAX, MIN_REF_TYPE); +  jl( &label_B );    add_imm_mem( 1, REG_RCX, OFFSETOF(pike_string, refs));    jmp( &label_B );   
2206:       /* Optimization: The types are equal, pop_stack can be greatly    * simplified if they are <= max_ref_type */ -  cmp_reg32_imm( REG_RCX,MAX_REF_TYPE+1); -  jl( &label_B ); +  cmp_reg32_imm( REG_RCX,MIN_REF_TYPE); +  jge( &label_B );    /* cheap pop. We know that both are > max_ref_type */    amd64_add_sp( -2 );    jmp( &label_D );