pike.git / src / code / amd64.c

version» Context lines:

pike.git/src/code/amd64.c:2745:    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), P_REG_RAX );    and_reg32_imm( P_REG_RAX, PIKE_FRAME_RETURN_INTERNAL);    jnz( &label_A );    /* So, it is just a normal return. */ -  LABEL_B; +     /* Actually return */    flush_dirty_regs();    amd64_return_from_function(); -  /* */ +  /* inter return */    LABEL_A; -  /* We should jump to the given address. */ -  mov_mem32_reg( fp_reg, OFFSETOF(pike_frame, flags), P_REG_RAX ); -  and_reg32_imm( P_REG_RAX, PIKE_FRAME_RETURN_POP ); -  jnz( &label_C ); +     amd64_call_c_function( low_return ); -  jmp( &label_D ); +     -  LABEL_C; -  amd64_call_c_function( low_return_pop ); -  -  LABEL_D; +    #ifdef MACHINE_CODE_STACK_FRAMES    /* We know that this is a RETURN_INTERNAL frame, so we must pop    the C stack. */    amd64_pop_internal_c_frame();   #endif /* MACHINE_CODE_STACK_FRAMES */    fp_reg = -1;    amd64_load_fp_reg();    mov_mem_reg( fp_reg, OFFSETOF(pike_frame, return_addr), P_REG_RAX );    jmp_reg( P_REG_RAX );    }