Thu Jan 30 12:28:18 1997 Alan Modra <alan@spri.levels.unisa.edu.au>
authorIan Lance Taylor <ian@airs.com>
Thu, 30 Jan 1997 17:29:28 +0000 (17:29 +0000)
committerIan Lance Taylor <ian@airs.com>
Thu, 30 Jan 1997 17:29:28 +0000 (17:29 +0000)
* config/tc-i386.c (i386_align_code): Improve the nop patterns.

gas/ChangeLog
gas/config/tc-i386.c

index eb599a2f4156ea0f89e2b21802393ff8fee330d9..d5af7055d295740744301f287270bd162e78cb00 100644 (file)
@@ -1,3 +1,7 @@
+Thu Jan 30 12:28:18 1997  Alan Modra  <alan@spri.levels.unisa.edu.au>
+
+       * config/tc-i386.c (i386_align_code): Improve the nop patterns.
+
 Thu Jan 30 12:08:40 1997  Ian Lance Taylor  <ian@cygnus.com>
 
        Ideas from Srinivas Addagarla <srinivas@cdotd.ernet.in>:
index 07323c4880ca6797da699a1d593960f50261cf44..61099d085295a68961f9d3a19c1c0806a972b444 100644 (file)
@@ -1,5 +1,5 @@
 /* i386.c -- Assemble code for the Intel 80386
-   Copyright (C) 1989, 91, 92, 93, 94, 95, 1996 Free Software Foundation.
+   Copyright (C) 1989, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -249,7 +249,7 @@ i386_align_code (fragP, count)
 {
   /* Various efficient no-op patterns for aligning code labels.  */
   static const char f32_1[] = {0x90};
