X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fscripts%2Fgenerate_emitter_new.pl;h=1ffc8fbda19b88512283c58cb0c0bb6d01cb45eb;hb=30369d28b8fabe4f66cee12f42ee475d9444cf9e;hp=b9784bf15ccaac3a5653200c3223d42ea2c85e9e;hpb=f2b8f680613688d357df37089bc8de73d2b37fab;p=libfirm diff --git a/ir/be/scripts/generate_emitter_new.pl b/ir/be/scripts/generate_emitter_new.pl index b9784bf15..1ffc8fbda 100755 --- a/ir/be/scripts/generate_emitter_new.pl +++ b/ir/be/scripts/generate_emitter_new.pl @@ -22,8 +22,6 @@ # This script generates C code which emits assembler code for the # assembler ir nodes. It takes a "emit" key from the node specification # and substitutes lines starting with . with a corresponding fprintf(). -# Creation: 2005/11/07 -# $Id$ use strict; use Data::Dumper; @@ -35,6 +33,7 @@ our $arch; our %nodes; our %emit_templates; our $finish_line_template = "be_emit_finish_line_gas(node);"; +our $indent_line_func; my $target_c = $target_dir."/gen_".$arch."_emitter.c"; my $target_h = $target_dir."/gen_".$arch."_emitter.h"; @@ -51,13 +50,17 @@ sub create_emitter { our %emit_templates; our $arch; - my @tokens = ($template =~ m/[^\%]+|\%[a-zA-Z_][a-zA-Z0-9_]*|\%./g); - push(@{$result}, "${indent}be_emit_char('\\t');\n"); + if (!defined($indent_line_func)) { + $template = "\\t" . $template; + } else { + push(@{$result}, "${indent}${indent_line_func};\n"); + } + + my @tokens = ($template =~ m/(?:[^%]|%%)+|\%[a-zA-Z_][a-zA-Z0-9_]*|%\./g); for (@tokens) { SWITCH: { - if (/%\./) { last SWITCH; } - if (/%%/) { push(@{$result}, "${indent}be_emit_char('%');\n"); last SWITCH; } - if (/%(.+)/) { + if (/%\./) { last SWITCH; } + if (/^%([^%]+)/) { if(defined($emit_templates{$1})) { push(@{$result}, "${indent}$emit_templates{$1}\n"); } else { @@ -66,7 +69,12 @@ sub create_emitter { } last SWITCH; } - push(@{$result}, "${indent}be_emit_cstring(\"$_\");\n"); + $_ =~ s/%%/%/g; + if (length($_) == 1) { + push(@{$result}, "${indent}be_emit_char('$_');\n"); + } else { + push(@{$result}, "${indent}be_emit_cstring(\"$_\");\n"); + } } } push(@{$result}, "${indent}${finish_line_template}\n"); @@ -82,26 +90,30 @@ foreach my $op (keys(%nodes)) { $line = "static void emit_${arch}_${op}(const ir_node *node)"; - push(@obst_register, " BE_EMIT($op);\n"); + push(@obst_register, " ${arch}_register_emitter(op_${arch}_${op}, emit_${arch}_${op});\n"); if($n{"emit"} eq "") { - push(@obst_func, $line." {\n"); + push(@obst_func, $line."\n"); + push(@obst_func, "{\n"); push(@obst_func, "\t(void) node;\n"); push(@obst_func, "}\n\n"); next; } - push(@obst_func, $line." {\n"); + push(@obst_func, $line."\n"); + push(@obst_func, "{\n"); my @emit = split(/\n/, $n{"emit"}); foreach my $template (@emit) { # substitute only lines, starting with a '.' - if ($template =~ /^(\s*)\.\s*(.*)/) { + if ($template eq '') { + # nothing + } elsif ($template =~ /^(\s*)\.\s*(.*)/) { my $indent = "\t$1"; create_emitter(\@obst_func, $indent, $2); } else { - push(@obst_func, "\t$template\n"); + push(@obst_func, "\t${arch}_emitf(node, \"$template\");\n"); } } @@ -153,10 +165,12 @@ print OUT< +#include #include "irnode.h" #include "irop_t.h" #include "irprog_t.h" +#include "beemitter.h" #include "gen_${arch}_emitter.h" #include "${arch}_new_nodes.h" @@ -167,22 +181,26 @@ EOF print OUT @obst_func; print OUT<ops.generic == NULL); + op->ops.generic = (op_func)func; +} + /** * Enters the emitter functions for handled nodes into the generic * pointer of an opcode. */ -void $arch\_register_spec_emitters(void) { - -#define BE_EMIT(a) op_$arch\_##a->ops.generic = (op_func)emit_$arch\_##a - - /* generated emitter functions */ +void $arch\_register_spec_emitters(void) +{ EOF print OUT @obst_register; print OUT<