[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