+2016-12-09  Graham Markall  <graham.markall@embecosm.com>
+           Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * Makefile.am: Add earclinux_nps.c target and add to
+       ALL_EMULATION_SOURCES.
+       * Makefile.in: Likewise, regenerated.
+       * configure.tgt: Add arclinux_nps as an extra emulation for
+       arc*-*-elf* and arc*-*-linux*.
+       * emulparams/arc-nps.sh: New file.
+       * emulparams/arclinux_nps.sh: New file.
+       * testsuite/ld-arc/arclinux-nps.d,
+       * testsuite/ld-arc/arclinux-nps.s: New test.
+
 2017-01-04  Dilan Palauzov  <dilyan.palauzov@aegee.org>
 
        PR 20958
 
        earcelf.c \
        earcelf_prof.c \
        earclinux.c \
+       earclinux_nps.c \
        earclinux_prof.c \
        earm_epoc_pe.c \
        earm_wince_pe.c \
   $(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
   $(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}
 
+earclinux_nps.c: $(srcdir)/emulparams/arclinux_nps.sh \
+  $(srcdir)/emulparams/arc-nps.sh \
+  $(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
+  $(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}
+
 earclinux_prof.c: $(srcdir)/emulparams/arclinux_prof.sh \
   $(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
   $(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}
 
        earcelf.c \
        earcelf_prof.c \
        earclinux.c \
+       earclinux_nps.c \
        earclinux_prof.c \
        earm_epoc_pe.c \
        earm_wince_pe.c \
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earcelf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earcelf_prof.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earclinux.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earclinux_nps.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earclinux_prof.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earcv2elf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earcv2elfx.Po@am__quote@
   $(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
   $(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}
 
+earclinux_nps.c: $(srcdir)/emulparams/arclinux_nps.sh \
+  $(srcdir)/emulparams/arc-nps.sh \
+  $(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
+  $(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}
+
 earclinux_prof.c: $(srcdir)/emulparams/arclinux_prof.sh \
   $(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
   $(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}
 
 alpha*-*-*vms*)                targ_emul=alphavms
                        ;;
 arc*-*-elf*)           targ_emul=arcelf
-                       targ_extra_emuls="arcelf_prof arclinux arclinux_prof arcv2elf arcv2elfx"
+                       targ_extra_emuls="arcelf_prof arclinux arclinux_nps arclinux_prof arcv2elf arcv2elfx"
                        ;;
 arc*-*-linux*)         targ_emul=arclinux
-                       targ_extra_emuls="arclinux_prof arcelf arcelf_prof arcv2elf arcv2elfx"
+                       targ_extra_emuls="arclinux_nps arclinux_prof arcelf arcelf_prof arcv2elf arcv2elfx"
                        ;;
 arm-epoc-pe)           targ_emul=arm_epoc_pe ; targ_extra_ofiles="deffilep.o pe-dll.o" ;;
 arm*-*-cegcc*)         targ_emul=arm_wince_pe ; targ_extra_ofiles="deffilep.o pe-dll.o"
 
--- /dev/null
+OTHER_SECTIONS="
+  /* Start of symbols and sections required to support CMEM instructions
+     on NPS targets.  */
+
+  PROVIDE (_cmem_start               = ADDR (.cmem)                                            );
+  PROVIDE (_cmem_alter_start         = ADDR (.cmem_alter)                                      );
+  PROVIDE (_cmem_shared_start        = ADDR (.cmem_shared)                                     );
+  PROVIDE (_cmem_shared_alter_start  = ADDR (.cmem_shared_alter)                               );
+  PROVIDE (_fmt_slot0_start          = ADDR (.fmt_slot0)                                       );
+  PROVIDE (_fmt_slot1_start          = ADDR (.fmt_slot1)                                       );
+  PROVIDE (_fmt_slot2_start          = ADDR (.fmt_slot2)                                       );
+  PROVIDE (_fmt_slot3_start          = ADDR (.fmt_slot3)                                       );
+  PROVIDE (_fmt_slot4_start          = ADDR (.fmt_slot4)                                       );
+  PROVIDE (_fmt_slot5_start          = ADDR (.fmt_slot5)                                       );
+  PROVIDE (_fmt_slot6_start          = ADDR (.fmt_slot6)                                       );
+  PROVIDE (_fmt_slot7_start          = ADDR (.fmt_slot7)                                       );
+  PROVIDE (_fmt_slot8_start          = ADDR (.fmt_slot8)                                       );
+  PROVIDE (_fmt_slot9_start          = ADDR (.fmt_slot9)                                       );
+  PROVIDE (_fmt_slot10_start         = ADDR (.fmt_slot10)                                      );
+  PROVIDE (_fmt_slot11_start         = ADDR (.fmt_slot11)                                      );
+  PROVIDE (_fmt_slot12_start         = ADDR (.fmt_slot12)                                      );
+  PROVIDE (_fmt_slot13_start         = ADDR (.fmt_slot13)                                      );
+  PROVIDE (_fmt_slot14_start         = ADDR (.fmt_slot14)                                      );
+  PROVIDE (_fmt_slot15_start         = ADDR (.fmt_slot15)                                      );
+
+  PROVIDE (_cmem_end                 = ADDR (.cmem)              + SIZEOF (.cmem)              );
+  PROVIDE (_cmem_alter_end           = ADDR (.cmem_alter)        + SIZEOF (.cmem_alter)        );
+  PROVIDE (_cmem_shared_end          = ADDR (.cmem_shared)       + SIZEOF (.cmem_shared)       );
+  PROVIDE (_cmem_shared_alter_end    = ADDR (.cmem_shared_alter) + SIZEOF (.cmem_shared_alter) );
+  PROVIDE (_fmt_slot0_end            = ADDR (.fmt_slot0)         + SIZEOF (.fmt_slot0)         );
+  PROVIDE (_fmt_slot1_end            = ADDR (.fmt_slot1)         + SIZEOF (.fmt_slot1)         );
+  PROVIDE (_fmt_slot2_end            = ADDR (.fmt_slot2)         + SIZEOF (.fmt_slot2)         );
+  PROVIDE (_fmt_slot3_end            = ADDR (.fmt_slot3)         + SIZEOF (.fmt_slot3)         );
+  PROVIDE (_fmt_slot4_end            = ADDR (.fmt_slot4)         + SIZEOF (.fmt_slot4)         );
+  PROVIDE (_fmt_slot5_end            = ADDR (.fmt_slot5)         + SIZEOF (.fmt_slot5)         );
+  PROVIDE (_fmt_slot6_end            = ADDR (.fmt_slot6)         + SIZEOF (.fmt_slot6)         );
+  PROVIDE (_fmt_slot7_end            = ADDR (.fmt_slot7)         + SIZEOF (.fmt_slot7)         );
+  PROVIDE (_fmt_slot8_end            = ADDR (.fmt_slot8)         + SIZEOF (.fmt_slot8)         );
+  PROVIDE (_fmt_slot9_end            = ADDR (.fmt_slot9)         + SIZEOF (.fmt_slot9)         );
+  PROVIDE (_fmt_slot10_end           = ADDR (.fmt_slot10)        + SIZEOF (.fmt_slot10)        );
+  PROVIDE (_fmt_slot11_end           = ADDR (.fmt_slot11)        + SIZEOF (.fmt_slot11)        );
+  PROVIDE (_fmt_slot12_end           = ADDR (.fmt_slot12)        + SIZEOF (.fmt_slot12)        );
+  PROVIDE (_fmt_slot13_end           = ADDR (.fmt_slot13)        + SIZEOF (.fmt_slot13)        );
+  PROVIDE (_fmt_slot14_end           = ADDR (.fmt_slot14)        + SIZEOF (.fmt_slot14)        );
+  PROVIDE (_fmt_slot15_end           = ADDR (.fmt_slot15)        + SIZEOF (.fmt_slot15)        );
+
+  OVERLAY 0x57f00000 :
+    {
+      .cmem       { *(.cmem)       }
+      .cmem_alter { *(.cmem_alter) }
+    }
+
+  OVERLAY 0x57f08000 :
+    {
+      .cmem_shared       { *(.cmem_shared)       }
+      .cmem_shared_alter { *(.cmem_shared_alter) }
+    }
+
+  .fmt_slot0  0x58000000 : { *(.fmt_slot0)  }
+  .fmt_slot1  0x58800000 : { *(.fmt_slot1)  }
+  .fmt_slot2  0x59000000 : { *(.fmt_slot2)  }
+  .fmt_slot3  0x59800000 : { *(.fmt_slot3)  }
+  .fmt_slot4  0x5a000000 : { *(.fmt_slot4)  }
+  .fmt_slot5  0x5a800000 : { *(.fmt_slot5)  }
+  .fmt_slot6  0x5b000000 : { *(.fmt_slot6)  }
+  .fmt_slot7  0x5b800000 : { *(.fmt_slot7)  }
+  .fmt_slot8  0x5c000000 : { *(.fmt_slot8)  }
+  .fmt_slot9  0x5c800000 : { *(.fmt_slot9)  }
+  .fmt_slot10 0x5d000000 : { *(.fmt_slot10) }
+  .fmt_slot11 0x5d800000 : { *(.fmt_slot11) }
+  .fmt_slot12 0x5e000000 : { *(.fmt_slot12) }
+  .fmt_slot13 0x5e800000 : { *(.fmt_slot13) }
+  .fmt_slot14 0x5f000000 : { *(.fmt_slot14) }
+  .fmt_slot15 0x5f800000 : { *(.fmt_slot15) }
+
+  /* End of nps specific sections and symbols.  */
+
+  ${OTHER_SECTIONS}"
 
--- /dev/null
+. ${srcdir}/emulparams/arclinux.sh
+# Extend the OTHER_SECTIONS for nps.
+. ${srcdir}/emulparams/arc-nps.sh
 
--- /dev/null
+#source: arclinux-nps.s
+#as: -mnps400
+#ld: -marclinux_nps
+#objdump: -dr
+
+.*: +file format .*arc.*
+
+Disassembly of section .text:
+
+[0-9a-f]+ <.*>:
+   [0-9a-f]+:  200a 0f80 57f0 0000     mov     r0,0x57f00000
+   [0-9a-f]+:  200a 0f80 57f0 0000     mov     r0,0x57f00000
+   [0-9a-f]+:  200a 0f80 57f0 8000     mov     r0,0x57f08000
+   [0-9a-f]+:  200a 0f80 57f0 8000     mov     r0,0x57f08000
+   [0-9a-f]+:  200a 0f80 5800 0000     mov     r0,0x58000000
+   [0-9a-f]+:  200a 0f80 5880 0000     mov     r0,0x58800000
+   [0-9a-f]+:  200a 0f80 5900 0000     mov     r0,0x59000000
+   [0-9a-f]+:  200a 0f80 5980 0000     mov     r0,0x59800000
+   [0-9a-f]+:  200a 0f80 5a00 0000     mov     r0,0x5a000000
+   [0-9a-f]+:  200a 0f80 5a80 0000     mov     r0,0x5a800000
+   [0-9a-f]+:  200a 0f80 5b00 0000     mov     r0,0x5b000000
+   [0-9a-f]+:  200a 0f80 5b80 0000     mov     r0,0x5b800000
+   [0-9a-f]+:  200a 0f80 5c00 0000     mov     r0,0x5c000000
+   [0-9a-f]+:  200a 0f80 5c80 0000     mov     r0,0x5c800000
+   [0-9a-f]+:  200a 0f80 5d00 0000     mov     r0,0x5d000000
+   [0-9a-f]+:  200a 0f80 5d80 0000     mov     r0,0x5d800000
+   [0-9a-f]+:  200a 0f80 5e00 0000     mov     r0,0x5e000000
+   [0-9a-f]+:  200a 0f80 5e80 0000     mov     r0,0x5e800000
+   [0-9a-f]+:  200a 0f80 5f00 0000     mov     r0,0x5f000000
+   [0-9a-f]+:  200a 0f80 5f80 0000     mov     r0,0x5f800000
+   [0-9a-f]+:  200a 0f80 57f0 0000     mov     r0,0x57f00000
+   [0-9a-f]+:  200a 0f80 57f0 0000     mov     r0,0x57f00000
+   [0-9a-f]+:  200a 0f80 57f0 8000     mov     r0,0x57f08000
+   [0-9a-f]+:  200a 0f80 57f0 8000     mov     r0,0x57f08000
+   [0-9a-f]+:  200a 0f80 5800 0000     mov     r0,0x58000000
+   [0-9a-f]+:  200a 0f80 5880 0000     mov     r0,0x58800000
+   [0-9a-f]+:  200a 0f80 5900 0000     mov     r0,0x59000000
+   [0-9a-f]+:  200a 0f80 5980 0000     mov     r0,0x59800000
+   [0-9a-f]+:  200a 0f80 5a00 0000     mov     r0,0x5a000000
+   [0-9a-f]+:  200a 0f80 5a80 0000     mov     r0,0x5a800000
+   [0-9a-f]+:  200a 0f80 5b00 0000     mov     r0,0x5b000000
+   [0-9a-f]+:  200a 0f80 5b80 0000     mov     r0,0x5b800000
+   [0-9a-f]+:  200a 0f80 5c00 0000     mov     r0,0x5c000000
+   [0-9a-f]+:  200a 0f80 5c80 0000     mov     r0,0x5c800000
+   [0-9a-f]+:  200a 0f80 5d00 0000     mov     r0,0x5d000000
+   [0-9a-f]+:  200a 0f80 5d80 0000     mov     r0,0x5d800000
+   [0-9a-f]+:  200a 0f80 5e00 0000     mov     r0,0x5e000000
+   [0-9a-f]+:  200a 0f80 5e80 0000     mov     r0,0x5e800000
+   [0-9a-f]+:  200a 0f80 5f00 0000     mov     r0,0x5f000000
+   [0-9a-f]+:  200a 0f80 5f80 0000     mov     r0,0x5f800000
 
--- /dev/null
+        .text
+        .global __start
+__start:
+        mov r0, _cmem_start
+        mov r0, _cmem_alter_start
+        mov r0, _cmem_shared_start
+        mov r0, _cmem_shared_alter_start
+
+        mov r0, _fmt_slot0_start
+        mov r0, _fmt_slot1_start
+        mov r0, _fmt_slot2_start
+        mov r0, _fmt_slot3_start
+        mov r0, _fmt_slot4_start
+        mov r0, _fmt_slot5_start
+        mov r0, _fmt_slot6_start
+        mov r0, _fmt_slot7_start
+        mov r0, _fmt_slot8_start
+        mov r0, _fmt_slot9_start
+        mov r0, _fmt_slot10_start
+        mov r0, _fmt_slot11_start
+        mov r0, _fmt_slot12_start
+        mov r0, _fmt_slot13_start
+        mov r0, _fmt_slot14_start
+        mov r0, _fmt_slot15_start
+
+        mov r0, _cmem_end
+        mov r0, _cmem_alter_end
+        mov r0, _cmem_shared_end
+        mov r0, _cmem_shared_alter_end
+
+        mov r0, _fmt_slot0_end
+        mov r0, _fmt_slot1_end
+        mov r0, _fmt_slot2_end
+        mov r0, _fmt_slot3_end
+        mov r0, _fmt_slot4_end
+        mov r0, _fmt_slot5_end
+        mov r0, _fmt_slot6_end
+        mov r0, _fmt_slot7_end
+        mov r0, _fmt_slot8_end
+        mov r0, _fmt_slot9_end
+        mov r0, _fmt_slot10_end
+        mov r0, _fmt_slot11_end
+        mov r0, _fmt_slot12_end
+        mov r0, _fmt_slot13_end
+        mov r0, _fmt_slot14_end
+        mov r0, _fmt_slot15_end