[svn:parrot] r39057 - branches/tt452_reduce_mmd/src/pmc

bacek at svn.parrot.org bacek at svn.parrot.org
Fri May 22 22:13:48 UTC 2009


Author: bacek
Date: Fri May 22 22:13:47 2009
New Revision: 39057
URL: https://trac.parrot.org/parrot/changeset/39057

Log:
[pmc] Use less MULTIs in Complex.

Modified:
   branches/tt452_reduce_mmd/src/pmc/complex.pmc

Modified: branches/tt452_reduce_mmd/src/pmc/complex.pmc
==============================================================================
--- branches/tt452_reduce_mmd/src/pmc/complex.pmc	Fri May 22 22:01:04 2009	(r39056)
+++ branches/tt452_reduce_mmd/src/pmc/complex.pmc	Fri May 22 22:13:47 2009	(r39057)
@@ -703,31 +703,9 @@
 
 */
 
-    MULTI PMC *add(Complex value, PMC *dest) {
-        FLOATVAL self_re, self_im, val_re, val_im;
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, self_re);
-        GET_ATTR_im(INTERP, SELF, self_im);
-
-        GET_ATTR_re(INTERP, value, val_re);
-        GET_ATTR_im(INTERP, value, val_im);
-
-        SET_ATTR_re(INTERP, dest, self_re + val_re);
-        SET_ATTR_im(INTERP, dest, self_im + val_im);
-
-        return dest;
-    }
-
-    MULTI PMC *add(DEFAULT value, PMC *dest) {
-        FLOATVAL re, im;
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-        SET_ATTR_re(INTERP, dest, re + VTABLE_get_number(INTERP, value));
-        SET_ATTR_im(INTERP, dest, im);
-
+    VTABLE PMC *add(PMC *value, PMC *dest) {
+        dest = VTABLE_clone(INTERP, SELF);
+        VTABLE_i_add(INTERP, dest, value);
         return dest;
     }
 
@@ -736,35 +714,21 @@
     }
 
     VTABLE PMC *add_float(FLOATVAL value, PMC *dest) {
-        FLOATVAL re, im;
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-        SET_ATTR_re(INTERP, dest, re + value);
-        SET_ATTR_im(INTERP, dest, im);
-
+        dest = VTABLE_clone(INTERP, SELF);
+        VTABLE_i_add_float(INTERP, dest, value);
         return dest;
     }
 
