]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* defaults.h (UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP,
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 18 Aug 2001 00:53:20 +0000 (00:53 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 18 Aug 2001 00:53:20 +0000 (00:53 +0000)
UNALIGNED_DOUBLE_INT_ASM_OP, ASM_BYTE_OP): Move from ...
* dwarf2asm.c: ... here.
* dwarfout.c: Remove them.

* varasm.c (assemble_integer): Add align parameter.
(assemble_real, output_constant, output_constructor): Likewise.
* output.h: Update decls.
* dwarf2asm.c, final.c, varasm.c, config/darwin.c, config/nextstep.c,
config/alpha/alpha.c, config/arm/arm.md, config/clipper/clipper.c,
config/m88k/m88k.c, config/mcore/mcore.md, config/mips/mips.h,
config/mips/mips.md, config/pa/pa.c, config/rs6000/rs6000.c,
config/rs6000/rs6000.h, config/s390/s390.h, config/sh/sh.md:
Update all callers.

* final.c (end_final): Abort profile block generation if we
havn't layed it out properly.
* output.h (assemble_eh_integer): Remove stale decl.
* varasm.c (assemble_zeros): Tidy; use assemble_integer.
(min_align): New.
(assemble_integer): Handle unaligned data.
(assemble_real): Abort on unaligned data.
(output_constructor): Don't assume ASM_OUTPUT_ALIGN 0 does
anything useful.
(default_dtor_section_asm_out_destructor): Use assemble_align.
(default_named_section_asm_out_constructor): Likewise.
(default_ctor_section_asm_out_constructor): Likewise.
* config/darwin.c (machopic_asm_out_constructor): Likewise.
(machopic_asm_out_destructor): Likewise.
* config/nextstep.c (nextstep_asm_out_constructor): Likewise.
(nextstep_asm_out_destructor): Likewise.
* config/alpha/alpha.c (vms_asm_out_constructor): Likewise.
(vms_asm_out_destructor): Likewise.

        * java/class.c (emit_register_classes): Add align parameter to
        call to assemble_integer.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44992 138bc75d-0d04-0410-961f-82ee72b054a4

23 files changed:
gcc/ChangeLog
gcc/config/alpha/alpha.c
gcc/config/arm/arm.md
gcc/config/clipper/clipper.c
gcc/config/darwin.c
gcc/config/m88k/m88k.c
gcc/config/mcore/mcore.md
gcc/config/mips/mips.h
gcc/config/mips/mips.md
gcc/config/nextstep.c
gcc/config/pa/pa.c
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h
gcc/config/s390/s390.h
gcc/config/sh/sh.md
gcc/defaults.h
gcc/dwarf2asm.c
gcc/dwarfout.c
gcc/final.c
gcc/java/ChangeLog
gcc/java/class.c
gcc/output.h
gcc/varasm.c

index da042fe084057e7f510210db8a7e2d30d7c97b02..12b76ccb4f57e35b3323f7246e12b8bb40436e44 100644 (file)
@@ -1,3 +1,39 @@
+2001-08-17  Richard Henderson  <rth@redhat.com>
+
+       * defaults.h (UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP,
+       UNALIGNED_DOUBLE_INT_ASM_OP, ASM_BYTE_OP): Move from ...
+       * dwarf2asm.c: ... here.
+       * dwarfout.c: Remove them.
+
+       * varasm.c (assemble_integer): Add align parameter.
+       (assemble_real, output_constant, output_constructor): Likewise.
+       * output.h: Update decls.
+       * dwarf2asm.c, final.c, varasm.c, config/darwin.c, config/nextstep.c,
+       config/alpha/alpha.c, config/arm/arm.md, config/clipper/clipper.c,
+       config/m88k/m88k.c, config/mcore/mcore.md, config/mips/mips.h,
+       config/mips/mips.md, config/pa/pa.c, config/rs6000/rs6000.c,
+       config/rs6000/rs6000.h, config/s390/s390.h, config/sh/sh.md:
+       Update all callers.
+
+       * final.c (end_final): Abort profile block generation if we
+       havn't layed it out properly.
+       * output.h (assemble_eh_integer): Remove stale decl.
+       * varasm.c (assemble_zeros): Tidy; use assemble_integer.
+       (min_align): New.
+       (assemble_integer): Handle unaligned data.
+       (assemble_real): Abort on unaligned data.
+       (output_constructor): Don't assume ASM_OUTPUT_ALIGN 0 does
+       anything useful.
+       (default_dtor_section_asm_out_destructor): Use assemble_align.
+       (default_named_section_asm_out_constructor): Likewise.
+       (default_ctor_section_asm_out_constructor): Likewise.
+       * config/darwin.c (machopic_asm_out_constructor): Likewise.
+       (machopic_asm_out_destructor): Likewise.
+       * config/nextstep.c (nextstep_asm_out_constructor): Likewise.
+       (nextstep_asm_out_destructor): Likewise.
+       * config/alpha/alpha.c (vms_asm_out_constructor): Likewise.
+       (vms_asm_out_destructor): Likewise.
+
 2001-08-17  Richard Henderson  <rth@redhat.com>
 
        * config/mips/iris6.h (TARGET_IRIX6): New.
index 741a5ee97a48b7b759c07e1f26dcb4dc888a37b2..731f6a6a090577746de5b1842c00bb3a987780de 100644 (file)
@@ -6595,7 +6595,8 @@ vms_asm_out_constructor (symbol, priority)
      int priority ATTRIBUTE_UNUSED;
 {
   ctors_section ();
-  assemble_integer (symbol, UNITS_PER_WORD, 1);
+  assemble_align (BITS_PER_WORD);
+  assemble_integer (symbol, UNITS_PER_WORD, BITS_PER_WORD, 1);
 }
 
 static void
@@ -6604,7 +6605,8 @@ vms_asm_out_destructor (symbol, priority)
      int priority ATTRIBUTE_UNUSED;
 {
   dtors_section ();
-  assemble_integer (symbol, UNITS_PER_WORD, 1);
+  assemble_align (BITS_PER_WORD);
+  assemble_integer (symbol, UNITS_PER_WORD, BITS_PER_WORD, 1);
 }
 #else
 
index fea195483d559e2ba605ee2c0f7c961a90fd779a..5565aeeaf1ff5217dcc7863a789b89d21ef9ab77 100644 (file)
   "TARGET_THUMB"
   "*
   making_const_table = TRUE;
-  assemble_integer (operands[0], 1, 1);
+  assemble_integer (operands[0], 1, BITS_PER_WORD, 1);
   assemble_zeros (3);
   return \"\";
   "
   "TARGET_THUMB"
   "*
   making_const_table = TRUE;
-  assemble_integer (operands[0], 2, 1);
+  assemble_integer (operands[0], 2, BITS_PER_WORD, 1);
   assemble_zeros (2);
   return \"\";
   "
       {
         union real_extract u;
         memcpy (&u, &CONST_DOUBLE_LOW (operands[0]), sizeof u);
-        assemble_real (u.d, GET_MODE (operands[0]));
+        assemble_real (u.d, GET_MODE (operands[0]), BITS_PER_WORD);
         break;
       }
       default:
-        assemble_integer (operands[0], 4, 1);
+        assemble_integer (operands[0], 4, BITS_PER_WORD, 1);
         break;
       }
     return \"\";
         {
           union real_extract u;
           memcpy (&u, &CONST_DOUBLE_LOW (operands[0]), sizeof u);
-          assemble_real (u.d, GET_MODE (operands[0]));
+          assemble_real (u.d, GET_MODE (operands[0]), BITS_PER_WORD);
           break;
         }
       default:
