This is a patch for eq and ne that supports more combinations of
I, N and S, including ones that may be considered redundant.
There is also default popping of the call stack if there is no
branch address specified. I understand that I can branch to an
intermediate label and call ret myself, but I'd like a more
concise way.
If this one is ok with you guys, I will patch lt and gt similarly.
An example will be posted in a separate email shortly.
-Hao
--- core.ops Wed Dec 5 11:54:44 2001
+++ core.ops.old Wed Dec 5 10:41:31 2001
@@ -447,245 +447,73 @@
########################################
-=item B<eq>(i|ic, i|ic)
+=item B<eq>(i, i, ic)
-=item B<eq>(n|nc, n|nc)
+=item B<eq>(i, ic, ic)
-=item B<eq>(s|sc, s|sc)
+=item B<eq>(n, n, ic)
-=item B<eq>(i|ic, i|ic, ic)
+=item B<eq>(n, nc, ic)
-=item B<eq>(n|nc, n|nc, ic)
+=item B<eq>(s, s, ic)
-=item B<eq>(s|sc, s|sc, ic)
+=item B<eq>(s, sc, ic)
Branch if $1 is equal to $2.
-Return address is popped off the call stack if no address is supplied.
-
=cut
-AUTO_OP eq (i, i|ic) {
- opcode_t *dest;
- if ($1 == $2) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
-AUTO_OP eq (ic, i|ic) {
- opcode_t *dest;
- if ($1 == $2) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
-AUTO_OP eq (n, n|nc) {
- opcode_t *dest;
- if ($1 == $2) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
-AUTO_OP eq (nc, n|nc) {
- opcode_t *dest;
- if ($1 == $2) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
-AUTO_OP eq (s, s|sc) {
- opcode_t *dest;
- if (string_compare (interpreter, $1, $2) == 0) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
-AUTO_OP eq (sc, s|sc) {
- opcode_t *dest;
- if (string_compare (interpreter, $1, $2) == 0) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
AUTO_OP eq(i, i|ic, ic) {
if ($1 == $2) {
RETREL($3);
}
}
-AUTO_OP eq (ic, i|ic, ic) {
- if ($1 == $2) {
- RETREL($3);
- }
-}
-
AUTO_OP eq(n, n|nc, ic) {
if ($1 == $2) {
RETREL($3);
}
}
-AUTO_OP eq (nc, n|nc, ic) {
- if ($1 == $2) {
- RETREL($3);
- }
-}
-
AUTO_OP eq(s, s|sc, ic) {
if (string_compare(interpreter, $1, $2) == 0) {
RETREL($3);
}
}
-AUTO_OP eq (sc, s|sc, ic) {
- if (string_compare (interpreter, $1, $2) == 0) {
- RETREL($3);
- }
-}
-
########################################
-=item B<ne>(i|ic, i|ic)
+=item B<ne>(i, i, ic)
-=item B<ne>(n|nc, n|nc)
+=item B<ne>(i, ic, ic)
-=item B<ne>(s|sc, s|sc)
+=item B<ne>(n, n, ic)
-=item B<ne>(i|ic, i|ic, ic)
+=item B<ne>(n, nc, ic)
-=item B<ne>(n|nc, n|nc, ic)
+=item B<ne>(s, s, ic)
-=item B<ne>(s|sc, s|sc, ic)
+=item B<ne>(s, sc, ic)
Branch if $1 is not equal to $2.
-Return address is popped off the call stack if no address is supplied.
-
=cut
-AUTO_OP ne (i, i|ic) {
- opcode_t *dest;
- if ($1 != $2) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
-AUTO_OP ne (ic, i|ic) {
- opcode_t *dest;
- if ($1 != $2) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
-AUTO_OP ne (n, n|nc) {
- opcode_t *dest;
- if ($1 != $2) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
-AUTO_OP ne (nc, n|nc) {
- opcode_t *dest;
- if ($1 != $2) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
-AUTO_OP ne (s, s|sc) {
- opcode_t *dest;
- if (string_compare (interpreter, $1, $2) != 0) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
-AUTO_OP ne (sc, s|sc) {
- opcode_t *dest;
- if (string_compare (interpreter, $1, $2) != 0) {
- pop_generic_entry (
- interpreter, &interpreter->control_stack_top,
- &dest, STACK_ENTRY_DESTINATION
- );
- RETABS(dest);
- }
-}
-
AUTO_OP ne(i, i|ic, ic) {
if ($1 != $2) {
RETREL($3);
}
}
-AUTO_OP ne (ic, i|ic, ic) {
- if ($1 != $2) {
- RETREL($3);
- }
-}
-
AUTO_OP ne(n, n|nc, ic) {
if ($1 != $2) {
RETREL($3);
}
}
-AUTO_OP ne (nc, n|nc, ic) {
- if ($1 != $2) {
- RETREL($3);
- }
-}
-
AUTO_OP ne(s, s|sc, ic) {
if (string_compare(interpreter, $1, $2) != 0) {
- RETREL($3);
- }
-}
-
-AUTO_OP ne (sc, s|sc, ic) {
- if (string_compare (interpreter, $1, $2) != 0) {
RETREL($3);
}
}