# { "type" => "type 2", "name" => "name 2" },
# ...
# ],
-# "comment" => "any comment for constructor",
+# comment => "any comment for constructor",
# reg_req => { in => [ "reg_class|register" ], out => [ "reg_class|register|in_rX" ] },
-# "cmp_attr" => "c source code for comparing node attributes",
+# cmp_attr => "c source code for comparing node attributes",
+# outs => { "out1", "out2" } # optional, creates pn_op_out1, ... consts
+# ins => { "in1", "in2" } # optional, creates n_op_in1, ... consts
+# mode => "mode_Iu" # optional, predefines the mode
# emit => "emit code with templates",
-# "rd_constructor" => "c source code which constructs an ir_node"
+# attr => "attitional attribute arguments for constructor",
+# init_attr => "emit attribute initialization template",
+# rd_constructor => "c source code which constructs an ir_node",
+# hash_func => "name of the hash function for this operation",
+# latency => "latency of this operation (can be float)"
+# attr_type => "name of the attribute struct",
# },
#
# ... # (all nodes you need to describe)
# NOTE: Last entry of each class is the largest Firm-Mode a register can hold\
%reg_classes = (
"gp" => [
- { name => "zero", type => 4+2 }, # always zero
+ { name => "zero", type => 4 }, # always zero
{ name => "at", type => 4 }, # reserved for assembler
{ name => "v0", realname => "2", type => 1 }, # first return value
{ name => "v1", realname => "3", type => 1 }, # second return value
); # %reg_classes
%emit_templates = (
- S0 => "${arch}_emit_source_register(env, node, 0);",
- S1 => "${arch}_emit_source_register(env, node, 1);",
- S2 => "${arch}_emit_source_register(env, node, 2);",
- SI1 => "${arch}_emit_source_register_or_immediate(env, node, 1);",
- D0 => "${arch}_emit_dest_register(env, node, 0);",
- D1 => "${arch}_emit_dest_register(env, node, 1);",
- D2 => "${arch}_emit_dest_register(env, node, 2);",
- A0 => "${arch}_emit_load_store_address(env, node, 0);",
- I => "${arch}_emit_immediate_suffix(env, node, 1);",
- C => "${arch}_emit_immediate(env, node);",
- JumpTarget => "${arch}_emit_jump_target(env, node);",
- JumpTarget1 => "${arch}_emit_jump_target_proj(env, node, 1);",
- JumpOrFallthrough => "${arch}_emit_jump_or_fallthrough(env, node, 0);",
+ S0 => "${arch}_emit_source_register(node, 0);",
+ S1 => "${arch}_emit_source_register(node, 1);",
+ S2 => "${arch}_emit_source_register(node, 2);",
+ SI1 => "${arch}_emit_source_register_or_immediate(node, 1);",
+ D0 => "${arch}_emit_dest_register(node, 0);",
+ D1 => "${arch}_emit_dest_register(node, 1);",
+ D2 => "${arch}_emit_dest_register(node, 2);",
+ A0 => "${arch}_emit_load_store_address(node, 0);",
+ I => "${arch}_emit_immediate_suffix(node, 1);",
+ C => "${arch}_emit_immediate(node);",
+ JumpTarget => "${arch}_emit_jump_target(node);",
+ JumpTarget1 => "${arch}_emit_jump_target_proj(node, 1);",
+ JumpOrFallthrough => "${arch}_emit_jump_or_fallthrough(node, 0);",
);
$default_attr_type = "mips_attr_t";
$mode_gp = "mode_Iu";
%init_attr = (
- mips_attr_t => "\tinit_mips_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res, latency);",
+ mips_attr_t => "\tinit_mips_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);",
- mips_immediate_attr_t => "\tinit_mips_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res, latency);\n".
+ mips_immediate_attr_t => "\tinit_mips_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
"\tinit_mips_immediate_attributes(res, imm_type, entity, val);",
- mips_load_store_attr_t => "\tinit_mips_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res, latency);\n".
+ mips_load_store_attr_t => "\tinit_mips_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
"\tinit_mips_load_store_attributes(res, entity, offset);",
);