-        assemble_integer (operands[0], 8, 1);
+        assemble_integer (operands[0], 8, BITS_PER_WORD, 1);
         break;
       }
     return \"\";
index 8104b859fceb795eb09dfd30c19b213d0b807774..37756e941c5fd8efe8b3c49057e0008068468e55 100644 (file)
@@ -712,6 +712,6 @@ clix_asm_out_destructor (symbol, priority)
      int priority ATTRIBUTE_UNUSED;
 {
   fini_section ();
-  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
-  assemble_integer (const0_rtx, POINTER_SIZE / BITS_PER_UNIT, 1);
+  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
+  assemble_integer (const0_rtx, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
 }
index f2bd5bd614a35530ced2f559bc5bccaeb9fffca7..d00b7bda6005f72905aadc285dea51b8f759a86d 100644 (file)
@@ -924,10 +924,11 @@ machopic_finish (asm_out_file)
          )
        {
          data_section ();
-         assemble_align (UNITS_PER_WORD * BITS_PER_UNIT);
+         assemble_align (GET_MODE_ALIGNMENT (Pmode));
          assemble_label (lazy_name);
          assemble_integer (gen_rtx (SYMBOL_REF, Pmode, sym_name),
-                           GET_MODE_SIZE (Pmode), 1);
+                           GET_MODE_SIZE (Pmode),
+                           GET_MODE_ALIGNMENT (Pmode), 1);
        }
       else
        {
@@ -939,7 +940,8 @@ machopic_finish (asm_out_file)
          assemble_name (asm_out_file, sym_name); 
          fprintf (asm_out_file, "\n");
 
-         assemble_integer (const0_rtx, GET_MODE_SIZE (Pmode), 1);
+         assemble_integer (const0_rtx, GET_MODE_SIZE (Pmode),
+                           GET_MODE_ALIGNMENT (Pmode), 1);
        }
     }
 }
@@ -1117,7 +1119,8 @@ machopic_asm_out_constructor (symbol, priority)
     mod_init_section ();
   else
     constructor_section ();
-  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
+  assemble_align (POINTER_SIZE);
+  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
 
   if (!flag_pic)
     fprintf (asm_out_file, ".reference .constructors_used\n");
@@ -1132,7 +1135,8 @@ machopic_asm_out_destructor (symbol, priority)
     mod_term_section ();
   else
     destructor_section ();
-  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
+  assemble_align (POINTER_SIZE);
+  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
 
   if (!flag_pic)
     fprintf (asm_out_file, ".reference .destructors_used\n");
index c1b9a6b7c3499dd3b9609daf4fc46015240270fb..1c0bd15417a55089b18e44d5be73d55a38ae8cc3 100644 (file)
@@ -3311,8 +3311,8 @@ m88k_svr3_asm_out_destructor (symbol, priority)
   int i;
 
   fini_section ();
-  assemble_integer (symbol, UNITS_PER_WORD, 1);
+  assemble_integer (symbol, UNITS_PER_WORD, BITS_PER_WORD, 1);
   for (i = 1; i < 4; i++)
-    assemble_integer (constm1_rtx, UNITS_PER_WORD, 1);
+    assemble_integer (constm1_rtx, UNITS_PER_WORD, BITS_PER_WORD, 1);
 }
 #endif
index 4cc15370cf80cc1639958f9d565de211ef5375cd..1a37bbbebdde33af7f5cba88b3fbf97f45ecd753 100644 (file)
  ""
  "*
 {
-  assemble_integer (operands[0], 4, 1);
+  assemble_integer (operands[0], 4, BITS_PER_WORD, 1);
   return \"\";
 }"
  [(set_attr "length" "4")])
index d86cf1c986379fc3ae20d875789e028ba7757f67..b3c4dd40321f93712e2be02f69eede851b456cc3 100644 (file)
@@ -4304,9 +4304,9 @@ do {                                                                      \
   else                                                                 \
     {                                                                  \
       assemble_integer (operand_subword ((VALUE), 0, 0, DImode),       \
-                       UNITS_PER_WORD, 1);                             \
+                       UNITS_PER_WORD, BITS_PER_WORD, 1);              \
       assemble_integer (operand_subword ((VALUE), 1, 0, DImode),       \
-                       UNITS_PER_WORD, 1);                             \
+                       UNITS_PER_WORD, BITS_PER_WORD, 1);              \
     }                                                                  \
 } while (0)
 
index d0ab2a32059fcf3595df8795010ea1767832104c..6c4e32ca22b03bb434fbe92fd1afc47ad4e1ee20 100644 (file)
@@ -10382,7 +10382,7 @@ ld\\t%2,%1-%S1(%2)\;daddu\\t%2,%2,$31\;j\\t%2"
   "TARGET_MIPS16"
   "*
 {
-  assemble_integer (operands[0], 1, 1);
+  assemble_integer (operands[0], 1, BITS_PER_UNIT, 1);
   return \"\";
 }"
   [(set_attr "type"    "unknown")
@@ -10394,7 +10394,7 @@ ld\\t%2,%1-%S1(%2)\;daddu\\t%2,%2,$31\;j\\t%2"
   "TARGET_MIPS16"
   "*
 {
-  assemble_integer (operands[0], 2, 1);
+  assemble_integer (operands[0], 2, BITS_PER_UNIT * 2, 1);
   return \"\";
 }"
   [(set_attr "type"    "unknown")
@@ -10406,7 +10406,7 @@ ld\\t%2,%1-%S1(%2)\;daddu\\t%2,%2,$31\;j\\t%2"
   "TARGET_MIPS16"
   "*
 {
-  assemble_integer (operands[0], 4, 1);
+  assemble_integer (operands[0], 4, BITS_PER_UNIT * 4, 1);
   return \"\";
 }"
   [(set_attr "type"    "unknown")
@@ -10418,7 +10418,7 @@ ld\\t%2,%1-%S1(%2)\;daddu\\t%2,%2,$31\;j\\t%2"
   "TARGET_MIPS16"
   "*
 {
-  assemble_integer (operands[0], 8, 1);
+  assemble_integer (operands[0], 8, BITS_PER_UNIT * 8, 1);
   return \"\";
 }"
   [(set_attr "type"    "unknown")
@@ -10435,7 +10435,7 @@ ld\\t%2,%1-%S1(%2)\;daddu\\t%2,%2,$31\;j\\t%2"
   if (GET_CODE (operands[0]) != CONST_DOUBLE)
     abort ();
   memcpy (&u, &CONST_DOUBLE_LOW (operands[0]), sizeof u);
-  assemble_real (u.d, SFmode);
+  assemble_real (u.d, SFmode, GET_MODE_ALIGNMENT (SFmode));
   return \"\";
 }"
   [(set_attr "type"    "unknown")
@@ -10452,7 +10452,7 @@ ld\\t%2,%1-%S1(%2)\;daddu\\t%2,%2,$31\;j\\t%2"
   if (GET_CODE (operands[0]) != CONST_DOUBLE)
     abort ();
   memcpy (&u, &CONST_DOUBLE_LOW (operands[0]), sizeof u);
-  assemble_real (u.d, DFmode);
+  assemble_real (u.d, DFmode, GET_MODE_ALIGNMENT (DFmode));
   return \"\";
 }"
   [(set_attr "type"    "unknown")
index 94492d4998e9561f804e7513e1fb29eff4da5fe4..bbe0cd68fa49aa1a2f0d9bf9bde18ed3d32ca227 100644 (file)
@@ -96,7 +96,8 @@ nextstep_asm_out_constructor (symbol, priority)
      int priority ATTRIBUTE_UNUSED;
 {
   constructor_section ();
-  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
+  assemble_align (POINTER_SIZE);
+  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
   fprintf (asm_out_file, ".reference .constructors_used\n");
 }
 
@@ -106,7 +107,8 @@ nextstep_asm_out_destructor (symbol, priority)
      int priority ATTRIBUTE_UNUSED;
 {
   destructor_section ();
-  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
+  assemble_align (POINTER_SIZE);
+  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
   fprintf (asm_out_file, ".reference .destructors_used\n");
 }
 
index d4fe968008e2cd78a9cbb854bec5052fc76b3501..5517f99f7f4970a6ab8cfdf83b0818929cc58d66 100644 (file)
@@ -4377,8 +4377,8 @@ output_deferred_plabels (file)
   for (i = 0; i < n_deferred_plabels; i++)
     {
       ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (deferred_plabels[i].internal_label));
-      assemble_integer (gen_rtx_SYMBOL_REF (VOIDmode,
-                                           deferred_plabels[i].name), 4, 1);
+      assemble_integer (gen_rtx_SYMBOL_REF (Pmode, deferred_plabels[i].name),
+                       4, 32, 1);
     }
 }
 
index 838315ea7dc15873c02fe4f70f21ecf688b1b2d1..f8a168dabf7ca09cbc552d3d05969bbda9263b02 100644 (file)
@@ -8745,7 +8745,7 @@ rs6000_elf_asm_out_constructor (symbol, priority)
       fputs (")@fixup\n", asm_out_file);
     }
   else
-    assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
+    assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
 }
 
 static void
