pike.git / src / code / amd64.c

version» Context lines:

pike.git/src/code/amd64.c:1298:    add_imm_mem( 1, P_REG_RAX, OFFSETOF(pike_string, refs));       amd64_add_sp(1);   }      static void amd64_push_local_function(int fun)   {    amd64_load_fp_reg();    amd64_load_sp_reg();    mov_mem_reg(fp_reg, OFFSETOF(pike_frame, context), P_REG_RAX); -  mov_mem_reg(fp_reg, OFFSETOF(pike_frame, current_object), -  P_REG_RCX); +  mov_mem_reg(fp_reg, OFFSETOF(pike_frame, current_object),P_REG_RCX);    mov_mem32_reg(P_REG_RAX, OFFSETOF(inherit, identifier_level),    P_REG_RAX);    mov_reg_mem(P_REG_RCX, sp_reg, OFFSETOF(svalue, u.object));    add_reg_imm(P_REG_RAX, fun); -  add_imm_mem( 1, P_REG_RCX,(INT32)OFFSETOF(object, refs)); +  add_imm_mem(1, P_REG_RCX,(INT32)OFFSETOF(object, refs));    shl_reg_imm(P_REG_RAX, 16);    add_reg_imm(P_REG_RAX, PIKE_T_FUNCTION);    mov_reg_mem(P_REG_RAX, sp_reg, OFFSETOF(svalue, tu.t.type));    amd64_add_sp(1);   }      void amd64_update_pc(void)   {    INT32 tmp = PIKE_PC, disp;    const enum amd64_reg tmp_reg = P_REG_RAX;
pike.git/src/code/amd64.c:2372:    maybe_update_pc();    switch(a) {    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    and return.       This saves a push, and the poping has to be done anyway.    */    ins_f_byte_with_arg( F_LOCAL, b );    ins_f_byte( F_DUMB_RETURN );    return;
pike.git/src/code/amd64.c:2454:    amd64_call_c_function(really_free_array);    jmp( &label_C );       LABEL_A;    update_arg1( b );    amd64_call_c_opcode(instrs[a-F_OFFSET].address,    instrs[a-F_OFFSET].flags);    LABEL_C;    }    return; -  +     case F_LOCAL_INDEX:    {    LABELS();    /*    local[pike_sp[-1]]    */    ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_load_sp_reg();    amd64_load_fp_reg();   
pike.git/src/code/amd64.c:3363:    amd64_load_sp_reg();    mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), ARG3_REG );    add_reg_imm( ARG3_REG, c*sizeof(struct svalue) );    mov_mem_reg(fp_reg, OFFSETOF(pike_frame, current_object), ARG1_REG);    mov_mem_reg(fp_reg, OFFSETOF(pike_frame,context), ARG2_REG);    mov_mem16_reg(ARG2_REG, OFFSETOF(inherit, identifier_level), ARG2_REG);    add_reg_imm( ARG2_REG, b );    amd64_call_c_function( object_low_set_index );    return;    +  case F_LEXICAL_LOCAL: +  if( c < 5 ) +  { +  amd64_load_fp_reg(); +  mov_reg_reg( fp_reg, P_REG_RAX ); +  while(c--) +  mov_mem_reg( P_REG_RAX, OFFSETOF(pike_frame,scope), P_REG_RAX ); +  mov_mem_reg( P_REG_RAX, OFFSETOF(pike_frame,locals), P_REG_RAX ); +  add_reg_imm_reg( P_REG_RAX, b*sizeof(struct svalue), P_REG_RBX ); +  amd64_push_svaluep( P_REG_RBX ); +  return; +  } +  /* use c version. Could have a loop version here. */ +  break;    case F_LOCAL_2_LOCAL:    ins_debug_instr_prologue(a-F_OFFSET, b, c);    if( b != c )    {    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) );    /* RBX points to dst. */    amd64_free_svalue( P_REG_RBX, 0 );    /* assign rbx[0] = rbx[c-b] */