Branch: Tag:

2014-12-04

2014-12-04 19:27:15 by Per Hedbor <ph@opera.com>

Removed CLEAR_2_LOCAL & CLEAR_4_LOCAL, added CLEAR_N_LOCAL

This simplifies things a bit, and reduces codesize at times.

The record I have seen while running the testsuite was a clear_n_local(23).

2757:    amd64_push_svaluep(P_REG_RCX);    return;    -  case F_CLEAR_4_LOCAL: -  { -  LABELS(); -  ins_debug_instr_prologue(a-F_OFFSET, b, 0); -  amd64_load_fp_reg(); -  mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), P_REG_RBX); -  add_reg_imm(P_REG_RBX, b*sizeof(struct svalue)); -  mov_imm_reg(3, P_REG_R8 ); -  /* need to use a saving register for the counter. */ -  -  LABEL_A; -  amd64_free_svalue(P_REG_RBX, 0); -  mov_imm_mem(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, tu.t.type)); -  mov_imm_mem(0, P_REG_RBX, OFFSETOF(svalue, u.integer)); -  add_reg_imm(P_REG_RBX, sizeof(struct svalue ) ); -  add_reg_imm(P_REG_R8,-1); -  jnz(&label_A); -  } -  return; -  -  case F_CLEAR_2_LOCAL: +     case F_CLEAR_LOCAL: -  ins_debug_instr_prologue(a-F_OFFSET, b, 0); -  amd64_load_fp_reg(); -  mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), P_REG_RBX); -  add_reg_imm(P_REG_RBX, b*sizeof(struct svalue)); -  amd64_free_svalue(P_REG_RBX, 0); -  mov_imm_mem(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, tu.t.type)); -  mov_imm_mem(0, P_REG_RBX, OFFSETOF(svalue, u.integer)); -  if( a == F_CLEAR_2_LOCAL ) -  { -  add_reg_imm( P_REG_RBX, sizeof(struct svalue ) ); -  amd64_free_svalue(P_REG_RBX, 0); -  mov_imm_mem(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, tu.t.type)); -  mov_imm_mem(0, P_REG_RBX, OFFSETOF(svalue, u.integer)); -  } +  ins_f_byte_with_2_args( F_CLEAR_N_LOCAL, b, 1 );    return;       case F_INC_LOCAL_AND_POP:
3097:    ins_f_byte(F_MARK);    ins_f_byte_with_2_args(F_EXTERNAL, b, c);    return; +  +  case F_CLEAR_N_LOCAL: +  { +  LABELS(); +  ins_debug_instr_prologue(a-F_OFFSET, b, 0); +  amd64_load_fp_reg(); +  mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), P_REG_RBX); +  add_reg_imm(P_REG_RBX, b*sizeof(struct svalue)); +  if( c > 1 ) +  add_reg_imm_reg(P_REG_RBX, c*sizeof(struct svalue), P_REG_RBP ); +  +  LABEL_A; +  amd64_free_svalue(P_REG_RBX, 0); +  mov_imm_mem(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, tu.t.type)); +  mov_imm_mem(0, P_REG_RBX, OFFSETOF(svalue, u.integer)); +  if( c > 1 ) +  { +  add_reg_imm(P_REG_RBX, sizeof(struct svalue ) ); +  cmp_reg_reg( P_REG_RBX, P_REG_RBP ); +  jne(&label_A); +  } +  } +  return; +     case F_LOCAL_LOCAL_INDEX:    {    LABELS();