Here's a patch which adds the 'missing' opcodes from the earlier email.
It also adds the 3 arg variant of concat.
Dan/Simon/Anyone, if it seems ok, I'll commit it, but since it adds 52
op variants, I wasn't sure if it would be ok.
Brian
Ops follow----
+AUTO_OP add(i, i, ic) {
+AUTO_OP add(n, n, nc) {
+AUTO_OP cmod(i, i, ic) {
+AUTO_OP cmod(i, ic, i) {
+AUTO_OP cmod(n, n, nc) {
+AUTO_OP cmod(n, nc, n) {
+AUTO_OP div(i, i, ic) {
+AUTO_OP div(i, ic, i) {
+AUTO_OP div(n, n, nc) {
+AUTO_OP div(n, nc, n) {
+AUTO_OP mod(i, i, ic) {
+AUTO_OP mod(i, ic, i) {
+AUTO_OP mod(n, n, nc) {
+AUTO_OP mod(n, nc, n) {
+AUTO_OP mul(i, i, ic) {
+AUTO_OP mul(n, n, nc) {
+AUTO_OP pow(n, i, ic) {
+AUTO_OP pow(n, ic, i) {
+AUTO_OP pow(n, i, nc) {
+AUTO_OP pow(n, ic, n) {
+AUTO_OP pow(n, n, ic) {
+AUTO_OP pow(n, nc, i) {
+AUTO_OP pow(n, n, nc) {
+AUTO_OP pow(n, nc, n) {
+AUTO_OP sub(i, i, ic) {
+AUTO_OP sub(i, ic, i) {
+AUTO_OP sub(n, n, nc) {
+AUTO_OP sub(n, nc, n) {
+AUTO_OP chopn(s, i) {
+AUTO_OP concat(s, sc) {
+AUTO_OP concat(s, s, s) {
+AUTO_OP concat(s, s, sc) {
+AUTO_OP concat(s, sc, s) {
+AUTO_OP substr(s, s, i, ic) {
+AUTO_OP substr(s, s, ic, i) {
+AUTO_OP substr(s, s, ic, ic) {
+AUTO_OP substr(s, sc, i, i) {
+AUTO_OP substr(s, sc, i, ic) {
+AUTO_OP substr(s, sc, ic, i) {
+AUTO_OP atan(n, i, ic) {
+AUTO_OP atan(n, ic, i) {
+AUTO_OP atan(n, i, nc) {
+AUTO_OP atan(n, ic, n) {
+AUTO_OP atan(n, n, ic) {
+AUTO_OP atan(n, nc, i) {
+AUTO_OP atan(n, n, nc) {
+AUTO_OP atan(n, nc, n) {
+AUTO_OP and(i, i, ic) {
+AUTO_OP or(i, i, ic) {
+AUTO_OP shl(i, i, i) {
+AUTO_OP shr(i, i, i) {
+AUTO_OP xor(i, i, ic) {
Index: core.ops
===================================================================
RCS file: /home/perlcvs/parrot/core.ops,v
retrieving revision 1.8
diff -u -r1.8 core.ops
--- core.ops 2001/10/16 14:12:41 1.8
+++ core.ops 2001/10/16 15:35:36
@@ -661,8 +661,12 @@
=item B<add>(i, i, i)
+=item B<add>(i, i, ic)
+
=item B<add>(n, n, n)
+=item B<add>(n, n, nc)
+
Set $1 to the sum of $2 and $3.
=cut
@@ -670,16 +674,28 @@
AUTO_OP add(i, i, i) {
$1 = $2 + $3;
}
+
+AUTO_OP add(i, i, ic) {
+ $1 = $2 + $3;
+}
AUTO_OP add(n, n, n) {
$1 = $2 + $3;
}
+AUTO_OP add(n, n, nc) {
+ $1 = $2 + $3;
+}
+
########################################
=item B<cmod>(i, i, i)
+=item B<cmod>(i, i, ic)
+
+=item B<cmod>(i, ic, i)
+
NOTE: This "uncorrected mod" algorithm uses the C language's built-in
mod operator (x % y), which is
@@ -716,11 +732,23 @@
$1 = $2 % $3;
}
+AUTO_OP cmod(i, i, ic) {
+ $1 = $2 % $3;
+}
+
+AUTO_OP cmod(i, ic, i) {
+ $1 = $2 % $3;
+}
+
########################################
=item B<cmod>(n, n, n)
+=item B<cmod>(n, n, nc)
+
+=item B<cmod>(n, nc, n)
+
NOTE: This "uncorrected mod" algorithm uses the built-in C math library's
fmod() function, which computes
@@ -752,7 +780,15 @@
$1 = fmod($2, $3);
}
+AUTO_OP cmod(n, n, nc) {
+ $1 = fmod($2, $3);
+}
+AUTO_OP cmod(n, nc, n) {
+ $1 = fmod($2, $3);
+}
+
+
########################################
=item B<dec>(i)
@@ -795,8 +831,16 @@
=item B<div>(i, i, i)
+=item B<div>(i, i, ic)
+
+=item B<div>(i, ic, i)
+
=item B<div>(n, n, n)
+=item B<div>(n, n, nc)
+
+=item B<div>(n, nc, n)
+
Set $1 to the quotient of $2 divided by $3. In the case of INTVAL division, the
result is truncated (NOT rounded or floored).
@@ -806,11 +850,27 @@
$1 = $2 / $3;
}
+AUTO_OP div(i, i, ic) {
+ $1 = $2 / $3;
+}
+
+AUTO_OP div(i, ic, i) {
+ $1 = $2 / $3;
+}
+
AUTO_OP div(n, n, n) {
$1 = $2 / $3;
}
+AUTO_OP div(n, n, nc) {
+ $1 = $2 / $3;
+}
+
+AUTO_OP div(n, nc, n) {
+ $1 = $2 / $3;
+}
+
########################################
=item B<inc>(i)
@@ -853,6 +913,10 @@
=item B<mod>(i, i, i)
+=item B<mod>(i, i, ic)
+
+=item B<mod>(i, ic, i)
+
NOTE: This "corrected mod" algorithm is based on the C code on page 70
of [1]. Assuming correct behavior of C's built-in mod operator (%) with
positive arguments, this algorithm implements a mathematically convenient
@@ -899,11 +963,67 @@
$1 = r;
}
+AUTO_OP mod(i, i, ic) {
+ INTVAL y = $2;
+ INTVAL z = $3;
+ INTVAL s = 0;
+ INTVAL r;
+ if (z == 0) {
+ r = y;
+ }
+ else {
+ if (y < 0) { s += 2; y = -y; }
+ if (z < 0) { s += 1; z = -z; }
+
+ r = y % z;
+
+ switch (s) {
+ case 0 + 0: break;
+ case 0 + 1: r = r - z; break;
+ case 2 + 0: r = z - r; break;
+ case 2 + 1: r = -r; break;
+ }
+ }
+
+ $1 = r;
+}
+
+AUTO_OP mod(i, ic, i) {
+ INTVAL y = $2;
+ INTVAL z = $3;
+ INTVAL s = 0;
+ INTVAL r;
+
+ if (z == 0) {
+ r = y;
+ }
+ else {
+ if (y < 0) { s += 2; y = -y; }
+ if (z < 0) { s += 1; z = -z; }
+
+ r = y % z;
+
+ switch (s) {
+ case 0 + 0: break;
+ case 0 + 1: r = r - z; break;
+ case 2 + 0: r = z - r; break;
+ case 2 + 1: r = -r; break;
+ }
+ }
+
+ $1 = r;
+}
+
+
########################################
=item B<mod>(n, n, n)
+=item B<mod>(n, n, nc)
+
+=item B<mod>(n, nc, n)
+
NOTE: This "corrected mod" algorithm is based on the formula of [1]:
x mod y = x - y * floor(x / y)
@@ -924,13 +1044,29 @@
: $2;
}
+AUTO_OP mod(n, n, nc) {
+ $1 = $3
+ ? ($2 - $3 * floor($2 / $3))
+ : $2;
+}
+
+AUTO_OP mod(n, nc, n) {
+ $1 = $3
+ ? ($2 - $3 * floor($2 / $3))
+ : $2;
+}
+
########################################
=item B<mul>(i, i, i)
+=item B<mul>(i, i, ic)
+
=item B<mul>(n, n, n)
+=item B<mul>(n, n, nc)
+
Set $1 to the product of $2 and $3.
=cut
@@ -939,21 +1075,45 @@
$1 = $2 * $3;
}
+AUTO_OP mul(i, i, ic) {
+ $1 = $2 * $3;
+}
+
AUTO_OP mul(n, n, n) {
$1 = $2 * $3;
}
+AUTO_OP mul(n, n, nc) {
+ $1 = $2 * $3;
+}
+
########################################
=item B<pow>(n, i, i)
+=item B<pow>(n, i, ic)
+
+=item B<pow>(n, ic, i)
+
=item B<pow>(n, i, n)
+=item B<pow>(n, i, nc)
+
+=item B<pow>(n, ic, n)
+
=item B<pow>(n, n, i)
+=item B<pow>(n, n, ic)
+
+=item B<pow>(n, nc, i)
+
=item B<pow>(n, n, n)
+=item B<pow>(n, n, nc)
+
+=item B<pow>(n, nc, n)
+
Set $1 to $2 raised to the power $3.
=cut
@@ -962,25 +1122,65 @@
$1 = pow((FLOATVAL)$2, (FLOATVAL)$3);
}
+AUTO_OP pow(n, i, ic) {
+ $1 = pow((FLOATVAL)$2, (FLOATVAL)$3);
+}
+
+AUTO_OP pow(n, ic, i) {
+ $1 = pow((FLOATVAL)$2, (FLOATVAL)$3);
+}
+
AUTO_OP pow(n, i, n) {
$1 = pow((FLOATVAL)$2, $3);
}
+AUTO_OP pow(n, i, nc) {
+ $1 = pow((FLOATVAL)$2, $3);
+}
+
+AUTO_OP pow(n, ic, n) {
+ $1 = pow((FLOATVAL)$2, $3);
+}
+
AUTO_OP pow(n, n, i) {
$1 = pow($2, (FLOATVAL)$3);
}
+AUTO_OP pow(n, n, ic) {
+ $1 = pow($2, (FLOATVAL)$3);
+}
+
+AUTO_OP pow(n, nc, i) {
+ $1 = pow($2, (FLOATVAL)$3);
+}
+
AUTO_OP pow(n, n, n) {
$1 = pow($2, $3);
}
+AUTO_OP pow(n, n, nc) {
+ $1 = pow($2, $3);
+}
+AUTO_OP pow(n, nc, n) {
+ $1 = pow($2, $3);
+}
+
+
########################################
=item B<sub>(i, i, i)
+=item B<sub>(i, i, ic)
+
+=item B<sub>(i, ic, i)
+
=item B<sub>(n, n, n)
+=item B<sub>(n, n, nc)
+
+=item B<sub>(n, nc, n)
+
Set $1 to $2 minus $3.
=cut
@@ -989,11 +1189,27 @@
$1 = $2 - $3;
}
+AUTO_OP sub(i, i, ic) {
+ $1 = $2 - $3;
+}
+
+AUTO_OP sub(i, ic, i) {
+ $1 = $2 - $3;
+}
+
AUTO_OP sub(n, n, n) {
$1 = $2 - $3;
}
+AUTO_OP sub(n, n, nc) {
+ $1 = $2 - $3;
+}
+
+AUTO_OP sub(n, nc, n) {
+ $1 = $2 - $3;
+}
+
=back
=cut
@@ -1012,6 +1228,8 @@
=item B<chopn>(s, ic)
+=item B<chopn>(s, i)
+
Remove $2 characters from the end of the string in $1.
TODO: Create a three-argument version of this? Don't force in-place modification.
@@ -1022,14 +1240,27 @@
(void)string_chopn($1, $2);
}
+AUTO_OP chopn(s, i) {
+ (void)string_chopn($1, $2);
+}
+
########################################
=item B<concat>(s, s)
+=item B<concat>(s,sc)
+
+=item B<concat>(s, s, s)
+
+=item B<concat>(s, s, sc)
+
+=item B<concat>(s, sc, s)
+
Append the string in $2 to the string in $1.
-TODO: Create a three-argument version of this. Don't force in-place modification.
+The three argument version appends the string $3 to $2 and places the result
+into $1.
=cut
@@ -1038,6 +1269,29 @@
$1 = s;
}
+AUTO_OP concat(s, sc) {
+ STRING *s = string_concat($1, $2, 1);
+ $1 = s;
+}
+
+AUTO_OP concat(s, s, s) {
+ STRING *s = string_concat($2, $3, 1);
+ $1 = s;
+}
+
+AUTO_OP concat(s, s, sc) {
+ STRING *s = string_concat($2, $3, 1);
+ $1 = s;
+}
+
+
+AUTO_OP concat(s, sc, s) {
+ STRING *s = string_concat($2, $3, 1);
+ $1 = s;
+}
+
+
+
########################################
=item B<length>(i, s)
@@ -1055,6 +1309,18 @@
=item B<substr>(s, s, i, i)
+=item B<substr>(s, s, i, ic)
+
+=item B<substr>(s, s, ic, i)
+
+=item B<substr>(s, s, ic, ic)
+
+=item B<substr>(s, sc, i, i)
+
+=item B<substr>(s, sc, i, ic)
+
+=item B<substr>(s, sc, ic, i)
+
Set $1 to the portion of $2 starting at (zero-based) character position $3 and having
length $4.
@@ -1065,7 +1331,37 @@
$1 = s;
}
+AUTO_OP substr(s, s, i, ic) {
+ STRING *s = string_substr($2, $3, $4, &$1);
+ $1 = s;
+}
+
+AUTO_OP substr(s, s, ic, i) {
+ STRING *s = string_substr($2, $3, $4, &$1);
+ $1 = s;
+}
+AUTO_OP substr(s, s, ic, ic) {
+ STRING *s = string_substr($2, $3, $4, &$1);
+ $1 = s;
+}
+
+AUTO_OP substr(s, sc, i, i) {
+ STRING *s = string_substr($2, $3, $4, &$1);
+ $1 = s;
+}
+
+AUTO_OP substr(s, sc, i, ic) {
+ STRING *s = string_substr($2, $3, $4, &$1);
+ $1 = s;
+}
+
+AUTO_OP substr(s, sc, ic, i) {
+ STRING *s = string_substr($2, $3, $4, &$1);
+ $1 = s;
+}
+
+
=back
=cut
@@ -1146,14 +1442,30 @@
=item B<atan>(n, i, i)
+=item B<atan>(n, i, ic)
+
+=item B<atan>(n, ic, i)
+
=item B<atan>(n, i, n)
+=item B<atan>(n, i, nc)
+
+=item B<atan>(n, ic, n)
+
=item B<atan>(n, n)
=item B<atan>(n, n, i)
+=item B<atan>(n, n, ic)
+
+=item B<atan>(n, nc, i)
+
=item B<atan>(n, n, n)
+=item B<atan>(n, n, nc)
+
+=item B<atan>(n, nc, n)
+
The two-argument versions set $1 to the arc tangent (in radians) of $2.
The three-argument versions set $1 to the arc tangent (in radians) of
@@ -1170,10 +1482,26 @@
$1 = atan2((FLOATVAL)$2, (FLOATVAL)$3);
}
+AUTO_OP atan(n, i, ic) {
+ $1 = atan2((FLOATVAL)$2, (FLOATVAL)$3);
+}
+
+AUTO_OP atan(n, ic, i) {
+ $1 = atan2((FLOATVAL)$2, (FLOATVAL)$3);
+}
+
AUTO_OP atan(n, i, n) {
$1 = atan2((FLOATVAL)$2, $3);
}
+AUTO_OP atan(n, i, nc) {
+ $1 = atan2((FLOATVAL)$2, $3);
+}
+
+AUTO_OP atan(n, ic, n) {
+ $1 = atan2((FLOATVAL)$2, $3);
+}
+
AUTO_OP atan(n, n) {
$1 = atan($2);
}
@@ -1182,11 +1510,27 @@
$1 = atan2($2, (FLOATVAL)$3);
}
+AUTO_OP atan(n, n, ic) {
+ $1 = atan2($2, (FLOATVAL)$3);
+}
+
+AUTO_OP atan(n, nc, i) {
+ $1 = atan2($2, (FLOATVAL)$3);
+}
+
AUTO_OP atan(n, n, n) {
$1 = atan2($2, $3);
}
+AUTO_OP atan(n, n, nc) {
+ $1 = atan2($2, $3);
+}
+AUTO_OP atan(n, nc, n) {
+ $1 = atan2($2, $3);
+}
+
+
########################################
=item B<cos>(n, i)
@@ -1437,6 +1781,8 @@
=item B<and>(i, i, i)
+=item B<and>(i, i, ic)
+
Set the bits of $1 according to the B<and> of the corresponding bits from $2 and $3.
=cut
@@ -1445,6 +1791,10 @@
$1 = $2 & $3;
}
+AUTO_OP and(i, i, ic) {
+ $1 = $2 & $3;
+}
+
########################################
@@ -1463,6 +1813,8 @@
=item B<or>(i, i, i)
+=item B<or>(i, i, ic)
+
Set the bits of $1 according to the B<or> of the corresponding bits from $2 and $3.
=cut
@@ -1471,9 +1823,14 @@
$1 = $2 | $3;
}
+AUTO_OP or(i, i, ic) {
+ $1 = $2 | $3;
+}
########################################
+=item B<shl>(i, i, i)
+
=item B<shl>(i, i, ic)
Set $1 to the value of $2 shifted left by $3 bits.
@@ -1484,9 +1841,15 @@
$1 = $2 << $3;
}
+AUTO_OP shl(i, i, i) {
+ $1 = $2 << $3;
+}
+
########################################
+=item B<shr>(i, i, i)
+
=item B<shr>(i, i, ic)
Set $1 to the value of $2 shifted right by $3 bits.
@@ -1497,11 +1860,17 @@
$1 = $2 >> $3;
}
+AUTO_OP shr(i, i, i) {
+ $1 = $2 >> $3;
+}
+
########################################
=item B<xor>(i, i, i)
+=item B<xor>(i, i, ic)
+
Set the bits of $1 according to the B<xor> of the corresponding bits from $2 and $3.
=cut
@@ -1509,6 +1878,11 @@
AUTO_OP xor(i, i, i) {
$1 = $2 ^ $3;
}
+
+AUTO_OP xor(i, i, ic) {
+ $1 = $2 ^ $3;
+}
+
=back