@@ -8776,7 +8776,7 @@ rs6000_elf_asm_out_destructor (symbol, priority)
       fputs (")@fixup\n", asm_out_file);
     }
   else
-    assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
+    assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
 }
 #endif
 
index 8c7ba3369ec8021157f6f0f9f0fe4a6e8a730c9f..f87c1eb833941d6098be28e341f686af445800bd 100644 (file)
@@ -2475,9 +2475,9 @@ do {                                                                      \
   if (TARGET_32BIT)                                                    \
     {                                                                  \
       assemble_integer (operand_subword ((VALUE), 0, 0, DImode),       \
-                        UNITS_PER_WORD, 1);                            \
+                        UNITS_PER_WORD, BITS_PER_WORD, 1);             \
       assemble_integer (operand_subword ((VALUE), 1, 0, DImode),       \
-                        UNITS_PER_WORD, 1);                            \
+                        UNITS_PER_WORD, BITS_PER_WORD, 1);             \
     }                                                                  \
   else                                                                 \
     {                                                                  \
index 066811a8c4ef23970b9bb059e266cbdfa0561e19..2e52dd2b217dbd4c76c1ffb11e8c0c19d9a86513 100644 (file)
@@ -1807,7 +1807,7 @@ extern int s390_nr_constants;
     /* Mark entries referenced by other entries */                     \
     for (pool = first_pool; pool; pool = pool->next)                   \
       if (pool->mark)                                                  \
-        mark_constants (pool->constant);                                       \
+        mark_constants (pool->constant);                               \
                                                                        \
     s390_asm_output_pool_prologue (FILE, FUNNAME, fndecl, size);       \
 }
@@ -1818,46 +1818,47 @@ extern int s390_nr_constants;
 #define ASM_OUTPUT_POOL_EPILOGUE(FILE, FUNNAME, fndecl, size) return;
 
 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY(FILE, EXP, MODE, ALIGN, LABELNO, WIN) \
