X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fscripts%2Fgenerate_emitter_new.pl;h=1ffc8fbda19b88512283c58cb0c0bb6d01cb45eb;hb=30369d28b8fabe4f66cee12f42ee475d9444cf9e;hp=28aa150ee914ddd5d505add803539e5fb1b9f4c5;hpb=863d31d7a5c8210432fef88b30fc3e8353131538;p=libfirm diff --git a/ir/be/scripts/generate_emitter_new.pl b/ir/be/scripts/generate_emitter_new.pl index 28aa150ee..1ffc8fbda 100755 --- a/ir/be/scripts/generate_emitter_new.pl +++ b/ir/be/scripts/generate_emitter_new.pl @@ -1,10 +1,27 @@ #!/usr/bin/perl -w +# +# Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. +# +# This file is part of libFirm. +# +# This file may be distributed and/or modified under the terms of the +# GNU General Public License version 2 as published by the Free Software +# Foundation and appearing in the file LICENSE.GPL included in the +# packaging of this file. +# +# Licensees holding valid libFirm Professional Edition licenses may use +# this file in accordance with the libFirm Commercial License. +# Agreement provided with the Software. +# +# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE. +# + # 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; @@ -15,7 +32,8 @@ our $target_dir; our $arch; our %nodes; our %emit_templates; -our $finish_line_template = "be_emit_finish_line_gas(emit, node);"; +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"; @@ -32,22 +50,31 @@ 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(emit, '\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(emit, '%');\n"); last SWITCH; } - if (/%(.+)/) { + if (/%\./) { last SWITCH; } + if (/^%([^%]+)/) { if(defined($emit_templates{$1})) { push(@{$result}, "${indent}$emit_templates{$1}\n"); } else { print "Warning: No emit_template defined for '$1'\n"; - push(@{$result}, "${indent}$1(emit, node);\n"); + push(@{$result}, "${indent}$1(node);\n"); } last SWITCH; } - push(@{$result}, "${indent}be_emit_cstring(emit, \"$_\");\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"); @@ -61,28 +88,32 @@ foreach my $op (keys(%nodes)) { # skip this node description if no emit information is available next if (!defined($n{"emit"})); - $line = "static void emit_${arch}_${op}(${arch}_emit_env_t *env, const ir_node *node)"; + $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, "\tbe_emit_env_t *emit = env->emit;\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"); } } @@ -96,23 +127,23 @@ my $creation_time = localtime(time()); my $tmp = uc($arch); 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" @@ -149,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<