fix xStoreSimple and SetST0
authorMatthias Braun <matze@braunis.de>
Wed, 30 May 2007 12:49:38 +0000 (12:49 +0000)
committerMatthias Braun <matze@braunis.de>
Wed, 30 May 2007 12:49:38 +0000 (12:49 +0000)
[r14179]

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

index fced886..ff19294 100644 (file)
@@ -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,
index 7365eb6..9f5b820 100644 (file)
@@ -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);