-{                                                                       \
-  if ((s390_pool_count == 0) || (s390_pool_count > 0 && LABELNO >= 0))         \
-    {                                                                  \
-      fprintf (FILE, ".LC%d:\n", LABELNO);                              \
-      LABELNO = ~LABELNO;                                               \
-    }                                                                   \
-  if (s390_pool_count > 0)                                             \
-    {                                                                  \
-      fprintf (FILE, ".LC%d_%X:\n", ~LABELNO, s390_pool_count);         \
-    }                                                                  \
-                                                                       \
-  /* Output the value of the constant itself.  */                      \
-  switch (GET_MODE_CLASS (pool->mode))                                 \
-    {                                                                  \
-    case MODE_FLOAT:                                                   \
-      if (GET_CODE (x) != CONST_DOUBLE)                                        \
-       abort ();                                                       \
-                                                                       \
-      memcpy ((char *) &u, (char *) &CONST_DOUBLE_LOW (x), sizeof u);  \
-      assemble_real (u.d, pool->mode);                                 \
-      break;                                                           \
-                                                                       \
-    case MODE_INT:                                                     \
-    case MODE_PARTIAL_INT:                                             \
-      if (flag_pic && (GET_CODE (x) == CONST ||                         \
-                  GET_CODE (x) == SYMBOL_REF ||                        \
-                   GET_CODE (x) == LABEL_REF ))                         \
-        {                                                              \
-          fprintf (FILE, "%s\t",TARGET_64BIT ? ASM_QUAD : ASM_LONG);   \
-          s390_output_symbolic_const (FILE, x);                        \
-          fputc ('\n', (FILE));                                                \
-       }                                                               \
-      else                                                              \
-        assemble_integer (x, GET_MODE_SIZE (pool->mode), 1);           \
-      break;                                                           \
-                                                                       \
-    default:                                                           \
-      abort ();                                                                \
-    }                                                                  \
-  goto WIN;                                                            \
+{                                                                          \
+  if ((s390_pool_count == 0) || (s390_pool_count > 0 && LABELNO >= 0))     \
+    {                                                                      \
+      fprintf (FILE, ".LC%d:\n", LABELNO);                                 \
+      LABELNO = ~LABELNO;                                                  \
+    }                                                                      \
+  if (s390_pool_count > 0)                                                 \
+    {                                                                      \
+      fprintf (FILE, ".LC%d_%X:\n", ~LABELNO, s390_pool_count);                    \
+    }                                                                      \
+                                                                           \
+  /* Output the value of the constant itself.  */                          \
+  switch (GET_MODE_CLASS (MODE))                                           \
+    {                                                                      \
+    case MODE_FLOAT:                                                       \
+      if (GET_CODE (EXP) != CONST_DOUBLE)                                  \
+       abort ();                                                           \
+                                                                           \
+      memcpy ((char *) &u, (char *) &CONST_DOUBLE_LOW (EXP), sizeof u);            \
+      assemble_real (u.d, MODE, ALIGN);                                            \
+      break;                                                               \
+                                                                           \
+    case MODE_INT:                                                         \
+    case MODE_PARTIAL_INT:                                                 \
+      if (flag_pic                                                         \
+         && (GET_CODE (EXP) == CONST                                       \
+             || GET_CODE (EXP) == SYMBOL_REF                               \
+             || GET_CODE (EXP) == LABEL_REF ))                             \
+        {                                                                  \
+          fprintf (FILE, "%s\t",TARGET_64BIT ? ASM_QUAD : ASM_LONG);       \
+          s390_output_symbolic_const (FILE, EXP);                          \
+          fputc ('\n', (FILE));                                                    \
+       }                                                                   \
+      else                                                                 \
+        assemble_integer (EXP, GET_MODE_SIZE (MODE), ALIGN, 1);                    \
+      break;                                                               \
+                                                                           \
+    default:                                                               \
+      abort ();                                                                    \
+    }                                                                      \
+  goto WIN;                                                                \
 }
 
 #endif 
index 284429198e2e6a3dc75b6dc4acd3651367cf597e..69857c32024c47fecdc89aa33c0d4b7545d5ddec 100644 (file)
  "*
 {
   if (operands[1] != const0_rtx)
-    assemble_integer (operands[0], 2, 1);
+    assemble_integer (operands[0], 2, BITS_PER_UNIT * 2, 1);
   return \"\";
 }"
  [(set_attr "length" "2")
  "*
 {
   if (operands[1] != const0_rtx)
-    assemble_integer (operands[0], 4, 1);
+    assemble_integer (operands[0], 4, BITS_PER_UNIT * 4, 1);
   return \"\";
 }"
  [(set_attr "length" "4")
  "*
 {
   if (operands[1] != const0_rtx)
-    assemble_integer (operands[0], 8, 1);
+    assemble_integer (operands[0], 8, BITS_PER_UNIT * 8, 1);
   return \"\";
 }"
  [(set_attr "length" "8")
     {
       union real_extract u;
       memcpy (&u, &CONST_DOUBLE_LOW (operands[0]), sizeof u);
-      assemble_real (u.d, SFmode);
+      assemble_real (u.d, SFmode, GET_MODE_ALIGNMENT (SFmode));
     }
   return \"\";
 }"
     {
       union real_extract u;
       memcpy (&u, &CONST_DOUBLE_LOW (operands[0]), sizeof u);
-      assemble_real (u.d, DFmode);
+      assemble_real (u.d, DFmode, GET_MODE_ALIGNMENT (DFmode));
     }
   return \"\";
 }"
index 14635b3e2c91d6681d6dd3a69cbe0d924252ff51..44eedc8e02b05b59c63880f13f0690df2688f9c4 100644 (file)
@@ -383,4 +383,21 @@ do {                                                               \
 #define TARGET_ALLOWS_PROFILING_WITHOUT_FRAME_POINTER true
 #endif
 
+/* GAS and SYSV4 assemblers accept these.  */
+#ifdef OBJECT_FORMAT_ELF
+#ifndef UNALIGNED_SHORT_ASM_OP
+#define UNALIGNED_SHORT_ASM_OP         "\t.2byte\t"
+#endif
+#ifndef UNALIGNED_INT_ASM_OP
+#define UNALIGNED_INT_ASM_OP           "\t.4byte\t"
+#endif
+#ifndef UNALIGNED_DOUBLE_INT_ASM_OP
+#define UNALIGNED_DOUBLE_INT_ASM_OP    "\t.8byte\t"
+#endif
+#endif /* OBJECT_FORMAT_ELF */
+
+#ifndef ASM_BYTE_OP
+#define ASM_BYTE_OP                    "\t.byte\t"
+#endif
+
 #endif  /* ! GCC_DEFAULTS_H */
index 15ae68dd21284f5c4c786d05384df649036b8754..087cd684b98334bb375fa095a1ec17c2c7e510d4 100644 (file)
@@ -37,26 +37,6 @@ Boston, MA 02111-1307, USA.  */
 #define ASM_COMMENT_START ";#"
 #endif
 
-/* Definitions of defaults for assembler-dependent names of various
-   pseudo-ops and section names.  These may be overridden in the tm.h
-   file (if necessary) for a particular assembler.  */
-
-#ifdef OBJECT_FORMAT_ELF
-#ifndef UNALIGNED_SHORT_ASM_OP
-#define UNALIGNED_SHORT_ASM_OP         "\t.2byte\t"
-#endif
-#ifndef UNALIGNED_INT_ASM_OP
-#define UNALIGNED_INT_ASM_OP           "\t.4byte\t"
-#endif
-#ifndef UNALIGNED_DOUBLE_INT_ASM_OP
-#define UNALIGNED_DOUBLE_INT_ASM_OP    "\t.8byte\t"
-#endif
-#endif /* OBJECT_FORMAT_ELF */
-
-#ifndef ASM_BYTE_OP
-#define ASM_BYTE_OP                    "\t.byte\t"
-#endif
-
 /* We don't have unaligned support, let's hope the normal output works for
    .debug_frame.  But we know it won't work for .debug_info.  */
 #if !defined(UNALIGNED_INT_ASM_OP) && defined(DWARF2_DEBUGGING_INFO)
@@ -64,6 +44,9 @@ Boston, MA 02111-1307, USA.  */
 #endif
 
 \f
+/* Despite the fact that assemble_integer handles unaligned data,
+   continue emitting things by hand when possible, since that makes
+   the assembler commentary come out prettier.  */
 #ifdef UNALIGNED_INT_ASM_OP
 static const char * unaligned_integer_asm_op  PARAMS ((int));
 
@@ -123,7 +106,7 @@ dw2_asm_output_data VPARAMS ((int size, unsigned HOST_WIDE_INT value,
   fputs (unaligned_integer_asm_op (size), asm_out_file);
   fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, value);
 #else
-  assemble_integer (GEN_INT (value), size, 1);
+  assemble_integer (GEN_INT (value), size, BITS_PER_UNIT, 1);
 #endif
 
   if (flag_debug_asm && comment)
@@ -168,10 +151,9 @@ dw2_asm_output_delta VPARAMS ((int size, const char *lab1, const char *lab2,
   fputc ('-', asm_out_file);
   assemble_name (asm_out_file, lab2);
 #else
-  assemble_integer (gen_rtx_MINUS (smallest_mode_for_size (size, MODE_INT),
-                                  gen_rtx_SYMBOL_REF (Pmode, lab1),
+  assemble_integer (gen_rtx_MINUS (Pmode, gen_rtx_SYMBOL_REF (Pmode, lab1),
                                   gen_rtx_SYMBOL_REF (Pmode, lab2)),
-                   size, 1);
+                   size, BITS_PER_UNIT, 1);
 #endif
 
   if (flag_debug_asm && comment)
@@ -216,7 +198,7 @@ dw2_asm_output_offset VPARAMS ((int size, const char *label,
   fputs (unaligned_integer_asm_op (size), asm_out_file);
   assemble_name (asm_out_file, label);
 #else
-  assemble_integer (gen_rtx_SYMBOL_REF (Pmode, label), size, 1);
+  assemble_integer (gen_rtx_SYMBOL_REF (Pmode, label), size, BITS_PER_UNIT, 1);
 #endif
 #endif
 
@@ -300,7 +282,7 @@ dw2_asm_output_addr VPARAMS ((int size, const char *label,
   fputs (unaligned_integer_asm_op (size), asm_out_file);
   assemble_name (asm_out_file, label);
 #else
-  assemble_integer (gen_rtx_SYMBOL_REF (Pmode, label), size, 1);
+  assemble_integer (gen_rtx_SYMBOL_REF (Pmode, label), size, BITS_PER_UNIT, 1);
 #endif
 
   if (flag_debug_asm && comment)
@@ -338,7 +320,7 @@ dw2_asm_output_addr_rtx VPARAMS ((int size, rtx addr,
   fputs (unaligned_integer_asm_op (size), asm_out_file);
   output_addr_const (asm_out_file, addr);
 #else
-  assemble_integer (addr, size, 1);
+  assemble_integer (addr, size, BITS_PER_UNIT, 1);
 #endif
 
   if (flag_debug_asm && comment)
@@ -898,7 +880,7 @@ dw2_output_indirect_constant_1 (node, data)
   sym_ref = gen_rtx_SYMBOL_REF (Pmode, sym);
 
   ASM_OUTPUT_LABEL (asm_out_file, label);
-  assemble_integer (sym_ref, POINTER_SIZE / BITS_PER_UNIT, 1);
+  assemble_integer (sym_ref, POINTER_SIZE / BITS_PER_UNIT, BITS_PER_UNIT, 1);
 
   return 0;
 }
@@ -956,7 +938,7 @@ dw2_asm_output_encoded_addr_rtx VPARAMS ((int encoding,
 
   /* NULL is _always_ represented as a plain zero.  */
   if (addr == const0_rtx)
-    assemble_integer (addr, size, 1);
+    assemble_integer (addr, size, BITS_PER_UNIT, 1);
   else
     {
     restart:
@@ -989,7 +971,7 @@ dw2_asm_output_encoded_addr_rtx VPARAMS ((int encoding,
          fputs (unaligned_integer_asm_op (size), asm_out_file);
          output_addr_const (asm_out_file, addr);
 #else
-         assemble_integer (addr, size, 1);
+         assemble_integer (addr, size, BITS_PER_UNIT, 1);
 #endif
          break;
 
index 5c8b8bc6a2d5b9998dd2f9a0e8111ccc8cef1d80..b245f235e23beb9b734c085d45c81a33eaa835dc 100644 (file)
@@ -948,15 +948,6 @@ static void retry_incomplete_types PARAMS ((void));
 #ifndef VERSION_ASM_OP
 #define VERSION_ASM_OP         "\t.version\t"
 #endif
-#ifndef UNALIGNED_SHORT_ASM_OP
-#define UNALIGNED_SHORT_ASM_OP "\t.2byte\t"
-#endif
-#ifndef UNALIGNED_INT_ASM_OP
-#define UNALIGNED_INT_ASM_OP   "\t.4byte\t"
-#endif
-#ifndef ASM_BYTE_OP
-#define ASM_BYTE_OP            "\t.byte\t"
-#endif
 #ifndef SET_ASM_OP
 #define SET_ASM_OP             "\t.set\t"
 #endif
index d32248196a0066c1045a5b4e90766203d6c2e670..ec57842e079dda1d91e6a4da8f638884dfa83f7a 100644 (file)
@@ -291,6 +291,7 @@ end_final (filename)
       int long_bytes = LONG_TYPE_SIZE / BITS_PER_UNIT;
       int gcov_type_bytes = GCOV_TYPE_SIZE / BITS_PER_UNIT;
       int pointer_bytes = POINTER_SIZE / BITS_PER_UNIT;
+      unsigned int align2 = LONG_TYPE_SIZE;
 
       if (profile_block_flag)
        size = long_bytes * count_basic_blocks;
@@ -302,6 +303,12 @@ end_final (filename)
       rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
                 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
 
+      /* ??? This _really_ ought to be done with a structure layout
+        and with assemble_constructor.  If long_bytes != pointer_bytes
+        we'll be emitting unaligned data at some point.  */
+      if (long_bytes != pointer_bytes)
+       abort ();
+
       data_section ();
 
       /* Output the main header, of 11 words:
@@ -323,70 +330,74 @@ end_final (filename)
       ASM_OUTPUT_ALIGN (asm_out_file, align);
 
       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LPBX", 0);
-      /* zero word */
-      assemble_integer (const0_rtx, long_bytes, 1);
 
-      /* address of filename */
+      /* Zero word.  */
+      assemble_integer (const0_rtx, long_bytes, align2, 1);
+
+      /* Address of filename.  */
       ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 1);
-      assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name), pointer_bytes, 1);
+      assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name), pointer_bytes,
+                       align2, 1);
 
-      /* address of count table */
+      /* Address of count table.  */
       ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 2);
-      assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name), pointer_bytes, 1);
+      assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name), pointer_bytes,
+                       align2, 1);
 
-      /* count of the # of basic blocks or # of instrumented arcs */
+      /* Count of the # of basic blocks or # of instrumented arcs.  */
       if (profile_block_flag)
-       assemble_integer (GEN_INT (count_basic_blocks), long_bytes, 1);
-      else
-       assemble_integer (GEN_INT (count_instrumented_edges), long_bytes, 1);
+      assemble_integer (GEN_INT (profile_block_flag
+                                ? count_basic_blocks
+                                : count_instrumented_edges),
+                       long_bytes, align2, 1);
 
-      /* zero word (link field) */
-      assemble_integer (const0_rtx, pointer_bytes, 1);
+      /* Zero word (link field).  */
+      assemble_integer (const0_rtx, pointer_bytes, align2, 1);
 
       /* address of basic block start address table */
       if (profile_block_flag)
        {
          ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 3);
-         assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name), pointer_bytes,
-                           1);
+         assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name),
+                           pointer_bytes, align2, 1);
        }
       else
-       assemble_integer (const0_rtx, pointer_bytes, 1);
+       assemble_integer (const0_rtx, pointer_bytes, align2, 1);
 
-      /* byte count for extended structure.  */
-      assemble_integer (GEN_INT (11 * UNITS_PER_WORD), long_bytes, 1);
+      /* Byte count for extended structure.  */
+      assemble_integer (GEN_INT (11 * UNITS_PER_WORD), long_bytes, align2, 1);
 
-      /* address of function name table */
+      /* Address of function name table.  */
       if (profile_block_flag)
        {
          ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 4);
-         assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name), pointer_bytes,
-                           1);
+         assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name),
+                           pointer_bytes, align2, 1);
        }
       else
