From: Matthias Braun Date: Wed, 30 May 2007 12:49:38 +0000 (+0000) Subject: fix xStoreSimple and SetST0 X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=4001b2d9dc732ba616cf5584cc149f056b59c8b5;p=libfirm fix xStoreSimple and SetST0 [r14179] --- diff --git a/ir/be/ia32/ia32_spec.pl b/ir/be/ia32/ia32_spec.pl index fced88664..ff1929423 100644 --- a/ir/be/ia32/ia32_spec.pl +++ b/ir/be/ia32/ia32_spec.pl @@ -1228,8 +1228,9 @@ xStoreSimple => { op_flags => "L|F", state => "exc_pinned", comment => "construct Store without index: Store(ptr, val, mem) = ST ptr,val", - reg_req => { in => [ "gp", "xmm", "none" ] }, - emit => '. mov%XXM %S1, %AM', + reg_req => { in => [ "gp", "gp", "xmm", "none" ] }, + ins => [ "base", "index", "val", "mem" ], + emit => '. mov%XXM %S2, %AM', latency => 2, units => [ "SSE" ], mode => "mode_M", @@ -1285,7 +1286,8 @@ SetST0 => { irn_flags => "I", state => "exc_pinned", comment => "load ST0 from stack", - reg_req => { in => [ "gp", "none" ], out => [ "vf0", "none" ] }, + reg_req => { in => [ "gp", "gp", "none" ], out => [ "vf0", "none" ] }, + ins => [ "base", "index", "mem" ], emit => '. fld%XM %AM', outs => [ "res", "M" ], latency => 2, diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index 7365eb652..9f5b820f6 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -2592,6 +2592,7 @@ static ir_node *gen_be_Return(ia32_transform_env_t *env, ir_node *node) { ir_mode *mode; ir_node *frame, *sse_store, *fld, *mproj, *barrier; ir_node *new_barrier, *new_ret_val, *new_ret_mem; + ir_node *noreg; ir_node **in; int pn_ret_val, pn_ret_mem, arity, i; @@ -2632,8 +2633,10 @@ static ir_node *gen_be_Return(ia32_transform_env_t *env, ir_node *node) { dbgi = get_irn_dbg_info(barrier); block = transform_node(env, get_nodes_block(barrier)); + noreg = ia32_new_NoReg_gp(env->cg); + /* store xmm0 onto stack */ - sse_store = new_rd_ia32_xStoreSimple(dbgi, irg, block, frame, new_ret_val, new_ret_mem); + sse_store = new_rd_ia32_xStoreSimple(dbgi, irg, block, frame, noreg, new_ret_val, new_ret_mem); set_ia32_ls_mode(sse_store, mode); set_ia32_op_type(sse_store, ia32_AddrModeD); set_ia32_use_frame(sse_store); @@ -2641,7 +2644,7 @@ static ir_node *gen_be_Return(ia32_transform_env_t *env, ir_node *node) { set_ia32_am_support(sse_store, ia32_am_Dest); /* load into st0 */ - fld = new_rd_ia32_SetST0(dbgi, irg, block, frame, sse_store); + fld = new_rd_ia32_SetST0(dbgi, irg, block, frame, noreg, sse_store); set_ia32_ls_mode(fld, mode); set_ia32_op_type(fld, ia32_AddrModeS); set_ia32_use_frame(fld);