pike.git / src / code / amd64.c

version» Context lines:

pike.git/src/code/amd64.c:1031:    flush_dirty_regs(); /* FIXME: Need to change LABEL handling to remove this */   }      /* Note: Uses RAX and RCX internally. reg MUST not be P_REG_RAX. */   static void amd64_push_svaluep_to(int reg, int spoff)   {    LABELS();    if( reg == P_REG_RAX )    Pike_fatal("Using RAX in push_svaluep not supported\n" );    amd64_load_sp_reg(); -  mov_mem_reg(reg, OFFSETOF(svalue, type), P_REG_RAX); +  mov_mem_reg(reg, OFFSETOF(svalue, tu.t.type), P_REG_RAX);    mov_mem_reg(reg, OFFSETOF(svalue, u.refs), P_REG_RCX); -  mov_reg_mem(P_REG_RAX, sp_reg, spoff*sizeof(struct svalue)+OFFSETOF(svalue, type)); +  mov_reg_mem(P_REG_RAX, sp_reg, +  spoff*sizeof(struct svalue)+OFFSETOF(svalue, tu.t.type));    and_reg_imm(P_REG_RAX, ~(MIN_REF_TYPE - 1) & 0x1f); -  mov_reg_mem(P_REG_RCX, sp_reg, spoff*sizeof(struct svalue)+OFFSETOF(svalue, u.refs)); +  mov_reg_mem(P_REG_RCX, sp_reg, +  spoff*sizeof(struct svalue)+OFFSETOF(svalue, u.refs));    cmp_reg32_imm(P_REG_RAX, MIN_REF_TYPE);    jne(&label_A);    add_imm_mem( 1, P_REG_RCX, OFFSETOF(pike_string, refs));    LABEL_A;   }      static void amd64_push_svaluep(int reg)   {    amd64_push_svaluep_to( reg, 0 );    amd64_add_sp( 1 );   }      static void amd64_push_int(INT64 value, int subtype)   {    amd64_load_sp_reg(); -  mov_imm_mem((subtype<<16) + PIKE_T_INT, sp_reg, OFFSETOF(svalue, type)); +  mov_imm_mem((subtype<<16) + PIKE_T_INT, sp_reg, OFFSETOF(svalue, tu.t.type));    mov_imm_mem(value, sp_reg, OFFSETOF(svalue, u.integer));    amd64_add_sp( 1 );   }      static void amd64_push_int_reg(enum amd64_reg reg )   {    amd64_load_sp_reg(); -  mov_imm_mem( PIKE_T_INT, sp_reg, OFFSETOF(svalue, type)); +  mov_imm_mem( PIKE_T_INT, sp_reg, OFFSETOF(svalue, tu.t.type));    mov_reg_mem( reg, sp_reg, OFFSETOF(svalue, u.integer));    amd64_add_sp( 1 );   }      static void amd64_mark(int offset)   {    amd64_load_sp_reg();    amd64_load_mark_sp_reg();    if (offset) {    add_reg_imm_reg(sp_reg, -offset * sizeof(struct svalue), P_REG_RAX);    mov_reg_mem(P_REG_RAX, mark_sp_reg, 0);    } else {    mov_reg_mem(sp_reg, mark_sp_reg, 0);    }    amd64_add_mark_sp( 1 );   }      static void mov_sval_type(enum amd64_reg src, enum amd64_reg dst )   { -  mov_mem8_reg( src, OFFSETOF(svalue,type), dst); +  mov_mem8_reg( src, OFFSETOF(svalue, tu.t.type), dst);   /* and_reg32_imm( dst, 0x1f );*/   }         static void amd64_call_c_function(void *addr)   {    flush_dirty_regs();    call_imm(addr);   }   
pike.git/src/code/amd64.c:1203:   }      static void amd64_push_string(int strno, int subtype)   {    amd64_load_fp_reg();    amd64_load_sp_reg();    mov_mem_reg(fp_reg, OFFSETOF(pike_frame, context), P_REG_RAX);    mov_mem_reg(P_REG_RAX, OFFSETOF(inherit, prog), P_REG_RAX);    mov_mem_reg(P_REG_RAX, OFFSETOF(program, strings), P_REG_RAX);    mov_mem_reg(P_REG_RAX, strno * sizeof(struct pike_string *), P_REG_RAX); -  mov_imm_mem((subtype<<16) | PIKE_T_STRING, sp_reg, OFFSETOF(svalue, type)); +  mov_imm_mem((subtype<<16) | PIKE_T_STRING, sp_reg, +  OFFSETOF(svalue, tu.t.type));    mov_reg_mem(P_REG_RAX, sp_reg,(INT32)OFFSETOF(svalue, u.string));    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_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));    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, type)); +  mov_reg_mem(P_REG_RAX, sp_reg, OFFSETOF(svalue, tu.t.type));    amd64_add_sp(1);   }      #ifdef PIKE_DEBUG   static void amd64_stack_error(void)   {    Pike_fatal("Stack error\n");   }   #endif   
pike.git/src/code/amd64.c:1384:   }   #else /* !PIKE_DEBUG */   #define ins_debug_instr_prologue(instr, arg1, arg2) maybe_load_fp()   #endif      static void amd64_push_this_object( )   {    amd64_load_fp_reg();    amd64_load_sp_reg();    -  mov_imm_mem( PIKE_T_OBJECT, sp_reg, OFFSETOF(svalue,type)); +  mov_imm_mem( PIKE_T_OBJECT, sp_reg, OFFSETOF(svalue, tu.t.type));    mov_mem_reg( fp_reg, OFFSETOF(pike_frame, current_object), P_REG_RAX );    mov_reg_mem( P_REG_RAX, sp_reg, OFFSETOF(svalue,u.object) );    add_mem32_imm( P_REG_RAX, (INT32)OFFSETOF(object, refs), 1);    amd64_add_sp( 1 );   }      static void amd64_align()   {    while( PIKE_PC & 3 )    ib( 0x90 );
pike.git/src/code/amd64.c:1811:    /* It's something else, svalue in RBX. */    mov_reg_reg( P_REG_RBX, ARG1_REG );    amd64_call_c_function( pike_sizeof );       LABEL_C;/* all done, res in RAX */    /* free value, store result */    push( P_REG_RAX );    amd64_free_svalue( P_REG_RBX, 0 );    pop( P_REG_RAX );    mov_reg_mem(P_REG_RAX, P_REG_RBX, OFFSETOF(svalue, u.integer)); -  mov_imm_mem(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, type)); +  mov_imm_mem(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, tu.t.type));    }    return;       case F_POP_VALUE:    {    ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    amd64_add_sp( -1 );    amd64_free_svalue( sp_reg, 0 );    }
pike.git/src/code/amd64.c:1964:    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 );    }    return;       case F_CLEAR_STRING_SUBTYPE:    ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg(); -  mov_mem32_reg(sp_reg, OFFSETOF(svalue, type) - sizeof(struct svalue), +  mov_mem32_reg(sp_reg, OFFSETOF(svalue, tu.t.type) - sizeof(struct svalue),    P_REG_RAX);    /* NB: We only care about subtype 1! */    cmp_reg32_imm(P_REG_RAX, (1<<16)|PIKE_T_STRING);    jne(&label_A);    and_reg_imm(P_REG_RAX, 0x1f);    mov_reg_mem32(P_REG_RAX, -  sp_reg, OFFSETOF(svalue, type) - sizeof(struct svalue)); +  sp_reg, OFFSETOF(svalue, tu.t.type) - sizeof(struct svalue));    LABEL_A;    return;    }    amd64_call_c_opcode(addr,flags);       if (instrs[b].flags & I_RETURN) {    LABELS();       if ((b + F_OFFSET) == F_RETURN_IF_TRUE) {    /* Kludge. We must check if the ret addr is
pike.git/src/code/amd64.c:2647:    amd64_push_svaluep(P_REG_RCX);    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, type)); +  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, type)); +  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));    }    return;       case F_INC_LOCAL_AND_POP:    {    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_RCX);    add_reg_imm(P_REG_RCX, b*sizeof(struct svalue));    mov_sval_type(P_REG_RCX, P_REG_RAX);    cmp_reg32_imm(P_REG_RAX, PIKE_T_INT);    jne(&label_A);    /* Integer - Zap subtype and try just incrementing it. */ -  mov_reg_mem32(P_REG_RAX, P_REG_RCX, OFFSETOF(svalue, type)); +  mov_reg_mem32(P_REG_RAX, P_REG_RCX, OFFSETOF(svalue, tu.t.type));    add_imm_mem(1, P_REG_RCX, OFFSETOF(svalue, u.integer));    jno(&label_B);    add_imm_mem(-1, P_REG_RCX, OFFSETOF(svalue, u.integer));    LABEL_A;    /* Fallback to the C-implementation. */    update_arg1(b);    amd64_call_c_opcode(instrs[a-F_OFFSET].address,    instrs[a-F_OFFSET].flags);    LABEL_B;    }
pike.git/src/code/amd64.c:2703:    {    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_RCX);    add_reg_imm(P_REG_RCX, b*sizeof(struct svalue));    mov_sval_type(P_REG_RCX, P_REG_RAX);    cmp_reg32_imm(P_REG_RAX, PIKE_T_INT);    jne(&label_A);    /* Integer - Zap subtype and try just decrementing it. */ -  mov_reg_mem32(P_REG_RAX, P_REG_RCX, OFFSETOF(svalue, type)); +  mov_reg_mem32(P_REG_RAX, P_REG_RCX, OFFSETOF(svalue, tu.t.type));    add_imm_mem(-1, P_REG_RCX, OFFSETOF(svalue, u.integer));    jno(&label_B);    add_imm_mem(1, P_REG_RCX, OFFSETOF(svalue, u.integer));    LABEL_A;    /* Fallback to the C-implementation. */    update_arg1(b);    amd64_call_c_opcode(instrs[a-F_OFFSET].address,    instrs[a-F_OFFSET].flags);    LABEL_B;    }
pike.git/src/code/amd64.c:2839:    amd64_push_svaluep( P_REG_RCX );    return;       case F_GLOBAL_LVALUE:    ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_load_fp_reg();    amd64_load_sp_reg();       amd64_push_this_object( );    -  mov_imm_mem( T_OBJ_INDEX, sp_reg, OFFSETOF(svalue,type)); +  mov_imm_mem( T_OBJ_INDEX, sp_reg, OFFSETOF(svalue, tu.t.type));    mov_mem_reg(fp_reg, OFFSETOF(pike_frame, context), P_REG_RAX);    mov_mem16_reg( P_REG_RAX,OFFSETOF(inherit, identifier_level), P_REG_RAX);    add_reg_imm( P_REG_RAX, b );    mov_reg_mem( P_REG_RAX, sp_reg, OFFSETOF(svalue,u.identifier) );    amd64_add_sp( 1 );    return;       case F_LOCAL_LVALUE:    ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_load_fp_reg();    amd64_load_sp_reg();       /* &frame->locals[b] */    mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), P_REG_RAX);    add_reg_imm( P_REG_RAX, b*sizeof(struct svalue));    -  mov_imm_mem( T_SVALUE_PTR, sp_reg, OFFSETOF(svalue,type)); +  mov_imm_mem( T_SVALUE_PTR, sp_reg, OFFSETOF(svalue, tu.t.type));    mov_reg_mem( P_REG_RAX, sp_reg, OFFSETOF(svalue,u.lval) ); -  mov_imm_mem( T_VOID, sp_reg, OFFSETOF(svalue,type)+sizeof(struct svalue)); +  mov_imm_mem( T_VOID, sp_reg, +  OFFSETOF(svalue, tu.t.type)+sizeof(struct svalue));    amd64_add_sp( 2 );    return;       case F_PROTECT_STACK:    ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_load_fp_reg();    mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), ARG1_REG);    if (b) {    add_reg_imm_reg(ARG1_REG, sizeof(struct svalue) * b, ARG1_REG);    }
pike.git/src/code/amd64.c:2968:    amd64_load_fp_reg();    mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), ARG1_REG);    add_reg_imm( ARG1_REG, b*sizeof(struct svalue) );       /* arg1 = dst    arg2 = int    */    mov_sval_type( ARG1_REG, P_REG_RAX );    cmp_reg32_imm( P_REG_RAX, PIKE_T_INT );    jne(&label_A); /* Fallback */ -  mov_imm_mem( PIKE_T_INT, ARG1_REG, OFFSETOF(svalue,type)); +  mov_imm_mem( PIKE_T_INT, ARG1_REG, OFFSETOF(svalue, tu.t.type));    add_imm_mem( c, ARG1_REG,OFFSETOF(svalue,u.integer));    jno( &label_B);    add_imm_mem( -c, ARG1_REG,OFFSETOF(svalue,u.integer));    /* Overflow. Use C version */    LABEL_A;    update_arg2(c);    update_arg1(b);    ins_f_byte(a);    /* Push already done by C version. */    if( a == F_ADD_LOCAL_INT )
pike.git/src/code/amd64.c:3015:    mov_sval_type( ARG1_REG, P_REG_RAX );    mov_sval_type( ARG2_REG, P_REG_RBX );    shl_reg_imm( P_REG_RAX, 8 );    add_reg_reg( P_REG_RAX, P_REG_RBX );    cmp_reg32_imm( P_REG_RAX, (PIKE_T_INT<<8) | PIKE_T_INT );    jne(&label_A); /* Fallback */    mov_mem_reg( ARG2_REG, OFFSETOF(svalue,u.integer), P_REG_RAX );    add_reg_mem( P_REG_RAX, ARG1_REG, OFFSETOF(svalue,u.integer));    jo( &label_A);    /* Clear subtype */ -  mov_imm_mem( PIKE_T_INT, ARG1_REG,OFFSETOF(svalue,type)); +  mov_imm_mem( PIKE_T_INT, ARG1_REG,OFFSETOF(svalue, tu.t.type));    mov_reg_mem( P_REG_RAX, ARG1_REG, OFFSETOF(svalue,u.integer));    jmp( &label_B );       LABEL_A;    update_arg2(c);    update_arg1(b);    ins_f_byte(a); /* Will call C version */    LABEL_B;    return;    }       case F_ASSIGN_LOCAL_NUMBER_AND_POP:    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) );    mov_reg_reg( ARG1_REG, P_REG_RBX );    amd64_free_svalue(ARG1_REG, 0);    mov_imm_mem(c, P_REG_RBX, OFFSETOF(svalue, u.integer)); -  mov_imm_mem32(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, type)); +  mov_imm_mem32(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, tu.t.type));    return;       case F_LOCAL_2_GLOBAL:    ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_load_fp_reg();    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);