-       assemble_integer (const0_rtx, pointer_bytes, 1);
+       assemble_integer (const0_rtx, pointer_bytes, align2, 1);
 
-      /* address of line number and filename tables if debugging.  */
+      /* Address of line number and filename tables if debugging.  */
       if (write_symbols != NO_DEBUG && profile_block_flag)
        {
          ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 5);
          assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name),
-                           pointer_bytes, 1);
+                           pointer_bytes, align2, 1);
          ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 6);
          assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name),
-                           pointer_bytes, 1);
+                           pointer_bytes, align2, 1);
        }
       else
        {
-         assemble_integer (const0_rtx, pointer_bytes, 1);
-         assemble_integer (const0_rtx, pointer_bytes, 1);
+         assemble_integer (const0_rtx, pointer_bytes, align2, 1);
+         assemble_integer (const0_rtx, pointer_bytes, align2, 1);
        }
 
-      /* space for extension ptr (link field) */
-      assemble_integer (const0_rtx, UNITS_PER_WORD, 1);
+      /* Space for extension ptr (link field).  */
+      assemble_integer (const0_rtx, UNITS_PER_WORD, align2, 1);
 
-      /* Output the file name changing the suffix to .d for Sun tcov
-        compatibility.  */
+      /* Output the file name changing the suffix to .d for
+        Sun tcov compatibility.  */
       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LPBX", 1);
       {
        char *cwd = getpwd ();
@@ -460,7 +471,7 @@ end_final (filename)
            {
              ASM_GENERATE_INTERNAL_LABEL (name, "LPB", i);
              assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name),
-                               pointer_bytes, 1);
+                               pointer_bytes, align2, 1);
            }
        }
 
