# { "type" => "type 2", "name" => "name 2" },
# ...
# ],
-# "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",
-# "emit" => "emit code with templates",
-# "rd_constructor" => "c source code which constructs an ir_node"
+# 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",
+# 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",
+# 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)
); # %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);",
- D0 => "${arch}_emit_dest_register(env, node, 0);",
- D1 => "${arch}_emit_dest_register(env, node, 1);",
- D2 => "${arch}_emit_dest_register(env, node, 2);",
- O => "${arch}_emit_offset(env, node);",
- C => "${arch}_emit_immediate(env, node);",
- RLWIMI => "${arch}_emit_rlwimi_helper(env, node);",
+ S0 => "${arch}_emit_source_register(node, 0);",
+ S1 => "${arch}_emit_source_register(node, 1);",
+ S2 => "${arch}_emit_source_register(node, 2);",
+ D0 => "${arch}_emit_dest_register(node, 0);",
+ D1 => "${arch}_emit_dest_register(node, 1);",
+ D2 => "${arch}_emit_dest_register(node, 2);",
+ O => "${arch}_emit_offset(node);",
+ C => "${arch}_emit_immediate(node);",
+ RLWIMI => "${arch}_emit_rlwimi_helper(node);",
);
+$default_cmp_attr = "NULL";
+
#--------------------------------------------------#
# _ #
# (_) #
"op_flags" => "L|F",
"state" => "exc_pinned",
"comment" => "construct Store: Store (byte) (ptr, val, mem) = ST ptr,val",
- "reg_req" => { "in" => [ "!r0", "gp", "none" ] },
+ "reg_req" => { "in" => [ "!r0", "gp", "none" ], "out" => [ "none" ] },
"emit" => '. stb %S1, %O(%S0)',
"cmp_attr" =>
'
"op_flags" => "L|F",
"state" => "exc_pinned",
"comment" => "construct Store: Store (halfword) (ptr, val, mem) = ST ptr,val",
- "reg_req" => { "in" => [ "!r0", "gp", "none" ] },
+ "reg_req" => { "in" => [ "!r0", "gp", "none" ], "out" => [ "none" ] },
"emit" => '. sth %S1, %O(%S0)',
"cmp_attr" =>
'
"op_flags" => "L|F",
"state" => "exc_pinned",
"comment" => "construct Store: Store (word) (ptr, val, mem) = ST ptr,val",
- "reg_req" => { "in" => [ "!r0", "gp", "none" ] },
+ "reg_req" => { "in" => [ "!r0", "gp", "none" ], "out" => [ "none" ] },
"emit" => '. stw %S1, %O(%S0)',
"cmp_attr" =>
'
"op_flags" => "L|F",
"state" => "exc_pinned",
"comment" => "construct Store (double): Store(ptr, val, mem) = ST ptr,val",
- "reg_req" => { "in" => [ "!r0", "fp", "none" ] },
+ "reg_req" => { "in" => [ "!r0", "fp", "none" ], "out" => [ "none" ] },
"emit" => '. stfd %S1, %O(%S0)',
"cmp_attr" =>
'
"op_flags" => "L|F",
"state" => "exc_pinned",
"comment" => "construct Store (single): Store(ptr, val, mem) = ST ptr,val",
- "reg_req" => { "in" => [ "!r0", "fp", "none" ] },
+ "reg_req" => { "in" => [ "!r0", "fp", "none" ], "out" => [ "none" ] },
"emit" => '. stfs %S1, %O(%S0)',
"cmp_attr" =>
'