-    MULTI void i_add(Complex value) {
-        FLOATVAL self_re, self_im, val_re, val_im;
-
-        GET_ATTR_re(INTERP, SELF, self_re);
-        GET_ATTR_im(INTERP, SELF, self_im);
-
-        GET_ATTR_re(INTERP, value, val_re);
-        GET_ATTR_im(INTERP, value, val_im);
-
-        SET_ATTR_re(INTERP, SELF, self_re + val_re);
-        SET_ATTR_im(INTERP, SELF, self_im + val_im);
-    }
-
-    MULTI void i_add(DEFAULT value) {
-        FLOATVAL re;
-
-        GET_ATTR_re(INTERP, SELF, re);
-        SET_ATTR_re(INTERP, SELF, re + VTABLE_get_number(INTERP, value));
+    VTABLE void i_add(PMC *value) {
+        switch (value->vtable->base_type) {
+            case enum_class_Complex:
+                PARROT_COMPLEX(SELF)->re += PARROT_COMPLEX(value)->re;
+                PARROT_COMPLEX(SELF)->im += PARROT_COMPLEX(value)->im;
+                break;
+            default:
+                PARROT_COMPLEX(SELF)->re += VTABLE_get_number(INTERP, value);
+                break;
+        }
     }
 
     VTABLE void i_add_int(INTVAL value) {
@@ -792,31 +756,9 @@
 
 */
 
-    MULTI PMC *subtract(Complex value, PMC *dest) {
-        FLOATVAL self_re, self_im, val_re, val_im;
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, self_re);
-        GET_ATTR_im(INTERP, SELF, self_im);
-
-        GET_ATTR_re(INTERP, value, val_re);
-        GET_ATTR_im(INTERP, value, val_im);
-
-        SET_ATTR_re(INTERP, dest, self_re - val_re);
-        SET_ATTR_im(INTERP, dest, self_im - val_im);
-
-        return dest;
-    }
-
-    MULTI PMC *subtract(DEFAULT value, PMC *dest) {
-        FLOATVAL re, im;
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-        SET_ATTR_re(INTERP, dest, re - VTABLE_get_number(INTERP, value));
-        SET_ATTR_im(INTERP, dest, im);
-
+    VTABLE PMC *subtract(PMC *value, PMC *dest) {
+        dest = VTABLE_clone(INTERP, SELF);
+        VTABLE_i_subtract(INTERP, dest, value);
         return dest;
     }
 
@@ -825,35 +767,21 @@
     }
 
     VTABLE PMC *subtract_float(FLOATVAL value, PMC *dest) {
-        FLOATVAL re, im;
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-        SET_ATTR_re(INTERP, dest, re - value);
-        SET_ATTR_im(INTERP, dest, im);
-
+        dest = VTABLE_clone(INTERP, SELF);
+        VTABLE_i_subtract_float(INTERP, dest, value);
         return dest;
     }
 
-    MULTI void i_subtract(Complex value) {
-        FLOATVAL self_re, self_im, val_re, val_im;
-
-        GET_ATTR_re(INTERP, SELF, self_re);
-        GET_ATTR_im(INTERP, SELF, self_im);
-
-        GET_ATTR_re(INTERP, value, val_re);
-        GET_ATTR_im(INTERP, value, val_im);
-
-        SET_ATTR_re(INTERP, SELF, self_re - val_re);
-        SET_ATTR_im(INTERP, SELF, self_im - val_im);
-    }
-
-    MULTI void i_subtract(DEFAULT value) {
-        FLOATVAL re;
-
-        GET_ATTR_re(INTERP, SELF, re);
-        SET_ATTR_re(INTERP, SELF, re - VTABLE_get_number(INTERP, value));
+    VTABLE void i_subtract(PMC *value) {
+        switch (value->vtable->base_type) {
+            case enum_class_Complex:
+                PARROT_COMPLEX(SELF)->re -= PARROT_COMPLEX(value)->re;
+                PARROT_COMPLEX(SELF)->im -= PARROT_COMPLEX(value)->im;
+                break;
+            default:
+                PARROT_COMPLEX(SELF)->re -= VTABLE_get_number(INTERP, value);
+                break;
+        }
     }
 
     VTABLE void i_subtract_int(INTVAL value) {
@@ -894,30 +822,9 @@
   (a+bi)(c+di)=(ac-bd)+i(ad+bc)
 
 */
-    MULTI PMC *multiply(Complex value, PMC *dest) {
-        FLOATVAL a, b, c, d;
-
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, a);
-        GET_ATTR_im(INTERP, SELF, b);
-        GET_ATTR_re(INTERP, value, c);
-        GET_ATTR_im(INTERP, value, d);
-        SET_ATTR_re(INTERP, dest, a * c - b * d);
-        SET_ATTR_im(INTERP, dest, a * d + b * c);
-
-        return dest;
-    }
-
-    MULTI PMC *multiply(DEFAULT value, PMC *dest) {
-        FLOATVAL re, im;
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-        SET_ATTR_re(INTERP, dest, re * VTABLE_get_number(INTERP, value));
-        SET_ATTR_im(INTERP, dest, im * VTABLE_get_number(INTERP, value));
-
+    VTABLE PMC *multiply(PMC *value, PMC *dest) {
+        dest = VTABLE_clone(INTERP, SELF);
+        VTABLE_i_multiply(INTERP, dest, value);
         return dest;
     }
 
@@ -926,44 +833,40 @@
     }
 
     VTABLE PMC *multiply_float(FLOATVAL value, PMC *dest) {
-        FLOATVAL re, im;
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-        SET_ATTR_re(INTERP, dest, re * value);
-        SET_ATTR_im(INTERP, dest, im * value);
-
+        dest = VTABLE_clone(INTERP, SELF);
+        VTABLE_i_multiply_float(INTERP, dest, value);
         return dest;
     }
 
-    MULTI void i_multiply(Complex value) {
-        FLOATVAL a, b, c, d;
-
-        GET_ATTR_re(INTERP, SELF, a);
-        GET_ATTR_im(INTERP, SELF, b);
-        GET_ATTR_re(INTERP, value, c);
-        GET_ATTR_im(INTERP, value, d);
-        SET_ATTR_re(INTERP, SELF, a * c - b * d);
-        SET_ATTR_im(INTERP, SELF, a * d + b * c);
-    }
-
-    MULTI void i_multiply(DEFAULT value) {
-        FLOATVAL re, im;
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-        SET_ATTR_re(INTERP, SELF, re * VTABLE_get_number(INTERP, value));
-        SET_ATTR_im(INTERP, SELF, im * VTABLE_get_number(INTERP, value));
+    VTABLE void i_multiply(PMC *value) {
+        switch (value->vtable->base_type) {
+            case enum_class_Complex:
+                {
+                    FLOATVAL a, b, c, d;
+
+                    GET_ATTR_re(INTERP, SELF, a);
+                    GET_ATTR_im(INTERP, SELF, b);
+                    GET_ATTR_re(INTERP, value, c);
+                    GET_ATTR_im(INTERP, value, d);
+                    SET_ATTR_re(INTERP, SELF, a * c - b * d);
+                    SET_ATTR_im(INTERP, SELF, a * d + b * c);
+                }
+                break;
+            default:
+                {
+                    FLOATVAL re, im;
+
+                    GET_ATTR_re(INTERP, SELF, re);
+                    GET_ATTR_im(INTERP, SELF, im);
+                    SET_ATTR_re(INTERP, SELF, re * VTABLE_get_number(INTERP, value));
+                    SET_ATTR_im(INTERP, SELF, im * VTABLE_get_number(INTERP, value));
+                }
+                break;
+        }
     }
 
     VTABLE void i_multiply_int(INTVAL value) {
-        FLOATVAL re, im;
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-        SET_ATTR_re(INTERP, SELF, re * value);
-        SET_ATTR_im(INTERP, SELF, im * value);
+        SELF.i_multiply_float(value);
     }
 
     VTABLE void i_multiply_float(FLOATVAL value) {
@@ -1005,129 +908,55 @@
 
 */
 
-    MULTI PMC *divide(Complex value, PMC *dest) {
-        FLOATVAL mod, re, im;
-        FLOATVAL self_re, self_im, val_re, val_im;
-
-        complex_check_divide_zero(INTERP, value);
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, self_re);
-        GET_ATTR_im(INTERP, SELF, self_im);
-        GET_ATTR_re(INTERP, value, val_re);
-        GET_ATTR_im(INTERP, value, val_im);
-
-        /* a little speed optimisation: cache an intermediate number;
-            I'm not sure the compiler does this */
-
-        if (self_im == 0.0 && val_im == 0.0) {
-            re = self_re / val_re;
-            im = 0.0;
-        }
-        else {
-            mod = (val_re * val_re + val_im * val_im);
-            re  = (self_re * val_re + self_im * val_im) / mod;
-            im  = (self_im * val_re - self_re * val_im) / mod;
-        }
-
-        SET_ATTR_re(INTERP, dest, re);
-        SET_ATTR_im(INTERP, dest, im);
-
-        return dest;
-    }
-
-    MULTI PMC *divide(DEFAULT value, PMC *dest) {
-        FLOATVAL re, im;
-        FLOATVAL d = VTABLE_get_number(INTERP, value);
-        float_check_divide_zero(INTERP, d);
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-
-        SET_ATTR_re(INTERP, dest, re / d);
-        SET_ATTR_im(INTERP, dest, im / d);
-
+    VTABLE PMC *divide(PMC *value, PMC *dest) {
+        dest = VTABLE_clone(INTERP, SELF);
+        VTABLE_i_divide(INTERP, dest, value);
         return dest;
     }
 
     VTABLE PMC *divide_int(INTVAL value, PMC *dest) {
-        FLOATVAL re, im;
-        int_check_divide_zero(INTERP, value);
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-
-        SET_ATTR_re(INTERP, dest, re / value);
-        SET_ATTR_im(INTERP, dest, im / value);
-
-        return dest;
+        return SELF.divide_float(value, dest);
     }
 
     VTABLE PMC *divide_float(FLOATVAL value, PMC *dest) {
-        FLOATVAL re, im;
-        float_check_divide_zero(INTERP, value);
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-
-        SET_ATTR_re(INTERP, dest, re / value);
-        SET_ATTR_im(INTERP, dest, im / value);
-
+        dest = VTABLE_clone(INTERP, SELF);
+        VTABLE_i_divide_float(INTERP, dest, value);
         return dest;
     }
 
-    MULTI void i_divide(Complex value) {
-        FLOATVAL mod, re, im;
-        FLOATVAL self_re, self_im, val_re, val_im;
-
-        complex_check_divide_zero(INTERP, value);
+    VTABLE void i_divide(PMC *value) {
+        if (VTABLE_type(INTERP, value) == enum_class_Complex) {
+            FLOATVAL mod, re, im;
+            FLOATVAL self_re, self_im, val_re, val_im;
+
+            complex_check_divide_zero(INTERP, value);
+
+            GET_ATTR_re(INTERP, SELF, self_re);
+            GET_ATTR_im(INTERP, SELF, self_im);
+            GET_ATTR_re(INTERP, value, val_re);
+            GET_ATTR_im(INTERP, value, val_im);
+
+            if (self_im == 0.0 && val_im == 0.0) {
+                re = self_re / val_re;
+                im = 0.0;
+            }
+            else {
+                /* a little speed optimisation: cache an intermediate number;
+                   I'm not sure the compiler does this */
+                mod = (val_re * val_re + val_im * val_im);
+                re  = (self_re * val_re + self_im * val_im) / mod;
+                im  = (self_im * val_re - self_re * val_im) / mod;
+            }
 
-        GET_ATTR_re(INTERP, SELF, self_re);
-        GET_ATTR_im(INTERP, SELF, self_im);
-        GET_ATTR_re(INTERP, value, val_re);
-        GET_ATTR_im(INTERP, value, val_im);
-
-        if (self_im == 0.0 && val_im == 0.0) {
-            re = self_re / val_re;
-            im = 0.0;
-        }
-        else {
-            /* a little speed optimisation: cache an intermediate number;
-               I'm not sure the compiler does this */
-            mod = (val_re * val_re + val_im * val_im);
-            re  = (self_re * val_re + self_im * val_im) / mod;
-            im  = (self_im * val_re - self_re * val_im) / mod;
+            SET_ATTR_re(INTERP, SELF, re);
+            SET_ATTR_im(INTERP, SELF, im);
         }
-
-        SET_ATTR_re(INTERP, SELF, re);
-        SET_ATTR_im(INTERP, SELF, im);
-
-    }
-
-    MULTI void i_divide(DEFAULT value) {
-        FLOATVAL re, im;
-        FLOATVAL d = VTABLE_get_number(INTERP, value);
-        float_check_divide_zero(INTERP, d);
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-
-        SET_ATTR_re(INTERP, SELF, re / d);
-        SET_ATTR_im(INTERP, SELF, im / d);
+        else
+            SELF.i_divide_float(VTABLE_get_number(INTERP, value));
     }
 
     VTABLE void i_divide_int(INTVAL value) {
-        FLOATVAL re, im;
-        int_check_divide_zero(INTERP, value);
-
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
-
-        SET_ATTR_re(INTERP, SELF, re / value);
-        SET_ATTR_im(INTERP, SELF, im / value);
+        SELF.i_divide_float(value);
     }
 
     VTABLE void i_divide_float(FLOATVAL value) {
@@ -1184,24 +1013,30 @@
 
 */
 
-    MULTI INTVAL is_equal(Complex value) {
-        FLOATVAL self_re, self_im, val_re, val_im;
-        GET_ATTR_re(INTERP, SELF, self_re);
-        GET_ATTR_im(INTERP, SELF, self_im);
-        GET_ATTR_re(INTERP, value, val_re);
-        GET_ATTR_im(INTERP, value, val_im);
-        return (INTVAL)(self_re == val_re && self_im == val_im);
-    }
-
-    MULTI INTVAL is_equal(DEFAULT value) {
-        FLOATVAL re, im;
-        GET_ATTR_re(INTERP, SELF, re);
-        GET_ATTR_im(INTERP, SELF, im);
+    VTABLE INTVAL is_equal(PMC *value) {
+        switch (value->vtable->base_type) {
+            case enum_class_Complex:
+                {
+                    FLOATVAL self_re, self_im, val_re, val_im;
+                    GET_ATTR_re(INTERP, SELF, self_re);
+                    GET_ATTR_im(INTERP, SELF, self_im);
+                    GET_ATTR_re(INTERP, value, val_re);
+                    GET_ATTR_im(INTERP, value, val_im);
+                    return (INTVAL)(self_re == val_re && self_im == val_im);
+                }
+                break;
+            default:
+                {
+                    FLOATVAL re, im;
+                    GET_ATTR_re(INTERP, SELF, re);
+                    GET_ATTR_im(INTERP, SELF, im);
 
-        if (im != 0.0)
-            return (INTVAL)0;
+                    if (im != 0.0)
+                        return (INTVAL)0;
 
-        return (re == VTABLE_get_number(INTERP, value));
+                    return (re == VTABLE_get_number(INTERP, value));
+                }
+        }
     }
 
 /*
@@ -1421,7 +1256,7 @@
         (PMC *d) = PCCINVOKE(INTERP, SELF, "sin");
         (PMC *e) = PCCINVOKE(INTERP, SELF, "cos");
 
-        Parrot_Complex_multi_i_divide_Complex(INTERP, d, e);
+        VTABLE_i_divide(INTERP, d, e);
 
         RETURN(PMC *d);
     }
@@ -1432,7 +1267,7 @@
         (PMC *d) = PCCINVOKE(INTERP, SELF, "cos");
         (PMC *e) = PCCINVOKE(INTERP, SELF, "sin");
 
-        Parrot_Complex_multi_i_divide_Complex(INTERP, d, e);
+        VTABLE_i_divide(INTERP, d, e);
 
         RETURN(PMC *d);
     }
@@ -1444,7 +1279,7 @@
         SET_ATTR_im(INTERP, d, 0.0);
         (PMC *e) = PCCINVOKE(INTERP, SELF, "cos");
 
-        Parrot_Complex_multi_i_divide_Complex(INTERP, d, e);
+        VTABLE_i_divide(INTERP, d, e);
 
         RETURN(PMC *d);
     }
@@ -1458,7 +1293,7 @@
 
         (PMC *e) = PCCINVOKE(INTERP, SELF, "sin");
 
-        Parrot_Complex_multi_i_divide_Complex(INTERP, d, e);
+        VTABLE_i_divide(INTERP, d, e);
 
         RETURN(PMC *d);
     }
@@ -1503,7 +1338,7 @@
         GET_ATTR_re(INTERP, SELF, self_re);
         GET_ATTR_im(INTERP, SELF, self_im);
 
-        e      = Parrot_Complex_multi_multiply_Complex_PMC(INTERP, SELF, SELF, e);
+        e      = VTABLE_multiply(INTERP, SELF, SELF, e);
         GET_ATTR_re(INTERP, e, e_re);
         GET_ATTR_im(INTERP, e, e_im);
         SET_ATTR_re(INTERP, e, 1.0 - e_re);
@@ -1531,7 +1366,7 @@
         GET_ATTR_re(INTERP, SELF, self_re);
         GET_ATTR_im(INTERP, SELF, self_im);
 
-        e = Parrot_Complex_multi_multiply_Complex_PMC(INTERP, SELF, SELF, e);
+        e = VTABLE_multiply(INTERP, SELF, SELF, e);
         GET_ATTR_re(INTERP, e, e_re);
         GET_ATTR_im(INTERP, e, e_im);
         SET_ATTR_re(INTERP, e, 1.0 - e_re);
@@ -1564,7 +1399,7 @@
         SET_ATTR_re(INTERP, e, -re);
         SET_ATTR_im(INTERP, e, 1 - im);
 
-        Parrot_Complex_multi_i_divide_Complex(INTERP, d, e);
+        VTABLE_i_divide(INTERP, d, e);
 
         (PMC *d) = PCCINVOKE(INTERP, d, "ln");
         GET_ATTR_re(INTERP, d, d_re);
@@ -1674,7 +1509,7 @@
         (PMC *d) = PCCINVOKE(INTERP, SELF, "sinh");
         (PMC *e) = PCCINVOKE(INTERP, SELF, "cosh");
 
-        Parrot_Complex_multi_i_divide_Complex(INTERP, d, e);
+        VTABLE_i_divide(INTERP, d, e);
 
         RETURN(PMC *d);
     }
@@ -1872,8 +1707,7 @@
         Parrot_PCCINVOKE(interp, SELF, CONST_STRING(interp, "ln"),
                     "->P", &log);
 
-        l = Parrot_Complex_multi_multiply_Complex_PMC(INTERP,
-                    log, value, l);
+        l = VTABLE_multiply(INTERP, log, value, l);
 
         Parrot_PCCINVOKE(interp, l, CONST_STRING(interp, "exp"),
                     "->P", &dest);
@@ -1889,7 +1723,7 @@
 
         Parrot_PCCINVOKE(interp, SELF, CONST_STRING(interp, "ln"),
                      "->P", &log);
-        l = Parrot_Complex_multi_multiply_DEFAULT_PMC(INTERP, log, value, l);
+        l = VTABLE_multiply(INTERP, log, value, l);
         Parrot_PCCINVOKE(interp, l, CONST_STRING(interp, "exp"),
                      "->P", &dest);
 


More information about the parrot-commits mailing list