Use simple assignment instead of memcpy() when possible.
[libfirm] / ir / be / begnuas.c
index 6c2165b..2315169 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
+ * Copyright (C) 1995-2011 University of Karlsruhe.  All right reserved.
  *
  * This file is part of libFirm.
  *
@@ -722,7 +722,7 @@ static void do_emit_atomic_init(be_gas_decl_env_t *env, ir_node *init)
        case iro_Const:
                tv = get_Const_tarval(init);
 
-               /* it's a arithmetic value */
+               /* it's an arithmetic value */
                emit_arith_tarval(tv, bytes);
                return;
 
@@ -977,9 +977,9 @@ static size_t get_initializer_size(const ir_initializer_t *initializer,
                if (!is_type_variable_size(type)) {
                        return get_type_size_bytes(type);
                } else {
-                       unsigned n_entries
+                       size_t n_entries
                                = get_initializer_compound_n_entries(initializer);
-                       unsigned i;
+                       size_t i;
                        unsigned initializer_size = get_type_size_bytes(type);
                        for (i = 0; i < n_entries; ++i) {
                                ir_entity *entity = get_compound_member(type, i);
@@ -1158,15 +1158,14 @@ static void emit_ir_initializer(normal_or_bitfield *vals,
                                if (mode != NULL) {
                                        size_t offset_bits
                                                = get_entity_offset_bits_remainder(member);
-                                       size_t value_len = get_mode_size_bits(mode);
 
-                                       if (offset_bits != 0 ||
-                                               (value_len != 8 && value_len != 16 && value_len != 32
-                                                && value_len != 64) ||
-                                               (is_Primitive_type(subtype) && get_primitive_base_type(subtype) != NULL)) {
+                                       if (is_Primitive_type(subtype)
+                                                       && get_primitive_base_type(subtype) != NULL) {
                                                emit_bitfield(&vals[offset], offset_bits,
                                                              sub_initializer, subtype);
                                                continue;
+                                       } else {
+                                               assert(offset_bits == 0);
                                        }
                                }
 
@@ -1602,8 +1601,11 @@ static void emit_global(be_gas_decl_env_t *env, const ir_entity *entity)
        }
 
        if (entity_is_null(entity)) {
-               be_emit_irprintf("\t.space %u, 0\n", get_type_size_bytes(type));
-               be_emit_write_line();
+               unsigned size = get_type_size_bytes(type);
+               if (size > 0) {
+                       be_emit_irprintf("\t.space %u, 0\n", get_type_size_bytes(type));
+                       be_emit_write_line();
+               }
        } else if (entity_has_compound_ent_values(entity)) {
                emit_compound_graph_init(env, entity);
        } else {
@@ -1620,7 +1622,7 @@ static void emit_global(be_gas_decl_env_t *env, const ir_entity *entity)
  */
 static void be_gas_emit_globals(ir_type *gt, be_gas_decl_env_t *env)
 {
-       int i, n = get_compound_n_members(gt);
+       size_t i, n = get_compound_n_members(gt);
 
        for (i = 0; i < n; i++) {
                ir_entity *ent = get_compound_member(gt, i);