pike.git / src / code / amd64.c

version» Context lines:

pike.git/src/code/amd64.c:639:    }   }      static void test_reg_reg( enum amd64_reg reg1, enum amd64_reg reg2 )   {    rex(1,reg1,0,reg2);    opcode(0x85);    modrm(3, reg1, reg2 );   }    + static void test_reg32_reg( enum amd64_reg reg1, enum amd64_reg reg2 ) + { +  rex(0,reg1,0,reg2); +  opcode(0x85); +  modrm(3, reg1, reg2 ); + } +    static void test_reg( enum amd64_reg reg1 )   {    test_reg_reg( reg1, reg1 );   }    -  + static void test_reg32( enum amd64_reg reg1 ) + { +  test_reg32_reg( reg1, reg1 ); + } +    static void cmp_reg_imm( enum amd64_reg reg, int imm32 )   {    rex(1, 0, 0, reg);    if( imm32 > 0x7f || imm32 < -0x80 )    {    if( reg == P_REG_RAX )    {    opcode( 0x3d );    id( imm32 );    }
pike.git/src/code/amd64.c:1920:    mov_imm_mem( PIKE_T_INT, sp_reg, -sizeof(struct svalue) );    mov_reg_mem( P_REG_RBX, sp_reg,    -sizeof(struct svalue)+OFFSETOF(svalue,u.integer) );    jmp( &label_B );    LABEL_A;    /* not an integer. Use C version for simplicitly.. */    amd64_call_c_opcode( addr, flags );    LABEL_B;    }    return; +  +  case F_ADD: +  { +  addr = f_add; +  update_arg1(2); +  amd64_call_c_opcode(addr, flags); +  amd64_load_sp_reg(); +  } +  return; +     case F_INC:    {    LABELS();    ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    mov_mem8_reg(sp_reg, -16, P_REG_RAX ); -  cmp_reg32_imm(P_REG_RAX, PIKE_T_INT); -  jne(&label_A); +  test_reg32(P_REG_RAX); +  jnz(&label_A);    add_imm_mem(1, sp_reg, -8);    jno(&label_B);    add_imm_mem(-1, sp_reg, -8);    LABEL_A;    amd64_call_c_opcode(addr, flags);    LABEL_B;    }    return; - #if 0 -  case F_ADD: +  +  case F_DEC:    {    LABELS();    ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg(); -  mov_mem8_reg(sp_reg, -1*sizeof(struct svalue), P_REG_RAX ); -  mov_mem8_reg(sp_reg, -2*sizeof(struct svalue), P_REG_RBX ); -  add_reg_reg(P_REG_RAX,P_REG_RBX); -  test_reg(P_REG_RAX); /* int == 0 */ - #ifdef PIKE_DEBUG -  if( PIKE_T_INT ) -  Pike_fatal("Assertion failed\n"); - #endif +  mov_mem8_reg(sp_reg, -16, P_REG_RAX ); +  test_reg32(P_REG_RAX);    jnz(&label_A); -  amd64_add_sp(-1); -  mov_mem_reg(sp_reg, OFFSETOF(svalue,u.integer), -  P_REG_RAX ); -  add_reg_mem(P_REG_RAX, sp_reg, -  -1*sizeof(struct svalue)+OFFSETOF(svalue,u.integer)); +  add_imm_mem(-1, sp_reg, -8);    jno(&label_B); -  amd64_add_sp(1); -  sub_reg_mem(P_REG_RAX, sp_reg, -  -1*sizeof(struct svalue)+OFFSETOF(svalue,u.integer)); +  add_imm_mem(1, sp_reg, -8);    LABEL_A; -  addr = f_add; -  update_arg1(2); +     amd64_call_c_opcode(addr, flags);    LABEL_B;    }    return;    -  +     case F_SUBTRACT:    {    LABELS();    ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    mov_mem8_reg(sp_reg, -1*sizeof(struct svalue), P_REG_RAX );    mov_mem8_reg(sp_reg, -2*sizeof(struct svalue), P_REG_RBX );    add_reg_reg(P_REG_RAX,P_REG_RBX); -  test_reg(P_REG_RAX); /* int == 0 */ +  test_reg32(P_REG_RAX); /* int == 0 */    jnz(&label_A);      #ifdef PIKE_DEBUG    if( PIKE_T_INT )    Pike_fatal("Assertion failed\n");   #endif    mov_mem_reg(sp_reg, -1*sizeof(struct svalue)+OFFSETOF(svalue,u.integer),    P_REG_RAX );    mov_mem_reg(sp_reg, -2*sizeof(struct svalue)+OFFSETOF(svalue,u.integer),    P_REG_RCX );
pike.git/src/code/amd64.c:2000: Inside #if 0
   amd64_call_c_opcode(o_subtract, flags);    amd64_load_sp_reg();    jmp(&label_C);    LABEL_B;    mov_reg_mem( P_REG_RCX, sp_reg,    -2*sizeof(struct svalue)+OFFSETOF(svalue,u.integer));    amd64_add_sp(-1);    LABEL_C;    }    return; - #endif -  case F_DEC: -  { -  LABELS(); -  ins_debug_instr_prologue(b, 0, 0); -  amd64_load_sp_reg(); -  mov_mem8_reg(sp_reg, -16, P_REG_RAX ); -  cmp_reg32_imm(P_REG_RAX, PIKE_T_INT); -  jne(&label_A); -  add_imm_mem(-1, sp_reg, -8); -  jno(&label_B); -  add_imm_mem(1, sp_reg, -8); -  LABEL_A; -  amd64_call_c_opcode(addr, flags); -  LABEL_B; -  } -  return; +     case F_UNDEFINED:    ins_debug_instr_prologue(b, 0, 0);    amd64_push_int(0, 1);    return;    case F_CONST0:    ins_debug_instr_prologue(b, 0, 0);    amd64_push_int(0, 0);    return;    case F_CONST1:    ins_debug_instr_prologue(b, 0, 0);
