From: Michael Beck Date: Wed, 25 Jul 2007 12:14:25 +0000 (+0000) Subject: add IJmp instruction X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=26707e47403f59f1fa8d1df66dde1a6856068524;p=libfirm add IJmp instruction [r15330] --- diff --git a/ir/be/ia32/ia32_spec.pl b/ir/be/ia32/ia32_spec.pl index 6435544b7..ce821aa6b 100644 --- a/ir/be/ia32/ia32_spec.pl +++ b/ir/be/ia32/ia32_spec.pl @@ -816,6 +816,17 @@ SwitchJmp => { mode => "mode_T", }, +IJmp => { + state => "pinned", + op_flags => "X", + reg_req => { in => [ "gp", "gp", "gp", "none" ] }, + ins => [ "base", "index", "val", "mem" ], + emit => '. jmp *%unop2', + units => [ "BRANCH" ], + mode => "mode_X", + modified_flags => [] +}, + Const => { op_flags => "c", irn_flags => "R", diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index 5fd1bb298..e315458a6 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -3216,6 +3216,27 @@ static ir_node *gen_Phi(ir_node *node) { return phi; } +/** + * Transform IJmp + */ +static ir_node *gen_IJmp(ir_node *node) { + ir_node *block = be_transform_node(get_nodes_block(node)); + ir_graph *irg = current_ir_graph; + dbg_info *dbgi = get_irn_dbg_info(node); + ir_node *new_op = be_transform_node(get_IJmp_target(node)); + ir_node *noreg = ia32_new_NoReg_gp(env_cg); + ir_node *nomem = new_NoMem(); + ir_node *new_node; + + new_node = new_rd_ia32_IJmp(dbgi, irg, block, noreg, noreg, new_op, nomem); + set_ia32_am_support(new_node, ia32_am_Source, ia32_am_unary); + + SET_IA32_ORIG_NODE(new_node, ia32_get_old_node_name(env_cg, node)); + + return new_node; +} + + /********************************************************************** * _ _ _ * | | | | | | @@ -4108,6 +4129,7 @@ static void register_transformers(void) GEN(Psi); GEN(Proj); GEN(Phi); + GEN(IJmp); /* transform ops from intrinsic lowering */ GEN(ia32_l_Add);