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