From da865c0b16bdd948a93aa400249e4c883b4109a5 Mon Sep 17 00:00:00 2001 From: Per Hedbor <ph@opera.com> Date: Mon, 1 Sep 2014 13:48:11 +0200 Subject: [PATCH] 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. :) --- src/code/amd64.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/code/amd64.c b/src/code/amd64.c index 17d0e7a0a3..6123b1c1da 100644 --- a/src/code/amd64.c +++ b/src/code/amd64.c @@ -1925,6 +1925,7 @@ void ins_f_byte(unsigned int b) 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,23 +1949,23 @@ void ins_f_byte(unsigned int b) } 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); + je(&label_A); cmp_reg_imm(P_REG_RBX,-1); - jne(&label_C); + jne(&label_C); cmp_reg_imm(P_REG_RAX,0); jle(&label_A); /* FIXME: @@ -3042,6 +3043,8 @@ void ins_f_byte_with_arg(unsigned int a, INT32 b) return; case F_MOD_INT: + if( b < 0 ) + break; case F_DIVIDE_INT: if( b == 0 ) { @@ -3060,14 +3063,14 @@ void ins_f_byte_with_arg(unsigned int a, INT32 b) mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RAX); if( b == -1 ) { - /* 64bit imm not done. */ - cmp_reg_imm(P_REG_RAX,-0x80000000); - jl(&label_A); + /* 64bit imm not done. */ + cmp_reg_imm(P_REG_RAX,-0x80000000); + jle(&label_A); } - else if( a == F_MOD_INT ) + /*if( a == F_MOD_INT )*/ { - cmp_reg_imm(P_REG_RAX, 0); - jl(&label_A); + cmp_reg_imm(P_REG_RAX, 0); + jl(&label_A); } mov_imm_reg(b,P_REG_RBX); -- GitLab