X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fscripts%2Fgenerate_new_opcodes.pl;h=08ce0c977fa2d52584d88a44b5eab96aa6176fb4;hb=67e049d5b177416c8883bbf8f827827bb424126f;hp=aa80228a07e6cda411d3e979ba8b94371ad4b363;hpb=ce6161a7e42a48f7422b7babcc64d8ace18e2687;p=libfirm diff --git a/ir/be/scripts/generate_new_opcodes.pl b/ir/be/scripts/generate_new_opcodes.pl index aa80228a0..08ce0c977 100755 --- a/ir/be/scripts/generate_new_opcodes.pl +++ b/ir/be/scripts/generate_new_opcodes.pl @@ -70,7 +70,7 @@ if(!defined($default_attr_type)) { } if(!defined(%init_attr)) { %init_attr = ( - "$default_attr_type" => "\tinit_${arch}_attributes(res, flags, in_reqs, exec_units, n_res);", + "$default_attr_type" => "\tinit_${arch}_attributes(res, irn_flags_, in_reqs, exec_units, n_res);", ); } if(!defined($default_cmp_attr)) { @@ -270,9 +270,10 @@ sub create_constructor { # emit constructor code $temp = <out_infos[${idx}].req = &${reqstruct}; + info->out_infos[${idx}].req = &${reqstruct}; EOF } } else { @@ -425,16 +426,19 @@ EOF if (not defined($known_irn_flags{$flag})) { print STDERR "WARNING: irn_flag '$flag' in opcode $op is unknown\n"; } else { - $temp .= "\tflags |= " . $known_irn_flags{$flag} . ";\n"; + $temp .= "\tirn_flags_ |= " . $known_irn_flags{$flag} . ";\n"; } } $temp .= "\n"; } # lookup init function - my $attr_init_code = $init_attr{$attr_type}; - if(!defined($attr_init_code)) { - die "Fatal error: Couldn't find attribute initialisation code for type '${attr_type}'"; + my $attr_init_code = "(void)in;(void)exec_units;(void)irn_flags_;(void)in_reqs;(void)n_res;"; + if ($attr_type ne "") { + $attr_init_code = $init_attr{$attr_type}; + if(!defined($attr_init_code)) { + die "Fatal error: Couldn't find attribute initialisation code for type '${attr_type}'"; + } } my $custominit = ""; if(defined($custom_init_attr_func)) { @@ -447,26 +451,27 @@ EOF $temp .= <{"init_attr"})) { $temp .= "\tattr = (${attr_type}*)get_irn_generic_attr(res);\n"; + $temp .= "\t(void) attr; /* avoid potential warning */\n"; $temp .= "\t".$n->{"init_attr"}."\n"; } $temp .= < 1 } ( - "none", "labeled", "commutative", "cfopcode", "op_cfopcode", - "fragile", "forking", "highlevel", "constlike", "always_opt", - "keep", "start_block", "uses_memory", "dump_noblock", - "dump_noinput", "machine", "machine_op", "cse_neutral" + "none", "labeled", "commutative", "cfopcode", "unknown_jump", "fragile", + "forking", "highlevel", "constlike", "always_opt", "keep", + "start_block", "uses_memory", "dump_noblock", "dump_noinput", + "machine", "machine_op", "cse_neutral" ); + my $is_fragile = 0; foreach my $flag (@{$n{"op_flags"}}) { if (not defined($known_flags{$flag})) { print STDERR "WARNING: Flag '$flag' in opcode $op is unknown\n"; } + if ($flag eq "fragile") { + $is_fragile = 1; + } } my @mapped = map { "irop_flag_$_" } @{$n{"op_flags"}}; my $op_flags = join('|', @mapped); + my $attr_size = "0"; + if ($attr_type ne "") { + $attr_size = "sizeof(${attr_type})" + } + $n_opcodes++; $temp = "\top_$op = new_ir_op(cur_opcode + iro_$op, \"$op\", op_pin_state_".$n{"state"}.", $op_flags"; - $temp .= "|irop_flag_machine, ".translate_arity($arity).", 0, sizeof(${attr_type}), &ops);\n"; + $temp .= "|irop_flag_machine, ".translate_arity($arity).", 0, ${attr_size}, &ops);\n"; push(@obst_new_irop, $temp); + if ($is_fragile) { + push(@obst_new_irop, "\tir_op_set_fragile_indices(op_${op}, n_${op}_mem, pn_${op}_X_regular, pn_${op}_X_except);\n"); + } push(@obst_new_irop, "\tset_op_tag(op_$op, $arch\_op_tag);\n"); if(defined($default_op_attr_type)) { push(@obst_new_irop, "\tattr = &attrs[iro_$op];\n"); @@ -801,22 +820,6 @@ $obst_constructor * needed for the assembler irgs. */ void $arch\_create_opcodes(const arch_irn_ops_t *be_ops) { -#define N irop_flag_none -#define L irop_flag_labeled -#define C irop_flag_commutative -#define X irop_flag_cfopcode -#define F irop_flag_fragile -#define Y irop_flag_forking -#define H irop_flag_highlevel -#define c irop_flag_constlike -#define K irop_flag_keep -#define M irop_flag_machine -#define O irop_flag_machine_op -#define NB irop_flag_dump_noblock -#define NI irop_flag_dump_noinput -#define n irop_flag_cse_neutral -#define R (irop_flag_user << 0) - ir_op_ops ops; int cur_opcode; static int run_once = 0; @@ -1028,7 +1031,7 @@ sub get_reg_class { } ### -# Returns the index of a given register within it's register class. +# Returns the index of a given register within its register class. # @return index or undef ### sub get_reg_index {