Simplify gen_float_const_Store().
authorChristoph Mallon <christoph.mallon@gmx.de>
Sat, 23 Aug 2008 23:11:59 +0000 (23:11 +0000)
committerChristoph Mallon <christoph.mallon@gmx.de>
Sat, 23 Aug 2008 23:11:59 +0000 (23:11 +0000)
[r21392]

ir/be/ia32/ia32_transform.c

index cec0e1a..a4c75c1 100644 (file)
@@ -2322,9 +2322,10 @@ static int is_float_to_int32_conv(const ir_node *node)
  *
  * @return the created ia32 Store node
  */
-static ir_node *gen_float_const_Store(ir_node *node, ir_node *cns) {
+static ir_node *gen_float_const_Store(ir_node *node, ir_node *cns)
+{
        ir_mode  *mode      = get_irn_mode(cns);
-       int      size       = get_mode_size_bits(mode);
+       unsigned size       = get_mode_size_bytes(mode);
        tarval   *tv        = get_Const_tarval(cns);
        ir_node  *block     = get_nodes_block(node);
        ir_node  *new_block = be_transform_node(block);
@@ -2332,67 +2333,37 @@ static ir_node *gen_float_const_Store(ir_node *node, ir_node *cns) {
        ir_node  *mem       = get_Store_mem(node);
        ir_graph *irg       = current_ir_graph;
        dbg_info *dbgi      = get_irn_dbg_info(node);
-       ir_node  *noreg     = ia32_new_NoReg_gp(env_cg);
-       int      ofs        = 4;
+       int      ofs        = 0;
        ir_node  *new_node;
        ia32_address_t addr;
 
-       unsigned val = get_tarval_sub_bits(tv, 0) |
-               (get_tarval_sub_bits(tv, 1) << 8) |
-               (get_tarval_sub_bits(tv, 2) << 16) |
-               (get_tarval_sub_bits(tv, 3) << 24);
-       ir_node *imm = create_Immediate(NULL, 0, val);
+       assert(size % 4 == 0);
 
-       /* construct store address */
-       memset(&addr, 0, sizeof(addr));
-       ia32_create_address_mode(&addr, ptr, /*force=*/0);
-
-       if (addr.base == NULL) {
-               addr.base = noreg;
-       } else {
-               addr.base = be_transform_node(addr.base);
-       }
-
-       if (addr.index == NULL) {
-               addr.index = noreg;
-       } else {
-               addr.index = be_transform_node(addr.index);
-       }
-       addr.mem = be_transform_node(mem);
-
-       new_node = new_rd_ia32_Store(dbgi, irg, new_block, addr.base,
-               addr.index, addr.mem, imm);
-
-       set_irn_pinned(new_node, get_irn_pinned(node));
-       set_ia32_op_type(new_node, ia32_AddrModeD);
-       set_ia32_ls_mode(new_node, mode_Iu);
-
-       set_address(new_node, &addr);
+       build_address_ptr(&addr, ptr, mem);
 
-       /** add more stores if needed */
-       while (size > 32) {
-               unsigned val = get_tarval_sub_bits(tv, ofs) |
-                       (get_tarval_sub_bits(tv, ofs + 1) << 8) |
+       do {
+               unsigned val =
+                        get_tarval_sub_bits(tv, ofs)            |
+                       (get_tarval_sub_bits(tv, ofs + 1) <<  8) |
                        (get_tarval_sub_bits(tv, ofs + 2) << 16) |
                        (get_tarval_sub_bits(tv, ofs + 3) << 24);
                ir_node *imm = create_Immediate(NULL, 0, val);
 
-               addr.offset += 4;
-               addr.mem = new_node;
-
                new_node = new_rd_ia32_Store(dbgi, irg, new_block, addr.base,
                        addr.index, addr.mem, imm);
 
                set_irn_pinned(new_node, get_irn_pinned(node));
                set_ia32_op_type(new_node, ia32_AddrModeD);
                set_ia32_ls_mode(new_node, mode_Iu);
-
                set_address(new_node, &addr);
-               size -= 32;
-               ofs  += 4;
-       }
+               SET_IA32_ORIG_NODE(new_node, ia32_get_old_node_name(env_cg, node));
+
+               size        -= 4;
+               ofs         += 4;
+               addr.offset += 4;
+               addr.mem     = new_node;
+       } while (size != 0);
 
-       SET_IA32_ORIG_NODE(new_node, ia32_get_old_node_name(env_cg, node));
        return new_node;
 }