Branch: Tag:

2014-09-01

2014-09-01 11:48:11 by Per Hedbor <ph@opera.com>

For now -- Give up entirely doing / and % with negative integers

x86 is round-to-0, and pike expects round-to-negative-infinity.

This can be fixed in the opcodes, but it is somewhat harder than simply ignoring it for now. :)

1925:    amd64_call_c_opcode(addr, flags);    jmp(&label_C);    LABEL_B; +  mov_imm_mem(PIKE_T_INT, sp_reg, SVAL(-1).type );    neg_mem(sp_reg, SVAL(-1).value );    jo(&label_D);    LABEL_C;
1948:    }    return;    -  case F_DIVIDE: +     case F_MOD: -  +  case F_DIVIDE:    {    LABELS();    if_not_two_int(&label_A,0);    mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RBX );    mov_mem_reg(sp_reg, SVAL(-2).value, P_REG_RAX ); -  +  cmp_reg_imm(P_REG_RAX, 0 ); jl(&label_A);    if( b+F_OFFSET == F_MOD )    { -  cmp_reg_imm(P_REG_RAX, 0 ); -  /* FIXME: Emulate pikes % functionality. */ -  jl(&label_A); +  /* Emulates pikes % functionality. */ +  cmp_reg_imm(P_REG_RBX, 0 ); jl(&label_A);    }    cmp_reg_imm(P_REG_RBX,0);    je(&label_A);
3042:    return;       case F_MOD_INT: +  if( b < 0 ) +  break;    case F_DIVIDE_INT:    if( b == 0 )    {
3062:    {    /* 64bit imm not done. */    cmp_reg_imm(P_REG_RAX,-0x80000000); -  jl(&label_A); +  jle(&label_A);    } -  else if( a == F_MOD_INT ) +  /*if( a == F_MOD_INT )*/    {    cmp_reg_imm(P_REG_RAX, 0);    jl(&label_A);