All --

I've updated my mod patch to work with the latest CVS...


Regards,

-- 
 _____________________________________________________________________ 
/     perl -e 'srand(-2091643526); print chr rand 90 for (0..4)'      \

   Gregor N. Purdy                          [EMAIL PROTECTED]
   Focus Research, Inc.                http://www.focusresearch.com/
   8080 Beckett Center Drive #203                   513-860-3570 vox
   West Chester, OH 45069                           513-860-3579 fax
\_____________________________________________________________________/
? tryme
? mod.c
? mod.patch
Index: basic_opcodes.ops
===================================================================
RCS file: /home/perlcvs/parrot/basic_opcodes.ops,v
retrieving revision 1.29
diff -a -u -r1.29 basic_opcodes.ops
--- basic_opcodes.ops   2001/10/02 14:01:30     1.29
+++ basic_opcodes.ops   2001/10/03 12:30:16
@@ -7,6 +7,13 @@
 #include "parrot/parrot.h"
 #include <math.h>
 
+/* DEFINES to make true mod work right */
+
+#define OPP_SIGNS(x,y)     ((((x)<0)&&((y)>0))||(((x)>0)&&((y)<0)))
+#define REM_INC(x,y)       (((x)%(y))?1:0)
+#define INT_FLOOR_DIV(x,y) (OPP_SIGNS(x,y)?(-((-x)/(y)+REM_INC((-x),(y)))):((x)/(y)))
+#define INT_MOD(x,y)       (((y)==0)?(x):((x)-(y)*INT_FLOOR_DIV((x),(y))))
+
 /* SET Ix, CONSTANT */
 AUTO_OP set_i_ic {
   INT_REG(P1) = P2;
@@ -43,8 +50,12 @@
 
 /* MOD Ix, Iy, Iz   */
 AUTO_OP mod_i {
-  INT_REG(P1) = INT_REG(P2) %
-                           INT_REG(P3);
+  INT_REG(P1) = INT_MOD(INT_REG(P2), INT_REG(P3));
+}
+
+/* CMOD Ix, Iy, Iz   */
+AUTO_OP cmod_i {
+  INT_REG(P1) = INT_REG(P2) % INT_REG(P3);
 }
 
 /* EQ Ix, Iy, EQ_BRANCH */
@@ -221,6 +232,18 @@
 AUTO_OP div_n {
   NUM_REG(P1) = NUM_REG(P2) /
                            NUM_REG(P3);
+}
+
+/* MOD Nx, Ny, Nz   */
+AUTO_OP mod_n {
+  NUM_REG(P1) = NUM_REG(P3)
+    ? (NUM_REG(P2) - NUM_REG(P3) * floor(NUM_REG(P2) / NUM_REG(P3)))
+    : NUM_REG(P2);
+}
+
+/* CMOD Nx, Ny, Nz   */
+AUTO_OP cmod_n {
+  NUM_REG(P1) = fmod(NUM_REG(P2), NUM_REG(P3));
 }
 
 /* EQ Nx, Ny, EQ_BRANCH */
Index: opcode_table
===================================================================
RCS file: /home/perlcvs/parrot/opcode_table,v
retrieving revision 1.22
diff -a -u -r1.22 opcode_table
--- opcode_table        2001/09/24 16:27:48     1.22
+++ opcode_table        2001/10/03 12:30:16
@@ -36,6 +36,7 @@
 mul_i  3       I I I
 div_i  3       I I I
 mod_i  3       I I I
+cmod_i 3       I I I
 inc_i  1       I
 inc_i_ic       2       I i
 dec_i  1       I
@@ -49,6 +50,8 @@
 sub_n  3       N N N
 mul_n  3       N N N
 div_n  3       N N N
+mod_n  3       N N N
+cmod_n 3       N N N
 inc_n  1       N
 inc_n_nc       2       N n
 dec_n  1       N
Index: t/op/integer.t
===================================================================
RCS file: /home/perlcvs/parrot/t/op/integer.t,v
retrieving revision 1.7
diff -a -u -r1.7 integer.t
--- t/op/integer.t      2001/09/26 18:13:50     1.7
+++ t/op/integer.t      2001/10/03 12:30:17
@@ -1,6 +1,6 @@
 #! perl -w
 
-use Parrot::Test tests => 26;
+use Parrot::Test tests => 27;
 
 output_is(<<CODE, <<OUTPUT, "set_i_ic");
        # XXX: Need a test for writing outside the set of available
@@ -219,21 +219,55 @@
 OUTPUT
 
 output_is(<<CODE, <<OUTPUT, "mod_i");
-       set     I0, 17
-       set     I1, 5
+       set     I0, 5
+       set     I1, 0
        mod     I2, I0, I1
        print   I2
        print   "\\n"
 
-       set     I0, -57
-       set     I1, 10
+       set     I0, 5
+       set     I1, 3
        mod     I2, I0, I1
        print   I2
        print   "\\n"
+
+       set     I0, 5
+       set     I1, -3
+       mod     I2, I0, I1
+       print   I2
+       print   "\\n"
+
+       set     I0, -5
+       set     I1, 3
+       mod     I2, I0, I1
+       print   I2
+       print   "\\n"
+
+       set     I0, -5
+       set     I1, -3
+       mod     I2, I0, I1
+       print   I2
+       print   "\\n"
+
+        end
+CODE
+5
+2
+-1
+1
+-2
+OUTPUT
+
+output_is(<<CODE, <<OUTPUT, "cmod_i");
+       set     I0, 5
+       set     I1, 3
+       mod     I2, I0, I1
+       print   I2
+       print   "\\n"
+
         end
 CODE
 2
--7
 OUTPUT
 
 output_is(<<CODE, <<OUTPUT, "eq_i_ic");
Index: t/op/number.t
===================================================================
RCS file: /home/perlcvs/parrot/t/op/number.t,v
retrieving revision 1.7
diff -a -u -r1.7 number.t
--- t/op/number.t       2001/09/24 18:08:50     1.7
+++ t/op/number.t       2001/10/03 12:30:17
@@ -1,6 +1,6 @@
 #! perl -w
 
-use Parrot::Test tests => 25;
+use Parrot::Test tests => 27;
 
 output_is(<<CODE, <<OUTPUT, "set_n_nc");
        set     N0, 1.0
@@ -194,6 +194,58 @@
 -2.250000
 OUTPUT
 
+output_is(<<CODE, <<OUTPUT, "mod_n");
+       set     N0, 5.0
+       set     N1, 0.0
+       mod     N2, N0, N1
+       print   N2
+       print   "\\n"
+
+       set     N0, 5.0
+       set     N1, 3.0
+       mod     N2, N0, N1
+       print   N2
+       print   "\\n"
+
+       set     N0, 5.0
+       set     N1, -3.0
+       mod     N2, N0, N1
+       print   N2
+       print   "\\n"
+
+       set     N0, -5.0
+       set     N1, 3.0
+       mod     N2, N0, N1
+       print   N2
+       print   "\\n"
+
+       set     N0, -5.0
+       set     N1, -3.0
+       mod     N2, N0, N1
+       print   N2
+       print   "\\n"
+
+        end
+CODE
+5.000000
+2.000000
+-1.000000
+1.000000
+-2.000000
+OUTPUT
+
+output_is(<<CODE, <<OUTPUT, "cmod_n");
+       set     N0, 5.000
+       set     N1, 3.000
+       cmod    N2, N0, N1
+       print   N2
+       print   "\\n"
+
+        end
+CODE
+2.000000
+OUTPUT
+
 output_is(<<CODE, <<OUTPUT, "eq_n_ic");
        set     N0, 5.000001
        set     N1, 5.000001
@@ -679,7 +731,6 @@
 -0.500000
 0.500000
 OUTPUT
-
 
 output_is(<<CODE, <<OUTPUT, "ntoi_i_n");
        set     N0, 0.0

Reply via email to