pike.git/src/code/amd64.c:2197:    } while(0)       switch( op )    {    case F_QUICK_BRANCH_WHEN_ZERO:    case F_QUICK_BRANCH_WHEN_NON_ZERO:    START_JUMP();    amd64_load_sp_reg();    amd64_add_sp( -1 );    mov_mem_reg( sp_reg, 8, P_REG_RAX ); -  test_reg(P_REG_RAX); +  test_reg32(P_REG_RAX);    if( op == F_QUICK_BRANCH_WHEN_ZERO )    return jz_imm_rel32(0);    return jnz_imm_rel32(0);       case F_BRANCH_WHEN_ZERO:    case F_BRANCH_WHEN_NON_ZERO:    START_JUMP();    amd64_load_sp_reg();    mov_mem8_reg( sp_reg, -sizeof(struct svalue), P_REG_RCX );    cmp_reg32_imm( P_REG_RCX, PIKE_T_INT ); je( &label_C );
pike.git/src/code/amd64.c:2237:    jmp( &label_B );       LABEL_C;    /* integer */    mov_mem_reg( sp_reg,    -sizeof(struct svalue)+OFFSETOF(svalue,u.integer),    P_REG_RBX );    amd64_add_sp(-1);       LABEL_B; /* Branch or not? */ -  test_reg( P_REG_RBX ); +  test_reg32( P_REG_RBX );    if( op == F_BRANCH_WHEN_ZERO )    return jz_imm_rel32(0);    return jnz_imm_rel32(0);       case F_FOREACH:    START_JUMP();    /* -4: array    -3: lvalue[0]    -2: lvalue[1]    -1: counter
pike.git/src/code/amd64.c:2304:       LABEL_C;    add_reg_imm_reg( sp_reg, -3*sizeof(struct svalue), ARG1_REG );    mov_reg_reg( P_REG_RBX, ARG2_REG );    amd64_call_c_function( assign_lvalue );    jmp(&label_B);       LABEL_A;    mov_imm_reg( 0, P_REG_RBX );    LABEL_B; -  test_reg(P_REG_RBX); +  test_reg32(P_REG_RBX);    return jnz_imm_rel32(0);       case F_LOOP:    START_JUMP();    /* counter in pike_sp-1 */    /* decrement until 0. */    /* if not 0, branch */    /* otherwise, pop */    amd64_load_sp_reg();    mov_mem32_reg( sp_reg, -sizeof(struct svalue), P_REG_RAX );
pike.git/src/code/amd64.c:2601:    amd64_call_c_opcode(instrs[a-F_OFFSET].address,    instrs[a-F_OFFSET].flags);    LABEL_C;    /* done */    }    return;          case F_ADD_NEG_INT:    b = -b; -  +     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), P_REG_RAX );    cmp_reg32_imm( P_REG_RAX,PIKE_T_INT );    jne( &label_A );    mov_mem_reg(sp_reg,    -sizeof(struct svalue)+OFFSETOF(svalue,u.integer),
pike.git/src/code/amd64.c:3230:    LABEL_B;    /* something else. */    update_arg1(b);    update_arg2(c);    amd64_call_c_opcode(instrs[a-F_OFFSET].address,    instrs[a-F_OFFSET].flags);    LABEL_C;    /* done */    }    return; +     case F_PRIVATE_IF_DIRECT_GLOBAL:    {    LABELS();    amd64_load_sp_reg();    ins_debug_instr_prologue(a-F_OFFSET, b, c);    /* do not assign if this object is destructed. */    mov_mem_reg( fp_reg, OFFSETOF(pike_frame,current_object), ARG2_REG );    mov_mem_reg( fp_reg, OFFSETOF(pike_frame,context), ARG3_REG );    /* if ctx->prog != arg1->prog */    mov_mem_reg( ARG3_REG, OFFSETOF(inherit,prog), P_REG_R8 );