-  static const char f32_2[] = {0x8d,0x36};
+  static const char f32_2[] = {0x89,0xf6};
   static const char f32_3[] = {0x8d,0x76,0x00};
   static const char f32_4[] = {0x8d,0x74,0x26,0x00};
   static const char f32_5[] = {0x90,
@@ -258,29 +258,29 @@ i386_align_code (fragP, count)
   static const char f32_7[] = {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};
   static const char f32_8[] = {0x90,
                               0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};
-  static const char f32_9[] = {0x8d,0x36,
-                              0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};
+  static const char f32_9[] = {0x89,0xf6,
+                              0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};
   static const char f32_10[] = {0x8d,0x76,0x00,
-                               0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};
+                               0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};
   static const char f32_11[] = {0x8d,0x74,0x26,0x00,
-                               0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};
+                               0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};
   static const char f32_12[] = {0x8d,0xb6,0x00,0x00,0x00,0x00,
-                               0x8d,0xb6,0x00,0x00,0x00,0x00};
+                               0x8d,0xbf,0x00,0x00,0x00,0x00};
   static const char f32_13[] = {0x8d,0xb6,0x00,0x00,0x00,0x00,
-                               0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};
+                               0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};
   static const char f32_14[] = {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00,
-                               0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};
+                               0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};
   static const char f32_15[] = {0xeb,0x0d,0x90,0x90,0x90,0x90,0x90,
                                0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
   static const char f16_4[] = {0x8d,0xb6,0x00,0x00};
   static const char f16_5[] = {0x90,
                               0x8d,0xb6,0x00,0x00};
-  static const char f16_6[] = {0x8d,0x36,
-                              0x8d,0xb6,0x00,0x00};
+  static const char f16_6[] = {0x89,0xf6,
+                              0x8d,0xbd,0x00,0x00};
   static const char f16_7[] = {0x8d,0x76,0x00,
-                              0x8d,0xb6,0x00,0x00};
+                              0x8d,0xbd,0x00,0x00};
   static const char f16_8[] = {0x8d,0xb6,0x00,0x00,
-                              0x8d,0xb6,0x00,0x00};
+                              0x8d,0xbd,0x00,0x00};
   static const char *const f32_patt[] = {
     f32_1, f32_2, f32_3, f32_4, f32_5, f32_6, f32_7, f32_8,
     f32_9, f32_10, f32_11, f32_12, f32_13, f32_14, f32_15
@@ -774,7 +774,11 @@ tc_i386_fix_adjustable(fixP)
   /* Prevent all adjustments to global symbols. */
   if (S_IS_EXTERN (fixP->fx_addsy))
     return 0;
-#endif
+#ifdef BFD_ASSEMBLER
+  if (S_IS_WEAK (fixP->fx_addsy))
+    return 0;
+#endif /* BFD_ASSEMBLER */
+#endif /* ! defined (OBJ_AOUT) */
 #ifdef BFD_ASSEMBLER
   /* adjust_reloc_syms doesn't know about the GOT */
   if (fixP->fx_r_type == BFD_RELOC_386_GOTOFF
@@ -822,8 +826,8 @@ md_assemble (line)
     unsigned int expecting_operand = 0;
     /* 1 if we found a prefix only acceptable with string insns. */
     unsigned int expecting_string_instruction = 0;
-    /* Non-zero if operand parens not balenced. */
-    unsigned int paren_not_balenced;
+    /* Non-zero if operand parens not balanced. */
+    unsigned int paren_not_balanced;
     char *token_start = l;
 
     while (!is_space_char (*l) && *l != END_OF_INSN)
@@ -942,14 +946,14 @@ md_assemble (line)
                l++;
              }
            token_start = l;    /* after white space */
-           paren_not_balenced = 0;
-           while (paren_not_balenced || *l != ',')
+           paren_not_balanced = 0;
+           while (paren_not_balanced || *l != ',')
              {
                if (*l == END_OF_INSN)
                  {
-                   if (paren_not_balenced)
+                   if (paren_not_balanced)
                      {
-                       as_bad ("unbalenced parenthesis in %s operand.",
+                       as_bad ("unbalanced parenthesis in %s operand.",
                                ordinal_names[i.operands]);
                        return;
                      }
@@ -964,9 +968,9 @@ md_assemble (line)
                    return;
                  }
                if (*l == '(')
-                 ++paren_not_balenced;
+                 ++paren_not_balanced;
                if (*l == ')')
-                 --paren_not_balenced;
+                 --paren_not_balanced;
                l++;
              }
            if (l != token_start)
@@ -2117,18 +2121,18 @@ i386_operand (operand_string)
       found_base_index_form = 0;
       if (*base_string == ')')
        {
-         unsigned int parens_balenced = 1;
+         unsigned int parens_balanced = 1;
          /* We've already checked that the number of left & right ()'s are
             equal, so this loop will not be infinite. */
          do
            {
              base_string--;
              if (*base_string == ')')
-               parens_balenced++;
+               parens_balanced++;
              if (*base_string == '(')
-               parens_balenced--;
+               parens_balanced--;
            }
-         while (parens_balenced);
+         while (parens_balanced);
          base_string++;        /* Skip past '('. */
          if (*base_string == REGISTER_PREFIX || *base_string == ',')
            found_base_index_form = 1;
@@ -2626,7 +2630,9 @@ md_apply_fix3 (fixP, valp, seg)
    */
   if (fixP->fx_r_type == BFD_RELOC_32_PCREL && fixP->fx_addsy)
     {
+#ifndef OBJ_AOUT
       value += fixP->fx_where + fixP->fx_frag->fr_address;
+#endif
 #ifdef OBJ_ELF
       if (S_GET_SEGMENT (fixP->fx_addsy) == seg
          || (fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) != 0)
@@ -3067,99 +3073,4 @@ tc_coff_sizemachdep (frag)
 
 #endif /* BFD_ASSEMBLER? */
 \f
-#ifdef SCO_ELF
-
-/* Heavily plagarized from obj_elf_version.  The idea is to emit the
-   SCO specific identifier in the .notes section to satisfy the SCO
-   linker.
-
-   This looks more complicated than it really is.  As opposed to the
-   "obvious" solution, this should handle the cross dev cases
-   correctly.  (i.e, hosting on a 64 bit big endian processor, but
-   generating SCO Elf code) Efficiency isn't a concern, as there
-   should be exactly one of these sections per object module.
-
-   SCO OpenServer 5 identifies it's ELF modules with a standard ELF
-   .note section.
-
-   int_32 namesz  = 4 ;  Name size 
-   int_32 descsz  = 12 ; Descriptive information 
-   int_32 type    = 1 ;  
-   char   name[4] = "SCO" ; Originator name ALWAYS SCO + NULL 
-   int_32 version = (major ver # << 16)  | version of tools ;
-   int_32 source  = (tool_id << 16 ) | 1 ;
-   int_32 info    = 0 ;    These are set by the SCO tools, but we
-                           don't know enough about the source 
-                          environment to set them.  SCO ld currently
-                          ignores them, and recommends we set them
-                          to zero.  */
-
-#define SCO_MAJOR_VERSION 0x1
-#define SCO_MINOR_VERSION 0x1
-
-void
-sco_id ()
-{
-  char *name;
-  unsigned int c;
-  char ch;
-  char *p;
-  asection *seg = now_seg;
-  subsegT subseg = now_subseg;
-  Elf_Internal_Note i_note;
-  Elf_External_Note e_note;
-  asection *note_secp = (asection *) NULL;
-  int i, len;
-
-  /* create the .note section */
-
-  note_secp = subseg_new (".note", 0);
-  bfd_set_section_flags (stdoutput,
-                        note_secp,
-                        SEC_HAS_CONTENTS | SEC_READONLY);
-
-  /* process the version string */
-
-  i_note.namesz = 4; 
-  i_note.descsz = 12;          /* 12 descriptive bytes */
-  i_note.type = NT_VERSION;    /* Contains a version string */
-
-  p = frag_more (sizeof (i_note.namesz));
-  md_number_to_chars (p, (valueT) i_note.namesz, 4);
-
-  p = frag_more (sizeof (i_note.descsz));
-  md_number_to_chars (p, (valueT) i_note.descsz, 4);
-
-  p = frag_more (sizeof (i_note.type));
-  md_number_to_chars (p, (valueT) i_note.type, 4);
-
-  p = frag_more (4);
-  strcpy (p, "SCO"); 
-
-  /* Note: this is the version number of the ELF we're representing */
-  p = frag_more (4);
-  md_number_to_chars (p, (SCO_MAJOR_VERSION << 16) | (SCO_MINOR_VERSION), 4);
-
-  /* Here, we pick a magic number for ourselves (yes, I "registered"
-     it with SCO.  The bottom bit shows that we are compat with the
-     SCO ABI.  */
-  p = frag_more (4);
-  md_number_to_chars (p, 0x4c520000 | 0x0001, 4);
-
-  /* If we knew (or cared) what the source language options were, we'd
-     fill them in here.  SCO has given us permission to ignore these
-     and just set them to zero.  */
-  p = frag_more (4);
-  md_number_to_chars (p, 0x0000, 4);
-  frag_align (2, 0); 
-
-  /* We probably can't restore the current segment, for there likely
-     isn't one yet...  */
-  if (seg && subseg)
-    subseg_set (seg, subseg);
-}
-
-#endif /* SCO_ELF */
-
 /* end of tc-i386.c */