2001-06-07 H.J. Lu <hjl@gnu.org>
[deliverable/binutils-gdb.git] / bfd / elf-m10300.c
index 19f03a70ba1d856a9e656009b34d35697f270975..15380bc64ad0902bca199b40c519913e7a9111bd 100644 (file)
@@ -1,5 +1,5 @@
 /* Matsushita 10300 specific support for 32-bit ELF
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001
    Free Software Foundation, Inc.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -2183,6 +2183,11 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
                  case 0x91:
                  case 0x92:
                  case 0x93:
+                   /* sp-based offsets are zero-extended.  */
+                   if (code >= 0x90 && code <= 0x93
+                       && (long)value < 0)
+                     continue;
+
                    /* Note that we've changed the relocation contents, etc.  */
                    elf_section_data (sec)->relocs = internal_relocs;
                    free_relocs = NULL;
@@ -2231,6 +2236,11 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
                        && (value & 0x8000))
                      continue;
 
+                   /* mov imm16, an zero-extends the immediate.  */
+                   if (code == 0xdc
+                       && (long)value < 0)
+                     continue;
+
                    /* Note that we've changed the relocation contents, etc.  */
                    elf_section_data (sec)->relocs = internal_relocs;
                    free_relocs = NULL;
@@ -2276,18 +2286,18 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
                    break;
 
                  /* mov (abs32),an    -> mov (abs16),an
-                    mov (d32,sp),an   -> mov (d32,sp),an
-                    mov (d32,sp),dn   -> mov (d32,sp),dn
-                    movbu (d32,sp),dn -> movbu (d32,sp),dn
-                    movhu (d32,sp),dn -> movhu (d32,sp),dn
+                    mov (d32,sp),an   -> mov (d16,sp),an
+                    mov (d32,sp),dn   -> mov (d16,sp),dn
+                    movbu (d32,sp),dn -> movbu (d16,sp),dn
+                    movhu (d32,sp),dn -> movhu (d16,sp),dn
                     add imm32,dn      -> add imm16,dn
                     cmp imm32,dn      -> cmp imm16,dn
                     add imm32,an      -> add imm16,an
                     cmp imm32,an      -> cmp imm16,an
-                    and imm32,dn      -> and imm32,dn
-                    or imm32,dn       -> or imm32,dn
-                    xor imm32,dn      -> xor imm32,dn
-                    btst imm32,dn     -> btst imm32,dn */
+                    and imm32,dn      -> and imm16,dn
+                    or imm32,dn       -> or imm16,dn
+                    xor imm32,dn      -> xor imm16,dn
+                    btst imm32,dn     -> btst imm16,dn */
 
                  case 0xa0:
                  case 0xb0:
@@ -2303,6 +2313,16 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
                  case 0xe1:
                  case 0xe2:
                  case 0xe3:
+                   /* cmp imm16, an zero-extends the immediate.  */
+                   if (code == 0xdc
+                       && (long)value < 0)
+                     continue;
+
+                   /* So do sp-based offsets.  */
+                   if (code >= 0xb0 && code <= 0xb3
+                       && (long)value < 0)
+                     continue;
+
                    /* Note that we've changed the relocation contents, etc.  */
                    elf_section_data (sec)->relocs = internal_relocs;
                    free_relocs = NULL;
This page took 0.025605 seconds and 4 git commands to generate.