From 4096b5c81c67872326dbae07b5b175dcaba30c64 Mon Sep 17 00:00:00 2001 From: Robin Redeker Date: Wed, 30 Jun 2010 13:37:39 +0000 Subject: [PATCH] amd64: made SymConst rematerializable and added emission of be_Perm. [r27683] --- ir/be/amd64/amd64_emitter.c | 26 ++++++++++++++++++++++++++ ir/be/amd64/amd64_new_nodes.c | 18 ++++++++++++++++++ ir/be/amd64/amd64_spec.pl | 4 +++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/ir/be/amd64/amd64_emitter.c b/ir/be/amd64/amd64_emitter.c index cbdbde172..4ca4de80c 100644 --- a/ir/be/amd64/amd64_emitter.c +++ b/ir/be/amd64/amd64_emitter.c @@ -43,6 +43,7 @@ #include "amd64_emitter.h" #include "gen_amd64_emitter.h" +#include "gen_amd64_regalloc_if.h" #include "amd64_nodes_attr.h" #include "amd64_new_nodes.h" @@ -395,6 +396,30 @@ static void emit_be_Copy(const ir_node *irn) } } +static void emit_be_Perm(const ir_node *node) +{ + const arch_register_t *in0, *in1; + const arch_register_class_t *cls0, *cls1; + + in0 = arch_get_irn_register(get_irn_n(node, 0)); + in1 = arch_get_irn_register(get_irn_n(node, 1)); + + cls0 = arch_register_get_class(in0); + cls1 = arch_register_get_class(in1); + + assert(cls0 == cls1 && "Register class mismatch at Perm"); + + be_emit_cstring("\txchg "); + amd64_emit_register (in0); + be_emit_cstring(", "); + amd64_emit_register (in1); + be_emit_finish_line_gas(node); + + if (cls0 != &amd64_reg_classes[CLASS_amd64_gp]) { + panic("unexpected register class in be_Perm (%+F)", node); + } +} + static void emit_amd64_FrameAddr(const ir_node *irn) { const amd64_SymConst_attr_t *attr = get_irn_generic_attr_const(irn); @@ -530,6 +555,7 @@ static void amd64_register_emitters(void) set_emitter(op_be_Call, emit_be_Call); set_emitter(op_be_Copy, emit_be_Copy); set_emitter(op_be_IncSP, emit_be_IncSP); + set_emitter(op_be_Perm, emit_be_Perm); set_emitter(op_amd64_Add, emit_amd64_binop); set_emitter(op_amd64_Sub, emit_amd64_binop); diff --git a/ir/be/amd64/amd64_new_nodes.c b/ir/be/amd64/amd64_new_nodes.c index 6be6cdf8e..21ff32d6e 100644 --- a/ir/be/amd64/amd64_new_nodes.c +++ b/ir/be/amd64/amd64_new_nodes.c @@ -196,5 +196,23 @@ static int cmp_amd64_attr(ir_node *a, ir_node *b) return attr_a->ext.imm_value != attr_b->ext.imm_value; } +/** copies the AMD64 attributes of a node. */ +static void amd64_copy_attr(ir_graph *irg, const ir_node *old_node, + ir_node *new_node) +{ + struct obstack *obst = get_irg_obstack(irg); + const amd64_attr_t *attr_old = get_amd64_attr_const(old_node); + amd64_attr_t *attr_new = get_amd64_attr(new_node); + backend_info_t *old_info = be_get_info(old_node); + backend_info_t *new_info = be_get_info(new_node); + + /* copy the attributes */ + memcpy(attr_new, attr_old, get_op_attr_size(get_irn_op(old_node))); + + /* copy out flags */ + new_info->out_infos = + DUP_ARR_D(reg_out_info_t, obst, old_info->out_infos); +} + /* Include the generated constructor functions */ #include "gen_amd64_new_nodes.c.inl" diff --git a/ir/be/amd64/amd64_spec.pl b/ir/be/amd64/amd64_spec.pl index 2b71d2aa0..4a71cd700 100644 --- a/ir/be/amd64/amd64_spec.pl +++ b/ir/be/amd64/amd64_spec.pl @@ -158,6 +158,8 @@ sub amd64_custom_init_attr { } $custom_init_attr_func = \&amd64_custom_init_attr; +$default_copy_attr = "amd64_copy_attr"; + %emit_templates = ( S1 => "${arch}_emit_source_register(node, 0);", S2 => "${arch}_emit_source_register(node, 1);", @@ -257,7 +259,7 @@ Immediate => { }, SymConst => { op_flags => "c", -# irn_flags => "R", + irn_flags => "R", attr => "ir_entity *entity", attr_type => "amd64_SymConst_attr_t", reg_req => { out => [ "gp" ] }, -- 2.20.1