All --
If the assembler patch I submitted a little while ago goes in, I'll
commit these changes to the Jako compiler. They fix a bug in assignment
handling and add some more conditionals to while and if. Also it goes
back to using implicit opcodes in a few cases that were broken before
the assembler patch.
Regards,
-- Gregor
_____________________________________________________________________
/ 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
\_____________________________________________________________________/
Index: jako_compiler.pl
===================================================================
RCS file: /home/perlcvs/parrot/little_languages/jako_compiler.pl,v
retrieving revision 1.3
diff -u -r1.3 jako_compiler.pl
--- jako_compiler.pl 2001/09/15 00:42:07 1.3
+++ jako_compiler.pl 2001/09/15 19:05:42
@@ -202,27 +202,29 @@
my $prefix = "_W$block_count";
push @block_stack, { TYPE => 'while', NEXT => $line, PREFIX => $prefix };
- #
- # TODO: Note that the assembler wasn't inferring the opcode qualifiers, so we had
- # to code them explicitly. We should remove the qualifiers as soon as the
- # assembler is fixed.
- #
-
if ($cond =~ m/^(.*)\s*==\s*(.*)$/) {
my @args = map_args($1, $2);
- printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "eq_i_ic", "$args[0], $args[1],
${prefix}_REDO, ${prefix}_LAST";
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "eq", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
printf "%s_REDO:\n", $prefix;
} elsif ($cond =~ m/^(.*)\s*!=\s*(.*)$/) {
my @args = map_args($1, $2);
- printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ne_i_ic", "$args[0], $args[1],
${prefix}_REDO, ${prefix}_LAST";
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ne", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
printf "%s_REDO:\n", $prefix;
} elsif ($cond =~ m/^(.*)\s*<=\s*(.*)$/) {
my @args = map_args($1, $2);
- printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "le_i_ic", "$args[0], $args[1],
${prefix}_REDO, ${prefix}_LAST";
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "le", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
printf "%s_REDO:\n", $prefix;
+ } elsif ($cond =~ m/^(.*)\s*<\s*(.*)$/) {
+ my @args = map_args($1, $2);
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "lt", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
+ printf "%s_REDO:\n", $prefix;
} elsif ($cond =~ m/^(.*)\s*>=\s*(.*)$/) {
+ my @args = map_args($1, $2);
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ge", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
+ printf "%s_REDO:\n", $prefix;
+ } elsif ($cond =~ m/^(.*)\s*>\s*(.*)$/) {
my @args = map_args($1, $2);
- printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ge_i_ic", "$args[0], $args[1],
${prefix}_REDO, ${prefix}_LAST";
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "gt", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
printf "%s_REDO:\n", $prefix;
} else {
printf(STDERR "jako: Syntax error. Unrecognized condition in while on line
%d.\n", $line);
@@ -242,28 +244,30 @@
my $prefix = "_I$block_count";
push @block_stack, { TYPE => 'if', NEXT => $line, PREFIX => $prefix };
- #
- # TODO: Note that the assembler wasn't inferring the opcode qualifiers, so we had
- # to code them explicitly. We should remove the qualifiers as soon as the
- # assembler is fixed.
- #
-
if ($cond =~ m/^(.*)\s*==\s*(.*)$/) {
my @args = map_args($1, $2);
- printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "eq_i_ic", "$args[0], $args[1],
${prefix}_REDO, ${prefix}_LAST";
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "eq", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
printf "%s_REDO:\n", $prefix;
} elsif ($cond =~ m/^(.*)\s*!=\s*(.*)$/) {
my @args = map_args($1, $2);
- printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ne_i_ic", "$args[0], $args[1],
${prefix}_REDO, ${prefix}_LAST";
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ne", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
printf "%s_REDO:\n", $prefix;
} elsif ($cond =~ m/^(.*)\s*<=\s*(.*)$/) {
+ my @args = map_args($1, $2);
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "le", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
+ printf "%s_REDO:\n", $prefix;
+ } elsif ($cond =~ m/^(.*)\s*<\s*(.*)$/) {
my @args = map_args($1, $2);
- printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "le_i_ic", "$args[0], $args[1],
${prefix}_REDO, ${prefix}_LAST";
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "lt", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
printf "%s_REDO:\n", $prefix;
} elsif ($cond =~ m/^(.*)\s*>=\s*(.*)$/) {
my @args = map_args($1, $2);
- printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ge_i_ic", "$args[0], $args[1],
${prefix}_REDO, ${prefix}_LAST";
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ge", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
printf "%s_REDO:\n", $prefix;
+ } elsif ($cond =~ m/^(.*)\s*>\s*(.*)$/) {
+ my @args = map_args($1, $2);
+ printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "gt", "$args[0], $args[1],
+${prefix}_REDO, ${prefix}_LAST";
+ printf "%s_REDO:\n", $prefix;
} else {
printf(STDERR "jako: Syntax error. Unrecognized condition in while on line
%d.\n", $line);
}
@@ -284,15 +288,8 @@
my $block = pop @block_stack;
my $prefix = $block->{PREFIX};
- #
- # TODO: Note that the assembler wasn't inferring the opcode qualifiers, so we had
- # to code them explicitly. We should remove the qualifiers as soon as the
- # assembler is fixed.
- #
-
if ($block->{TYPE} eq 'while') {
- printf("%-12s %-8s %s\n", '', 'branch_ic', "${prefix}_NEXT", );
- # TODO: Is there a better unconditional jump (branch_ic)?
+ printf("%-12s %-8s %s\n", '', 'branch', "${prefix}_NEXT", );
}
printf "%s_LAST:\n", $prefix;
@@ -307,16 +304,10 @@
{
my $which = uc shift;
- #
- # TODO: Note that the assembler wasn't inferring the opcode qualifiers, so we had
- # to code them explicitly. We should remove the qualifiers as soon as the
- # assembler is fixed.
- #
-
foreach (reverse @block_stack) {
if ($_->{TYPE} eq 'while') {
my $prefix = $_->{PREFIX};
- printf("%-12s %-8s %s\n", '', 'branch_ic', "${prefix}_$which", );
+ printf("%-12s %-8s %s\n", '', 'branch', "${prefix}_$which", );
last;
}
}
@@ -541,8 +532,13 @@
# a = "Howdy";
#
- if (m/^([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+(\.\d+))$/) {
+ if (m/^([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)$/) {
assign_var($1, 'I', $2);
+ next;
+ }
+
+ if (m/^([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+\.\d+)$/) {
+ assign_var($1, 'N', $2);
next;
}