RISC-V compiler now builds working executables
authorAndrew Waterman <waterman@s144.Millennium.Berkeley.EDU>
Wed, 2 Nov 2011 09:29:53 +0000 (02:29 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 01:28:05 +0000 (18:28 -0700)
tools/compilers/gcc-glibc/binutils-2.21.1-riscv.patch
tools/compilers/gcc-glibc/gcc-4.6.1-riscv.patch
tools/compilers/gcc-glibc/gcc-4.6.1-ros.patch
tools/compilers/gcc-glibc/glibc-2.14.1-riscv.patch

index 09324f4..9de1a1b 100644 (file)
@@ -2497,7 +2497,7 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf32-riscv.c binutils-2
 +#include "elf32-target.h"
 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2.21.1/bfd/elf64-riscv.c
 --- ../binutils-2.21.1-orig/bfd/elf64-riscv.c  1969-12-31 16:00:00.000000000 -0800
-+++ binutils-2.21.1/bfd/elf64-riscv.c  2011-10-22 18:50:03.000000000 -0700
++++ binutils-2.21.1/bfd/elf64-riscv.c  2011-10-31 18:59:25.000000000 -0700
 @@ -0,0 +1,3298 @@
 +/* MIPS-specific support for 64-bit ELF
 +   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
@@ -3777,10 +3777,10 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2
 +       FALSE),                /* pcrel_offset */
 +
 +  /* TLS general dynamic variable reference.  */
-+  HOWTO (R_RISCV_TLS_GD,              /* type */
++  HOWTO (R_RISCV_TLS_GD,      /* type */
 +       0,                     /* rightshift */
 +       2,                     /* size (0 = byte, 1 = short, 2 = long) */
-+       RISCV_IMM_BITS,                        /* bitsize */
++       RISCV_IMM_BITS,        /* bitsize */
 +       FALSE,                 /* pc_relative */
 +       OP_SH_IMMEDIATE,       /* bitpos */
 +       complain_overflow_signed, /* complain_on_overflow */
@@ -3795,14 +3795,14 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2
 +  HOWTO (R_RISCV_TLS_LDM,     /* type */
 +       0,                     /* rightshift */
 +       2,                     /* size (0 = byte, 1 = short, 2 = long) */
-+       RISCV_IMM_BITS,                        /* bitsize */
++       RISCV_IMM_BITS,        /* bitsize */
 +       FALSE,                 /* pc_relative */
 +       OP_SH_IMMEDIATE,       /* bitpos */
 +       complain_overflow_signed, /* complain_on_overflow */
 +       _bfd_riscv_elf_generic_reloc, /* special_function */
 +       "R_RISCV_TLS_LDM",     /* name */
 +       TRUE,                  /* partial_inplace */
-+       (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
++       0,                     /* src_mask */
 +       (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
 +       FALSE),                /* pcrel_offset */
 +
@@ -3810,14 +3810,14 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2
 +  HOWTO (R_RISCV_TLS_DTPREL_HI16,     /* type */
 +       0,                     /* rightshift */
 +       2,                     /* size (0 = byte, 1 = short, 2 = long) */
-+       RISCV_BIGIMM_BITS,                     /* bitsize */
++       RISCV_BIGIMM_BITS,     /* bitsize */
 +       FALSE,                 /* pc_relative */
 +       OP_SH_BIGIMMEDIATE,    /* bitpos */
 +       complain_overflow_signed, /* complain_on_overflow */
 +       _bfd_riscv_elf_generic_reloc, /* special_function */
 +       "R_RISCV_TLS_DTPREL_HI16",     /* name */
 +       TRUE,                  /* partial_inplace */
-+       ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,      /* src_mask */
++       0,                     /* src_mask */
 +       ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,      /* dst_mask */
 +       FALSE),                /* pcrel_offset */
 +
@@ -3825,14 +3825,14 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2
 +  HOWTO (R_RISCV_TLS_DTPREL_LO16,     /* type */
 +       0,                     /* rightshift */
 +       2,                     /* size (0 = byte, 1 = short, 2 = long) */
-+       RISCV_IMM_BITS,                        /* bitsize */
++       RISCV_IMM_BITS,        /* bitsize */
 +       FALSE,                 /* pc_relative */
 +       OP_SH_IMMEDIATE,       /* bitpos */
 +       complain_overflow_signed, /* complain_on_overflow */
 +       _bfd_riscv_elf_generic_reloc, /* special_function */
 +       "R_RISCV_TLS_DTPREL_LO16",     /* name */
 +       TRUE,                  /* partial_inplace */
-+       (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
++       0,                     /* src_mask */
 +       (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
 +       FALSE),                /* pcrel_offset */
 +
@@ -3840,14 +3840,14 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2
 +  HOWTO (R_RISCV_TLS_GOTTPREL,        /* type */
 +       0,                     /* rightshift */
 +       2,                     /* size (0 = byte, 1 = short, 2 = long) */
-+       RISCV_IMM_BITS,                        /* bitsize */
++       RISCV_IMM_BITS,        /* bitsize */
 +       FALSE,                 /* pc_relative */
 +       OP_SH_IMMEDIATE,       /* bitpos */
 +       complain_overflow_signed, /* complain_on_overflow */
 +       _bfd_riscv_elf_generic_reloc, /* special_function */
 +       "R_RISCV_TLS_GOTTPREL",        /* name */
 +       TRUE,                  /* partial_inplace */
-+       (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
++       0,                     /* src_mask */
 +       (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
 +       FALSE),                /* pcrel_offset */
 +
@@ -3871,14 +3871,14 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2
 +  HOWTO (R_RISCV_TLS_TPREL_HI16,      /* type */
 +       0,                     /* rightshift */
 +       2,                     /* size (0 = byte, 1 = short, 2 = long) */
-+       RISCV_BIGIMM_BITS,                     /* bitsize */
++       RISCV_BIGIMM_BITS,     /* bitsize */
 +       FALSE,                 /* pc_relative */
 +       OP_SH_BIGIMMEDIATE,    /* bitpos */
 +       complain_overflow_signed, /* complain_on_overflow */
 +       _bfd_riscv_elf_generic_reloc, /* special_function */
 +       "R_RISCV_TLS_TPREL_HI16", /* name */
 +       TRUE,                  /* partial_inplace */
-+       ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,      /* src_mask */
++       0,                     /* src_mask */
 +       ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,      /* dst_mask */
 +       FALSE),                /* pcrel_offset */
 +
@@ -3886,14 +3886,14 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2
 +  HOWTO (R_RISCV_TLS_TPREL_LO16,      /* type */
 +       0,                     /* rightshift */
 +       2,                     /* size (0 = byte, 1 = short, 2 = long) */
-+       RISCV_IMM_BITS,                        /* bitsize */
++       RISCV_IMM_BITS,        /* bitsize */
 +       FALSE,                 /* pc_relative */
 +       OP_SH_IMMEDIATE,       /* bitpos */
 +       complain_overflow_signed, /* complain_on_overflow */
 +       _bfd_riscv_elf_generic_reloc, /* special_function */
 +       "R_RISCV_TLS_TPREL_LO16", /* name */
 +       TRUE,                  /* partial_inplace */
-+       (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
++       0,                     /* src_mask */
 +       (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
 +       FALSE),                /* pcrel_offset */
 +
@@ -5799,9 +5799,8 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2
 +#include "elf64-target.h"
 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elfxx-riscv.c binutils-2.21.1/bfd/elfxx-riscv.c
 --- ../binutils-2.21.1-orig/bfd/elfxx-riscv.c  1969-12-31 16:00:00.000000000 -0800
-+++ binutils-2.21.1/bfd/elfxx-riscv.c  2011-10-28 05:18:11.000000000 -0700
-@@ -0,0 +1,9385 @@
-+/* vim: set ts=8 */
++++ binutils-2.21.1/bfd/elfxx-riscv.c  2011-11-01 23:35:35.000000000 -0700
+@@ -0,0 +1,9403 @@
 +/* MIPS-specific support for ELF
 +   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 +   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
@@ -6472,8 +6471,22 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elfxx-riscv.c binutils-2
 +  (ELF32_R_INFO (s, t))
 +#endif
 +
++#define IS_STORE_RELOC(bfd, reloc, opcode) \
++  ((ELF_R_TYPE (bfd, reloc) == R_RISCV_LO16           \
++    || ELF_R_TYPE (bfd, reloc) == R_RISCV_TLS_TPREL_LO16      \
++    || ELF_R_TYPE (bfd, reloc) == R_RISCV_TLS_DTPREL_LO16)    \
++   && OPCODE_IS_STORE(opcode))
++
 +#define MATCH_LREG(abfd) (ABI_64_P(abfd) ? MATCH_LD : MATCH_LW)
 +
++#define OPCODE_MATCHES(OPCODE, OP) \
++  (((OPCODE) & MASK_##OP) == MATCH_##OP)
++
++#define OPCODE_IS_STORE(OPCODE) \
++  (OPCODE_MATCHES(OPCODE, SD)  || OPCODE_MATCHES(OPCODE, SW) || \
++   OPCODE_MATCHES(OPCODE, SH)  || OPCODE_MATCHES(OPCODE, SB) || \
++   OPCODE_MATCHES(OPCODE, FSW) || OPCODE_MATCHES(OPCODE, FSD))
++
 +/* The format of the first PLT entry.  */
 +
 +#define RISCV_PLT0_ENTRY_INSNS 8
@@ -7228,14 +7241,25 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elfxx-riscv.c binutils-2
 +    reloc_entry->addend += val;
 +  else
 +    {
-+      bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
++      bfd_byte *loc = (bfd_byte *) data + reloc_entry->address;
++      struct reloc_howto_struct howto = *reloc_entry->howto;
 +
 +      /* Add in the separate addend, if any.  */
 +      val += reloc_entry->addend;
 +
-+      /* Add VAL to the relocation field.  */
-+      status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
-+                                     location);
++      /* Fix up dst_mask and value for R_RISCV_LO16 relocs on stores. */
++      if (IS_STORE_RELOC (abfd, howto.type,
++              bfd_big_endian(abfd) ? bfd_getb32(loc) : bfd_getl32(loc)))
++      {
++        val >>= OP_SH_IMMEDIATE;
++        val = ((val >> RISCV_IMMLO_BITS) << OP_SH_IMMHI) |
++              ((val & ((1<<RISCV_IMMLO_BITS)-1)) << OP_SH_IMMLO);
++        howto.dst_mask = (OP_MASK_IMMHI << OP_SH_IMMHI) | 
++                         (OP_MASK_IMMLO << OP_SH_IMMLO);
++      }
++
++      /* Add VAL to the reloc field.  */
++      status = _bfd_relocate_contents (&howto, abfd, val, loc);
 +
 +      if (status != bfd_reloc_ok)
 +      return status;
@@ -9968,16 +9992,18 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elfxx-riscv.c binutils-2
 +    case R_RISCV_TLS_DTPREL_LO16:
 +    case R_RISCV_TLS_DTPREL32:
 +    case R_RISCV_TLS_DTPREL64:
-+      value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
++      value = ((addend + symbol - dtprel_base (info))
++              << OP_SH_IMMEDIATE) & howto->dst_mask;
 +      break;
 +
 +    case R_RISCV_TLS_TPREL_HI16:
-+      value = ((mips_elf_high (addend + symbol - tprel_base (info))
-+              << OP_SH_BIGIMMEDIATE) & howto->dst_mask);
++      value = (mips_elf_high (addend + symbol - tprel_base (info))
++             << OP_SH_BIGIMMEDIATE) & howto->dst_mask;
 +      break;
 +
 +    case R_RISCV_TLS_TPREL_LO16:
-+      value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
++      value = ((symbol + addend - tprel_base (info))
++              << OP_SH_IMMEDIATE) & howto->dst_mask;
 +      break;
 +
 +    case R_RISCV_HI16:
@@ -10152,21 +10178,13 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elfxx-riscv.c binutils-2
 +  x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
 +
 +  /* Fix up dst_mask and value for R_RISCV_LO16 relocs on stores. */
-+  if((ELF_R_TYPE (input_bfd, relocation->r_info) == R_RISCV_LO16 ||
-+      ELF_R_TYPE (input_bfd, relocation->r_info) == R_RISCV_TLS_TPREL_LO16 ||
-+      ELF_R_TYPE (input_bfd, relocation->r_info) == R_RISCV_TLS_DTPREL_LO16) &&
-+       ((x & MASK_SD)  == MATCH_SD  ||
-+      (x & MASK_SW)  == MATCH_SW  ||
-+      (x & MASK_SH)  == MATCH_SH  ||
-+      (x & MASK_SB)  == MATCH_SB  ||
-+      (x & MASK_FSW) == MATCH_FSW ||
-+      (x & MASK_FSD) == MATCH_FSD))
-+  {
-+    value >>= OP_SH_IMMEDIATE;
-+    value = ((value >> RISCV_IMMLO_BITS) << OP_SH_IMMHI) |
-+            ((value & ((1<<RISCV_IMMLO_BITS)-1)) << OP_SH_IMMLO);
-+    dst_mask = (OP_MASK_IMMHI << OP_SH_IMMHI) | (OP_MASK_IMMLO << OP_SH_IMMLO);
-+  }
++  if (IS_STORE_RELOC (input_bfd, relocation->r_info, x))
++    {
++      value >>= OP_SH_IMMEDIATE;
++      value = ((value >> RISCV_IMMLO_BITS) << OP_SH_IMMHI) |
++            ((value & ((1<<RISCV_IMMLO_BITS)-1)) << OP_SH_IMMLO);
++      dst_mask = (OP_MASK_IMMHI << OP_SH_IMMHI) | (OP_MASK_IMMLO << OP_SH_IMMLO);
++    }
 +
 +  /* Clear the field we are setting.  */
 +  x &= ~dst_mask;
@@ -12733,7 +12751,7 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elfxx-riscv.c binutils-2
 +
 +  if (stub->stub_section != htab->strampoline)
 +    {
-+      /* This is a simple LUI/ADIDU stub.  Zero out the beginning
++      /* This is a simple LUI/ADDI stub.  Zero out the beginning
 +       of the section and write the two instructions at the end.  */
 +      memset (loc, 0, offset);
 +      loc += offset;
@@ -12744,9 +12762,9 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elfxx-riscv.c binutils-2
 +    {
 +      /* This is trampoline.  */
 +      loc += offset;
-+      bfd_put_32 (hti->output_bfd, RISCV_LTYPE (LUI, 19, RISCV_LUI_HIGH_PART(target)), loc);
-+      bfd_put_32 (hti->output_bfd, RISCV_ITYPE (ADDI, 19, 19, RISCV_CONST_LOW_PART(target)), loc + 4);
-+      bfd_put_32 (hti->output_bfd, RISCV_JTYPE (J, RISCV_JUMP_TARGET(target)), loc + 8);
++      bfd_put_32 (hti->output_bfd, RISCV_LTYPE (LUI, 18, RISCV_LUI_HIGH_PART(target)), loc);
++      bfd_put_32 (hti->output_bfd, RISCV_ITYPE (ADDI, 19, 18, RISCV_CONST_LOW_PART(target)), loc + 4);
++      bfd_put_32 (hti->output_bfd, RISCV_ITYPE (JALR_J, 0, 18, RISCV_CONST_LOW_PART(target)), loc + 8);
 +      bfd_put_32 (hti->output_bfd, 0, loc + 12);
 +    }
 +  return TRUE;
@@ -15425,7 +15443,7 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/config.sub binutils-2.21.1/c
        # because (1) that's what they normally are, and
 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/gas/config/tc-riscv.c binutils-2.21.1/gas/config/tc-riscv.c
 --- ../binutils-2.21.1-orig/gas/config/tc-riscv.c      1969-12-31 16:00:00.000000000 -0800
-+++ binutils-2.21.1/gas/config/tc-riscv.c      2011-10-22 22:13:39.000000000 -0700
++++ binutils-2.21.1/gas/config/tc-riscv.c      2011-11-01 20:58:24.000000000 -0700
 @@ -0,0 +1,4942 @@
 +/* tc-mips.c -- assemble code for a MIPS chip.
 +   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -15526,15 +15544,6 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/gas/config/tc-riscv.c binuti
 +
 +extern int target_big_endian;
 +
-+/* The name of the readonly data section.  */
-+#define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
-+                          ? ".rdata" \
-+                          : OUTPUT_FLAVOR == bfd_target_coff_flavour \
-+                          ? ".rdata" \
-+                          : OUTPUT_FLAVOR == bfd_target_elf_flavour \
-+                          ? ".rodata" \
-+                          : (abort (), ""))
-+
 +/* Information about an instruction, including its format, operands
 +   and fixups.  */
 +struct mips_cl_insn
@@ -15771,9 +15780,17 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/gas/config/tc-riscv.c binuti
 +  EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
 +
 +/* Determine if an instruction matches an opcode. */
++#define OPCODE_MATCHES(OPCODE, OP) \
++  (((OPCODE) & MASK_##OP) == MATCH_##OP)
++
 +#define INSN_MATCHES(INSN, OP) \
 +  (((INSN).insn_opcode & MASK_##OP) == MATCH_##OP)
 +
++#define OPCODE_IS_STORE(OPCODE) \
++  (OPCODE_MATCHES(OPCODE, SD)  || OPCODE_MATCHES(OPCODE, SW) || \
++   OPCODE_MATCHES(OPCODE, SH)  || OPCODE_MATCHES(OPCODE, SB) || \
++   OPCODE_MATCHES(OPCODE, FSW) || OPCODE_MATCHES(OPCODE, FSD))
++
 +/* Prototypes for static functions.  */
 +
 +#define internalError()                                                       \
@@ -16950,17 +16967,15 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/gas/config/tc-riscv.c binuti
 +          case BFD_RELOC_UNUSED:
 +          case BFD_RELOC_LO16:
 +          case BFD_RELOC_MIPS_GOT_DISP:
-+            // handle stores specially (split immediate)
-+        if(INSN_MATCHES(*ip, SD)  || INSN_MATCHES(*ip, SW) ||
-+           INSN_MATCHES(*ip, SH)  || INSN_MATCHES(*ip, SB) ||
-+           INSN_MATCHES(*ip, FSW) || INSN_MATCHES(*ip, FSD))
-+            {
-+              int value = address_expr->X_add_number & (RISCV_IMM_REACH-1);
-+              value = ((value >> RISCV_IMMLO_BITS) << OP_SH_IMMHI) |
-+                      ((value & ((1<<RISCV_IMMLO_BITS)-1)) << OP_SH_IMMLO);
-+              ip->insn_opcode |= value;
-+            }
-+          else
++                /* Stores have a split immediate field. */
++            if (OPCODE_IS_STORE(ip->insn_opcode))
++              {
++                int value = address_expr->X_add_number & (RISCV_IMM_REACH-1);
++                value = ((value >> RISCV_IMMLO_BITS) << OP_SH_IMMHI) |
++                        ((value & ((1<<RISCV_IMMLO_BITS)-1)) << OP_SH_IMMLO);
++                ip->insn_opcode |= value;
++              }
++            else
 +              ip->insn_opcode |= (address_expr->X_add_number & (RISCV_IMM_REACH-1)) << OP_SH_IMMEDIATE;
 +            break;
 +
@@ -18734,20 +18749,24 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/gas/config/tc-riscv.c binuti
 +
 +    case BFD_RELOC_LO16:
 +    case BFD_RELOC_MIPS16_LO16:
-+      /* FIXME: Now that embedded-PIC is gone, some of this code/comment
-+       may be safe to remove, but if so it's not obvious.  */
-+      /* When handling an embedded PIC switch statement, we can wind
-+       up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
-+      if (fixP->fx_done)
++      if (!fixP->fx_done)
++      break;
++
++      if (*valP + RISCV_IMM_REACH/2 > RISCV_IMM_REACH-1)
++        as_bad_where (fixP->fx_file, fixP->fx_line,
++                    _("relocation overflow"));
++
++      if (OPCODE_IS_STORE(insn)) /* Stores have a split immediate field. */
 +      {
-+        if (*valP + RISCV_IMM_REACH/2 > RISCV_IMM_REACH-1)
-+          as_bad_where (fixP->fx_file, fixP->fx_line,
-+                        _("relocation overflow"));
-+        if (target_big_endian)
-+          buf += 2;
-+        insn |= (*valP & ((1<<RISCV_IMM_BITS)-1)) << OP_SH_IMMEDIATE;
-+        md_number_to_chars ((char *) buf, insn, 4);
++        valueT value = *valP & (RISCV_IMM_REACH-1);
++        value = ((value >> RISCV_IMMLO_BITS) << OP_SH_IMMHI) |
++                ((value & ((1<<RISCV_IMMLO_BITS)-1)) << OP_SH_IMMLO);
++        insn |= value;
 +      }
++      else
++      insn |= (*valP & ((1<<RISCV_IMM_BITS)-1)) << OP_SH_IMMEDIATE;
++
++      md_number_to_chars ((char *) buf, insn, 4);
 +      break;
 +
 +    case BFD_RELOC_MIPS_JMP:
@@ -18945,8 +18964,7 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/gas/config/tc-riscv.c binuti
 +      break;
 +
 +    case 'r':
-+      seg = subseg_new (RDATA_SECTION_NAME,
-+                      (subsegT) get_absolute_expression ());
++      seg = subseg_new (".rodata", (subsegT) get_absolute_expression ());
 +      if (IS_ELF)
 +      {
 +        bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
index ce5ef05..3d4c548 100644 (file)
@@ -1322,8 +1322,8 @@ diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/r
 +  (match_code "eq,lt,le,gt,ge"))
 diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/riscv/riscv.c gcc-4.6.1/gcc/config/riscv/riscv.c
 --- ../gcc-4.6.1-orig/gcc/config/riscv/riscv.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-4.6.1/gcc/config/riscv/riscv.c 2011-10-22 17:02:49.000000000 -0700
-@@ -0,0 +1,7604 @@
++++ gcc-4.6.1/gcc/config/riscv/riscv.c 2011-11-01 22:28:20.000000000 -0700
+@@ -0,0 +1,7599 @@
 +/* vim: set ts=8: */
 +/* Subroutines used for MIPS code generation.
 +   Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
@@ -8492,14 +8492,9 @@ diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/r
 +    mips_branch_cost = mips_cost->branch_cost;
 +
 +  if (flag_pic)
-+    {
-+      target_flags |= MASK_ABICALLS;
-+
-+      if (!flag_pie)
-+      target_flags |= MASK_SHARED;
-+    }
-+  else if (TARGET_ABICALLS_PIC2 && !flag_pic)
-+    flag_pic = flag_shlib = 1;
++    target_flags |= MASK_ABICALLS;
++  else
++    TARGET_SHARED = 0;
 +
 +  /* Prefer a call to memcpy over inline code when optimizing for size,
 +     though see MOVE_RATIO in mips.h.  */
@@ -9060,8 +9055,8 @@ diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/r
 +DEF_MIPS_FTYPE (2, (VOID, V4QI, V4QI))
 diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/riscv/riscv.h gcc-4.6.1/gcc/config/riscv/riscv.h
 --- ../gcc-4.6.1-orig/gcc/config/riscv/riscv.h 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-4.6.1/gcc/config/riscv/riscv.h 2011-10-22 19:22:40.000000000 -0700
-@@ -0,0 +1,2017 @@
++++ gcc-4.6.1/gcc/config/riscv/riscv.h 2011-11-01 22:20:08.000000000 -0700
+@@ -0,0 +1,2014 @@
 +/* vim: set ts=8: */
 +/* Definitions of target machine for GNU compiler.  MIPS version.
 +   Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
@@ -10907,9 +10902,6 @@ diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/r
 +#define TEXT_SECTION_ASM_OP   "\t.text"       /* instructions */
 +#define DATA_SECTION_ASM_OP   "\t.data"       /* large data */
 +
-+#undef READONLY_DATA_SECTION_ASM_OP
-+#define READONLY_DATA_SECTION_ASM_OP  "\t.rdata"      /* read-only data */
-+\f
 +#define ASM_OUTPUT_REG_PUSH(STREAM,REGNO)                             \
 +do                                                                    \
 +  {                                                                   \
@@ -14652,7 +14644,7 @@ diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/r
 +#define  MASK_SD 0x3ff
 diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/riscv/riscv.opt gcc-4.6.1/gcc/config/riscv/riscv.opt
 --- ../gcc-4.6.1-orig/gcc/config/riscv/riscv.opt       1969-12-31 16:00:00.000000000 -0800
-+++ gcc-4.6.1/gcc/config/riscv/riscv.opt       2011-10-22 17:02:09.000000000 -0700
++++ gcc-4.6.1/gcc/config/riscv/riscv.opt       2011-11-01 21:51:56.000000000 -0700
 @@ -0,0 +1,206 @@
 +; Options for the MIPS port of the compiler
 +;
@@ -14815,7 +14807,7 @@ diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/r
 +Try to allow the linker to turn PIC calls into direct calls
 +
 +mshared
-+Target Report Mask(SHARED)
++Target Report Var(TARGET_SHARED) Init(1)
 +When generating -mabicalls code, make the code suitable for use in shared libraries
 +
 +msingle-float
@@ -15130,7 +15122,7 @@ diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/r
 +#define LINUX_DYNAMIC_LINKER64 GLIBC_DYNAMIC_LINKER64
 diff -x mpfr -x mpc -x gmp -x autom4te.cache -ruN ../gcc-4.6.1-orig/gcc/config/riscv/ros.h gcc-4.6.1/gcc/config/riscv/ros.h
 --- ../gcc-4.6.1-orig/gcc/config/riscv/ros.h   1969-12-31 16:00:00.000000000 -0800
-+++ gcc-4.6.1/gcc/config/riscv/ros.h   2011-10-24 17:57:49.000000000 -0700
++++ gcc-4.6.1/gcc/config/riscv/ros.h   2011-11-01 22:15:05.000000000 -0700
 @@ -0,0 +1,9 @@
 +#include "linux.h"
 +
index a685c8b..bcd66c7 100644 (file)
@@ -298,7 +298,7 @@ diff -ruN orig-src/gcc-4.6.1/gcc/config.gcc gcc-4.6.1/gcc/config.gcc
 +      tmake_file="${tmake_file} t-slibgcc-elf-ver t-linux i386/t-fprules-softfp soft-fp/t-softfp i386/t-linux"
 +      ;;
 +riscv*-*-ros*)
-+      tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h ros.h riscv/ros.h riscv/ros64.h glibc-stdint.h"
++      tm_file="dbxelf.h elfos.h gnu-user.h ros.h ${tm_file} riscv/ros.h riscv/ros64.h glibc-stdint.h"
 +      tmake_file="${tmake_file} t-slibgcc-elf-ver t-linux"
 +      ;;
  x86_64-*-elf*)
index e991f9a..298c978 100644 (file)
@@ -17,8 +17,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/a
 +#define ABORT_INSTRUCTION asm ("unimp")
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/bits/atomic.h glibc-2.14.1/sysdeps/riscv/bits/atomic.h
 --- ../glibc-2.14.1-orig/sysdeps/riscv/bits/atomic.h   1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/bits/atomic.h   2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,178 @@
++++ glibc-2.14.1/sysdeps/riscv/bits/atomic.h   2011-11-01 23:44:42.000000000 -0700
+@@ -0,0 +1,177 @@
 +/* Low-level functions for atomic operations. Mips version.
 +   Copyright (C) 2005 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -67,8 +67,7 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/b
 +  (".gnu.linkonce.b.__riscv_atomic_lock, \"aw\", %nobits");
 +
 +volatile int __riscv_atomic_lock
-+  __attribute__ ((nocommon, section (".gnu.linkonce.b.__riscv_atomic_lock"
-+                                   __sec_comment),
++  __attribute__ ((nocommon, section(".gnu.linkonce.b.__riscv_atomic_lock\n\t#"),
 +                visibility ("hidden")));
 +
 +#define __riscv_atomic_do_lock(addr) ({ \
@@ -642,7 +641,7 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/b
 +#endif        /* GCC.  */
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/bits/setjmp.h glibc-2.14.1/sysdeps/riscv/bits/setjmp.h
 --- ../glibc-2.14.1-orig/sysdeps/riscv/bits/setjmp.h   1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/bits/setjmp.h   2011-10-25 02:48:44.000000000 -0700
++++ glibc-2.14.1/sysdeps/riscv/bits/setjmp.h   2011-11-02 01:20:35.000000000 -0700
 @@ -0,0 +1,47 @@
 +/* Define the machine-dependent type `jmp_buf'.  RISC-V version.
 +   Copyright (C) 1992,1993,1995,1997,2000,2002,2003,2004,2005,2006
@@ -687,7 +686,7 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/b
 +    /* Callee-saved floating point registers.
 +       Note that there are an even number of preceding words in this struct,
 +       so no padding will be inserted before __fpregs, even for RV32. */
-+    double __fpregs[8];
++    double __fpregs[10];
 +  } __jmp_buf[1];
 +
 +#endif /* _RISCV_BITS_SETJMP_H */
@@ -5555,8 +5554,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/l
 +#endif
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/__longjmp.S glibc-2.14.1/sysdeps/riscv/__longjmp.S
 --- ../glibc-2.14.1-orig/sysdeps/riscv/__longjmp.S     1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/__longjmp.S     2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,57 @@
++++ glibc-2.14.1/sysdeps/riscv/__longjmp.S     2011-11-02 01:24:15.000000000 -0700
+@@ -0,0 +1,59 @@
 +/* Copyright (C) 1996, 1997, 2000, 2002, 2003, 2004
 +      Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -5597,20 +5596,22 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/_
 +#ifdef __riscv_hard_float
 +      REG_L t0, 13*SZREG(a0)
 +
-+      fld  fs0, 14*SZREG(a0)
-+      fld  fs1, 15*SZREG(a0)
-+      fld  fs2, 16*SZREG(a0)
-+      fld  fs3, 17*SZREG(a0)
-+      fld  fs4, 18*SZREG(a0)
-+      fld  fs5, 19*SZREG(a0)
-+      fld  fs6, 20*SZREG(a0)
-+      fld  fs7, 21*SZREG(a0)
++      fld  fs0, 8*0 + 14*SZREG(a0)
++      fld  fs1, 8*1 + 14*SZREG(a0)
++      fld  fs2, 8*2 + 14*SZREG(a0)
++      fld  fs3, 8*3 + 14*SZREG(a0)
++      fld  fs4, 8*4 + 14*SZREG(a0)
++      fld  fs5, 8*5 + 14*SZREG(a0)
++      fld  fs6, 8*6 + 14*SZREG(a0)
++      fld  fs7, 8*7 + 14*SZREG(a0)
++      fld  fs8, 8*8 + 14*SZREG(a0)
++      fld  fs9, 8*9 + 14*SZREG(a0)
 +
 +      mtfsr t0
 +#endif
 +
-+      sltu t0, a1, 1  # t0 = (a1 == 0)
-+      add  v0, t0, a1 # v0 = (a1 == 0 ? 1 : a1)
++      sltu t0, a1, 1    # t0 = (a1 == 0)
++      add  v0, t0, a1   # v0 = (a1 == 0 ? 1 : a1)
 +      ret
 +
 +END(__longjmp)
@@ -7574,8 +7575,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/r
 +}
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/setjmp.S glibc-2.14.1/sysdeps/riscv/setjmp.S
 --- ../glibc-2.14.1-orig/sysdeps/riscv/setjmp.S        1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/setjmp.S        2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,73 @@
++++ glibc-2.14.1/sysdeps/riscv/setjmp.S        2011-11-02 01:21:55.000000000 -0700
+@@ -0,0 +1,75 @@
 +/* Copyright (C) 1996, 1997, 2000, 2002, 2003, 2004
 +      Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -7632,6 +7633,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/s
 +  fsd  fs5, 8*5 + 14*SZREG(a0)
 +  fsd  fs6, 8*6 + 14*SZREG(a0)
 +  fsd  fs7, 8*7 + 14*SZREG(a0)
++  fsd  fs8, 8*8 + 14*SZREG(a0)
++  fsd  fs9, 8*9 + 14*SZREG(a0)
 +
 +  REG_S t0, 13*SZREG(a0)
 +#endif
@@ -11444,8 +11447,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +#endif
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/getcontext.S glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/getcontext.S
 --- ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/getcontext.S    1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/getcontext.S    2011-10-27 22:24:14.000000000 -0700
-@@ -0,0 +1,81 @@
++++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/getcontext.S    2011-11-02 01:26:28.000000000 -0700
+@@ -0,0 +1,83 @@
 +/* Save current context.
 +   Copyright (C) 2009 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -11497,14 +11500,16 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +#ifdef __riscv_hard_float
 +  mffsr v1
 +
-+      fsd     fs0, (24 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs1, (25 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs2, (26 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs3, (27 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs4, (28 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs5, (29 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs6, (30 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs7, (31 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs0, (20 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs1, (21 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs2, (22 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs3, (23 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs4, (24 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs5, (25 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs6, (26 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs7, (27 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs8, (28 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs9, (29 * 8 + MCONTEXT_FPREGS)(a0)
 +
 +      sw      v1, MCONTEXT_FSR(a0)
 +#endif /* __mips_hard_float */
@@ -14230,8 +14235,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +weak_alias (__umount, umount);
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/setcontext.S glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/setcontext.S
 --- ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/setcontext.S    1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/setcontext.S    2011-10-27 22:24:24.000000000 -0700
-@@ -0,0 +1,129 @@
++++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/setcontext.S    2011-11-02 01:26:08.000000000 -0700
+@@ -0,0 +1,131 @@
 +/* Set current context.
 +   Copyright (C) 2009 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -14286,14 +14291,16 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +#ifdef __riscv_hard_float
 +      lw      v1, MCONTEXT_FSR(v0)
 +
-+      fld     fs0, (24 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs1, (25 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs2, (26 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs3, (27 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs4, (28 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs5, (29 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs6, (30 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs7, (31 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs0, (20 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs1, (21 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs2, (22 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs3, (23 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs4, (24 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs5, (25 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs6, (26 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs7, (27 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs8, (28 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs9, (29 * 8 + MCONTEXT_FPREGS)(v0)
 +
 +      mtfsr   v1
 +#endif /* __mips_hard_float */
@@ -14744,8 +14751,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +PSEUDO_END (__start_context)
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/swapcontext.S glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/swapcontext.S
 --- ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/swapcontext.S   1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/swapcontext.S   2011-10-27 22:24:08.000000000 -0700
-@@ -0,0 +1,127 @@
++++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/swapcontext.S   2011-11-02 01:25:30.000000000 -0700
+@@ -0,0 +1,131 @@
 +/* Save and set current context.
 +   Copyright (C) 2009 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -14796,14 +14803,16 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +#ifdef __riscv_hard_float
 +  mffsr v1
 +
-+      fsd     fs0, (24 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs1, (25 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs2, (26 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs3, (27 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs4, (28 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs5, (29 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs6, (30 * 8 + MCONTEXT_FPREGS)(a0)
-+      fsd     fs7, (31 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs0, (20 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs1, (21 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs2, (22 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs3, (23 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs4, (24 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs5, (25 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs6, (26 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs7, (27 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs8, (28 * 8 + MCONTEXT_FPREGS)(a0)
++      fsd     fs9, (29 * 8 + MCONTEXT_FPREGS)(a0)
 +
 +      sw      v1, MCONTEXT_FSR(a0)
 +#endif /* __mips_hard_float */
@@ -14827,14 +14836,16 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +#ifdef __riscv_hard_float
 +      lw      v1, MCONTEXT_FSR(v0)
 +
-+      fld     fs0, (24 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs1, (25 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs2, (26 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs3, (27 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs4, (28 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs5, (29 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs6, (30 * 8 + MCONTEXT_FPREGS)(v0)
-+      fld     fs7, (31 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs0, (20 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs1, (21 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs2, (22 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs3, (23 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs4, (24 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs5, (25 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs6, (26 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs7, (27 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs8, (28 * 8 + MCONTEXT_FPREGS)(v0)
++      fld     fs9, (29 * 8 + MCONTEXT_FPREGS)(v0)
 +
 +      mtfsr   v1
 +#endif /* __mips_hard_float */