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; }