Fix 64-bit nits.
authorAlan Modra <amodra@gmail.com>
Mon, 10 Apr 2000 12:36:06 +0000 (12:36 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 10 Apr 2000 12:36:06 +0000 (12:36 +0000)
gas/ChangeLog
gas/config/tc-i386.c

index 8d4c973157840ed76b09873ad991a576f22867f3..c6651e5ffb78bb69345585f099c80ce2503d8b3d 100644 (file)
@@ -1,3 +1,20 @@
+2000-04-10  Alan Modra  <alan@linuxcare.com.au>
+
+       * config/tc-i386.c (fits_in_signed_byte): Change arg to offsetT.
+       (fits_in_unsigned_byte, fits_in_unsigned_word): Ditto.
+       (fits_in_signed_word, smallest_imm_type): Ditto.
+       (md_assemble): Use an offsetT var to hold offsetT values, not a
+       long.
+       (offset_in_range): New.
+       (md_assemble): Use it.
+       (md_convert_frag): Change type of target_address, opcode_address,
+       and displacement_from_opcode_start to offsetT.
+       (md_create_short_jump): Change type of offset to offsetT.
+       (md_create_long_jump): Ditto.
+       (md_apply_fix3): Use -4, not 0xfffffffc for BFD_RELOC_386_PLT32.
+       (md_chars_to_number): Remove.
+       (output_invalid): Remove duplicate prototype.
+
 2000-04-09  Nick Clifton  <nickc@cygnus.com>
 
        * Makefile.am (CPU_TYPES): Add 'avr'.
index 7efd6dd180e4fbc1943726ebc2e1cb56fef8e3d3..d863ecdc51395ecf13b8f1650d79ef3a9276fa7f 100644 (file)
 #define false 0
 
 static unsigned int mode_from_disp_size PARAMS ((unsigned int));
-static int fits_in_signed_byte PARAMS ((long));
-static int fits_in_unsigned_byte PARAMS ((long));
-static int fits_in_unsigned_word PARAMS ((long));
-static int fits_in_signed_word PARAMS ((long));
-static int smallest_imm_type PARAMS ((long));
+static int fits_in_signed_byte PARAMS ((offsetT));
+static int fits_in_unsigned_byte PARAMS ((offsetT));
+static int fits_in_unsigned_word PARAMS ((offsetT));
+static int fits_in_signed_word PARAMS ((offsetT));
+static int smallest_imm_type PARAMS ((offsetT));
+static offsetT offset_in_range PARAMS ((offsetT, int));
 static int add_prefix PARAMS ((unsigned int));
 static void set_16bit_code_flag PARAMS ((int));
 static void set_16bit_gcc_code_flag PARAMS((int));
@@ -410,35 +411,35 @@ mode_from_disp_size (t)
 
 static INLINE int
 fits_in_signed_byte (num)
-     long num;
+     offsetT num;
 {
   return (num >= -128) && (num <= 127);
 }                              /* fits_in_signed_byte() */
 
 static INLINE int
 fits_in_unsigned_byte (num)
-     long num;
+     offsetT num;
 {
   return (num & 0xff) == num;
 }                              /* fits_in_unsigned_byte() */
 
 static INLINE int
 fits_in_unsigned_word (num)
-     long num;
+     offsetT num;
 {
   return (num & 0xffff) == num;
 }                              /* fits_in_unsigned_word() */
 
 static INLINE int
 fits_in_signed_word (num)
-     long num;
+     offsetT num;
 {
   return (-32768 <= num) && (num <= 32767);
 }                              /* fits_in_signed_word() */
 
 static int
 smallest_imm_type (num)
-     long num;
+     offsetT num;
 {
 #if 0
   /* This code is disabled because all the Imm1 forms in the opcode table
@@ -459,6 +460,31 @@ smallest_imm_type (num)
          : (Imm32));
 }                              /* smallest_imm_type() */
 
+static offsetT
+offset_in_range (val, size)
+     offsetT val;
+     int size;
+{
+  offsetT mask;
+  switch (size)
+    {
+    case 1: mask = ((offsetT) 1 <<  8) - 1; break;
+    case 2: mask = ((offsetT) 1 << 16) - 1; break;
+    case 4: mask = ((offsetT) 1 << 32) - 1; break;
+    default: abort();
+    }
+
+  if ((val & ~ mask) != 0 && (val & ~ mask) != ~ mask)
+    {
+      char buf1[40], buf2[40];
+
+      sprint_value (buf1, val);
+      sprint_value (buf2, val & mask);
+      as_warn (_("%s shortened to %s"), buf1, buf2);
+    }
+  return val & mask;
+}
+
 /* Returns 0 if attempting to add a prefix where one from the same
    class already exists, 1 if non rep/repne added, 2 if rep/repne
    added.  */
@@ -2256,7 +2282,7 @@ md_assemble (line)
        *p++ = i.tm.base_opcode;
        if (i.op[1].imms->X_op == O_constant)
          {
-           long n = (long) i.op[1].imms->X_add_number;
+           offsetT n = i.op[1].imms->X_add_number;
 
            if (size == 2
                && !fits_in_unsigned_word (n)
@@ -2265,7 +2291,7 @@ md_assemble (line)
                as_bad (_("16-bit jump out of range"));
                return;
              }
-           md_number_to_chars (p, (valueT) n, size);
+           md_number_to_chars (p, n, size);
          }
        else
          fix_new_exp (frag_now, p - frag_now->fr_literal, size,
@@ -2363,28 +2389,21 @@ md_assemble (line)
                  {
                    if (i.op[n].disps->X_op == O_constant)
                      {
-                       int size = 4;
-                       long val = (long) i.op[n].disps->X_add_number;
+                       int size;
+                       offsetT val;
 
+                       size = 4;
                        if (i.types[n] & (Disp8 | Disp16))
                          {
-                           long mask;
-
                            size = 2;
-                           mask = ~ (long) 0xffff;
                            if (i.types[n] & Disp8)
-                             {
-                               size = 1;
-                               mask = ~ (long) 0xff;
-                             }
-
-                           if ((val & mask) != 0 && (val & mask) != mask)
-                             as_warn (_("%ld shortened to %ld"),
-                                      val, val & ~mask);
+                             size = 1;
                          }
+                       val = offset_in_range (i.op[n].disps->X_add_number,
+                                              size);
                        insn_size += size;
                        p = frag_more (size);
-                       md_number_to_chars (p, (valueT) val, size);
+                       md_number_to_chars (p, val, size);
                      }
                    else
                      {
@@ -2414,27 +2433,21 @@ md_assemble (line)
                  {
                    if (i.op[n].imms->X_op == O_constant)
                      {
-                       int size = 4;
-                       long val = (long) i.op[n].imms->X_add_number;
+                       int size;
+                       offsetT val;
 
+                       size = 4;
                        if (i.types[n] & (Imm8 | Imm8S | Imm16))
                          {
-                           long mask;
-
                            size = 2;
-                           mask = ~ (long) 0xffff;
                            if (i.types[n] & (Imm8 | Imm8S))
-                             {
-                               size = 1;
-                               mask = ~ (long) 0xff;
-                             }
-                           if ((val & mask) != 0 && (val & mask) != mask)
-                             as_warn (_("%ld shortened to %ld"),
-                                      val, val & ~mask);
+                             size = 1;
                          }
+                       val = offset_in_range (i.op[n].imms->X_add_number,
+                                              size);
                        insn_size += size;
                        p = frag_more (size);
-                       md_number_to_chars (p, (valueT) val, size);
+                       md_number_to_chars (p, val, size);
                      }
                    else
                      {         /* not absolute_section */
@@ -3750,10 +3763,10 @@ md_convert_frag (abfd, sec, fragP)
 {
   register unsigned char *opcode;
   unsigned char *where_to_put_displacement = NULL;
-  unsigned int target_address;
-  unsigned int opcode_address;
+  offsetT target_address;
+  offsetT opcode_address;
   unsigned int extension = 0;
-  int displacement_from_opcode_start;
+  offsetT displacement_from_opcode_start;
 
   opcode = (unsigned char *) fragP->fr_opcode;
 
@@ -3829,7 +3842,7 @@ md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
      fragS *frag ATTRIBUTE_UNUSED;
      symbolS *to_symbol ATTRIBUTE_UNUSED;
 {
-  long offset;
+  offsetT offset;
 
   offset = to_addr - (from_addr + 2);
   md_number_to_chars (ptr, (valueT) 0xeb, 1);  /* opcode for byte-disp jump */
@@ -3843,7 +3856,7 @@ md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
      fragS *frag;
      symbolS *to_symbol;
 {
-  long offset;
+  offsetT offset;
 
   if (flag_do_long_jump)
     {
@@ -3978,7 +3991,7 @@ md_apply_fix3 (fixP, valp, seg)
     case BFD_RELOC_386_PLT32:
       /* Make the jump instruction point to the address of the operand.  At
         runtime we merely add the offset to the actual PLT entry. */
-      value = 0xfffffffc;
+      value = -4;
       break;
     case BFD_RELOC_386_GOTPC:
 /*
@@ -4042,23 +4055,6 @@ md_apply_fix3 (fixP, valp, seg)
 
   return 1;
 }
-
-#if 0
-/* This is never used.  */
-long                           /* Knows about the byte order in a word. */
-md_chars_to_number (con, nbytes)
-     unsigned char con[];      /* Low order byte 1st. */
-     int nbytes;               /* Number of bytes in the input. */
-{
-  long retval;
-  for (retval = 0, con += nbytes - 1; nbytes--; con--)
-    {
-      retval <<= BITS_PER_CHAR;
-      retval |= *con;
-    }
-  return retval;
-}
-#endif /* 0 */
 \f
 
 #define MAX_LITTLENUMS 6
@@ -4115,8 +4111,6 @@ md_atof (type, litP, sizeP)
 \f
 char output_invalid_buf[8];
 
-static char * output_invalid PARAMS ((int));
-
 static char *
 output_invalid (c)
      int c;