add IJmp instruction
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 25 Jul 2007 12:14:25 +0000 (12:14 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 25 Jul 2007 12:14:25 +0000 (12:14 +0000)
[r15330]

ir/be/ia32/ia32_spec.pl
ir/be/ia32/ia32_transform.c

index 6435544..ce821aa 100644 (file)
@@ -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",
index 5fd1bb2..e315458 100644 (file)
@@ -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);