Branch: Tag:

2012-06-28

2012-06-28 21:55:02 by Per Hedbor <ph@opera.com>

[compiler][amd64] Added instr_prologue in a lot of places.

Also, load sp register more consistently, and only when
actually needed.

49:   #define ARG6_REG REG_R9   #endif    + static enum amd64_reg sp_reg = -1, fp_reg = -1, mark_sp_reg = -1; + static int dirty_regs = 0, ret_for_func = 0; + ptrdiff_t amd64_prev_stored_pc = -1; /* PROG_PC at the last point Pike_fp->pc was updated. */ + static int branch_check_threads_update_etc = -1;    -  +    #define MAX_LABEL_USES 6   struct label {    int n_label_uses;
894:    amd64_flush_code_generator_state();   }    - static enum amd64_reg sp_reg = -1, fp_reg = -1, mark_sp_reg = -1; - static int dirty_regs = 0, ret_for_func = 0; - ptrdiff_t amd64_prev_stored_pc = -1; /* PROG_PC at the last point Pike_fp->pc was updated. */ - static int branch_check_threads_update_etc = -1; -  -  +    void amd64_flush_code_generator_state(void)   {    sp_reg = -1;
1142:    amd64_free_svalue(ARG1_REG, 0);       /* Copy sp[-1] -> local */ +  amd64_load_sp_reg();    mov_mem_reg(sp_reg, -1*sizeof(struct svalue), REG_RAX);    mov_mem_reg(sp_reg, -1*sizeof(struct svalue)+sizeof(long), REG_RCX);   
1195:   void amd64_update_pc(void)   {    INT32 tmp = PIKE_PC, disp; +  const enum amd64_reg tmp_reg = REG_RAX;       if(amd64_prev_stored_pc == - 1)    { -  enum amd64_reg tmp_reg = REG_RAX; +     amd64_load_fp_reg();    mov_rip_imm_reg(tmp - PIKE_PC, tmp_reg);    mov_reg_mem(tmp_reg, fp_reg, OFFSETOF(pike_frame, pc));
1406:    switch(b + F_OFFSET)    {    case F_DUP: -  amd64_load_sp_reg(); +     ins_debug_instr_prologue(b, 0, 0); -  +  amd64_load_sp_reg();    add_reg_imm_reg(sp_reg, -sizeof(struct svalue), REG_R10 );    amd64_push_svaluep( REG_R10 );    return;
1416: Inside #if 0
   case F_ESCAPE_CATCH:       case F_EXIT_CATCH: +  ins_debug_instr_prologue(b, 0, 0);    ins_f_byte( F_ESCAPE_CATCH );    amd64_load_sp_reg();    amd64_push_int( 0, 1 );
1432:    */    case F_LTOSVAL2_AND_FREE:    { +  ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    mov_mem8_reg( sp_reg, -3*sizeof(struct svalue), REG_RBX );    cmp_reg_imm( REG_RBX, T_SVALUE_PTR );
1477:       case F_LTOSVAL:    { +  ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    mov_mem8_reg( sp_reg, -sizeof(struct svalue)*2, REG_RAX );    /* lval type in RAX. */
1497:    mov_reg_reg( sp_reg, ARG1_REG );    add_reg_imm_reg( sp_reg, -2*sizeof(struct svalue), ARG2_REG );    amd64_call_c_function(lvalue_to_svalue_no_free); +  amd64_load_sp_reg();    amd64_add_sp(1);    jmp(&label_B);    LABEL_A;
1508:    return;    case F_ASSIGN:    { +  ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    mov_mem8_reg( sp_reg, -3*sizeof(struct svalue), REG_RAX );    cmp_reg_imm( REG_RAX, T_SVALUE_PTR );
1543:    return;    case F_ASSIGN_AND_POP:    { +  ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    mov_mem8_reg( sp_reg, -3*sizeof(struct svalue), REG_RAX );    cmp_reg_imm( REG_RAX, T_SVALUE_PTR );
1576:    return;    case F_ADD_INTS:    { -  amd64_load_sp_reg(); +     ins_debug_instr_prologue(b, 0, 0); -  +  amd64_load_sp_reg();    mov_mem8_reg( sp_reg, -sizeof(struct svalue)*2, REG_RAX );    shl_reg_imm( REG_RAX, 8 );    mov_mem8_reg( sp_reg,-sizeof(struct svalue), REG_RBX );
1616:    /*    pike_sp[-1] = pike_sp[-2]    */ +  ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    add_reg_imm_reg( sp_reg, -2*sizeof(struct svalue), REG_RCX );    mov_mem128_reg( REG_RCX, 0, REG_XMM0 );
1641:    /*    pike_sp[-2][pike_sp[-1]]    */ +  ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    mov_mem8_reg( sp_reg, -2*sizeof(struct svalue), REG_RAX );    mov_mem8_reg( sp_reg, -1*sizeof(struct svalue), REG_RBX );
1747:    case F_ZERO_TYPE:    {    LABELS(); +  ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    mov_mem32_reg( sp_reg, -sizeof(struct svalue), REG_RAX );    /* Rax now has type + subtype. */
1831:    LABEL_B;    amd64_add_sp( -1 );    amd64_free_svalue( sp_reg, 0 ); +  amd64_load_sp_reg();    LABEL_A;    cmp_reg_reg(REG_RBX, sp_reg);    jl(&label_B);
1841:    case F_DUMB_RETURN:    {    LABELS(); +  ins_debug_instr_prologue(b, 0, 0);    amd64_load_fp_reg();    /* Note: really mem16, but we & with PIKE_FRAME_RETURN_INTERNAL anyway */    mov_mem32_reg( fp_reg, OFFSETOF(pike_frame, flags), REG_RAX );
1971:    /* function or object. Use svalue_is_true. */    add_reg_imm_reg(sp_reg, -sizeof(struct svalue), ARG1_REG );    amd64_call_c_function(svalue_is_true); +  amd64_load_sp_reg();    mov_reg_reg( REG_RAX, REG_RBX );    amd64_add_sp( -1 );    amd64_free_svalue( sp_reg, 0 ); /* Pop the stack. */
1990:    return jnz_imm_rel32(0);       case F_FOREACH: +  START_JUMP();    /* -4: array    -3: lvalue[0]    -2: lvalue[1]
2047:    return jnz_imm_rel32(0);       case F_LOOP: +  START_JUMP();    /* counter in pike_sp-1 */    /* decrement until 0. */    /* if not 0, branch */    /* otherwise, pop */ -  START_JUMP(); +     amd64_load_sp_reg();    mov_mem32_reg( sp_reg, -sizeof(struct svalue), REG_RAX );    /* Is it a normal integer? subtype -> 0, type -> PIKE_T_INT */
2090:    case F_BRANCH_WHEN_EQ: /* sp[-2] != sp[-1] */    case F_BRANCH_WHEN_NE: /* sp[-2] != sp[-1] */   /* START_JUMP();*/ +  ins_debug_instr_prologue(op, 0, 0);    amd64_load_sp_reg();    mov_mem16_reg( sp_reg, -sizeof(struct svalue), REG_RAX );    mov_mem16_reg( sp_reg, -sizeof(struct svalue)*2,REG_RBX );
2127:    /* Free sp_reg */    mov_reg_reg( sp_reg, ARG1_REG );    amd64_call_c_function( really_free_svalue ); +  amd64_load_sp_reg();    LABEL_C;    add_reg_imm_reg( sp_reg, sizeof(struct svalue), ARG1_REG );    mov_mem_reg( ARG1_REG, OFFSETOF(svalue,u.refs), REG_RAX );
2193:    case F_THIS_OBJECT:    if( b == 0 )    { +  ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_push_this_object();    return;    }    break; /* Fallback to C-version. */    -  +     case F_RETURN_LOCAL:    /* FIXME: The C version has a trick:    if locals+b < expendibles, pop to there
2213:    case F_NEG_INT_INDEX:    {    LABELS(); +  ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_load_sp_reg();    mov_mem8_reg( sp_reg, -1*sizeof(struct svalue), REG_RAX );    cmp_reg32_imm( REG_RAX, PIKE_T_ARRAY );
2248:    case F_POS_INT_INDEX:    {    LABELS(); +  ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_load_sp_reg();    mov_mem8_reg( sp_reg, -1*sizeof(struct svalue), REG_RAX );    cmp_reg32_imm( REG_RAX, PIKE_T_ARRAY );
2286:    /*    pike_sp[-2][pike_sp[-1]]    */ +  ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_load_sp_reg();    amd64_load_fp_reg();   
2339:    case F_ADD_INT:    {    LABELS(); +  ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_load_sp_reg();    mov_mem16_reg( sp_reg, -sizeof(struct svalue), REG_RAX );    cmp_reg32_imm( REG_RAX,PIKE_T_INT );
2457:    if( a == F_ASSIGN_GLOBAL_AND_POP )    {    /* assign done, pop. */ +  amd64_load_sp_reg();    amd64_add_sp( -1 );    amd64_free_svalue( sp_reg, 1 );    }
2493:    LABEL_B;    /* It's something else, svalue already in ARG1. */    amd64_call_c_function( pike_sizeof ); -  amd64_load_sp_reg(); +     LABEL_C;/* all done, res in RAX */    /* Store result on stack */    amd64_push_int_reg( REG_RAX );
2670:    case F_MARK_CALL_BUILTIN:    if(a == F_MARK_CALL_BUILTIN )    { +  /* Note: It is not actually possible to do ins_debug_instr_prologue +  here.    ins_debug_instr_prologue(a-F_OFFSET, b, 0); -  +  */    mov_imm_reg( 0, ARG1_REG );    }       case F_CALL_BUILTIN1:    if(a == F_CALL_BUILTIN1 )    { -  +  /* Note: It is not actually possible to do ins_debug_instr_prologue +  here.    ins_debug_instr_prologue(a-F_OFFSET, b, 0); -  +  */    mov_imm_reg( 1, ARG1_REG );    }    /* Get function pointer */
2835:    return;       case F_ADD_LOCAL_INT: -  amd64_load_sp_reg(); +     case F_ADD_LOCAL_INT_AND_POP:    {    LABELS();
2868:    {    /* push the local. */    /* We know it's an integer (since we did not use the fallback) */ +  amd64_load_sp_reg();    mov_mem_reg( ARG1_REG, OFFSETOF(svalue,u.integer), REG_RAX );    amd64_push_int_reg( REG_RAX );    }
2909:    }       case F_ASSIGN_LOCAL_NUMBER_AND_POP: -  ins_debug_instr_prologue(a-F_OFFSET, b, 0); +  ins_debug_instr_prologue(a-F_OFFSET, b, c);    amd64_load_fp_reg();    mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), ARG1_REG);    add_reg_imm( ARG1_REG,b*sizeof(struct svalue) );