@@ -475,14 +486,14 @@ end_final (filename)
                  ASM_GENERATE_INTERNAL_LABEL (name, "LPBC",
                                               ptr->func_label_num);
                  assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name),
-                                   pointer_bytes, 1);
+                                   pointer_bytes, align2, 1);
                }
              else
-               assemble_integer (const0_rtx, pointer_bytes, 1);
+               assemble_integer (const0_rtx, pointer_bytes, align2, 1);
            }
 
          for (; i < count_basic_blocks; i++)
-           assemble_integer (const0_rtx, pointer_bytes, 1);
+           assemble_integer (const0_rtx, pointer_bytes, align2, 1);
        }
 
       if (write_symbols != NO_DEBUG && profile_block_flag)
@@ -490,10 +501,10 @@ end_final (filename)
          /* Output the table of line numbers.  */
          ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LPBX", 5);
          for ((ptr = bb_head), (i = 0); ptr != 0; (ptr = ptr->next), i++)
-           assemble_integer (GEN_INT (ptr->line_num), long_bytes, 1);
+           assemble_integer (GEN_INT (ptr->line_num), long_bytes, align2, 1);
 
          for (; i < count_basic_blocks; i++)
-           assemble_integer (const0_rtx, long_bytes, 1);
+           assemble_integer (const0_rtx, long_bytes, align2, 1);
 
          /* Output the table of file names.  */
          ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LPBX", 6);
@@ -504,14 +515,14 @@ end_final (filename)
                  ASM_GENERATE_INTERNAL_LABEL (name, "LPBC",
                                               ptr->file_label_num);
                  assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name),
-                                   pointer_bytes, 1);
+                                   pointer_bytes, align2, 1);
                }
              else
-               assemble_integer (const0_rtx, pointer_bytes, 1);
+               assemble_integer (const0_rtx, pointer_bytes, align2, 1);
            }
 
          for (; i < count_basic_blocks; i++)
-           assemble_integer (const0_rtx, pointer_bytes, 1);
+           assemble_integer (const0_rtx, pointer_bytes, align2, 1);
        }
 
       /* End with the address of the table of addresses,
@@ -519,8 +530,8 @@ end_final (filename)
       if (profile_block_flag)
        {
          ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 3);
-         assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name), pointer_bytes,
-                           1);
+         assemble_integer (gen_rtx_SYMBOL_REF (Pmode, name),
+                           pointer_bytes, align2, 1);
        }
     }
 }
@@ -1684,7 +1695,7 @@ profile_function (file)
   data_section ();
   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
   ASM_OUTPUT_INTERNAL_LABEL (file, "LP", profile_label_no);
-  assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, 1);
+  assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, align, 1);
 #endif
 
   function_section (current_function_decl);
index 6db866fd59b69c30f7b2452b8a5531ea5369560b..8c2b791080694d14d80ea6f90be275a7df4499de 100644 (file)
@@ -1,3 +1,8 @@
+2001-08-17  Richard Henderson  <rth@redhat.com>
+
+       * class.c (emit_register_classes): Add align parameter to
+       call to assemble_integer.
+
 2001-08-16  Alexandre Petit-Bianco  <apbianco@redhat.com>
 
        * jcf-parse.c (load_class): New locals saved and class_loaded. If
index 0f68e5ca75b2904c84d08a91dc77fa1b3973a0f1..e8f7e6f312aaee569aa70452369fb0d6b73e0f6a 100644 (file)
@@ -1893,7 +1893,7 @@ emit_register_classes ()
       assemble_align (POINTER_SIZE);
       for (t = registered_class; t; t = TREE_CHAIN (t))
        assemble_integer (XEXP (DECL_RTL (t), 0),
-                         POINTER_SIZE / BITS_PER_UNIT, 1);
+                         POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
 #else
       abort ();
 #endif
index b5aea51efedac32af0d15281c5cdc647754136d7..4c4c5aebcc1e01cfaadd4b52919f25ccc98b1583 100644 (file)
@@ -287,18 +287,17 @@ extern void assemble_eh_label             PARAMS ((const char *));
 extern void assemble_name              PARAMS ((FILE *, const char *));
 
 #ifdef RTX_CODE
-/* Assemble the integer constant X into an object of SIZE bytes.
-   X must be either a CONST_INT or CONST_DOUBLE.
-
-   Return 1 if we were able to output the constant, otherwise 0.  If FORCE is
-   non-zero, abort if we can't output the constant.  */
-extern int assemble_integer            PARAMS ((rtx, int, int));
-extern int assemble_eh_integer         PARAMS ((rtx, int, int));
+/* Assemble the integer constant X into an object of SIZE bytes.  ALIGN is
+   the alignment of the integer in bits.  Return 1 if we were able to output
+   the constant, otherwise 0.  If FORCE is non-zero, abort if we can't output
+   the constant.  */
+extern int assemble_integer            PARAMS ((rtx, unsigned, unsigned, int));
 
 #ifdef REAL_VALUE_TYPE
 /* Assemble the floating-point constant D into an object of size MODE.  */
 extern void assemble_real              PARAMS ((REAL_VALUE_TYPE,
-                                              enum machine_mode));
+                                                enum machine_mode,
+                                                unsigned));
 #endif
 #endif
 
@@ -341,8 +340,10 @@ extern tree initializer_constant_valid_p   PARAMS ((tree, tree));
    Assumes output_addressed_constants has been done on EXP already.
 
    Generate exactly SIZE bytes of assembler data, padding at the end
-   with zeros if necessary.  SIZE must always be specified.  */
-extern void output_constant            PARAMS ((tree, int));
+   with zeros if necessary.  SIZE must always be specified.
+
+   ALIGN is the alignment in bits that may be assumed for the data.  */
+extern void output_constant            PARAMS ((tree, int, unsigned));
 #endif
 
 #ifdef RTX_CODE
index 8b340624b8efc4c20f26696b42e08553e8df1888..24380c290196059762b287177346cfecb156e915 100644 (file)
@@ -161,7 +161,8 @@ static int mark_constant            PARAMS ((rtx *current_rtx, void *data));
 static int output_addressed_constants  PARAMS ((tree));
 static void output_after_function_constants PARAMS ((void));
 static unsigned HOST_WIDE_INT array_size_for_constructor PARAMS ((tree));
-static void output_constructor         PARAMS ((tree, int));
+static unsigned min_align              PARAMS ((unsigned, unsigned));
+static void output_constructor         PARAMS ((tree, int, unsigned));
 #ifdef ASM_WEAKEN_LABEL
 static void remove_from_pending_weak_list      PARAMS ((const char *));
 #endif
@@ -952,7 +953,7 @@ default_named_section_asm_out_destructor (symbol, priority)
 
   named_section_flags (section, SECTION_WRITE);
   assemble_align (POINTER_SIZE);
-  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
+  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
 }
 
 #ifdef DTORS_SECTION_ASM_OP
@@ -973,7 +974,8 @@ default_dtor_section_asm_out_destructor (symbol, priority)
      int priority ATTRIBUTE_UNUSED;
 {
   dtors_section ();
-  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
+  assemble_align (POINTER_SIZE);
+  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
 }
 #endif
 
@@ -1012,7 +1014,8 @@ default_named_section_asm_out_constructor (symbol, priority)
     }
 
   named_section_flags (section, SECTION_WRITE);
-  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
+  assemble_align (POINTER_SIZE);
+  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
 }
 
 #ifdef CTORS_SECTION_ASM_OP
@@ -1033,7 +1036,8 @@ default_ctor_section_asm_out_constructor (symbol, priority)
      int priority ATTRIBUTE_UNUSED;
 {
   ctors_section ();
-  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
+  assemble_align (POINTER_SIZE);
+  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
 }
 #endif
 \f
@@ -1172,29 +1176,8 @@ assemble_zeros (size)
   if (ASM_NO_SKIP_IN_TEXT && in_text_section ())
     {
       int i;
-
-      for (i = 0; i < size - 20; i += 20)
-       {
-#ifdef ASM_BYTE_OP
-         fprintf (asm_out_file,
-                  "%s0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n", ASM_BYTE_OP);
-#else
-         fprintf (asm_out_file,
-                  "\tbyte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n");
-#endif
-       }
-      if (i < size)
-        {
-#ifdef ASM_BYTE_OP
-         fprintf (asm_out_file, "%s0", ASM_BYTE_OP);
-#else
-         fprintf (asm_out_file, "\tbyte 0");
-#endif
-         i++;
-         for (; i < size; i++)
-           fprintf (asm_out_file, ",0");
-         fprintf (asm_out_file, "\n");
-       }
+      for (i = 0; i < size; i++)
+       assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
     }
   else
 #endif
@@ -1584,7 +1567,8 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
       if (DECL_INITIAL (decl))
        /* Output the actual data.  */
        output_constant (DECL_INITIAL (decl),
-                        tree_low_cst (DECL_SIZE_UNIT (decl), 1));
+                        tree_low_cst (DECL_SIZE_UNIT (decl), 1),
+                        align);
       else
        /* Leave space for it.  */
        assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1));
@@ -1801,52 +1785,90 @@ assemble_trampoline_template ()
 }
 #endif
 \f
-/* Assemble the integer constant X into an object of SIZE bytes.
-   X must be either a CONST_INT or CONST_DOUBLE.
+/* A and B are either alignments or offsets.  Return the minimum alignment
+   that may be assumed after adding the two together.  */
+
+static inline unsigned
+min_align (a, b)
+     unsigned int a, b;
+{
+  return (a | b) & -(a | b);
+}
 
-   Return 1 if we were able to output the constant, otherwise 0.  If FORCE is
-   non-zero, abort if we can't output the constant.  */
+/* Assemble the integer constant X into an object of SIZE bytes.  ALIGN is
+   the alignment of the integer in bits.  Return 1 if we were able to output
+   the constant, otherwise 0.  If FORCE is non-zero, abort if we can't output
+   the constant.  */
 
 int
-assemble_integer (x, size, force)
+assemble_integer (x, size, align, force)
      rtx x;
-     int size;
+     unsigned int size;
+     unsigned int align;
      int force;
 {
   /* First try to use the standard 1, 2, 4, 8, and 16 byte
      ASM_OUTPUT... macros.  */
 
-  switch (size)
-    {
+  if (align >= size * BITS_PER_UNIT)
+    switch (size)
+      {
 #ifdef ASM_OUTPUT_CHAR
-    case 1:
-      ASM_OUTPUT_CHAR (asm_out_file, x);
-      return 1;
+      case 1:
+       ASM_OUTPUT_CHAR (asm_out_file, x);
+       return 1;
 #endif
-
 #ifdef ASM_OUTPUT_SHORT
-    case 2:
-      ASM_OUTPUT_SHORT (asm_out_file, x);
-      return 1;
+      case 2:
+       ASM_OUTPUT_SHORT (asm_out_file, x);
+       return 1;
 #endif
-
 #ifdef ASM_OUTPUT_INT
-    case 4:
-      ASM_OUTPUT_INT (asm_out_file, x);
-      return 1;
+      case 4:
+       ASM_OUTPUT_INT (asm_out_file, x);
+       return 1;
 #endif
-
 #ifdef ASM_OUTPUT_DOUBLE_INT
-    case 8:
-      ASM_OUTPUT_DOUBLE_INT (asm_out_file, x);
-      return 1;
+      case 8:
+       ASM_OUTPUT_DOUBLE_INT (asm_out_file, x);
+       return 1;
 #endif
-
 #ifdef ASM_OUTPUT_QUADRUPLE_INT
-    case 16:
-      ASM_OUTPUT_QUADRUPLE_INT (asm_out_file, x);
-      return 1;
+      case 16:
+       ASM_OUTPUT_QUADRUPLE_INT (asm_out_file, x);
+       return 1;
+#endif
+      }
+  else
+    {
+      const char *asm_op = NULL;
+
+      switch (size)
+       {
+#ifdef UNALIGNED_SHORT_ASM_OP
+       case 2:
+         asm_op = UNALIGNED_SHORT_ASM_OP;
+         break;
+#endif
+#ifdef UNALIGNED_INT_ASM_OP
+       case 4:
+         asm_op = UNALIGNED_INT_ASM_OP;
+         break;
+#endif
+#ifdef UNALIGNED_DOUBLE_INT_ASM_OP
+       case 8:
+         asm_op = UNALIGNED_DOUBLE_INT_ASM_OP;
+         break;
 #endif
+       }
+
+      if (asm_op)
+       {
+         fputs (asm_op, asm_out_file);
+         output_addr_const (asm_out_file, x);
+         fputc ('\n', asm_out_file);
+         return 1;
+       }
     }
 
   /* If we couldn't do it that way, there are two other possibilities: First,
@@ -1861,24 +1883,22 @@ assemble_integer (x, size, force)
     }
 #endif
 
-  /* Finally, if SIZE is larger than a single word, try to output the constant
+  /* If SIZE is larger than a single word, try to output the constant
      one word at a time.  */
 
   if (size > UNITS_PER_WORD)
     {
-      int i;
       enum machine_mode mode
        = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
-      rtx word;
+      unsigned align2 = min_align (align, BITS_PER_WORD);
+      unsigned int i;
 
       for (i = 0; i < size / UNITS_PER_WORD; i++)
        {
-         word = operand_subword (x, i, 0, mode);
-
+         rtx word = operand_subword (x, i, 0, mode);
          if (word == 0)
            break;
-
-         if (! assemble_integer (word, UNITS_PER_WORD, 0))
+         if (! assemble_integer (word, UNITS_PER_WORD, align2, 0))
            break;
        }
 
@@ -1890,6 +1910,32 @@ assemble_integer (x, size, force)
        abort ();
     }
 
+  /* If unaligned, and this is a constant, emit it one byte at a time.  */
+  if (align < size * BITS_PER_UNIT)
+    {
+      enum machine_mode omode, imode;
+      unsigned int i;
+      omode = mode_for_size (BITS_PER_UNIT, MODE_INT, 0);
+      imode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
+
+      for (i = 0; i < size; i++)
+       {
+         rtx byte = simplify_subreg (omode, x, imode, i);
+         if (byte == 0)
+           break;
+         if (! assemble_integer (byte, 1, BITS_PER_UNIT, 0))
+           break;
+       }
+
+      if (i == size)
+       return 1;
+      /* If we output at least one byte and then could not finish,
+        there is no valid way to continue.  */
+      if (i > 0)
+       abort ();
+    }
+
   if (force)
     abort ();
 
@@ -1953,14 +1999,25 @@ assemble_real_1 (p)
 }
 
 void
-assemble_real (d, mode)
+assemble_real (d, mode, align)
      REAL_VALUE_TYPE d;
      enum machine_mode mode;
+     unsigned int align;
 {
   struct assemble_real_args args;
   args.d = &d;
   args.mode = mode;
 
+  /* We cannot emit unaligned floating point constants.  This is slightly
+     complicated in that we don't know what "unaligned" means exactly.  */
+#ifdef BIGGEST_FIELD_ALIGNMENT
+  if (align >= BIGGEST_FIELD_ALIGNMENT)
+    ;
+  else
+#endif
+  if (align < GET_MODE_ALIGNMENT (mode))
+    abort ();
+
   if (do_float_handler (assemble_real_1, (PTR) &args))
     return;
 
@@ -3280,7 +3337,8 @@ output_constant_def_contents (exp, reloc, labelno)
                   (TREE_CODE (exp) == STRING_CST
                    ? MAX (TREE_STRING_LENGTH (exp),
                           int_size_in_bytes (TREE_TYPE (exp)))
-                   : int_size_in_bytes (TREE_TYPE (exp))));
+                   : int_size_in_bytes (TREE_TYPE (exp))),
+                  align);
 
 }
 \f
@@ -3841,12 +3899,12 @@ output_constant_pool (fnname, fndecl)
            abort ();
 
          memcpy ((char *) &u, (char *) &CONST_DOUBLE_LOW (x), sizeof u);
-         assemble_real (u.d, pool->mode);
+         assemble_real (u.d, pool->mode, pool->align);
          break;
 
        case MODE_INT:
        case MODE_PARTIAL_INT:
-         assemble_integer (x, GET_MODE_SIZE (pool->mode), 1);
+         assemble_integer (x, GET_MODE_SIZE (pool->mode), pool->align, 1);
          break;
 
        default:
@@ -3856,7 +3914,6 @@ output_constant_pool (fnname, fndecl)
 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
     done: ;
 #endif
-
     }
 
 #ifdef ASM_OUTPUT_POOL_EPILOGUE
@@ -4258,12 +4315,15 @@ initializer_constant_valid_p (value, endtype)
 
    There a case in which we would fail to output exactly SIZE bytes:
    for a structure constructor that wants to produce more than SIZE bytes.
-   But such constructors will never be generated for any possible input.  */
+   But such constructors will never be generated for any possible input.
+
+   ALIGN is the alignment of the data in bits.  */
 
 void
-output_constant (exp, size)
-     register tree exp;
-     register int size;
+output_constant (exp, size, align)
+     tree exp;
+     int size;
+     unsigned int align;
 {
   register enum tree_code code = TREE_CODE (TREE_TYPE (exp));
 
@@ -4318,7 +4378,7 @@ output_constant (exp, size)
 
       if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
                                           EXPAND_INITIALIZER),
-                             size, 0))
+                             size, align, 0))
        error ("initializer for integer value is too complicated");
       size = 0;
       break;
@@ -4328,20 +4388,22 @@ output_constant (exp, size)
        error ("initializer for floating value is not a floating constant");
 
       assemble_real (TREE_REAL_CST (exp),
-                    mode_for_size (size * BITS_PER_UNIT, MODE_FLOAT, 0));
+                    mode_for_size (size * BITS_PER_UNIT, MODE_FLOAT, 0),
+                    align);
       size = 0;
       break;
 
     case COMPLEX_TYPE:
-      output_constant (TREE_REALPART (exp), size / 2);
-      output_constant (TREE_IMAGPART (exp), size / 2);
+      output_constant (TREE_REALPART (exp), size / 2, align);
+      output_constant (TREE_IMAGPART (exp), size / 2,
+                      min_align (align, BITS_PER_UNIT * (size / 2)));
       size -= (size / 2) * 2;
       break;
 
     case ARRAY_TYPE:
       if (TREE_CODE (exp) == CONSTRUCTOR)
        {
-         output_constructor (exp, size);
+         output_constructor (exp, size, align);
          return;
        }
       else if (TREE_CODE (exp) == STRING_CST)
@@ -4364,7 +4426,7 @@ output_constant (exp, size)
     case RECORD_TYPE:
     case UNION_TYPE:
       if (TREE_CODE (exp) == CONSTRUCTOR)
-       output_constructor (exp, size);
+       output_constructor (exp, size, align);
       else
        abort ();
       return;
@@ -4373,7 +4435,7 @@ output_constant (exp, size)
       if (TREE_CODE (exp) == INTEGER_CST)
        assemble_integer (expand_expr (exp, NULL_RTX,
                                       VOIDmode, EXPAND_INITIALIZER),
-                         size, 1);
+                         size, align, 1);
       else if (TREE_CODE (exp) == CONSTRUCTOR)
        {
          unsigned char *buffer = (unsigned char *) alloca (size);
@@ -4434,9 +4496,10 @@ array_size_for_constructor (val)
    Generate at least SIZE bytes, padding if necessary.  */
 
 static void
-output_constructor (exp, size)
+output_constructor (exp, size, align)
      tree exp;
      int size;
+     unsigned int align;
 {
   tree type = TREE_TYPE (exp);
   register tree link, field = 0;
@@ -4496,6 +4559,7 @@ output_constructor (exp, size)
          HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
          HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
          HOST_WIDE_INT index;
+         unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
 
          for (index = lo_index; index <= hi_index; index++)
            {
@@ -4503,7 +4567,7 @@ output_constructor (exp, size)
              if (val == 0)
                assemble_zeros (fieldsize);
              else
-               output_constant (val, fieldsize);
+               output_constant (val, fieldsize, align2);
 
              /* Count its size.  */
              total_bytes += fieldsize;
@@ -4517,6 +4581,7 @@ output_constructor (exp, size)
          /* Since this structure is static,
             we know the positions are constant.  */
          HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
+         unsigned int align2;
 
          if (index != 0)
            pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
@@ -4539,13 +4604,9 @@ output_constructor (exp, size)
              total_bytes = pos;
            }
 
-          else if (field != 0 && DECL_PACKED (field))
-           /* Some assemblers automaticallly align a datum according to its
-              size if no align directive is specified.  The datum, however,
-              may be declared with 'packed' attribute, so we have to disable
-              such a feature.  */
-           ASM_OUTPUT_ALIGN (asm_out_file, 0);
-
+         /* Find the alignment of this element.  */
+         align2 = min_align (align, BITS_PER_UNIT * pos);
+         
          /* Determine size this element should occupy.  */
          if (field)
            {
@@ -4581,7 +4642,7 @@ output_constructor (exp, size)
          if (val == 0)
            assemble_zeros (fieldsize);
          else
-           output_constant (val, fieldsize);
+           output_constant (val, fieldsize, align2);
 
          /* Count its size.  */
          total_bytes += fieldsize;