diff --git a/build-devkit.sh b/build-devkit.sh
index 44ac4fb..cad1033 100644
--- a/build-devkit.sh
+++ b/build-devkit.sh
@@ -12,7 +12,7 @@ NEWLIB_VER=1.14.0
LIBOGC_VER=20050812
LIBGBA_VER=20060410
LIBNDS_VER=20060410
-ELF2FLT_VER=20060412
+ELF2FLT_VER=20060506
BINUTILS="binutils-$BINUTILS_VER.tar.bz2"
GCC_CORE="gcc-core-$GCC_VER.tar.bz2"
diff --git a/dkarm/patches/gcc-4.1.0.patch b/dkarm/patches/gcc-4.1.0.patch
index aa228f2..bb9c0bf 100644
--- a/dkarm/patches/gcc-4.1.0.patch
+++ b/dkarm/patches/gcc-4.1.0.patch
@@ -1,6 +1,6 @@
-diff -Naurb gcc-4.1.0-20060219/gcc/c-incpath.c gcc-4.1.0-20060219-arm/gcc/c-incpath.c
---- gcc-4.1.0-20060219/gcc/c-incpath.c Sat Jun 25 03:02:01 2005
-+++ gcc-4.1.0-20060219-arm/gcc/c-incpath.c Mon Feb 20 13:44:13 2006
+diff -Naurb gcc-4.1.0/gcc/c-incpath.c gcc-4.1.0-arm/gcc/c-incpath.c
+--- gcc-4.1.0/gcc/c-incpath.c Sat Jun 25 03:02:01 2005
++++ gcc-4.1.0-arm/gcc/c-incpath.c Wed Apr 12 16:00:30 2006
@@ -331,13 +331,18 @@
cpp_dir *p;
@@ -27,9 +27,9 @@ diff -Naurb gcc-4.1.0-20060219/gcc/c-incpath.c gcc-4.1.0-20060219-arm/gcc/c-incp
#endif
p = xmalloc (sizeof (cpp_dir));
-diff -Naurb gcc-4.1.0-20060219/gcc/config/arm/t-arm-elf gcc-4.1.0-20060219-arm/gcc/config/arm/t-arm-elf
---- gcc-4.1.0-20060219/gcc/config/arm/t-arm-elf Wed Sep 1 12:14:21 2004
-+++ gcc-4.1.0-20060219-arm/gcc/config/arm/t-arm-elf Mon Feb 20 13:44:13 2006
+diff -Naurb gcc-4.1.0/gcc/config/arm/t-arm-elf gcc-4.1.0-arm/gcc/config/arm/t-arm-elf
+--- gcc-4.1.0/gcc/config/arm/t-arm-elf Wed Sep 1 12:14:21 2004
++++ gcc-4.1.0-arm/gcc/config/arm/t-arm-elf Wed Apr 12 16:00:30 2006
@@ -23,8 +23,8 @@
# MULTILIB_DIRNAMES += fpu soft
# MULTILIB_EXCEPTIONS += *mthumb/*mhard-float*
@@ -41,9 +41,85 @@ diff -Naurb gcc-4.1.0-20060219/gcc/config/arm/t-arm-elf gcc-4.1.0-20060219-arm/g
#
# MULTILIB_OPTIONS += fno-leading-underscore/fleading-underscore
# MULTILIB_DIRNAMES += elf under
-diff -Naurb gcc-4.1.0-20060219/gcc/version.c gcc-4.1.0-20060219-arm/gcc/version.c
---- gcc-4.1.0-20060219/gcc/version.c Wed Mar 16 06:04:10 2005
-+++ gcc-4.1.0-20060219-arm/gcc/version.c Mon Feb 20 13:47:44 2006
+diff -Naurb gcc-4.1.0/gcc/gcc.c gcc-4.1.0-arm/gcc/gcc.c
+--- gcc-4.1.0/gcc/gcc.c Sat Jan 21 18:29:08 2006
++++ gcc-4.1.0-arm/gcc/gcc.c Fri May 5 10:18:31 2006
+@@ -3250,8 +3250,6 @@
+ gcc_libexec_prefix = make_relative_prefix (argv[0],
+ standard_bindir_prefix,
+ standard_libexec_prefix);
+- if (gcc_exec_prefix)
+- putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
+ }
+ else
+ gcc_libexec_prefix = make_relative_prefix (gcc_exec_prefix,
+@@ -6148,10 +6146,10 @@
+
+ /* We need to check standard_exec_prefix/just_machine_suffix/specs
+ for any override of as, ld and libraries. */
+- specs_file = alloca (strlen (standard_exec_prefix)
++ specs_file = alloca (strlen (gcc_exec_prefix)
+ + strlen (just_machine_suffix) + sizeof ("specs"));
+
+- strcpy (specs_file, standard_exec_prefix);
++ strcpy (specs_file, gcc_exec_prefix);
+ strcat (specs_file, just_machine_suffix);
+ strcat (specs_file, "specs");
+ if (access (specs_file, R_OK) == 0)
+diff -Naurb gcc-4.1.0/gcc/prefix.c gcc-4.1.0-arm/gcc/prefix.c
+--- gcc-4.1.0/gcc/prefix.c Sat Jun 25 03:02:01 2005
++++ gcc-4.1.0-arm/gcc/prefix.c Fri May 5 10:18:51 2006
+@@ -246,13 +246,16 @@
+ The returned string is always malloc-ed, and the caller is
+ responsible for freeing it. */
+
++
++static const char *old_prefix = PREFIX;
++
+ char *
+ update_path (const char *path, const char *key)
+ {
+ char *result, *p;
+- const int len = strlen (std_prefix);
++ const int len = strlen (old_prefix);
+
+- if (! strncmp (path, std_prefix, len)
++ if (! strncmp (path, old_prefix, len)
+ && (IS_DIR_SEPARATOR(path[len])
+ || path[len] == '\0')
+ && key != 0)
+@@ -354,4 +357,6 @@
+ set_std_prefix (const char *prefix, int len)
+ {
+ std_prefix = save_string (prefix, len);
++
++ putenv (concat ("GCC_EXEC_PREFIX=", std_prefix, NULL));
+ }
+diff -Naurb gcc-4.1.0/gcc/toplev.c gcc-4.1.0-arm/gcc/toplev.c
+--- gcc-4.1.0/gcc/toplev.c Sat Feb 4 22:13:20 2006
++++ gcc-4.1.0-arm/gcc/toplev.c Wed Apr 26 16:49:36 2006
+@@ -82,6 +82,7 @@
+ #include "value-prof.h"
+ #include "alloc-pool.h"
+ #include "tree-mudflap.h"
++#include "prefix.h"
+
+ #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
+ #include "dwarf2out.h"
+@@ -1434,6 +1435,10 @@
+ progname = p;
+
+ xmalloc_set_program_name (progname);
++
++ p = getenv("GCC_EXEC_PREFIX");
++ set_std_prefix (p, strlen(p));
++
+
+ hex_init ();
+
+diff -Naurb gcc-4.1.0/gcc/version.c gcc-4.1.0-arm/gcc/version.c
+--- gcc-4.1.0/gcc/version.c Wed Mar 16 06:04:10 2005
++++ gcc-4.1.0-arm/gcc/version.c Wed Apr 12 16:00:30 2006
@@ -8,7 +8,7 @@
in parentheses. You may also wish to include a number indicating
the revision of your modified compiler. */
diff --git a/dkpsp/patches/binutils-2.16.1.patch b/dkpsp/patches/binutils-2.16.1.patch
index 87e0104..35fd3dd 100644
--- a/dkpsp/patches/binutils-2.16.1.patch
+++ b/dkpsp/patches/binutils-2.16.1.patch
@@ -1,27 +1,6 @@
---- binutils-2.16.1.orig/bfd/Makefile.am 2005-05-02 12:45:42.000000000 -0700
-+++ binutils-psp/bfd/Makefile.am 2005-07-22 22:17:36.000000000 -0700
-@@ -3,7 +3,7 @@
- AUTOMAKE_OPTIONS = 1.9 cygnus
-
- # Uncomment the following line when doing a release.
--RELEASE=y
-+#RELEASE=y
-
- INCDIR = $(srcdir)/../include
- CSEARCH = -I. -I$(srcdir) -I$(INCDIR)
---- binutils-2.16.1.orig/bfd/Makefile.in 2005-05-02 12:45:46.000000000 -0700
-+++ binutils-psp/bfd/Makefile.in 2005-07-22 22:17:46.000000000 -0700
-@@ -250,7 +250,7 @@
- AUTOMAKE_OPTIONS = 1.9 cygnus
-
- # Uncomment the following line when doing a release.
--RELEASE=y
-+#RELEASE=y
- INCDIR = $(srcdir)/../include
- CSEARCH = -I. -I$(srcdir) -I$(INCDIR)
- MKDEP = gcc -MM
---- binutils-2.16.1.orig/bfd/archures.c 2005-01-17 06:08:03.000000000 -0800
-+++ binutils-psp/bfd/archures.c 2005-06-19 18:09:32.000000000 -0700
+diff -burN binutils-2.16.1/bfd/archures.c binutils-psp/bfd/archures.c
+--- binutils-2.16.1/bfd/archures.c 2005-01-17 14:08:03.000000000 +0000
++++ binutils-psp/bfd/archures.c 2006-01-10 23:31:50.000000000 +0000
@@ -155,6 +155,7 @@
.#define bfd_mach_mips16 16
.#define bfd_mach_mips5 5
@@ -30,8 +9,9 @@
.#define bfd_mach_mipsisa32 32
.#define bfd_mach_mipsisa32r2 33
.#define bfd_mach_mipsisa64 64
---- binutils-2.16.1.orig/bfd/bfd-in2.h 2005-03-02 13:23:20.000000000 -0800
-+++ binutils-psp/bfd/bfd-in2.h 2005-06-19 18:09:32.000000000 -0700
+diff -burN binutils-2.16.1/bfd/bfd-in2.h binutils-psp/bfd/bfd-in2.h
+--- binutils-2.16.1/bfd/bfd-in2.h 2005-03-02 21:23:20.000000000 +0000
++++ binutils-psp/bfd/bfd-in2.h 2006-01-10 23:31:50.000000000 +0000
@@ -1600,6 +1600,7 @@
#define bfd_mach_mips16 16
#define bfd_mach_mips5 5
@@ -40,8 +20,9 @@
#define bfd_mach_mipsisa32 32
#define bfd_mach_mipsisa32r2 33
#define bfd_mach_mipsisa64 64
---- binutils-2.16.1.orig/bfd/cpu-mips.c 2005-03-03 03:40:58.000000000 -0800
-+++ binutils-psp/bfd/cpu-mips.c 2005-06-19 18:09:32.000000000 -0700
+diff -burN binutils-2.16.1/bfd/cpu-mips.c binutils-psp/bfd/cpu-mips.c
+--- binutils-2.16.1/bfd/cpu-mips.c 2005-03-03 11:40:58.000000000 +0000
++++ binutils-psp/bfd/cpu-mips.c 2006-01-10 23:31:50.000000000 +0000
@@ -86,6 +86,7 @@
I_mipsisa64,
I_mipsisa64r2,
@@ -60,9 +41,10 @@
};
/* The default architecture is mips:3000, but with a machine number of
---- binutils-2.16.1.orig/bfd/elfxx-mips.c 2005-10-22 15:36:24.000000000 -0700
-+++ binutils-psp/bfd/elfxx-mips.c 2005-10-22 15:38:52.000000000 -0700
-@@ -4669,6 +4669,9 @@ _bfd_elf_mips_mach (flagword flags)
+diff -burN binutils-2.16.1/bfd/elfxx-mips.c binutils-psp/bfd/elfxx-mips.c
+--- binutils-2.16.1/bfd/elfxx-mips.c 2005-05-28 22:58:29.000000000 +0100
++++ binutils-psp/bfd/elfxx-mips.c 2006-01-10 23:31:51.000000000 +0000
+@@ -4669,6 +4669,9 @@
case E_MIPS_MACH_SB1:
return bfd_mach_mips_sb1;
@@ -72,7 +54,7 @@
default:
switch (flags & EF_MIPS_ARCH)
{
-@@ -7941,6 +7944,10 @@ mips_set_isa_flags (bfd *abfd)
+@@ -7941,6 +7944,10 @@
val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
break;
@@ -83,113 +65,24 @@
case bfd_mach_mipsisa32:
val = E_MIPS_ARCH_32;
break;
-@@ -8422,56 +8429,59 @@ _bfd_mips_elf_hide_symbol (struct bfd_li
+@@ -8422,6 +8429,8 @@
if (dynobj != NULL && force_local && h->root.type != STT_TLS)
{
got = mips_elf_got_section (dynobj, FALSE);
-- g = mips_elf_section_data (got)->u.got_info;
--
-- if (g->next)
-- {
-- struct mips_got_entry e;
-- struct mips_got_info *gg = g;
--
-- /* Since we're turning what used to be a global symbol into a
-- local one, bump up the number of local entries of each GOT
-- that had an entry for it. This will automatically decrease
-- the number of global entries, since global_gotno is actually
-- the upper limit of global entries. */
-- e.abfd = dynobj;
-- e.symndx = -1;
-- e.d.h = h;
-- e.tls_type = 0;
+ if (got)
+ {
-+ g = mips_elf_section_data (got)->u.got_info;
+ g = mips_elf_section_data (got)->u.got_info;
-- for (g = g->next; g != gg; g = g->next)
-- if (htab_find (g->got_entries, &e))
-- {
-- BFD_ASSERT (g->global_gotno > 0);
-- g->local_gotno++;
-- g->global_gotno--;
-- }
-+ if (g->next)
-+ {
-+ struct mips_got_entry e;
-+ struct mips_got_info *gg = g;
-
-- /* If this was a global symbol forced into the primary GOT, we
-- no longer need an entry for it. We can't release the entry
-- at this point, but we must at least stop counting it as one
-- of the symbols that required a forced got entry. */
-- if (h->root.got.offset == 2)
-- {
-- BFD_ASSERT (gg->assigned_gotno > 0);
-- gg->assigned_gotno--;
-- }
-- }
-- else if (g->global_gotno == 0 && g->global_gotsym == NULL)
-- /* If we haven't got through GOT allocation yet, just bump up the
-- number of local entries, as this symbol won't be counted as
-- global. */
-- g->local_gotno++;
-- else if (h->root.got.offset == 1)
-- {
-- /* If we're past non-multi-GOT allocation and this symbol had
-- been marked for a global got entry, give it a local entry
-+ /* Since we're turning what used to be a global symbol into a
-+ local one, bump up the number of local entries of each GOT
-+ that had an entry for it. This will automatically decrease
-+ the number of global entries, since global_gotno is actually
-+ the upper limit of global entries. */
-+ e.abfd = dynobj;
-+ e.symndx = -1;
-+ e.d.h = h;
-+ e.tls_type = 0;
-+
-+ for (g = g->next; g != gg; g = g->next)
-+ if (htab_find (g->got_entries, &e))
-+ {
-+ BFD_ASSERT (g->global_gotno > 0);
-+ g->local_gotno++;
-+ g->global_gotno--;
-+ }
-+
-+ /* If this was a global symbol forced into the primary GOT, we
-+ no longer need an entry for it. We can't release the entry
-+ at this point, but we must at least stop counting it as one
-+ of the symbols that required a forced got entry. */
-+ if (h->root.got.offset == 2)
-+ {
-+ BFD_ASSERT (gg->assigned_gotno > 0);
-+ gg->assigned_gotno--;
-+ }
-+ }
-+ else if (g->global_gotno == 0 && g->global_gotsym == NULL)
-+ /* If we haven't got through GOT allocation yet, just bump up the
-+ number of local entries, as this symbol won't be counted as
-+ global. */
-+ g->local_gotno++;
-+ else if (h->root.got.offset == 1)
-+ {
-+ /* If we're past non-multi-GOT allocation and this symbol had
-+ been marked for a global got entry, give it a local entry
- instead. */
-- BFD_ASSERT (g->global_gotno > 0);
-- g->local_gotno++;
-- g->global_gotno--;
-+ BFD_ASSERT (g->global_gotno > 0);
-+ g->local_gotno++;
-+ g->global_gotno--;
-+ }
+ if (g->next)
+@@ -8472,6 +8481,7 @@
+ g->global_gotno--;
}
-- }
+ }
+ }
_bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
}
-@@ -9641,6 +9651,7 @@ static const struct mips_mach_extension
+@@ -9641,6 +9651,7 @@
/* MIPS II extensions. */
{ bfd_mach_mips4000, bfd_mach_mips6000 },
{ bfd_mach_mipsisa32, bfd_mach_mips6000 },
@@ -197,15 +90,41 @@
/* MIPS I extensions. */
{ bfd_mach_mips6000, bfd_mach_mips3000 },
---- binutils-2.16.1.orig/bfd/version.h 2005-10-22 15:36:25.000000000 -0700
-+++ binutils-psp/bfd/version.h 2005-10-22 15:42:13.000000000 -0700
+diff -burN binutils-2.16.1/bfd/Makefile.am binutils-psp/bfd/Makefile.am
+--- binutils-2.16.1/bfd/Makefile.am 2005-06-12 19:58:52.000000000 +0100
++++ binutils-psp/bfd/Makefile.am 2006-01-10 23:31:50.000000000 +0000
+@@ -3,7 +3,7 @@
+ AUTOMAKE_OPTIONS = 1.9 cygnus
+
+ # Uncomment the following line when doing a release.
+-RELEASE=y
++#RELEASE=y
+
+ INCDIR = $(srcdir)/../include
+ CSEARCH = -I. -I$(srcdir) -I$(INCDIR)
+diff -burN binutils-2.16.1/bfd/Makefile.in binutils-psp/bfd/Makefile.in
+--- binutils-2.16.1/bfd/Makefile.in 2005-06-12 19:58:55.000000000 +0100
++++ binutils-psp/bfd/Makefile.in 2006-01-10 23:31:50.000000000 +0000
+@@ -250,7 +250,7 @@
+ AUTOMAKE_OPTIONS = 1.9 cygnus
+
+ # Uncomment the following line when doing a release.
+-RELEASE=y
++#RELEASE=y
+ INCDIR = $(srcdir)/../include
+ CSEARCH = -I. -I$(srcdir) -I$(INCDIR)
+ MKDEP = gcc -MM
+diff -burN binutils-2.16.1/bfd/version.h binutils-psp/bfd/version.h
+--- binutils-2.16.1/bfd/version.h 2005-06-12 18:37:59.000000000 +0100
++++ binutils-psp/bfd/version.h 2006-01-10 23:31:51.000000000 +0000
@@ -1,3 +1,3 @@
-#define BFD_VERSION_DATE 20050612
-+#define BFD_VERSION_DATE (PSPDEV 20051022)
++#define BFD_VERSION_DATE (PSPDEV 20060116)
#define BFD_VERSION @bfd_version@
#define BFD_VERSION_STRING @bfd_version_string@
---- binutils-2.16.1.orig/binutils/readelf.c 2005-04-20 11:43:36.000000000 -0700
-+++ binutils-psp/binutils/readelf.c 2005-06-19 18:09:27.000000000 -0700
+diff -burN binutils-2.16.1/binutils/readelf.c binutils-psp/binutils/readelf.c
+--- binutils-2.16.1/binutils/readelf.c 2005-04-20 19:43:36.000000000 +0100
++++ binutils-psp/binutils/readelf.c 2006-01-10 23:31:51.000000000 +0000
@@ -2043,6 +2043,7 @@
case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
@@ -214,8 +133,9 @@
case 0:
/* We simply ignore the field in this case to avoid confusion:
MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
---- binutils-2.16.1.orig/config.sub 2005-01-18 16:34:56.000000000 -0800
-+++ binutils-psp/config.sub 2005-06-24 17:01:46.000000000 -0700
+diff -burN binutils-2.16.1/config.sub binutils-psp/config.sub
+--- binutils-2.16.1/config.sub 2005-01-19 00:34:56.000000000 +0000
++++ binutils-psp/config.sub 2006-01-10 23:31:51.000000000 +0000
@@ -253,6 +253,7 @@
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
@@ -243,9 +163,43 @@
mips3*-*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
;;
---- binutils-2.16.1.orig/gas/config/tc-mips.c 2005-10-22 15:36:25.000000000 -0700
-+++ binutils-psp/gas/config/tc-mips.c 2005-10-22 15:38:52.000000000 -0700
-@@ -365,11 +365,15 @@
+diff -burN binutils-2.16.1/gas/config/tc-mips.c binutils-psp/gas/config/tc-mips.c
+--- binutils-2.16.1/gas/config/tc-mips.c 2005-06-12 19:07:03.000000000 +0100
++++ binutils-psp/gas/config/tc-mips.c 2006-01-16 20:05:23.000000000 +0000
+@@ -92,6 +92,32 @@
+
+ #define ZERO 0
+ #define AT 1
++#define V0 2
++#define V1 3
++#define A0 4
++#define A1 5
++#define A2 6
++#define A3 7
++#define T0 8
++#define T1 9
++#define T2 10
++#define T3 11
++#define T4 12
++#define T5 13
++#define T6 14
++#define T7 15
++#define S0 16
++#define S1 17
++#define S2 18
++#define S3 19
++#define S4 20
++#define S5 21
++#define S6 22
++#define S7 23
++#define T8 24
++#define T9 25
++#define K0 26
++#define K1 27
+ #define TREG 24
+ #define PIC_CALL_REG 25
+ #define KT0 26
+@@ -365,11 +391,15 @@
#define CPU_HAS_MDMX(cpu) (FALSE \
)
@@ -262,7 +216,7 @@
/* True if mflo and mfhi can be immediately followed by instructions
which write to the HI and LO registers.
-@@ -393,6 +397,7 @@
+@@ -393,6 +423,7 @@
|| mips_opts.arch == CPU_R12000 \
|| mips_opts.arch == CPU_RM7000 \
|| mips_opts.arch == CPU_VR5500 \
@@ -270,28 +224,32 @@
)
/* Whether the processor uses hardware interlocks to protect reads
-@@ -1161,6 +1166,20 @@
- static segT pdr_seg;
- #endif
-
-+/* Expressions saved for use in VFPU immediate mode macros. */
-+
+@@ -1142,6 +1173,8 @@
+ static expressionS imm_expr;
+ static expressionS imm2_expr;
+ static expressionS offset_expr;
+static expressionS vimm_expr[4];
+static expressionS voffset_expr[4];
-+
-+/* VFPU instruction prefixes to apply to the current VFPU instruction. */
-+
-+static int vfpu_has_dprefix;
-+static int vfpu_has_sprefix;
-+static int vfpu_has_tprefix;
-+static char vfpu_dprefix_operands[64];
-+static char vfpu_sprefix_operands[64];
-+static char vfpu_tprefix_operands[64];
-+
- /* The default target format to use. */
- const char *
-@@ -1641,6 +1660,58 @@
+ /* Relocs associated with imm_expr and offset_expr. */
+
+@@ -1150,6 +1183,15 @@
+ static bfd_reloc_code_real_type offset_reloc[3]
+ = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
+
++/* set by vfpu code for prefix instructions */
++
++static bfd_boolean vfpu_dprefix;
++static char vfpu_dprefix_str[64];
++static bfd_boolean vfpu_sprefix;
++static char vfpu_sprefix_str[64];
++static bfd_boolean vfpu_tprefix;
++static char vfpu_tprefix_str[64];
++
+ /* These are set by mips16_ip if an explicit extension is used. */
+
+ static bfd_boolean mips16_small, mips16_ext;
+@@ -1641,6 +1683,62 @@
return;
}
@@ -300,606 +258,1839 @@
+ instruction it prefixes. Note that in mips_ip prefix operands do not
+ cause any side effects with imm_expr or offset_expr. If they did
+ we'd have to save and restore them here. */
-+ if (CPU_IS_ALLEGREX (mips_opts.arch)
-+ && (vfpu_has_dprefix || vfpu_has_sprefix || vfpu_has_tprefix))
++ if (CPU_IS_ALLEGREX (mips_opts.arch) && ((vfpu_dprefix || vfpu_sprefix || vfpu_tprefix)))
+ {
-+ if (mips_opts.noreorder &&
-+ (history[0].insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
-+ | INSN_COND_BRANCH_DELAY
-+ | INSN_COND_BRANCH_LIKELY)))
-+ as_bad (_("VFPU instruction with prefix can't be used in a branch delay slot"));
+
-+ if (vfpu_has_dprefix)
-+ {
-+ struct mips_cl_insn dprefix_insn;
-+ bfd_reloc_code_real_type dprefix_unused_reloc[3]
++ if (mips_opts.noreorder
++ && ( history[0].insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
++ | INSN_COND_BRANCH_DELAY
++ | INSN_COND_BRANCH_LIKELY)))
++ {
++ as_bad (_("instruction with prefix cannot be used in branch delay slot"));
++ }
++
++ if (vfpu_dprefix)
++ {
++ struct mips_cl_insn prefix;
++ bfd_reloc_code_real_type unused_reloc[3]
+ = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
-+ char dprefix_str[80];
++ char buf[256];
+
-+ sprintf (dprefix_str, "vpfxd %s", vfpu_dprefix_operands);
-+ mips_ip (str, &dprefix_insn);
-+ append_insn (&dprefix_insn, NULL, dprefix_unused_reloc);
-+ vfpu_has_dprefix = 0;
-+ }
-+ if (vfpu_has_sprefix)
-+ {
-+ struct mips_cl_insn sprefix_insn;
-+ bfd_reloc_code_real_type sprefix_unused_reloc[3]
++ sprintf (buf, "vpfxd %s", vfpu_dprefix_str);
++ mips_ip (buf, &prefix);
++ append_insn (&prefix, NULL, unused_reloc);
++ vfpu_dprefix = FALSE;
++ }
++
++ if (vfpu_sprefix)
++ {
++ struct mips_cl_insn prefix;
++ bfd_reloc_code_real_type unused_reloc[3]
+ = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
-+ char sprefix_str[80];
++ char buf[256];
+
-+ sprintf (sprefix_str, "vpfxs %s", vfpu_sprefix_operands);
-+ mips_ip (str, &sprefix_insn);
-+ append_insn (&sprefix_insn, NULL, sprefix_unused_reloc);
-+ vfpu_has_sprefix = 0;
-+ }
-+ if (vfpu_has_tprefix)
-+ {
-+ struct mips_cl_insn tprefix_insn;
-+ bfd_reloc_code_real_type tprefix_unused_reloc[3]
++ sprintf (buf, "vpfxs %s", vfpu_sprefix_str);
++ mips_ip (buf, &prefix);
++ append_insn ( &prefix, NULL, unused_reloc);
++ vfpu_sprefix = FALSE;
++ }
++
++ if (vfpu_tprefix)
++ {
++ struct mips_cl_insn prefix;
++ bfd_reloc_code_real_type unused_reloc[3]
+ = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
-+ char tprefix_str[80];
++ char buf[256];
+
-+ sprintf (tprefix_str, "vpfxt %s", vfpu_tprefix_operands);
-+ mips_ip (str, &tprefix_insn);
-+ append_insn (&tprefix_insn, NULL, tprefix_unused_reloc);
-+ vfpu_has_tprefix = 0;
-+ }
++ sprintf (buf, "vpfxt %s", vfpu_tprefix_str);
++ mips_ip (buf, &prefix);
++ append_insn (&prefix, NULL, unused_reloc);
++ vfpu_tprefix = FALSE;
++ }
+ }
+
if (insn.insn_mo->pinfo == INSN_MACRO)
{
macro_start ();
-@@ -7817,6 +7888,30 @@
+@@ -3128,6 +3226,55 @@
+ insn.insn_opcode |= va_arg (args, unsigned long);
+ continue;
+
++ /* VFPU fields */
++ case '?':
++ switch (*fmt++)
++ {
++ case 'o':
++ *r = (bfd_reloc_code_real_type) va_arg (args, int);
++ assert (*r == BFD_RELOC_GPREL16
++ || *r == BFD_RELOC_MIPS_LITERAL
++ || *r == BFD_RELOC_MIPS_HIGHER
++ || *r == BFD_RELOC_HI16_S
++ || *r == BFD_RELOC_LO16
++ || *r == BFD_RELOC_MIPS_GOT16
++ || *r == BFD_RELOC_MIPS_CALL16
++ || *r == BFD_RELOC_MIPS_GOT_DISP
++ || *r == BFD_RELOC_MIPS_GOT_PAGE
++ || *r == BFD_RELOC_MIPS_GOT_OFST
++ || *r == BFD_RELOC_MIPS_GOT_LO16
++ || *r == BFD_RELOC_MIPS_CALL_LO16);
++ break;
++ case 'd':
++ insn.insn_opcode |= va_arg (args, int) << VF_SH_VD;
++ fmt += 2;
++ break;
++ case 's':
++ insn.insn_opcode |= va_arg (args, int) << VF_SH_VS;
++ fmt += 2;
++ break;
++ case 'm':
++ {
++ int vtreg = va_arg (args, int);
++ insn.insn_opcode |= (vtreg & VF_MASK_VML) << VF_SH_VML;
++ insn.insn_opcode |= ((vtreg >> 5) & VF_MASK_VMH) << VF_SH_VMH;
++ fmt += 2;
++ }
++ break;
++ case 'n':
++ {
++ int vtreg = va_arg (args, int);
++ insn.insn_opcode |= (vtreg & VF_MASK_VNL) << VF_SH_VNL;
++ insn.insn_opcode |= ((vtreg >> 5) & VF_MASK_VNH) << VF_SH_VNH;
++ fmt += 2;
++ }
++ break;
++ case 'e':
++ insn.insn_opcode |= va_arg (args, int) << VF_SH_MCOND;
++ break;
++ }
++ continue;
++
+ default:
+ internalError ();
+ }
+@@ -4103,6 +4250,7 @@
+ macro (struct mips_cl_insn *ip)
+ {
+ register int treg, sreg, dreg, breg;
++ int vsreg, vtreg, vdreg, vmreg, vwb;
+ int tempreg;
+ int mask;
+ int used_at = 0;
+@@ -4128,6 +4276,13 @@
+ sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
+ mask = ip->insn_mo->mask;
+
++ vmreg = ((ip->insn_opcode >> 16) & 0x1f)
++ | ((ip->insn_opcode << 5) & 0x60);
++ vtreg = (ip->insn_opcode >> 16) & 0x7f;
++ vsreg = (ip->insn_opcode >> 8) & 0x7f;
++ vdreg = (ip->insn_opcode >> 0) & 0x7f;
++ vwb = (ip->insn_opcode >> 1) & 0x1;
++
+ expr1.X_op = O_constant;
+ expr1.X_op_symbol = NULL;
+ expr1.X_add_symbol = NULL;
+@@ -5654,6 +5809,26 @@
+ /* Itbl support may require additional care here. */
+ coproc = 1;
+ goto ld;
++ case M_LV_S_AB:
++ s = "lv.s";
++ /* Itbl support may require additional care here. */
++ coproc = 1;
++ goto ld;
++ case M_LV_Q_AB:
++ s = "lv.q";
++ /* Itbl support may require additional care here. */
++ coproc = 1;
++ goto ld;
++ case M_LVL_Q_AB:
++ s = "lvl.q";
++ /* Itbl support may require additional care here. */
++ coproc = 1;
++ goto ld;
++ case M_LVR_Q_AB:
++ s = "lvr.q";
++ /* Itbl support may require additional care here. */
++ coproc = 1;
++ goto ld;
+ case M_LWL_AB:
+ s = "lwl";
+ lr = 1;
+@@ -5738,6 +5913,29 @@
+ /* Itbl support may require additional care here. */
+ coproc = 1;
+ goto st;
++ case M_SV_S_AB:
++ s = "sv.s";
++ /* Itbl support may require additional care here. */
++ coproc = 1;
++ goto st;
++ case M_SV_Q_AB:
++ if (vwb)
++ s = "vwb.q";
++ else
++ s = "sv.q";
++ /* Itbl support may require additional care here. */
++ coproc = 1;
++ goto st;
++ case M_SVL_Q_AB:
++ s = "svl.q";
++ /* Itbl support may require additional care here. */
++ coproc = 1;
++ goto st;
++ case M_SVR_Q_AB:
++ s = "svr.q";
++ /* Itbl support may require additional care here. */
++ coproc = 1;
++ goto st;
+ case M_SWL_AB:
+ s = "swl";
+ goto st;
+@@ -5787,6 +5985,22 @@
+ || mask == M_L_DAB
+ || mask == M_S_DAB)
+ fmt = "T,o(b)";
++ else if (mask == M_LV_S_AB
++ || mask == M_SV_S_AB)
++ {
++ fmt = "?m0x,?o(b)";
++ treg = vmreg;
++ }
++ else if (mask == M_LV_Q_AB
++ || mask == M_SV_Q_AB
++ || mask == M_LVL_Q_AB
++ || mask == M_LVR_Q_AB
++ || mask == M_SVL_Q_AB
++ || mask == M_SVR_Q_AB)
++ {
++ fmt = "?n3x,?o(b)";
++ treg = vmreg;
++ }
+ else if (coproc)
+ fmt = "E,o(b)";
+ else
+@@ -6150,6 +6364,138 @@
+ break;
+ }
+
++ case M_LVI_S_SS:
++ case M_LVI_P_SS:
++ case M_LVI_T_SS:
++ case M_LVI_Q_SS:
++ {
++ int mtx = (vtreg >> VF_SH_MR_MTX) & VF_MASK_MR_MTX;
++ int idx = (vtreg >> VF_SH_MR_IDX) & VF_MASK_MR_IDX;
++ int fsl = 0;
++ int rxc = 0;
++ int vtreg_s = 0;
++ int vnum = 0;
++ int vat = 0;
++ int i;
++
++ switch (mask)
++ {
++ case M_LVI_S_SS:
++ vnum = 1;
++ fsl = (vtreg >> VF_SH_MR_FSL) & VF_MASK_MR_FSL;
++ rxc = 0;
++ break;
++ case M_LVI_P_SS:
++ vnum = 2;
++ fsl = ((vtreg >> VF_SH_MR_VFSL) & VF_MASK_MR_VFSL) << 1;
++ rxc = (vtreg >> VF_SH_MR_RXC) & VF_MASK_MR_RXC;
++ break;
++ case M_LVI_T_SS:
++ vnum = 3;
++ fsl = (vtreg >> VF_SH_MR_VFSL) & VF_MASK_MR_VFSL;
++ rxc = (vtreg >> VF_SH_MR_RXC) & VF_MASK_MR_RXC;
++ break;
++ case M_LVI_Q_SS:
++ vnum = 4;
++ fsl = 0;
++ rxc = (vtreg >> VF_SH_MR_RXC) & VF_MASK_MR_RXC;
++ break;
++ }
++ if (rxc)
++ vtreg_s = (mtx << VF_SH_MR_MTX) | (idx << VF_SH_MR_FSL)
++ | (fsl << VF_SH_MR_IDX);
++ else
++ vtreg_s = (mtx << VF_SH_MR_MTX) | (idx << VF_SH_MR_IDX)
++ | (fsl << VF_SH_MR_FSL);
++
++ for (i = 0; i < vnum; i++) {
++ imm_expr = vimm_expr[i];
++ offset_expr = voffset_expr[i];
++
++ if (imm_expr.X_op == O_constant)
++ {
++ load_register (AT, &imm_expr, 0);
++ macro_build ((expressionS *) NULL,
++ "mtv", "t,?d0z", AT, vtreg_s);
++ vat = 1;
++ }
++ else
++ {
++ assert (offset_expr.X_op == O_symbol
++ && strcmp (segment_name (S_GET_SEGMENT
++ (offset_expr.X_add_symbol)),
++ ".lit4") == 0
++ && offset_expr.X_add_number == 0);
++ macro_build (&offset_expr,
++ "lv.s", "?m0x,?o(b)", vtreg_s,
++ (int) BFD_RELOC_MIPS_LITERAL, mips_gp_register);
++ }
++
++ if (rxc)
++ vtreg_s += (1 << VF_SH_MR_IDX);
++ else
++ vtreg_s += (1 << VF_SH_MR_FSL);
++ }
++
++ if (vat)
++ break;
++ else
++ return;
++ }
++
++ case M_LVHI_S_SS:
++ case M_LVHI_P_SS:
++ {
++ int mtx = (vtreg >> VF_SH_MR_MTX) & VF_MASK_MR_MTX;
++ int idx = (vtreg >> VF_SH_MR_IDX) & VF_MASK_MR_IDX;
++ int fsl = 0;
++ int rxc = 0;
++ int vtreg_s = 0;
++ int vnum = 0;
++ int i;
++ unsigned int f16v;
++ char f16v_str[16];
++
++ switch (mask)
++ {
++ case M_LVHI_S_SS:
++ vnum = 2;
++ fsl = (vtreg >> VF_SH_MR_FSL) & VF_MASK_MR_FSL;
++ rxc = 0;
++ break;
++ case M_LVHI_P_SS:
++ vnum = 4;
++ fsl = ((vtreg >> VF_SH_MR_VFSL) & VF_MASK_MR_VFSL) << 1;
++ rxc = (vtreg >> VF_SH_MR_RXC) & VF_MASK_MR_RXC;
++ break;
++ }
++ if (rxc)
++ vtreg_s = (mtx << VF_SH_MR_MTX) | (idx << VF_SH_MR_FSL)
++ | (fsl << VF_SH_MR_IDX);
++ else
++ vtreg_s = (mtx << VF_SH_MR_MTX) | (idx << VF_SH_MR_IDX)
++ | (fsl << VF_SH_MR_FSL);
++
++
++ for (i = 0; i < vnum; i += 2) {
++ f16v = ((vimm_expr[i + 1].X_add_number & 0xffff) << 16)
++ | (vimm_expr[i].X_add_number & 0xffff);
++ sprintf(f16v_str, "0x%08x", f16v);
++ my_getExpression (&imm_expr, f16v_str);
++
++ load_register (AT, &imm_expr, 0);
++ macro_build ((expressionS *) NULL,
++ "mtv", "t,?d0z", AT, vtreg_s);
++
++ if (rxc)
++ vtreg_s += (1 << VF_SH_MR_IDX);
++ else
++ vtreg_s += (1 << VF_SH_MR_FSL);
++ }
++
++ break;
++ }
++
+ case M_LI_D:
+ /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
+ wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
+@@ -6672,6 +7018,27 @@
+ move_register (dreg, sreg);
+ break;
+
++ case M_VCMOV_S:
++ s = "vcmovt.s";
++ fmt = "?d0d,?s0s,?e";
++ goto vcmov;
++ case M_VCMOV_P:
++ s = "vcmovt.p";
++ fmt = "?d1d,?s1s,?e";
++ goto vcmov;
++ case M_VCMOV_T:
++ s = "vcmovt.t";
++ fmt = "?d2d,?s2s,?e";
++ goto vcmov;
++ case M_VCMOV_Q:
++ s = "vcmovt.q";
++ fmt = "?d3d,?s3s,?e";
++ vcmov:
++ macro_build ((expressionS *) NULL, s, fmt,
++ vdreg, vsreg,
++ (ip->insn_opcode >> VF_SH_MCOND) & VF_MASK_MCOND);
++ return;
++
+ #ifdef LOSING_COMPILER
+ default:
+ /* Try and see if this is a new itbl instruction.
+@@ -7348,6 +7715,39 @@
+ move_register (treg, tempreg);
+ break;
+
++ case M_ULV_S:
++ if (mips_opts.arch == CPU_ALLEGREX)
++ as_bad (_("opcode not supported on this processor"));
++ off = 3;
++ if (offset_expr.X_add_number >= 0x8000 - off)
++ as_bad (_("operand overflow"));
++ if (! target_big_endian)
++ offset_expr.X_add_number += off;
++ macro_build (&offset_expr, "lwl", "t,o(b)",
++ AT, (int) BFD_RELOC_LO16, breg);
++ if (! target_big_endian)
++ offset_expr.X_add_number -= off;
++ else
++ offset_expr.X_add_number += off;
++ macro_build (&offset_expr, "lwr", "t,o(b)",
++ AT, (int) BFD_RELOC_LO16, breg);
++
++ macro_build ((expressionS *) NULL, "mtv", "t,?d0z",
++ AT, vmreg);
++ break;
++
++ case M_ULV_Q:
++ off = 12;
++ if (offset_expr.X_add_number >= 0x8000 - off)
++ as_bad (_("operand overflow"));
++ offset_expr.X_add_number += off;
++ macro_build (&offset_expr, "lvl.q", "?n3x,?o(b)",
++ vmreg, (int) BFD_RELOC_LO16, breg);
++ offset_expr.X_add_number -= off;
++ macro_build (&offset_expr, "lvr.q", "?n3x,?o(b)",
++ vmreg, (int) BFD_RELOC_LO16, breg);
++ return;
++
+ case M_ULD_A:
+ s = "ldl";
+ s2 = "ldr";
+@@ -7430,6 +7830,55 @@
+ macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
+ break;
+
++ case M_USV_S:
++ off = 3;
++ if (offset_expr.X_add_number >= 0x8000 - off)
++ as_bad (_("operand overflow"));
++ macro_build ((expressionS *) NULL, "mfv", "t,?d0z",
++ AT, vmreg);
++ if (mips_opts.arch != CPU_ALLEGREX)
++ {
++ if (! target_big_endian)
++ offset_expr.X_add_number += off;
++ macro_build (&offset_expr, "swl", "t,o(b)",
++ AT, (int) BFD_RELOC_LO16, breg);
++ if (! target_big_endian)
++ offset_expr.X_add_number -= off;
++ else
++ offset_expr.X_add_number += off;
++ macro_build (&offset_expr, "swr", "t,o(b)",
++ AT, (int) BFD_RELOC_LO16, breg);
++ }
++ else
++ {
++ if (target_big_endian)
++ offset_expr.X_add_number += off;
++ while (off-- >= 0)
++ {
++ macro_build (&offset_expr, "sb", "t,o(b)",
++ AT, (int) BFD_RELOC_LO16, breg);
++ macro_build ((expressionS *) NULL, "ror",
++ "d,w,<", AT, AT, 8);
++ if (target_big_endian)
++ --offset_expr.X_add_number;
++ else
++ ++offset_expr.X_add_number;
++ }
++ }
++ break;
++
++ case M_USV_Q:
++ off = 12;
++ if (offset_expr.X_add_number >= 0x8000 - off)
++ as_bad (_("operand overflow"));
++ offset_expr.X_add_number += off;
++ macro_build (&offset_expr, "svl.q", "?n3x,?o(b)",
++ vmreg, (int) BFD_RELOC_LO16, breg);
++ offset_expr.X_add_number -= off;
++ macro_build (&offset_expr, "svr.q", "?n3x,?o(b)",
++ vmreg, (int) BFD_RELOC_LO16, breg);
++ return;
++
+ case M_USD_A:
+ s = "sdl";
+ s2 = "sdr";
+@@ -7817,6 +8266,103 @@
case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
case '[': break;
case ']': break;
++
++ /* VFPU fields */
+ case '?':
-+ /* MRB TODO: Fix this for the VFPU extensions. */
+ switch (c = *p++)
+ {
-+ case 'f':
-+ /* MRB HACK: Skip the next character. */
-+ p++;
++ case '[': break;
++ case ']': break;
++ case 'y':
++ {
++ if ((*p != '0') && (*p != '1') && (*p != '2') && (*p != '3'))
++ {
++ as_bad (_("internal: bad mips opcode : %s %s"),
++ opc->name, opc->args);
++ return 0;
++ }
++ p++;
++ }
+ break;
-+ case 'd':
-+ case 'm':
-+ case 'n':
++
++ case 'o': USE_BITS (VF_MASK_OFFSET, VF_SH_OFFSET); break;
++
+ case 's':
+ case 't':
++ case 'd':
+ case 'v':
+ case 'x':
-+ /* MRB HACK: Skip the next two characters. */
-+ p++;
-+ p++;
++ case 'm':
++ case 'n':
++ {
++ if ((*p != '0') && (*p != '1') && (*p != '2') && (*p != '3')
++ && (*p != '5') && (*p != '6') && (*p != '7'))
++ {
++ as_bad (_("internal: bad mips opcode (vreg type `?%c'): %s %s"),
++ *p, opc->name, opc->args);
++ return 0;
++ }
++ p++;
++
++ if ((*p != 's') && (*p != 't') && (*p != 'd')
++ && (*p != 'y') && (*p != 'x') && (*p != 'z')
++ && (*p != 'w') && (*p != 'm'))
++ {
++ as_bad (_("internal: bad mips opcode (vreg type `?%c'): %s %s"),
++ *(p - 1), opc->name, opc->args);
++ }
++ p++;
++
++ switch (c)
++ {
++ case 's': USE_BITS (VF_MASK_VS, VF_SH_VS); break;
++ case 't': USE_BITS (VF_MASK_VT, VF_SH_VT); break;
++ case 'd':
++ case 'v':
++ case 'x': USE_BITS (VF_MASK_VD, VF_SH_VD); break;
++ case 'm': USE_BITS (VF_MASK_VML, VF_SH_VML);
++ USE_BITS (VF_MASK_VMH, VF_SH_VMH); break;
++ case 'n': USE_BITS (VF_MASK_VNL, VF_SH_VNL);
++ USE_BITS (VF_MASK_VNH, VF_SH_VNH); break;
++ }
++ }
+ break;
-+ default: break;
++
++ case 'f': USE_BITS (VF_MASK_CC, VF_SH_CC);
++ p++; break;
++
++ case 'a': USE_BITS (VF_MASK_CONST, VF_SH_CONST); break;
++ case 'b': USE_BITS (VF_MASK_SCALE, VF_SH_SCALE); break;
++ case 'c': USE_BITS (VF_MASK_BCOND, VF_SH_BCOND); break;
++ case 'e': USE_BITS (VF_MASK_MCOND, VF_SH_MCOND); break;
++
++ case 'i': USE_BITS (VF_MASK_WRAP, VF_SH_WRAP); break;
++
++ case 'q': USE_BITS (VF_MASK_VCD, VF_SH_VCD); break;
++ case 'r': USE_BITS (VF_MASK_VCS, VF_SH_VCS); break;
++
++ case 'u': USE_BITS (VF_MASK_HFLOAT, VF_SH_HFLOAT); break;
++
++ case 'w': USE_BITS (VF_MASK_ROT, VF_SH_ROT); break;
++ case 'z': USE_BITS (VF_MASK_RWB, VF_SH_RWB); break;
++
++ case '0': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break;
++ case '1': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break;
++ case '2': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break;
++ case '3': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break;
++ case '4': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break;
++ case '5': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break;
++ case '6': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break;
++ case '7': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break;
++
++ default:
++ as_bad (_("internal: bad mips opcode (unknown extension operand type `?%c'): %s %s"),
++ c, opc->name, opc->args);
++ return 0;
++
+ }
-+ /* MRB HACK: Set all used bits. */
-+ used_bits = 0xffffffff;
+ break;
++
default:
as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
c, opc->name, opc->args);
-@@ -8125,6 +8220,517 @@
- }
- break;
+@@ -7845,12 +8391,15 @@
+ char c = 0;
+ struct mips_opcode *insn;
+ char *argsStart;
+- unsigned int regno;
++ unsigned int regno = 0;
+ unsigned int lastregno = 0;
+ unsigned int lastpos = 0;
+ unsigned int limlo, limhi;
+ char *s_reset;
+ char save_c = 0;
++ unsigned int vdregno = 0xffff;
++ char vdregt = 0;
++ char vdregl = 0;
-+ case '?': /* VFPU extension character. */
-+ switch (*++args)
-+ {
-+ case '[': /* these must match exactly */
-+ case ']':
-+ if (*s++ == *args)
+ insn_error = NULL;
+
+@@ -8238,26 +8787,1171 @@
+ s = expr_end;
+ continue;
+
+- case 'b': /* base register */
+- case 'd': /* destination register */
+- case 's': /* source register */
+- case 't': /* target register */
+- case 'r': /* both target and source */
+- case 'v': /* both dest and source */
+- case 'w': /* both dest and target */
+- case 'E': /* coprocessor target register */
+- case 'G': /* coprocessor destination register */
+- case 'K': /* 'rdhwr' destination register */
+- case 'x': /* ignore register name */
+- case 'z': /* must be zero register */
+- case 'U': /* destination register (clo/clz). */
+- s_reset = s;
+- if (s[0] == '$')
++ /* VFPU fields */
++ case '?':
++ switch (*++args)
+ {
++ case '[':
++ case ']':
++ if (*s++ == *args)
++ continue;
++ break;
+
+- if (ISDIGIT (s[1]))
+- {
+- ++s;
++ case 'y': /* immediate separator */
++ ++args;
++ vimm_expr[*args - '0'] = imm_expr;
++ voffset_expr[*args - '0'] = offset_expr;
++
++ imm_expr.X_op = O_absent;
++ offset_expr.X_op = O_absent;
++ imm_reloc[0] = BFD_RELOC_UNUSED;
++ imm_reloc[1] = BFD_RELOC_UNUSED;
++ imm_reloc[2] = BFD_RELOC_UNUSED;
++ offset_reloc[0] = BFD_RELOC_UNUSED;
++ offset_reloc[1] = BFD_RELOC_UNUSED;
++ offset_reloc[2] = BFD_RELOC_UNUSED;
++
++ continue;
++
++ case 'o': /* 16 bit offset */
++ /* Check whether there is only a single bracketed expression
++ left. If so, it must be the base register and the
++ constant must be zero. */
++ if (*s == '(' && strchr (s + 1, '(') == 0)
++ {
++ offset_expr.X_op = O_constant;
++ offset_expr.X_add_number = 0;
+ continue;
++ }
++
++ /* If this value won't fit into a 16 bit offset, then go
++ find a macro that will generate the 32 bit offset
++ code pattern. */
++ if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
++ && (offset_expr.X_op != O_constant
++ || offset_expr.X_add_number >= 0x8000
++ || offset_expr.X_add_number < -0x8000))
+ break;
+
-+ case '0': /* Source or target prefix. */
-+ case '1':
-+ case '2':
-+ case '3':
-+ {
-+ char *orig_s = s;
-+ int pos = *args - '0';
-+ int negation = 0;
-+ int is_constant = 0;
-+ int abs_consthi = 0;
-+ int swz_constlo = 0;
-+ int constant_code = 0;
-+ int bad_format = 0;
-+ unsigned int operand;
++ s = expr_end;
++ continue;
+
-+ if (*s == '-')
-+ {
-+ negation = 1;
-+ ++s;
-+ }
-+ if (ISDIGIT (*s))
-+ {
-+ is_constant = 1;
-+ if (*s == '0')
-+ constant_code = 0;
-+ else if (*s == '1')
-+ {
-+ if (s[1] == '/')
-+ {
-+ s += 2;
-+ if (*s == '2')
-+ constant_code = 3;
-+ else if (*s == '3')
-+ constant_code = 5;
-+ else if (*s == '4')
-+ constant_code = 6;
-+ else if (*s == '6')
-+ constant_code = 7;
-+ else
-+ bad_format = 1;
-+ }
-+ else
-+ constant_code = 1;
-+ }
-+ else if (*s == '2')
-+ constant_code = 2;
-+ else if (*s == '3')
-+ constant_code = 4;
-+ else
-+ bad_format = 1;
++ case 's': /* VFPU source register */
++ case 't': /* VFPU target register */
++ case 'd': /* VFPU destination register */
++ case 'v': /* VFPU destination register */
++ case 'x': /* VFPU destination register */
++ case 'm': /* VFPU target regsiter (load/store) */
++ case 'n': /* VFPU target regsiter (load/store) */
++ {
++ int dtype_err = 0;
++ int dnum_err = 0;
++ int dlen = 0;
++ char dtype = s[0];
++ char regtype = *(args + 1);
+
-+ /* Bits 0-1 of the constant code are stored in the
-+ SWZ/CST[1:0] field, and bit 2 is stored in the
-+ ABS/CST[2] field. */
-+ swz_constlo = constant_code & VFPU_MASK_PFX_SWZ_CSTLO;
-+ abs_consthi = constant_code >> 2;
-+ }
-+ else
-+ {
-+ if (*s == '|')
-+ {
-+ abs_consthi = 1;
-+ ++s;
-+ }
-+ if (*s == 'x' || *s == 'X')
-+ {
-+ swz_constlo = 0;
-+ ++s;
-+ }
-+ else if (*s == 'y' || *s == 'Y')
-+ {
-+ swz_constlo = 1;
-+ ++s;
-+ }
-+ else if (*s == 'z' || *s == 'Z')
-+ {
-+ swz_constlo = 2;
-+ ++s;
-+ }
-+ else if (*s == 'w' || *s == 'W')
-+ {
-+ swz_constlo = 3;
-+ ++s;
-+ }
-+ else if (*s != ',' && *s != '|'
-+ && ! IS_SPACE_OR_NUL (*s))
-+ bad_format = 1;
-+ if (! bad_format)
-+ {
-+ /* Make sure the abs value was written properly. */
-+ if (*s == '|')
-+ {
-+ ++s;
-+ if (! abs_consthi)
-+ bad_format = 1;
-+ }
-+ else if (abs_consthi)
-+ bad_format = 1;
-+ }
-+ }
++ int mtx = 0;
++ int idx = 0;
++ int rxc = 0;
++ int fsl = 0;
++ int vidx = 0;
++ int vfsl = 0;
+
-+ if (bad_format
-+ || (*s != ',' && ! IS_SPACE_OR_NUL (*s)))
-+ as_bad (_("Invalid prefix format (%s)"), orig_s);
-+
-+ /* The bit positions of each field vary depending on the
-+ position of our operand. We can't use INSERT_OPERAND()
-+ as it would mask out the values set by other operands. */
-+ operand = (((negation & VFPU_MASK_PFX_NEG)
-+ << (VFPU_SH_PFX_NEG + pos))
-+ || ((is_constant & VFPU_MASK_PFX_CST)
-+ << (VFPU_SH_PFX_CST + pos))
-+ || ((abs_consthi & VFPU_MASK_PFX_ABS_CSTHI)
-+ << (VFPU_SH_PFX_ABS_CSTHI + pos))
-+ || ((swz_constlo & VFPU_MASK_PFX_SWZ_CSTLO)
-+ << (VFPU_SH_PFX_SWZ_CSTLO + pos * 2)));
-+ ip->insn_opcode |= operand;
-+ }
-+ continue;
-+
-+ case '4': /* Destination prefix. */
-+ case '5':
-+ case '6':
-+ case '7':
-+ {
-+ char *orig_s = s;
-+ int mask = 0;
-+ int saturation = 0;
-+ int pos = *args - '4';
-+ unsigned int operand;
-+
-+ if (*s == '[')
-+ ++s;
-+ if (*s == '-')
-+ ++s;
-+ if (*s == 'm' || *s == 'M')
-+ {
-+ mask = 1;
-+ ++s;
-+ }
-+ else if (*s == '0')
-+ {
-+ saturation = 1;
-+ ++s;
-+ }
-+ else if (*s == '1')
-+ {
-+ saturation = 3;
-+ ++s;
-+ }
-+ if (*s == ':')
-+ {
-+ ++s;
-+ if (*s == '+')
-+ ++s;
-+ if (*s == '1')
-+ ++s;
-+ }
-+ if (*s == ']')
-+ ++s;
-+ if (*s != ',' && ! IS_SPACE_OR_NUL (*s))
-+ as_bad (_("Invalid prefix format (%s)"), orig_s);
-+
-+ /* The position of the stored mask and saturation code
-+ depend on the position of the prefix operand. Because
-+ the bits aren't consecutive, we have to be careful to
-+ insert them without masking out any other operands. */
-+ operand = (((mask & VFPU_MASK_PFX_MASK)
-+ << (VFPU_SH_PFX_MASK + pos))
-+ || ((saturation & VFPU_MASK_PFX_SAT)
-+ << (VFPU_SH_PFX_SAT + pos * 2)));
-+ ip->insn_opcode |= operand;
-+ }
-+ continue;
-+
-+ case 'a': /* Constant. */
-+ {
-+ static const char * const vfpu_const_names[20] = {
-+ "", "VFPU_HUGE", "VFPU_SQRT2", "VFPU_SQRT1_2",
-+ "VFPU_2_SQRTPI", "VFPU_2_PI", "VFPU_1_PI", "VFPU_PI_4",
-+ "VFPU_PI_2", "VFPU_PI", "VFPU_E", "VFPU_LOG2E",
-+ "VFPU_LOG10E", "VFPU_LN2", "VFPU_LN10", "VFPU_2PI",
-+ "VFPU_PI_6", "VFPU_LOG10TWO", "VFPU_LOG2TEN", "VFPU_SQRT3_2"
-+ };
-+ const int vfpu_num_constants = ARRAY_SIZE (vfpu_const_names) - 1;
-+ int i;
-+
-+ if (!ISDIGIT (*s))
-+ {
-+ /* Try to match one of the predefined constants. */
-+ for (i = 1; i <= vfpu_num_constants; i++)
-+ if (!strcasecmp (s, vfpu_const_names[i]))
-+ break;
-+ if (i <= vfpu_num_constants)
-+ s += strlen (vfpu_const_names[i]);
-+ else
-+ as_bad (_("Invalid constant code (%s)"), s);
-+ INSERT_OPERAND (VFPU_CONST, *ip, i);
-+ }
-+ else
-+ {
-+ my_getExpression (&imm_expr, s);
-+ check_absolute_expr (ip, &imm_expr);
-+ if (imm_expr.X_add_number == 0
-+ || imm_expr.X_add_number > vfpu_num_constants)
-+ as_bad (_("Improper constant code (%lu)"),
-+ (unsigned long) imm_expr.X_add_number);
-+ INSERT_OPERAND (VFPU_CONST, *ip, imm_expr.X_add_number);
-+ imm_expr.X_op = O_absent;
-+ s = expr_end;
-+ }
-+ }
-+ continue;
-+
-+ case 'b':
-+ my_getExpression (&imm_expr, s);
-+ check_absolute_expr (ip, &imm_expr);
-+ if ((unsigned long) imm_expr.X_add_number > 31)
-+ as_bad (_("Improper scale (%lu)"),
-+ (unsigned long) imm_expr.X_add_number);
-+ INSERT_OPERAND (VFPU_IMM5, *ip, imm_expr.X_add_number);
-+ imm_expr.X_op = O_absent;
-+ s = expr_end;
-+ continue;
-+
-+ case 'c': /* Condition code bit. */
-+ my_getExpression (&imm_expr, s);
-+ check_absolute_expr (ip, &imm_expr);
-+ if ((unsigned long) imm_expr.X_add_number > 5)
-+ as_bad (_("Improper condition bit (%lu)"),
-+ (unsigned long) imm_expr.X_add_number);
-+ INSERT_OPERAND (VFPU_CC, *ip, imm_expr.X_add_number);
-+ imm_expr.X_op = O_absent;
-+ s = expr_end;
-+ continue;
-+
-+ case 'e': /* Condition code bit for conditional moves. */
-+ my_getExpression (&imm_expr, s);
-+ check_absolute_expr (ip, &imm_expr);
-+ if ((unsigned long) imm_expr.X_add_number > 6)
-+ as_bad (_("Improper condition bit (%lu)"),
-+ (unsigned long) imm_expr.X_add_number);
-+ INSERT_OPERAND (VFPU_IMM3, *ip, imm_expr.X_add_number);
-+ imm_expr.X_op = O_absent;
-+ s = expr_end;
-+ continue;
-+
-+ case 'f': /* Condition code. */
-+ {
-+ static const char * const vfpu_cond_names[16] = {
-+ "FL", "EQ", "LT", "LE", "TR", "NE", "GE", "GT",
-+ "EZ", "EN", "EI", "ES", "NZ", "NN", "NI", "NS"
-+ };
-+ unsigned long cond;
-+ int i, arg_count;
-+
-+ if (!ISDIGIT (*s))
-+ {
-+ for (i = 0; i < VFPU_NUM_CONDS; i++)
-+ if (!strncasecmp (s, vfpu_cond_names[i], 2))
-+ break;
-+ if (i < VFPU_NUM_CONDS)
-+ s += 2;
-+ else
-+ as_bad (_("Invalid VFPU condition code (%s)"), s);
-+ cond = i;
-+ }
-+ else
-+ {
-+ my_getExpression (&imm_expr, s);
-+ check_absolute_expr (ip, &imm_expr);
-+ cond = imm_expr.X_add_number;
-+ if (cond >= VFPU_NUM_CONDS)
-+ as_bad (_("Invalid VFPU condition code (%lu)"), cond);
-+ imm_expr.X_op = O_absent;
-+ s = expr_end;
-+ }
-+
-+ /* Verify that the right number of arguments were passed
-+ for the selected condition code. */
-+ arg_count = *++args - '0';
-+ if (cond != VFPU_COND_FL && cond != VFPU_COND_TR
-+ && ((cond >= VFPU_COND_EZ && arg_count < 1)
-+ || (arg_count <= 1)))
-+ as_bad (_("Invalid VFPU condition operation"));
-+ INSERT_OPERAND (VFPU_COND, *ip, cond);
-+ }
-+ continue;
-+
-+ case 'i': /* Wrap. */
-+ my_getExpression (&imm_expr, s);
-+ check_absolute_expr (ip, &imm_expr);
-+ if ((unsigned long) imm_expr.X_add_number > 255)
-+ as_bad (_("Improper wrap (%lu)"),
-+ (unsigned long) imm_expr.X_add_number);
-+ INSERT_OPERAND (VFPU_IMM8, *ip, imm_expr.X_add_number);
-+ imm_expr.X_op = O_absent;
-+ s = expr_end;
-+ continue;
-+
-+ case 'o': /* VFPU 16-bit offset. */
-+ /* Check whether there is only a single bracketed expression
-+ left. If so, it must be the base register and the
-+ constant must be zero. */
-+ if (*s == '(' && strchr (s + 1, '(') == 0)
++ if (ISDIGIT (s[1]))
+ {
-+ offset_expr.X_op = O_constant;
-+ offset_expr.X_add_number = 0;
-+ continue;
++ int num = 0;
++ s++;
++ do
++ {
++ num *= 10;
++ num += *s - '0';
++ dlen++;
++ s++;
++ }
++ while (ISDIGIT (*s));
++
++ if ((s[0] == '.')
++ && (s[1] == 's' || s[1] == 'p'
++ || s[1] == 't' || s[1] == 'q'))
++ s += 2;
++
++ if (ISUPPER(dtype))
++ dtype -= 'A' - 'a';
++
++ if (dtype == '$')
++ {
++ regno = num;
++ if (regno > VF_MAX_MR)
++ as_bad (_("Invalid VFPU register number (%d)"),
++ regno);
++
++ idx = (num >> VF_SH_MR_IDX) & VF_MASK_MR_IDX;
++ vfsl = (num >> VF_SH_MR_VFSL) & VF_MASK_MR_VFSL;
++ switch (regtype)
++ {
++ case '0': /* single word */
++ break;
++ case '1': /* pare word */
++ dnum_err = (vfsl & 0x1);
++ break;
++ case '2': /* triple word */
++ dnum_err = (vfsl > 1);
++ break;
++ case '3': /* quad word */
++ dnum_err = (vfsl > 0);
++ break;
++ case '5': /* 2x2 word */
++ dnum_err = (vfsl & 0x1) || (idx & 0x1);
++ break;
++ case '6': /* 3x3 word */
++ dnum_err = (vfsl > 1) || (idx > 1);
++ break;
++ case '7': /* 4x4 word */
++ dnum_err = (vfsl > 0) || (idx > 0);
++ break;
++ }
++
++ if (dnum_err)
++ as_bad (_("Improper VFPU register number (%d)"),
++ regno);
++
++ }
++ else if ((dlen == 3)
++ && ((dtype == 's')
++ || (dtype == 'c') || (dtype == 'r')
++ || (dtype == 'm') || (dtype == 'e')))
++ {
++ mtx = num / 100;
++ if ((dtype == 'r') || (dtype == 'e'))
++ {
++ vfsl = (num / 10) % 10;
++ vidx = num % 10;
++ rxc = 1;
++ }
++ else
++ {
++ vidx = (num / 10) % 10;
++ vfsl = num % 10;
++ rxc = 0;
++ }
++
++ switch (regtype)
++ {
++ case '0': /* single word */
++ idx = vidx;
++ fsl = vfsl;
++ dtype_err = (dtype != 's');
++ break;
++ case '1': /* pare word */
++ idx = vidx;
++ fsl = (vfsl & 0x2) | rxc;
++ dnum_err = (vfsl & 0x1);
++ dtype_err = (dtype != 'c') && (dtype != 'r');
++ break;
++ case '2': /* triple word */
++ idx = vidx;
++ fsl = ((vfsl & 0x1) << 1) | rxc;
++ dnum_err = (vfsl > 1);
++ dtype_err = (dtype != 'c') && (dtype != 'r');
++ break;
++ case '3': /* quad word */
++ idx = vidx;
++ fsl = rxc;
++ dnum_err = (vfsl > 0);
++ dtype_err = (dtype != 'c') && (dtype != 'r');
++ break;
++ case '5': /* 2x2 word */
++ idx = vidx & 0x2;
++ fsl = (vfsl & 0x2) | rxc;
++ dnum_err = (vfsl & 0x1) || (vidx & 0x1);
++ dtype_err = (dtype != 'm') && (dtype != 'e');
++ break;
++ case '6': /* 3x3 word */
++ idx = vidx & 0x1;
++ fsl = ((vfsl & 0x1) << 1) | rxc;
++ dnum_err = (vfsl > 1) || (vidx > 1);
++ dtype_err = (dtype != 'm') && (dtype != 'e');
++ break;
++ case '7': /* 4x4 word */
++ idx = 0;
++ fsl = rxc;
++ dnum_err = (vfsl > 0) || (vidx > 0);
++ dtype_err = (dtype != 'm') && (dtype != 'e');
++ break;
++ }
++
++ if (dtype_err)
++ as_bad (_("Improper VFPU register prefix '%c'"),
++ dtype);
++ if (dnum_err)
++ as_bad (_("Improper VFPU register number (%03d)"),
++ num);
++
++ if (mtx > VF_MAX_MR_MTX)
++ as_bad (_("VFPU matrix range over %d"), mtx);
++ if (vidx > VF_MAX_MR_IDX)
++ as_bad (_("VFPU index range over %d"), idx);
++ if (vfsl > VF_MAX_MR_FSL)
++ as_bad (_("VFPU field select range over %d"), fsl);
++
++ regno = ((fsl & VF_MASK_MR_FSL) << VF_SH_MR_FSL)
++ | ((mtx & VF_MASK_MR_MTX) << VF_SH_MR_MTX)
++ | ((idx & VF_MASK_MR_IDX) << VF_SH_MR_IDX);
++ }
++ else
++ {
++ as_bad (_("Improper VFPU register prefix '%c'"),
++ dtype);
++ }
++ }
++ else
++ {
++ as_bad (_("bad operand %s"), s);
+ }
+
-+ /* If this value won't fit into a 16 bit offset, then go
-+ find a macro that will generate the 32 bit offset
-+ code pattern. */
-+ if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
-+ && (offset_expr.X_op != O_constant
-+ || offset_expr.X_add_number >= 0x8000
-+ || offset_expr.X_add_number < -0x8000))
-+ break;
++ if ((*args == 'v') || (*args == 'x'))
++ {
++ vdregno = regno;
++ vdregt = regtype;
++ vdregl = (*args == 'v');
++ }
++ else if (vdregno <= VF_MAX_MR)
++ {
++ static unsigned short used_vreg[8][16] = {
++ { 0x0001, 0x0010, 0x0100, 0x1000,
++ 0x0002, 0x0020, 0x0200, 0x2000,
++ 0x0004, 0x0040, 0x0400, 0x4000,
++ 0x0008, 0x0080, 0x0800, 0x8000 },
++ { 0x0003, 0x0030, 0x0300, 0x3000,
++ 0x0011, 0x0022, 0x0044, 0x0088,
++ 0x000c, 0x00c0, 0x0c00, 0xc000,
++ 0x1100, 0x2200, 0x4400, 0x8800 },
++ { 0x0007, 0x0070, 0x0700, 0x7000,
++ 0x0111, 0x0222, 0x0444, 0x0888,
++ 0x000e, 0x00e0, 0x0e00, 0xe000,
++ 0x1110, 0x2220, 0x4440, 0x8880 },
++ { 0x000f, 0x00f0, 0x0f00, 0xf000,
++ 0x1111, 0x2222, 0x4444, 0x8888,
++ 0x000f, 0x00f0, 0x0f00, 0xf000,
++ 0x1111, 0x2222, 0x4444, 0x8888 },
++ { 0x0000, 0x0000, 0x0000, 0x0000,
++ 0x0000, 0x0000, 0x0000, 0x0000,
++ 0x0000, 0x0000, 0x0000, 0x0000,
++ 0x0000, 0x0000, 0x0000, 0x0000 },
++ { 0x0033, 0x0033, 0x3300, 0x3300,
++ 0x0033, 0x0033, 0x00cc, 0x00cc,
++ 0x00cc, 0x00cc, 0xcc00, 0xcc00,
++ 0x3300, 0x3300, 0xcc00, 0xcc00 },
++ { 0x0777, 0x7770, 0x0777, 0x7770,
++ 0x0777, 0x0eee, 0x0777, 0x0eee,
++ 0x0eee, 0xeee0, 0x0eee, 0xeee0,
++ 0x7770, 0xeee0, 0x7770, 0xeee0 },
++ { 0xffff, 0xffff, 0xffff, 0xffff,
++ 0xffff, 0xffff, 0xffff, 0xffff,
++ 0xffff, 0xffff, 0xffff, 0xffff,
++ 0xffff, 0xffff, 0xffff, 0xffff },
++ };
++ int dmtx, smtx;
++ int dfsl, sfsl;
++ int didx, sidx;
++ int drxc, srxc;
++
++ dmtx = (vdregno >> VF_SH_MR_MTX) & VF_MASK_MR_MTX;
++ smtx = (regno >> VF_SH_MR_MTX) & VF_MASK_MR_MTX;
++
++ if (dmtx == smtx)
++ {
++ unsigned short dused, sused;
++ int dtype, stype;
++
++ dfsl = (vdregno >> VF_SH_MR_FSL) & VF_MASK_MR_FSL;
++ didx = (vdregno >> VF_SH_MR_IDX) & VF_MASK_MR_IDX;
++ drxc = (vdregno >> VF_SH_MR_RXC) & VF_MASK_MR_RXC;
++ sfsl = (regno >> VF_SH_MR_FSL) & VF_MASK_MR_FSL;
++ sidx = (regno >> VF_SH_MR_IDX) & VF_MASK_MR_IDX;
++ srxc = (regno >> VF_SH_MR_RXC) & VF_MASK_MR_RXC;
++
++ dtype = vdregt - '0';
++ stype = regtype - '0';
++ dused = used_vreg[dtype][(dfsl << 2) + didx];
++ sused = used_vreg[stype][(sfsl << 2) + sidx];
++
++ if ((dused & sused)
++ && (vdregl || (dused ^ sused) || (drxc != srxc)))
++ {
++ int dvfsl;
++ dvfsl = (vdregno >> VF_SH_MR_VFSL) & VF_MASK_MR_VFSL;
++ switch (vdregt)
++ {
++ case '1':
++ dvfsl <<= 1;
++ case '2':
++ case '3':
++ if (drxc)
++ as_bad (_("VFPU register conflict(R%d%d%d)"),
++ dmtx, dvfsl, didx);
++ else
++ as_bad (_("VFPU register conflict(C%d%d%d)"),
++ dmtx, didx, dvfsl);
++ break;
++ case '5':
++ dvfsl <<= 1;
++ case '6':
++ case '7':
++ if (drxc)
++ as_bad (_("VFPU register conflict(E%d%d%d)"),
++ dmtx, dvfsl, didx);
++ else
++ as_bad (_("VFPU register conflict(M%d%d%d)"),
++ dmtx, didx, dvfsl);
++ break;
++ }
++ }
++ }
++ }
++
++ switch (*args++)
++ {
++ case 's':
++ if (
++ (ip->insn_opcode
++ & VFPU_MASK_RPT_MMUL) == VFPU_INST_RPT_MMUL)
++ {
++ if (regno & (VF_MASK_MR_RXC << VF_SH_MR_RXC))
++ regno &= ~(VF_MASK_MR_RXC << VF_SH_MR_RXC);
++ else
++ regno |= (VF_MASK_MR_RXC << VF_SH_MR_RXC);
++ }
++ ip->insn_opcode |= (regno & VF_MASK_VS) << VF_SH_VS;
++ break;
++ case 't':
++ ip->insn_opcode |= (regno & VF_MASK_VT) << VF_SH_VT;
++ break;
++ case 'd':
++ case 'v':
++ case 'x':
++ ip->insn_opcode |= (regno & VF_MASK_VD) << VF_SH_VD;
++ break;
++ case 'm':
++ {
++ int vmregL = (regno >> 0) & VF_MASK_VML;
++ int vmregH = (regno >> 5) & VF_MASK_VMH;
++ ip->insn_opcode |= (vmregL << VF_SH_VML)
++ | (vmregH << VF_SH_VMH);
++ }
++ break;
++ case 'n':
++ {
++ int vmregL = (regno >> 0) & VF_MASK_VNL;
++ int vmregH = (regno >> 5) & VF_MASK_VNH;
++ ip->insn_opcode |= (vmregL << VF_SH_VNL)
++ | (vmregH << VF_SH_VNH);
++ }
++ break;
++ }
++ args++;
++
++ /* now check for vfpu prefixes if necessary */
++ if (*s == '[')
++ {
++ char *prefix_out = NULL;
++ bfd_boolean *prefix_bool = NULL;
++ char *prefix_type = NULL;
++ int num_args = 0;
++ char *ob = ++s;
++ bfd_boolean has_w = FALSE;
++ bfd_boolean has_z = FALSE;
++ bfd_boolean has_y = FALSE;
++ bfd_boolean has_operator = FALSE;
++ bfd_boolean has_saturater = FALSE;
++
++ switch (*args)
++ {
++ case 'w': /* only swizzle */
++ case 's': /* source prefix */
++ prefix_bool = &vfpu_sprefix;
++ prefix_out = vfpu_sprefix_str;
++ prefix_type = "source";
++ break;
++ case 't': /* target prefix */
++ prefix_bool = &vfpu_tprefix;
++ prefix_out = vfpu_tprefix_str;
++ prefix_type = "target";
++ break;
++ case 'm': /* only write mask */
++ case 'd': /* destination prefix */
++ prefix_bool = &vfpu_dprefix;
++ prefix_out = vfpu_dprefix_str;
++ prefix_type = "destination";
++ break;
++ case 'y': /* inhibit */
++ prefix_bool = NULL;
++ prefix_type = "source";
++ break;
++ case 'x': /* inhibit */
++ prefix_bool = NULL;
++ prefix_type = "target";
++ break;
++ case 'z': /* inhibit */
++ prefix_bool = NULL;
++ prefix_type = "destination";
++ break;
++ }
++
++ for ( ; *s != '\0' && *s != ']'; s++)
++ {
++ switch (*s)
++ {
++ case ',':
++ /* count no. of params for syntax check */
++ num_args++;
++ break;
++ case ' ':
++ case '\t':
++ break;
++ case 'm':
++ case 'M':
++ case 'x':
++ case 'X':
++ break;
++ case 'y':
++ case 'Y':
++ has_y = TRUE;
++ break;
++ case 'z':
++ case 'Z':
++ has_z = TRUE;
++ break;
++ case 'w':
++ case 'W':
++ has_w = TRUE;
++ break;
++ default:
++ if (*args == 'w')
++ has_operator = TRUE;
++ if (*args == 'm')
++ has_saturater = TRUE;
++ }
++ }
++
++ if (*s == ']')
++ {
++ if (prefix_bool)
++ {
++ *prefix_bool = TRUE;
++ strncpy (prefix_out, ob, s - ob);
++ prefix_out[s - ob] = '\0';
++ s++;
++ }
++ else
++ {
++ as_bad (_("%s cannot use %s prefix"),
++ insn->name, prefix_type);
++ s++;
++ continue;
++ }
++ }
++ else
++ {
++ as_bad (_("parse error (%s)"), ob - 1);
++ return;
++ }
++
++ if (num_args != regtype - '0')
++ {
++ as_bad (_("%s prefix specification requires %d parameters - [%s]"),
++ prefix_type, regtype - '0' + 1,
++ prefix_out);
++ }
++ else
++ {
++ int i = 8 - ((3 - num_args) * 2);
++ char dummy_d[] = " m,m,m,m";
++ char dummy_st[] = " x,y,z,w";
++
++ if (*args == 'd' || *args == 'm')
++ {
++ strcat (prefix_out, dummy_d + i);
++ if (has_saturater)
++ {
++ as_bad (_("%s is restricted to mask destination prefixes only"),
++ insn->name);
++ }
++ }
++ else
++ {
++ strcat (prefix_out, dummy_st + i);
++ if (has_operator)
++ {
++ as_bad (_("%s is restricted to swizzle %s prefixes only"),
++ insn->name, prefix_type);
++ }
++ /* semantic check, w can't be specified for
++ s, p, or t instructions same goes for
++ z for p and s, and y for scalars */
++ if ((has_y && num_args == 0)
++ || (has_z && num_args < 2)
++ || (has_w && num_args < 3))
++ {
++ as_bad (_("%s swizzle operand is out of range in [%s]"),
++ prefix_type, prefix_out);
++ }
++ }
++ }
++ }
+
-+ s = expr_end;
+ continue;
++ }
++ break;
+
-+ case 'q':
-+ case 'r': /* VFPU control register. */
-+ if (s[0] != '$' || !ISDIGIT (s[1]))
++ case 'q': /* VFPU destination control register */
++ case 'r': /* VFPU source control register */
++ {
++ if ((s[0] == '$') && ISDIGIT (s[1]))
++ {
++ s++;
++ regno = 0;
++ do
++ {
++ regno *= 10;
++ regno += *s - '0';
++ ++s;
++ }
++ while (ISDIGIT (*s));
++
++ if ((regno < VF_MIN_CR) || (regno > VF_MAX_CR))
++ as_bad (_("Invalid VFPU control register number (%d)"),
++ regno);
++
++ else if (!((regno >= VF_MIN_VCR) && (regno <= VF_MAX_VCR)))
++ as_bad (_("Improper VFPU control register number (%d)"),
++ regno);
++
++ switch (*args)
++ {
++ case 'q':
++ ip->insn_opcode |= (regno & VF_MASK_VCD) << VF_SH_VCD;
++ break;
++ case 'r':
++ ip->insn_opcode |= (regno & VF_MASK_VCS) << VF_SH_VCS;
++ break;
++ }
++ }
++ else
+ {
+ as_bad (_("Invalid VFPU control register name (%s)"), s);
-+ continue;
+ }
+
-+ ++s;
-+ regno = 0;
-+ do
++ continue;
++ }
++ break;
++
++ case 'f': /* condition code */
++ {
++ int cond = 0;
++ if (ISDIGIT (s[0]))
+ {
-+ regno *= 10;
-+ regno += *s - '0';
-+ ++s;
++ my_getExpression (&imm_expr, s);
++ check_absolute_expr (ip, &imm_expr);
++ cond = imm_expr.X_add_number;
++ if ((cond < VF_MIN_CC) || (cond > VF_MAX_CC))
++ as_bad (_("Invalid VFPU condition code (%d)"), cond);
++ imm_expr.X_op = O_absent;
++ s = expr_end;
+ }
-+ while (ISDIGIT (*s));
-+ if (regno < 128 || regno > 143)
-+ as_bad (_("Invalid VFPU control register number (%d)"), regno);
-+ else if (regno == 133 || regno == 134)
-+ as_bad (_("Improper VFPU control register number (%d)"), regno);
-+ if (*args == 'q')
-+ INSERT_OPERAND (VFPU_VMTVC, *ip, regno);
+ else
-+ INSERT_OPERAND (VFPU_VMFVC, *ip, regno);
-+ continue;
++ {
++ static const char * const vfpu_cond_names[] = {
++ "FL", "EQ", "LT", "LE",
++ "TR", "NE", "GE", "GT",
++ "EZ", "EN", "EI", "ES",
++ "NZ", "NN", "NI", "NS" };
++ for (cond = VF_MIN_CC; cond <= VF_MAX_CC; cond++)
++ {
++ if (strncasecmp(vfpu_cond_names[cond], s, 2) == 0)
++ break;
++ }
++ if ((cond < VF_MIN_CC) || (cond > VF_MAX_CC))
++ as_bad (_("Invalid VFPU condition code (%s)"), s);
+
-+ case 'u': /* 16-bit floating point constant. */
++ s += 2;
++ }
++
++ args++;
++ if ((cond == 0) || (cond == 4))
++ {
++ }
++ else if (cond & 0x8)
++ {
++ if (*args - '0' < 1)
++ as_bad (_("Invalid VFPU condition oparetion"));
++ }
++ else
++ {
++ if (*args - '0' < 2)
++ as_bad (_("Invalid VFPU condition oparetion"));
++ }
++
++ ip->insn_opcode |= (cond & VF_MASK_CC) << VF_SH_CC;
++ continue;
++ }
++ break;
++
++ case 'a': /* constant code */
++ {
++ int cst = 0;
++ if (ISDIGIT (s[0]))
++ {
++ my_getExpression (&imm_expr, s);
++ check_absolute_expr (ip, &imm_expr);
++ cst = imm_expr.X_add_number;
++ if ((cst < VF_MIN_CONST) || (cst > VF_MAX_CONST))
++ {
++ as_bad (_("Improper constant code (%d)"), cst);
++ cst &= VF_MASK_CONST;
++ }
++ imm_expr.X_op = O_absent;
++ s = expr_end;
++ }
++ else
++ {
++ static const char * const vfpu_const_names[] = {
++ "", "VFPU_HUGE", "VFPU_SQRT2", "VFPU_SQRT1_2",
++ "VFPU_2_SQRTPI", "VFPU_2_PI", "VFPU_1_PI", "VFPU_PI_4",
++ "VFPU_PI_2", "VFPU_PI", "VFPU_E", "VFPU_LOG2E",
++ "VFPU_LOG10E", "VFPU_LN2", "VFPU_LN10", "VFPU_2PI",
++ "VFPU_PI_6", "VFPU_LOG10TWO", "VFPU_LOG2TEN",
++ "VFPU_SQRT3_2"};
++ for (cst = VF_MIN_CONST; cst <= VF_MAX_CONST; cst++)
++ {
++ if (strcasecmp(vfpu_const_names[cst], s) == 0)
++ break;
++ }
++ if ((cst < VF_MIN_CONST) || (cst > VF_MAX_CONST))
++ as_bad (_("Invalid constant code (%s)"), s);
++ else
++ s += strlen(vfpu_const_names[cst]);
++ }
++
++ ip->insn_opcode |= cst << VF_SH_CONST;
++ }
++ continue;
++
++ case 'b': /* scale exponent */
++ my_getExpression (&imm_expr, s);
++ check_absolute_expr (ip, &imm_expr);
++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_SCALE)
+ {
-+ if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
-+ {
-+ my_getExpression (&imm_expr, s);
-+ check_absolute_expr (ip, &imm_expr);
-+ if ((unsigned long) imm_expr.X_add_number > 0xffff)
-+ as_bad (_("Improper half floating point constant: (%lu)"),
-+ (unsigned long) imm_expr.X_add_number);
-+ INSERT_OPERAND (VFPU_FLOAT16, *ip, imm_expr.X_add_number);
-+ imm_expr.X_op = O_absent;
-+ s = expr_end;
-+ }
++ as_bad (_("Improper scale (%lu)"),
++ (unsigned long) imm_expr.X_add_number);
++ imm_expr.X_add_number &= VF_MASK_SCALE;
++ }
++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_SCALE;
++ imm_expr.X_op = O_absent;
++ s = expr_end;
++ continue;
++
++ case 'c': /* branch condition code bit */
++ my_getExpression (&imm_expr, s);
++ check_absolute_expr (ip, &imm_expr);
++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_BCOND)
++ {
++ as_bad (_("Improper condition bit (%lu)"),
++ (unsigned long) imm_expr.X_add_number);
++ imm_expr.X_add_number &= VF_MASK_BCOND;
++ }
++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_BCOND;
++ imm_expr.X_op = O_absent;
++ s = expr_end;
++ continue;
++
++ case 'e': /* move condition code bit */
++ my_getExpression (&imm_expr, s);
++ check_absolute_expr (ip, &imm_expr);
++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_MCOND)
++ {
++ as_bad (_("Improper condition bit (%lu)"),
++ (unsigned long) imm_expr.X_add_number);
++ imm_expr.X_add_number &= VF_MASK_MCOND;
++ }
++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_MCOND;
++ imm_expr.X_op = O_absent;
++ s = expr_end;
++ continue;
++
++ case 'i': /* wrap exponent */
++ my_getExpression (&imm_expr, s);
++ check_absolute_expr (ip, &imm_expr);
++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_WRAP)
++ {
++ as_bad (_("Improper wrap (%lu)"),
++ (unsigned long) imm_expr.X_add_number);
++ imm_expr.X_add_number &= VF_MASK_WRAP;
++ }
++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_WRAP;
++ imm_expr.X_op = O_absent;
++ s = expr_end;
++ continue;
++
++ case 'w': /* rotation code */
++ if (s[0] == '[')
++ {
++ char *rot_str = s;
++ int rot_idx = 0;
++ int rot_neg = 0;
++ int rot_sin = 3;
++ int rot_cos = 3;
++ int rot_err = 0;
++ int rot_n;
++ int rot_neg_n = 0;
++ int rot_sin_n = 0;
++ int rot_cos_n = 0;
++ int rot_code;
++
++ if ((ip->insn_opcode & VFPU_MASK_DTYPE) == VFPU_PAIR)
++ rot_n = 2;
++ else if ((ip->insn_opcode & VFPU_MASK_DTYPE) == VFPU_TRIPLE)
++ rot_n = 3;
++ else if ((ip->insn_opcode & VFPU_MASK_DTYPE) == VFPU_QUAD)
++ rot_n = 4;
+ else
++ rot_n = 0;
++
++ s++;
++ while ((s[0] != ']') && (s[0] != '\0'))
+ {
-+ union flt2int {
-+ unsigned long i;
-+ float f;
-+ } flt2int;
-+ unsigned char temp[8];
-+ char *save_in;
-+ char *err;
-+ int len;
-+ int sign, exponent, fraction, exponent16;
-+ unsigned int float16 = 0;
-+
-+ save_in = input_line_pointer;
-+ input_line_pointer = s;
-+ err = md_atof ('f', (char *) temp, &len);
-+ s = input_line_pointer;
-+ input_line_pointer = save_in;
-+ if (err != NULL && *err != '\0')
++ if (s[0] == '-')
+ {
-+ as_bad (_("Bad half floating point constant: %s"), err);
-+ memset (temp, '\0', sizeof temp);
++ if ((s[1] != 's') && (s[1] != 'S'))
++ {
++ rot_err = 1;
++ break;
++ }
++ rot_neg = 1;
++ rot_neg_n++;
++ s++;
+ }
+
-+ /* Convert the 32-bit IEEE754 float into the VFPU
-+ 16-bit float format. */
-+ if (! target_big_endian)
-+ flt2int.i = bfd_getl32 (temp);
-+ else
-+ flt2int.i = bfd_getb32 (temp);
-+ /* TODO: There must be constants for these somewhere... */
-+ sign = (flt2int.i >> 31) & 0x1;
-+ exponent = (flt2int.i >> 23) & 0xff;
-+ fraction = flt2int.i & 0x7fffff;
-+ exponent16 = exponent - 112;
-+ if (exponent16 >= 0)
++ if (s[0] == ',')
++ rot_idx++;
++ else if ((s[0] == 'c') || (s[0] == 'C'))
+ {
-+ if (exponent16 > VFPU_FLOAT16_EXP_MAX
-+ && exponent != 0xff)
-+ {
-+ as_warn (_("Half floating point overflow: %g"),
-+ flt2int.f);
-+ exponent16 = VFPU_FLOAT16_EXP_MAX;
-+ fraction = 0;
-+ }
-+ else if (exponent16 <= VFPU_FLOAT16_EXP_MAX)
-+ fraction = (flt2int.i >> 13) & VFPU_MASK_FLOAT16_FRAC;
-+ else if (exponent == 0xff)
-+ {
-+ exponent16 = VFPU_FLOAT16_EXP_MAX;
-+ if (! fraction)
-+ fraction = 0;
-+ else
-+ fraction = 1;
-+ }
++ rot_cos = rot_idx;
++ rot_cos_n++;
+ }
++ else if ((s[0] == 's') || (s[0] == 'S'))
++ {
++ rot_sin = rot_idx;
++ rot_sin_n++;
++ }
++ else if (ISSPACE(s[0]) || (s[0] == '0'))
++ ;
+ else
+ {
-+ if (exponent != 0 || fraction != 0)
-+ as_warn (_("Half floating point underflow: %g"),
-+ flt2int.f);
-+ exponent16 = 0;
-+ fraction = 0;
++ rot_err = 1;
++ break;
+ }
-+ INSERT_BITS (float16, sign, VFPU_MASK_FLOAT16_SIGN,
-+ VFPU_SH_FLOAT16_SIGN);
-+ INSERT_BITS (float16, exponent16, VFPU_MASK_FLOAT16_EXP,
-+ VFPU_SH_FLOAT16_EXP);
-+ INSERT_BITS (float16, fraction, VFPU_MASK_FLOAT16_FRAC,
-+ VFPU_SH_FLOAT16_FRAC);
-+ INSERT_OPERAND (VFPU_FLOAT16, *ip, float16);
-+ /* Parse the 16-bit constant. */
-+ sprintf ((char *) temp, "0x%04x", float16);
-+ my_getExpression (&imm_expr, (char *) temp);
++
++ s++;
+ }
-+ }
-+ continue;
+
-+ case 'w': /* Rotation code. */
-+ {
-+ int bad_code = 0;
-+ int opsize;
++ if (s[0] == ']')
++ rot_idx++;
++ else
++ rot_err = 1;
++ s++;
+
-+ if (*s != '[')
++ if ((rot_sin_n == 0) && (rot_cos_n == 0))
+ {
-+ my_getExpression (&imm_expr, s);
-+ check_absolute_expr (ip, &imm_expr);
-+ if ((unsigned long) imm_expr.X_add_number > 31)
-+ as_bad (_("Improper rotation code (%lu)"),
-+ (unsigned long) imm_expr.X_add_number);
-+ INSERT_OPERAND (VFPU_ROT, *ip, imm_expr.X_add_number);
-+ imm_expr.X_op = O_absent;
-+ s = expr_end;
-+ continue;
++ if (rot_n == 2)
++ rot_sin = 2;
++ else if ((rot_n == 4) || (rot_n == 3))
++ rot_err = 1;
+ }
+
++ if (rot_cos_n > 1)
++ rot_err = 1;
+
++ if (rot_sin_n > 1)
++ {
++ if (((rot_sin_n + rot_cos_n) != rot_n)
++ || ((rot_n == 4) && (rot_cos_n == 0)))
++ rot_err = 1;
++ }
++
++ if (rot_neg && (rot_neg_n != rot_sin_n))
++ rot_err = 1;
++
++ if (rot_sin_n > 1)
++ rot_sin = rot_cos;
++
++ if (rot_err || (rot_n != rot_idx))
++ as_bad (_("Invalid rotation code (%s)"), rot_str);
++
++ rot_code = ((rot_neg & VF_MASK_ROT_NEG) << VF_SH_ROT_NEG)
++ | ((rot_cos & VF_MASK_ROT_COS) << VF_SH_ROT_COS)
++ | ((rot_sin & VF_MASK_ROT_SIN) << VF_SH_ROT_SIN);
++ ip->insn_opcode |= rot_code << VF_SH_ROT;
+ }
-+ continue;
-+
-+ case 'y':
-+ /* Save the current immediate and offset expressions for
-+ the lvi macro. */
++ else
+ {
-+ int slot = *++args - '0';
-+
-+ assert (slot >= 0 && slot < 4);
-+
-+ memcpy (&vimm_expr[slot], &imm_expr, sizeof (imm_expr));
-+ memcpy (&voffset_expr[slot], &offset_expr, sizeof (offset_expr));
++ my_getExpression (&imm_expr, s);
++ check_absolute_expr (ip, &imm_expr);
++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_ROT)
++ {
++ as_bad (_("Improper rotation code (%lu)"),
++ (unsigned long) imm_expr.X_add_number);
++ imm_expr.X_add_number &= VF_MASK_ROT;
++ }
++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_ROT;
+ imm_expr.X_op = O_absent;
-+ offset_expr.X_op = O_absent;
-+ imm_reloc[0] = BFD_RELOC_UNUSED;
-+ imm_reloc[1] = BFD_RELOC_UNUSED;
-+ imm_reloc[2] = BFD_RELOC_UNUSED;
-+ offset_reloc[0] = BFD_RELOC_UNUSED;
-+ offset_reloc[1] = BFD_RELOC_UNUSED;
-+ offset_reloc[2] = BFD_RELOC_UNUSED;
++ s = expr_end;
+ }
-+ continue;
++ continue;
+
-+ case 'z': /* Store to write buffer. */
++ case 'u': /* half float */
++ if ((s[0] == '0') && ((s[1] == 'x') || (s[1] == 'X')))
+ {
-+ int wb = 0;
-+
-+ if (strncasecmp (s, "WT", 2) == 0)
-+ wb = 0;
-+ else if (strncasecmp (s, "WB", 2) == 0)
-+ wb = 1;
-+ else
-+ as_bad (_("Invalid memory access type (%s)"), s);
-+ s += 2;
-+ INSERT_OPERAND (VFPU_RWB, *ip, wb);
++ my_getExpression (&imm_expr, s);
++ check_absolute_expr (ip, &imm_expr);
++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_HFLOAT)
++ {
++ as_bad (_("Improper half floating point constant: (%lu)"),
++ (unsigned long) imm_expr.X_add_number);
++ imm_expr.X_add_number &= VF_MASK_HFLOAT;
++ }
++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_HFLOAT;
++ imm_expr.X_op = O_absent;
++ s = expr_end;
++ continue;
+ }
-+ continue;
++ else
++ {
++ char *save_in;
++ char *err;
++ int len;
++ unsigned int length;
++ unsigned char temp[8];
++ unsigned int f32, f16;
++ int exponent32, exponent16;
++ int fraction32, fraction16;
++ int sign;
++ char f16_str[8];
+
-+ }
++ save_in = input_line_pointer;
++ input_line_pointer = s;
++ err = md_atof ('f', (char *) temp, &len);
++ length = len;
++ s = input_line_pointer;
++ input_line_pointer = save_in;
++ if (err != NULL && *err != '\0')
++ {
++ as_bad (_("Bad half floating point constant: %s"), err);
++ memset (temp, '\0', sizeof temp);
++ length = 4;
++ }
++
++ if (! target_big_endian)
++ f32 = bfd_getl32 (temp);
++ else
++ f32 = bfd_getb32 (temp);
++
++ sign = (f32 >> VF_SH_F32_SIGN) & VF_MASK_F32_SIGN;
++ exponent32 = (f32 >> VF_SH_F32_EXP) & VF_MASK_F32_EXP;
++ fraction32 = (f32 >> VF_SH_F32_FRA) & VF_MASK_F32_FRA;
++ exponent16 = exponent32
++ - VF_BIAS_F32_EXP + VF_BIAS_F16_EXP;
++
++ if (exponent16 < VF_MIN_F16_EXP)
++ {
++ if ((exponent32 == VF_MIN_F32_EXP)
++ && (fraction32 == 0))
++ { // zero
++ exponent16 = VF_MIN_F16_EXP;
++ fraction16 = 0;
++ }
++ else
++ { // underflow
++ float* p;
++ p = (float*) &f32;
++ as_warn (_("Half floating point underflow: %g"),
++ *p);
++ exponent16 = VF_MIN_F16_EXP;
++ fraction16 = 0;
++ }
++ }
++ else if (exponent16 > VF_MAX_F16_EXP)
++ {
++ if (exponent32 != VF_MAX_F32_EXP)
++ { // overflow
++ as_warn (_("Half floating point overflow: %g"),
++ *(float *)&f32);
++ exponent16 = VF_MAX_F16_EXP;
++ fraction16 = 0;
++ }
++ else
++ {
++ if (fraction32 == 0)
++ { // infinity
++ exponent16 = VF_MAX_F16_EXP;
++ fraction16 = 0;
++ }
++ else
++ { // NaN
++ exponent16 = VF_MAX_F16_EXP;
++ fraction16 = 1;
++ }
++ }
++ }
++ else
++ {
++ fraction16 = (f32 >> (VF_SH_F32_EXP - VF_SH_F16_EXP))
++ & VF_MASK_F16_FRA;
++ }
++
++ f16 = (sign << VF_SH_F16_SIGN)
++ | (exponent16 << VF_SH_F16_EXP)
++ | (fraction16 << VF_SH_F16_FRA);
++ ip->insn_opcode |= (f16 & VF_MASK_HFLOAT) << VF_SH_HFLOAT;
++
++ sprintf(f16_str, "0x%04x", f16);
++ my_getExpression (&imm_expr, f16_str);
++
++ continue;
++ }
++ break;
++
++ case 'z': /* read/write access code */
++ {
++ int rwb = 0;
++
++ if (strncasecmp (s, "WT", 2) == 0)
++ rwb = 0x0;
++ else if (strncasecmp (s, "WB", 2) == 0)
++ rwb = 0x1;
++ else
++ as_bad (_("Invalid memory access type (%s)"), s);
++
++ s += 2;
++ ip->insn_opcode |= (rwb & VF_MASK_RWB) << VF_SH_RWB;
++
++ continue;
++ }
++
++ case '0': /* source or target prefix code (X) */
++ case '1': /* source or target prefix code (Y) */
++ case '2': /* source or target prefix code (Z) */
++ case '3': /* source or target prefix code (W) */
++ {
++ int operand;
++ int shift;
++
++ int pfx_neg = 0;
++ int pfx_cst = 0;
++ int pfx_abs = 0;
++ int pfx_swz = 0;
++ int pfx_err = 0;
++ int cst = 0;
++ char *pfx_str = s;
++
++ if (s[0] == '-')
++ { // sign code
++ pfx_neg = 1;
++ s++;
++ }
++
++ if (ISDIGIT (s[0]))
++ { // constant
++ pfx_cst = 1;
++
++ if (s[0] == '0')
++ cst = 0;
++ else if (s[0] == '1')
++ {
++ if (s[1] == '/')
++ {
++ s += 2;
++ if (s[0] == '2')
++ cst = 3;
++ else if (s[0] == '3')
++ cst = 5;
++ else if (s[0] == '4')
++ cst = 6;
++ else if (s[0] == '6')
++ cst = 7;
++ else
++ pfx_err = 1;
++ }
++ else
++ {
++ cst = 1;
++ }
++ }
++ else if (s[0] == '2')
++ cst = 2;
++ else if (s[0] == '3')
++ cst = 4;
++ else
++ pfx_err = 1;
++
++ pfx_abs = (cst >> 2) & 0x1;
++ pfx_swz = (cst >> 0) & 0x3;
++ s++;
++ }
++ else
++ { // variable
++
++ if (s[0] == '|')
++ { // abs
++ pfx_abs = 1;
++ s++;
++ }
++
++ if ((s[0] == 'X') || (s[0] == 'x'))
++ {
++ pfx_swz = 0;
++ s++;
++ }
++ else if ((s[0] == 'Y') || (s[0] == 'y'))
++ {
++ pfx_swz = 1;
++ s++;
++ }
++ else if ((s[0] == 'Z') || (s[0] == 'z'))
++ {
++ pfx_swz = 2;
++ s++;
++ }
++ else if ((s[0] == 'W') || (s[0] == 'w'))
++ {
++ pfx_swz = 3;
++ s++;
++ }
++ else if ((s[0] == ',') || IS_SPACE_OR_NUL (s[0])
++ || (s[0] == '|'))
++ {
++ pfx_swz = *args - '0';
++ }
++ else
++ pfx_err = 1;
++
++ if (pfx_err == 0)
++ {
++ if (s[0] == '|')
++ {
++ s++;
++ if (pfx_abs == 0)
++ pfx_err = 1;
++ }
++ else
++ {
++ if (pfx_abs == 1)
++ pfx_err = 1;
++ }
++ }
++ }
++
++ if (! ((s[0] == ',') || IS_SPACE_OR_NUL (s[0])))
++ pfx_err = 1;
++
++ if (pfx_err)
++ as_bad (_("Invalid prefix format (%s)"), pfx_str);
++
++ shift = *args - '0';
++
++ operand = (pfx_neg << (VF_SH_PFX_NEG + shift))
++ | (pfx_cst << (VF_SH_PFX_CST + shift))
++ | (pfx_abs << (VF_SH_PFX_ABS + shift))
++ | (pfx_swz << (VF_SH_PFX_SWZ + shift * 2));
++
++ ip->insn_opcode |= operand;
++ continue;
++ }
++
++ case '4': /* destination prefix code (X) */
++ case '5': /* destination prefix code (Y) */
++ case '6': /* destination prefix code (Z) */
++ case '7': /* destination prefix code (W) */
++ {
++ int operand;
++ int shift;
++ static const char order[] = "xyzwXYZW";
++
++ int pfx_msk = 0;
++ int pfx_sat = 0;
++ char *pfx_str = s;
++
++ if (s[0] == '[')
++ s++;
++ if (s[0] == '-') /* -1:1, skip the minus symbol */
++ s++;
++
++ if ((s[0] == 'm') || (s[0] == 'M'))
++ {
++ pfx_msk = 1;
++ s++;
++ }
++ else if (s[0] == '0') /* 0:1 */
++ {
++ pfx_sat = 1;
++ s++;
++ }
++ else if (s[0] == '1') /* -1:1 or -1:+1 */
++ {
++ pfx_sat = 3;
++ s++;
++ }
++ else if ((s[0] == order[(*args) - '4'])
++ || (s[0] == order[(*args) - '4' + 4]))
++ {
++ pfx_sat = 0;
++ s++;
++ }
++
++ if (s[0] == ':') /* skip the :1 or :+1 part of the expression */
++ {
++ s++;
++ if (s[0] == '+')
++ s++;
++ if (s[0] == '1')
++ s++;
++ }
++ if (s[0] == ']')
++ s++;
++
++ if (! ((s[0] == ',') || IS_SPACE_OR_NUL (s[0])))
++ as_bad (_("Invalid prefix format (%s)"), pfx_str);
++
++ shift = *args - '4';
++ operand = (pfx_msk << (VF_SH_PFX_MSK + shift))
++ | (pfx_sat << (VF_SH_PFX_SAT + shift * 2));
++
++ ip->insn_opcode |= operand;
++ continue;
++ }
++ }
+ break;
+
- case '<': /* must be at least one digit */
- /*
- * According to the manual, if the shift amount is greater
-@@ -8485,6 +9091,7 @@
++ case 'b': /* base register */
++ case 'd': /* destination register */
++ case 's': /* source register */
++ case 't': /* target register */
++ case 'r': /* both target and source */
++ case 'v': /* both dest and source */
++ case 'w': /* both dest and target */
++ case 'E': /* coprocessor target register */
++ case 'G': /* coprocessor destination register */
++ case 'K': /* 'rdhwr' destination register */
++ case 'x': /* ignore register name */
++ case 'z': /* must be zero register */
++ case 'U': /* destination register (clo/clz). */
++ s_reset = s;
++ if (s[0] == '$')
++ {
++
++ if (ISDIGIT (s[1]))
++ {
++ ++s;
+ regno = 0;
+ do
+ {
+@@ -8273,30 +9967,27 @@
+ goto notreg;
+ else
+ {
+- if (s[1] == 'r' && s[2] == 'a')
++ const char regName[32][5] =
+ {
+- s += 3;
+- regno = RA;
+- }
+- else if (s[1] == 'f' && s[2] == 'p')
++ "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
++ "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
++ "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
++ "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra"
++ };
++ int i;
++
++ for(i = 0; i < 32; i++)
+ {
+- s += 3;
+- regno = FP;
+- }
+- else if (s[1] == 's' && s[2] == 'p')
++ if(strncmp(&s[1], regName[i], strlen(regName[i])) == 0)
+ {
+- s += 3;
+- regno = SP;
++ break;
+ }
+- else if (s[1] == 'g' && s[2] == 'p')
+- {
+- s += 3;
+- regno = GP;
+ }
+- else if (s[1] == 'a' && s[2] == 't')
++
++ if(i < 32)
+ {
+- s += 3;
+- regno = AT;
++ s += strlen(regName[i]) + 1;
++ regno = i;
+ }
+ else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
+ {
+@@ -8485,6 +10176,7 @@
if ((regno & 1) != 0
&& HAVE_32BIT_FPRS
@@ -907,7 +2098,7 @@
&& ! (strcmp (str, "mtc1") == 0
|| strcmp (str, "mfc1") == 0
|| strcmp (str, "lwc1") == 0
-@@ -13743,6 +14350,8 @@
+@@ -13743,6 +15435,8 @@
/* MIPS II */
{ "r6000", 0, ISA_MIPS2, CPU_R6000 },
@@ -916,8 +2107,9 @@
/* MIPS III */
{ "r4000", 0, ISA_MIPS3, CPU_R4000 },
---- binutils-2.16.1.orig/gas/configure 2005-02-28 16:43:51.000000000 -0800
-+++ binutils-psp/gas/configure 2005-06-19 18:09:30.000000000 -0700
+diff -burN binutils-2.16.1/gas/configure binutils-psp/gas/configure
+--- binutils-2.16.1/gas/configure 2005-03-01 00:43:51.000000000 +0000
++++ binutils-psp/gas/configure 2006-01-10 23:31:51.000000000 +0000
@@ -4537,6 +4537,9 @@
mips64vr | mips64vrel)
mips_cpu=vr4100
@@ -928,8 +2120,9 @@
mipsisa32r2* | mipsisa64r2*)
mips_cpu=`echo $target_cpu | sed -e 's/[a-z]*..r2//' -e 's/el$//'`
;;
---- binutils-2.16.1.orig/gas/configure.in 2005-02-28 16:43:57.000000000 -0800
-+++ binutils-psp/gas/configure.in 2005-06-19 18:09:30.000000000 -0700
+diff -burN binutils-2.16.1/gas/configure.in binutils-psp/gas/configure.in
+--- binutils-2.16.1/gas/configure.in 2005-03-01 00:43:57.000000000 +0000
++++ binutils-psp/gas/configure.in 2006-01-10 23:31:51.000000000 +0000
@@ -222,6 +222,9 @@
mips64vr | mips64vrel)
mips_cpu=vr4100
@@ -940,8 +2133,9 @@
mipsisa32r2* | mipsisa64r2*)
changequote(,)dnl
mips_cpu=`echo $target_cpu | sed -e 's/[a-z]*..r2//' -e 's/el$//'`
---- binutils-2.16.1.orig/gas/testsuite/gas/mips/mips.exp 2005-04-19 10:09:45.000000000 -0700
-+++ binutils-psp/gas/testsuite/gas/mips/mips.exp 2005-08-29 11:45:56.000000000 -0700
+diff -burN binutils-2.16.1/gas/testsuite/gas/mips/mips.exp binutils-psp/gas/testsuite/gas/mips/mips.exp
+--- binutils-2.16.1/gas/testsuite/gas/mips/mips.exp 2005-04-19 18:09:45.000000000 +0100
++++ binutils-psp/gas/testsuite/gas/mips/mips.exp 2006-01-10 23:31:51.000000000 +0000
@@ -382,6 +382,9 @@
mips_arch_create sb1 64 mips64 { mips3d } \
{ -march=sb1 -mtune=sb1 } { -mmips:sb1 } \
@@ -952,15 +2146,17 @@
#
---- binutils-2.16.1.orig/include/bin-bugs.h 2004-07-23 08:40:19.000000000 -0700
-+++ binutils-psp/include/bin-bugs.h 2005-07-22 22:38:52.000000000 -0700
+diff -burN binutils-2.16.1/include/bin-bugs.h binutils-psp/include/bin-bugs.h
+--- binutils-2.16.1/include/bin-bugs.h 2004-07-23 16:40:19.000000000 +0100
++++ binutils-psp/include/bin-bugs.h 2006-01-10 23:31:51.000000000 +0000
@@ -1,3 +1,3 @@
#ifndef REPORT_BUGS_TO
-#define REPORT_BUGS_TO ""
+#define REPORT_BUGS_TO ""
#endif
---- binutils-2.16.1.orig/include/elf/common.h 2004-10-08 06:55:08.000000000 -0700
-+++ binutils-psp/include/elf/common.h 2005-06-19 18:09:25.000000000 -0700
+diff -burN binutils-2.16.1/include/elf/common.h binutils-psp/include/elf/common.h
+--- binutils-2.16.1/include/elf/common.h 2004-10-08 14:55:08.000000000 +0100
++++ binutils-psp/include/elf/common.h 2006-01-10 23:31:51.000000000 +0000
@@ -93,6 +93,7 @@
#define ET_HIOS 0xFEFF /* Operating system-specific */
#define ET_LOPROC 0xFF00 /* Processor-specific */
@@ -969,8 +2165,9 @@
/* Values for e_machine, which identifies the architecture. These numbers
are officially assigned by registry@caldera.com. See below for a list of
---- binutils-2.16.1.orig/include/elf/mips.h 2005-03-03 03:58:06.000000000 -0800
-+++ binutils-psp/include/elf/mips.h 2005-06-19 18:09:25.000000000 -0700
+diff -burN binutils-2.16.1/include/elf/mips.h binutils-psp/include/elf/mips.h
+--- binutils-2.16.1/include/elf/mips.h 2005-03-03 11:58:06.000000000 +0000
++++ binutils-psp/include/elf/mips.h 2006-01-10 23:31:51.000000000 +0000
@@ -212,6 +212,7 @@
#define E_MIPS_MACH_5400 0x00910000
#define E_MIPS_MACH_5500 0x00980000
@@ -979,12 +2176,144 @@
/* Processor specific section indices. These sections do not actually
exist. Symbols with a st_shndx field corresponding to one of these
---- binutils-2.16.1.orig/include/opcode/mips.h 2005-03-03 03:58:10.000000000 -0800
-+++ binutils-psp/include/opcode/mips.h 2005-08-28 23:39:00.000000000 -0700
-@@ -171,6 +171,97 @@
+diff -burN binutils-2.16.1/include/opcode/mips.h binutils-psp/include/opcode/mips.h
+--- binutils-2.16.1/include/opcode/mips.h 2005-03-03 11:58:10.000000000 +0000
++++ binutils-psp/include/opcode/mips.h 2006-01-15 21:51:17.000000000 +0000
+@@ -171,6 +171,228 @@
#define MDMX_FMTSEL_VEC_QH 0x15
#define MDMX_FMTSEL_VEC_OB 0x16
++#include "vfpu.h"
++
++#define VF_MASK_VT 0x7f
++#define VF_SH_VT 16
++#define VF_MASK_VS 0x7f
++#define VF_SH_VS 8
++#define VF_MASK_VD 0x7f
++#define VF_SH_VD 0
++#define VF_MASK_VML 0x1f
++#define VF_SH_VML 16
++#define VF_MASK_VMH 0x3
++#define VF_SH_VMH 0
++#define VF_MASK_VNL 0x1f
++#define VF_SH_VNL 16
++#define VF_MASK_VNH 0x1
++#define VF_SH_VNH 0
++#define VF_MASK_OFFSET 0x3fff
++#define VF_SH_OFFSET 2
++#define VF_MASK_CC 0xf
++#define VF_SH_CC 0
++#define VF_MASK_CONST 0x1f
++#define VF_SH_CONST 16
++#define VF_MASK_SCALE 0x1f
++#define VF_SH_SCALE 16
++#define VF_MASK_BCOND 0x7
++#define VF_SH_BCOND 18
++#define VF_MASK_MCOND 0x7
++#define VF_SH_MCOND 16
++#define VF_MASK_VCD 0xff
++#define VF_SH_VCD 0
++#define VF_MASK_VCS 0xff
++#define VF_SH_VCS 8
++#define VF_MASK_ROT 0x1f
++#define VF_SH_ROT 16
++#define VF_MASK_WRAP 0xff
++#define VF_SH_WRAP 16
++#define VF_MASK_TSIGN 0x1
++#define VF_SH_TSIGN 5
++#define VF_MASK_BMCOND 0x1f
++#define VF_SH_BMCOND 0
++#define VF_MASK_HFLOAT 0xffff
++#define VF_SH_HFLOAT 0
++#define VF_MASK_PFX 0xffffff
++#define VF_SH_PFX 0
++#define VF_MASK_RWB 0x1
++#define VF_SH_RWB 1
++
++#define VF_MASK_PFX_SWZ 0x3
++#define VF_SH_PFX_SWZ 0
++#define VF_MASK_PFX_ABS 0x1
++#define VF_SH_PFX_ABS 8
++#define VF_MASK_PFX_CST 0x1
++#define VF_SH_PFX_CST 12
++#define VF_MASK_PFX_NEG 0x1
++#define VF_SH_PFX_NEG 16
++#define VF_MASK_PFX_SAT 0x3
++#define VF_SH_PFX_SAT 0
++#define VF_MASK_PFX_MSK 0x1
++#define VF_SH_PFX_MSK 8
++
++#define VF_MASK_ROT_COS 0x3
++#define VF_SH_ROT_COS 0
++#define VF_MASK_ROT_SIN 0x3
++#define VF_SH_ROT_SIN 2
++#define VF_MASK_ROT_NEG 0x1
++#define VF_SH_ROT_NEG 4
++
++#define VF_MASK_MR_MTX 0x7
++#define VF_SH_MR_MTX 2
++#define VF_MASK_MR_IDX 0x3
++#define VF_SH_MR_IDX 0
++#define VF_MASK_MR_FSL 0x3
++#define VF_SH_MR_FSL 5
++#define VF_MASK_MR_RXC 0x1
++#define VF_SH_MR_RXC 5
++#define VF_MASK_MR_VFSL 0x1
++#define VF_SH_MR_VFSL 6
++
++#define VF_MAX_MR_MTX 7
++#define VF_MAX_MR_IDX 3
++#define VF_MAX_MR_FSL 3
++#define VF_MAX_MR_VIDX 1
++#define VF_MAX_MR_VFSL 1
++
++#define VF_MIN_MR 0
++#define VF_MAX_MR 127
++#define VF_MIN_CR 128
++#define VF_MAX_CR 255
++#define VF_MIN_VCR 128
++#define VF_MAX_VCR 143
++#define VF_MIN_CC 0
++#define VF_MAX_CC 15
++#define VF_MIN_CONST 1
++#define VF_MAX_CONST 19
++#define VF_MIN_SCALE 0
++#define VF_MAX_SCALE 31
++#define VF_MIN_BCOND 0
++#define VF_MAX_BCOND 5
++#define VF_MIN_MCOND 0
++#define VF_MAX_MCOND 6
++#define VF_MIN_WRAP 0
++#define VF_MAX_WRAP 255
++#define VF_MIN_ROT 0
++#define VF_MAX_ROT 31
++#define VF_MIN_TSIGN 0
++#define VF_MAX_TSIGN 1
++#define VF_MIN_BMCOND 0
++#define VF_MAX_BMCOND 31
++#define VF_MIN_HFLOAT 0
++#define VF_MAX_HFLOAT 0xffff
++
++#define VF_MASK_F32_SIGN 0x1
++#define VF_SH_F32_SIGN 31
++#define VF_MASK_F32_EXP 0xff
++#define VF_SH_F32_EXP 23
++#define VF_MASK_F32_FRA 0x7fffff
++#define VF_SH_F32_FRA 0
++#define VF_MASK_F16_SIGN 0x1
++#define VF_SH_F16_SIGN 15
++#define VF_MASK_F16_EXP 0x1f
++#define VF_SH_F16_EXP 10
++#define VF_MASK_F16_FRA 0x3ff
++#define VF_SH_F16_FRA 0
++
++#define VF_MIN_F32_EXP 0
++#define VF_MAX_F32_EXP 255
++#define VF_BIAS_F32_EXP 127
++#define VF_MIN_F16_EXP 0
++#define VF_MAX_F16_EXP 31
++#define VF_BIAS_F16_EXP 15
++
+#define OP_SH_VFPU_DELTA 0
+#define OP_MASK_VFPU_DELTA 0xfffc
+#define OP_SH_VFPU_IMM3 16
@@ -1079,7 +2408,7 @@
/* This structure holds information for a particular instruction. */
struct mips_opcode
-@@ -258,6 +349,29 @@
+@@ -258,6 +480,29 @@
Requires that "+A" or "+E" occur first to set position.
Enforces: 32 < (pos+size) <= 64.
@@ -1109,7 +2438,7 @@
Floating point instructions:
"D" 5 bit destination register (OP_*_FD)
"M" 3 bit compare condition code (OP_*_CCC) (only used for mips4 and up)
-@@ -442,6 +556,8 @@
+@@ -442,6 +687,8 @@
#define INSN_5400 0x01000000
/* NEC VR5500 instruction. */
#define INSN_5500 0x02000000
@@ -1118,7 +2447,7 @@
/* MIPS ISA defines, use instead of hardcoding ISA level. */
-@@ -489,6 +605,7 @@
+@@ -489,6 +736,7 @@
#define CPU_MIPS64 64
#define CPU_MIPS64R2 65
#define CPU_SB1 12310201 /* octal 'SB', 01. */
@@ -1126,7 +2455,7 @@
/* Test for membership in an ISA including chip specific ISAs. INSN
is pointer to an element of the opcode table; ISA is the specified
-@@ -510,6 +627,7 @@
+@@ -510,6 +758,7 @@
|| (cpu == CPU_VR4120 && ((insn)->membership & INSN_4120) != 0) \
|| (cpu == CPU_VR5400 && ((insn)->membership & INSN_5400) != 0) \
|| (cpu == CPU_VR5500 && ((insn)->membership & INSN_5500) != 0) \
@@ -1134,7 +2463,16 @@
|| 0) /* Please keep this term for easier source merging. */
/* This is a list of macro expanded instructions.
-@@ -625,6 +743,16 @@
+@@ -622,9 +871,25 @@
+ M_LI_DD,
+ M_LI_S,
+ M_LI_SS,
++ M_LVHI_S_SS,
++ M_LVHI_P_SS,
++ M_LVI_S_SS,
++ M_LVI_P_SS,
++ M_LVI_T_SS,
++ M_LVI_Q_SS,
M_LL_AB,
M_LLD_AB,
M_LS_A,
@@ -1151,7 +2489,15 @@
M_LW_A,
M_LW_AB,
M_LWC0_A,
-@@ -714,6 +842,10 @@
+@@ -635,6 +900,7 @@
+ M_LWC2_AB,
+ M_LWC3_A,
+ M_LWC3_AB,
++ M_LV_S_AB,
+ M_LWL_A,
+ M_LWL_AB,
+ M_LWR_A,
+@@ -714,6 +980,10 @@
M_SUB_I,
M_SUBU_I,
M_SUBU_I_2,
@@ -1162,7 +2508,7 @@
M_TEQ_I,
M_TGE_I,
M_TGEU_I,
-@@ -728,14 +860,24 @@
+@@ -728,14 +998,24 @@
M_ULH_A,
M_ULHU,
M_ULHU_A,
@@ -1187,48 +2533,274 @@
M_XOR_I,
M_COP0,
M_COP1,
---- binutils-2.16.1.orig/ld/Makefile.am 2005-01-20 11:37:49.000000000 -0800
-+++ binutils-psp/ld/Makefile.am 2005-06-25 02:44:52.000000000 -0700
-@@ -190,6 +190,7 @@
- eelf_i386_chaos.o \
- eelf_i386_fbsd.o \
- eelf_i386_ldso.o \
-+ eelf_mipsallegrexel_psp.o \
- eelf_s390.o \
- egld960.o \
- egld960coff.o \
-@@ -864,6 +865,9 @@
- eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \
- $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
- ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)"
-+eelf_mipsallegrexel_psp.c: $(srcdir)/emulparams/elf_mipsallegrexel_psp.sh \
-+ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_psp.sc ${GEN_DEPENDS}
-+ ${GENSCRIPTS} elf_mipsallegrexel_psp "$(tdir_elf_mipsallegrexel_psp)"
- eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \
- $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
- ${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)"
---- binutils-2.16.1.orig/ld/Makefile.in 2005-01-22 21:36:37.000000000 -0800
-+++ binutils-psp/ld/Makefile.in 2005-06-25 02:47:12.000000000 -0700
-@@ -315,6 +315,7 @@
- eelf_i386_chaos.o \
- eelf_i386_fbsd.o \
- eelf_i386_ldso.o \
-+ eelf_mipsallegrexel_psp.o \
- eelf_s390.o \
- egld960.o \
- egld960coff.o \
-@@ -1601,6 +1602,9 @@
- eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \
- $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
- ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)"
-+eelf_mipsallegrexel_psp.c: $(srcdir)/emulparams/elf_mipsallegrexel_psp.sh \
-+ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_psp.sc ${GEN_DEPENDS}
-+ ${GENSCRIPTS} elf_mipsallegrexel_psp "$(tdir_elf_mipsallegrexel_psp)"
- eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \
- $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
- ${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)"
---- binutils-2.16.1.orig/ld/configure.tgt 2005-02-08 11:54:27.000000000 -0800
-+++ binutils-psp/ld/configure.tgt 2005-06-25 03:20:06.000000000 -0700
+diff -burN binutils-2.16.1/include/opcode/vfpu.h binutils-psp/include/opcode/vfpu.h
+--- binutils-2.16.1/include/opcode/vfpu.h 1970-01-01 01:00:00.000000000 +0100
++++ binutils-psp/include/opcode/vfpu.h 2006-01-15 21:51:21.000000000 +0000
+@@ -0,0 +1,261 @@
++#ifndef _VFPU_H_
++#define _VFPU_H_
++
++////////////////////////////////////
++// data type
++#define VFPU_MASK_DTYPE 0x8080
++#define VFPU_QUAD 0x8080
++#define VFPU_TRIPLE 0x8000
++#define VFPU_PAIR 0x0080
++#define VFPU_SINGLE 0x0000
++
++////////////////////////////////////
++// register index
++#define VFPU_MASK_VT 0x7f0000
++#define VFPU_MASK_VS 0x007f00
++#define VFPU_MASK_VD 0x00007f
++
++////////////////////////////////////
++// condition and comapre inst
++#define VFPU_PADD_BIN_CMP 0x70
++
++////////////////////////////////////
++// load/store left/right
++#define VFPU_MASK_LDST_LR 0x2
++#define VFPU_LDST_L 0x0
++#define VFPU_LDST_R 0x2
++
++////////////////////////////////////
++// load/store memory/buffer
++#define VFPU_MASK_LDST_MB 0x2
++#define VFPU_LDST_M 0x0
++#define VFPU_LDST_B 0x2
++
++////////////////////////////////////
++// coprocessor move
++#define VFPU_MASK_COP_MV 0xff80
++#define VFPU_MASK_COP_MVC 0xff00
++
++////////////////////////////////////
++// sync code
++#define VFPU_MASK_SYNC_CODE 0xffff
++#define VFPU_SYNC_CODE_DEFAULT 0x0320
++#define VFPU_SYNC_CODE_NOP 0x0000
++#define VFPU_SYNC_CODE_FLUSH 0x040d
++
++////////////////////////////////////
++#define VFPU_INST_BR_F 0x49000000
++#define VFPU_MASK_BR_F 0xffe30000
++#define VFPU_INST_BR_FL 0x49020000
++#define VFPU_MASK_BR_FL 0xffe30000
++#define VFPU_INST_BR_T 0x49010000
++#define VFPU_MASK_BR_T 0xffe30000
++#define VFPU_INST_BR_TL 0x49030000
++#define VFPU_MASK_BR_TL 0xffe30000
++
++#define VFPU_INST_COP_LD_S 0xc8000000
++#define VFPU_MASK_COP_LD_S 0xfc000000
++#define VFPU_INST_COP_ST_S 0xe8000000
++#define VFPU_MASK_COP_ST_S 0xfc000000
++#define VFPU_INST_COP_LD_Q 0xd8000000
++#define VFPU_MASK_COP_LD_Q 0xfc000000
++#define VFPU_INST_COP_ST_Q 0xf8000000
++#define VFPU_MASK_COP_ST_Q 0xfc000000
++#define VFPU_INST_COP_LD_U 0xd4000000
++#define VFPU_MASK_COP_LD_U 0xfc000000
++#define VFPU_INST_COP_ST_U 0xf4000000
++#define VFPU_MASK_COP_ST_U 0xfc000000
++#define VFPU_INST_COP_MF 0x48600000
++#define VFPU_MASK_COP_MF 0xffe00000
++#define VFPU_INST_COP_MT 0x48e00000
++#define VFPU_MASK_COP_MT 0xffe00000
++
++#define VFPU_INST_BIN_ADD 0x60000000
++#define VFPU_MASK_BIN_ADD 0xff800000
++#define VFPU_INST_BIN_SUB 0x60800000
++#define VFPU_MASK_BIN_SUB 0xff800000
++#define VFPU_INST_BIN_SBN 0x61000000
++#define VFPU_MASK_BIN_SBN 0xff800000
++#define VFPU_INST_BIN_DIV 0x63800000
++#define VFPU_MASK_BIN_DIV 0xff800000
++#define VFPU_INST_BIN_MUL 0x64000000
++#define VFPU_MASK_BIN_MUL 0xff800000
++#define VFPU_INST_BIN_DOT 0x64800000
++#define VFPU_MASK_BIN_DOT 0xff800000
++#define VFPU_INST_BIN_SCL 0x65000000
++#define VFPU_MASK_BIN_SCL 0xff800000
++#define VFPU_INST_BIN_HDP 0x66000000
++#define VFPU_MASK_BIN_HDP 0xff800000
++#define VFPU_INST_BIN_CRS 0x66800000
++#define VFPU_MASK_BIN_CRS 0xff800000
++#define VFPU_INST_BIN_DET 0x67000000
++#define VFPU_MASK_BIN_DET 0xff800000
++#define VFPU_INST_BIN_CMP 0x6c000000
++#define VFPU_MASK_BIN_CMP 0xff800000
++#define VFPU_INST_BIN_MIN 0x6d000000
++#define VFPU_MASK_BIN_MIN 0xff800000
++#define VFPU_INST_BIN_MAX 0x6d800000
++#define VFPU_MASK_BIN_MAX 0xff800000
++#define VFPU_INST_BIN_SCMP 0x6e800000
++#define VFPU_MASK_BIN_SCMP 0xff800000
++#define VFPU_INST_BIN_SGE 0x6f000000
++#define VFPU_MASK_BIN_SGE 0xff800000
++#define VFPU_INST_BIN_SLT 0x6f800000
++#define VFPU_MASK_BIN_SLT 0xff800000
++
++#define VFPU_INST_UNR_MOV 0xd0000000
++#define VFPU_MASK_UNR_MOV 0xffff0000
++#define VFPU_INST_UNR_ABS 0xd0010000
++#define VFPU_MASK_UNR_ABS 0xffff0000
++#define VFPU_INST_UNR_NEG 0xd0020000
++#define VFPU_MASK_UNR_NEG 0xffff0000
++#define VFPU_INST_UNR_IDT 0xd0030000
++#define VFPU_MASK_UNR_IDT 0xffff0000
++#define VFPU_INST_UNR_SAT0 0xd0040000
++#define VFPU_MASK_UNR_SAT0 0xffff0000
++#define VFPU_INST_UNR_SAT1 0xd0050000
++#define VFPU_MASK_UNR_SAT1 0xffff0000
++#define VFPU_INST_UNR_ZERO 0xd0060000
++#define VFPU_MASK_UNR_ZERO 0xffff0000
++#define VFPU_INST_UNR_ONE 0xd0070000
++#define VFPU_MASK_UNR_ONE 0xffff0000
++#define VFPU_INST_UNR_RCP 0xd0100000
++#define VFPU_MASK_UNR_RCP 0xffff0000
++#define VFPU_INST_UNR_RSQ 0xd0110000
++#define VFPU_MASK_UNR_RSQ 0xffff0000
++#define VFPU_INST_UNR_SIN 0xd0120000
++#define VFPU_MASK_UNR_SIN 0xffff0000
++#define VFPU_INST_UNR_COS 0xd0130000
++#define VFPU_MASK_UNR_COS 0xffff0000
++#define VFPU_INST_UNR_EXP2 0xd0140000
++#define VFPU_MASK_UNR_EXP2 0xffff0000
++#define VFPU_INST_UNR_LOG2 0xd0150000
++#define VFPU_MASK_UNR_LOG2 0xffff0000
++#define VFPU_INST_UNR_SQR 0xd0160000
++#define VFPU_MASK_UNR_SQR 0xffff0000
++#define VFPU_INST_UNR_ASIN 0xd0170000
++#define VFPU_MASK_UNR_ASIN 0xffff0000
++#define VFPU_INST_UNR_NRCP 0xd0180000
++#define VFPU_MASK_UNR_NRCP 0xffff0000
++#define VFPU_INST_UNR_NSIN 0xd01a0000
++#define VFPU_MASK_UNR_NSIN 0xffff0000
++#define VFPU_INST_UNR_REXP2 0xd01c0000
++#define VFPU_MASK_UNR_REXP2 0xffff0000
++#define VFPU_INST_UNR_RNDS 0xd0200000
++#define VFPU_MASK_UNR_RNDS 0xffff0000
++#define VFPU_INST_UNR_RNDI 0xd0210000
++#define VFPU_MASK_UNR_RNDI 0xffff0000
++#define VFPU_INST_UNR_RNDF1 0xd0220000
++#define VFPU_MASK_UNR_RNDF1 0xffff0000
++#define VFPU_INST_UNR_RNDF2 0xd0230000
++#define VFPU_MASK_UNR_RNDF2 0xffff0000
++#define VFPU_INST_UNR_F2H 0xd0320000
++#define VFPU_MASK_UNR_F2H 0xffff0000
++#define VFPU_INST_UNR_H2F 0xd0330000
++#define VFPU_MASK_UNR_H2F 0xffff0000
++#define VFPU_INST_UNR_SBZ 0xd0360000
++#define VFPU_MASK_UNR_SBZ 0xffff0000
++#define VFPU_INST_UNR_LGB 0xd0370000
++#define VFPU_MASK_UNR_LGB 0xffff0000
++#define VFPU_INST_UNR_US2I 0xd03a0000
++#define VFPU_MASK_UNR_US2I 0xffff0000
++#define VFPU_INST_UNR_S2I 0xd03b0000
++#define VFPU_MASK_UNR_S2I 0xffff0000
++#define VFPU_INST_UNR_I2UC 0xd03c0000
++#define VFPU_MASK_UNR_I2UC 0xffff0000
++#define VFPU_INST_UNR_I2C 0xd03d0000
++#define VFPU_MASK_UNR_I2C 0xffff0000
++#define VFPU_INST_UNR_I2US 0xd03e0000
++#define VFPU_MASK_UNR_I2US 0xffff0000
++#define VFPU_INST_UNR_I2S 0xd03f0000
++#define VFPU_MASK_UNR_I2S 0xffff0000
++#define VFPU_INST_UNR_SRT1 0xd0400000
++#define VFPU_MASK_UNR_SRT1 0xffff0000
++#define VFPU_INST_UNR_SRT2 0xd0410000
++#define VFPU_MASK_UNR_SRT2 0xffff0000
++#define VFPU_INST_UNR_BFY1 0xd0420000
++#define VFPU_MASK_UNR_BFY1 0xffff0000
++#define VFPU_INST_UNR_BFY2 0xd0430000
++#define VFPU_MASK_UNR_BFY2 0xffff0000
++#define VFPU_INST_UNR_OCP 0xd0440000
++#define VFPU_MASK_UNR_OCP 0xffff0000
++#define VFPU_INST_UNR_SOCP 0xd0450000
++#define VFPU_MASK_UNR_SOCP 0xffff0000
++#define VFPU_INST_UNR_FAD 0xd0460000
++#define VFPU_MASK_UNR_FAD 0xffff0000
++#define VFPU_INST_UNR_AVG 0xd0470000
++#define VFPU_MASK_UNR_AVG 0xffff0000
++#define VFPU_INST_UNR_SRT3 0xd0480000
++#define VFPU_MASK_UNR_SRT3 0xffff0000
++#define VFPU_INST_UNR_SRT4 0xd0490000
++#define VFPU_MASK_UNR_SRT4 0xffff0000
++#define VFPU_INST_UNR_SGN 0xd04a0000
++#define VFPU_MASK_UNR_SGN 0xffff0000
++#define VFPU_INST_UNR_CF 0xd0500000
++#define VFPU_MASK_UNR_CF 0xffff0080
++#define VFPU_INST_UNR_CT 0xd0510000
++#define VFPU_MASK_UNR_CT 0xffff8000
++#define VFPU_INST_UNR_T4444 0xd0590000
++#define VFPU_MASK_UNR_T4444 0xffff0000
++#define VFPU_INST_UNR_T5551 0xd05a0000
++#define VFPU_MASK_UNR_T5551 0xffff0000
++#define VFPU_INST_UNR_T5650 0xd05b0000
++#define VFPU_MASK_UNR_T5650 0xffff0000
++#define VFPU_INST_UNR_CST 0xd0600000
++#define VFPU_MASK_UNR_CST 0xffe00000
++
++#define VFPU_INST_UNRI_F2I_N 0xd2000000
++#define VFPU_MASK_UNRI_F2I_N 0xffe00000
++#define VFPU_INST_UNRI_F2I_Z 0xd2200000
++#define VFPU_MASK_UNRI_F2I_Z 0xffe00000
++#define VFPU_INST_UNRI_F2I_U 0xd2400000
++#define VFPU_MASK_UNRI_F2I_U 0xffe00000
++#define VFPU_INST_UNRI_F2I_D 0xd2600000
++#define VFPU_MASK_UNRI_F2I_D 0xffe00000
++#define VFPU_INST_UNRI_I2F 0xd2800000
++#define VFPU_MASK_UNRI_I2F 0xffe00000
++#define VFPU_INST_UNRI_CMOV_T 0xd2a00000
++#define VFPU_MASK_UNRI_CMOV_T 0xfff80000
++#define VFPU_INST_UNRI_CMOV_F 0xd2a80000
++#define VFPU_MASK_UNRI_CMOV_F 0xfff80000
++#define VFPU_INST_UNRI_WBN 0xd3000000
++#define VFPU_MASK_UNRI_WBN 0xff000000
++
++#define VFPU_INST_PFX_RA 0xdc000000
++#define VFPU_MASK_PFX_RA 0xff000000
++#define VFPU_INST_PFX_RB 0xdd000000
++#define VFPU_MASK_PFX_RB 0xff000000
++#define VFPU_INST_PFX_W 0xde000000
++#define VFPU_MASK_PFX_W 0xff000000
++#define VFPU_INST_IIM 0xdf000000
++#define VFPU_MASK_IIM 0xff800000
++#define VFPU_INST_FIM 0xdf800000
++#define VFPU_MASK_FIM 0xff800000
++
++#define VFPU_INST_RPT_MMUL 0xf0000000
++#define VFPU_MASK_RPT_MMUL 0xff800000
++#define VFPU_INST_RPT_TFM2 0xf0800000
++#define VFPU_MASK_RPT_TFM2 0xff800000
++#define VFPU_INST_RPT_TFM3 0xf1000000
++#define VFPU_MASK_RPT_TFM3 0xff800000
++#define VFPU_INST_RPT_TFM4 0xf1800000
++#define VFPU_MASK_RPT_TFM4 0xff800000
++#define VFPU_INST_RPT_MSCL 0xf2000000
++#define VFPU_MASK_RPT_MSCL 0xff800000
++#define VFPU_INST_RPT_QMUL 0xf2800000
++#define VFPU_MASK_RPT_QMUL 0xff800000
++#define VFPU_INST_RPT_MMOV 0xf3800000
++#define VFPU_MASK_RPT_MMOV 0xffff0000
++#define VFPU_INST_RPT_MIDT 0xf3830000
++#define VFPU_MASK_RPT_MIDT 0xffff0000
++#define VFPU_INST_RPT_MZERO 0xf3860000
++#define VFPU_MASK_RPT_MZERO 0xffff0000
++#define VFPU_INST_RPT_MONE 0xf3870000
++#define VFPU_MASK_RPT_MONE 0xffff0000
++#define VFPU_INST_RPT_ROT 0xf3a00000
++#define VFPU_MASK_RPT_ROT 0xffe00000
++
++#define VFPU_INST_SYNC 0xffff0000
++#define VFPU_MASK_SYNC 0xffff0000
++
++#endif /* _VFPU_H_ */
+diff -burN binutils-2.16.1/ld/configure.tgt binutils-psp/ld/configure.tgt
+--- binutils-2.16.1/ld/configure.tgt 2005-02-08 19:54:27.000000000 +0000
++++ binutils-psp/ld/configure.tgt 2006-01-10 23:31:51.000000000 +0000
@@ -428,6 +428,8 @@
mips*vr4100-*-elf*) targ_emul=elf32b4300 ;;
mips*vr5000el-*-elf*) targ_emul=elf32l4300 ;;
@@ -1238,8 +2810,9 @@
mips*el-*-elf*) targ_emul=elf32elmip ;;
mips*-*-elf*) targ_emul=elf32ebmip ;;
mips*el-*-rtems*) targ_emul=elf32elmip ;;
---- binutils-2.16.1.orig/ld/emulparams/elf_mipsallegrexel_psp.sh 1969-12-31 16:00:00.000000000 -0800
-+++ binutils-psp/ld/emulparams/elf_mipsallegrexel_psp.sh 2005-07-12 03:44:26.000000000 -0700
+diff -burN binutils-2.16.1/ld/emulparams/elf_mipsallegrexel_psp.sh binutils-psp/ld/emulparams/elf_mipsallegrexel_psp.sh
+--- binutils-2.16.1/ld/emulparams/elf_mipsallegrexel_psp.sh 1970-01-01 01:00:00.000000000 +0100
++++ binutils-psp/ld/emulparams/elf_mipsallegrexel_psp.sh 2006-01-10 23:31:51.000000000 +0000
@@ -0,0 +1,22 @@
+# Based off of the default elf32 MIPS target. However, we use a seperate
+# script template because the PSP architecture defines sections that normally
@@ -1263,8 +2836,51 @@
+
+# Discard the .comment and .pdr sections.
+OTHER_SECTIONS="/DISCARD/ : { *(.comment) *(.pdr) }"
---- binutils-2.16.1.orig/ld/scripttempl/elf_psp.sc 1969-12-31 16:00:00.000000000 -0800
-+++ binutils-psp/ld/scripttempl/elf_psp.sc 2005-06-25 03:12:02.000000000 -0700
+diff -burN binutils-2.16.1/ld/Makefile.am binutils-psp/ld/Makefile.am
+--- binutils-2.16.1/ld/Makefile.am 2005-01-20 19:37:49.000000000 +0000
++++ binutils-psp/ld/Makefile.am 2006-01-10 23:31:51.000000000 +0000
+@@ -190,6 +190,7 @@
+ eelf_i386_chaos.o \
+ eelf_i386_fbsd.o \
+ eelf_i386_ldso.o \
++ eelf_mipsallegrexel_psp.o \
+ eelf_s390.o \
+ egld960.o \
+ egld960coff.o \
+@@ -864,6 +865,9 @@
+ eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \
+ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)"
++eelf_mipsallegrexel_psp.c: $(srcdir)/emulparams/elf_mipsallegrexel_psp.sh \
++ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_psp.sc ${GEN_DEPENDS}
++ ${GENSCRIPTS} elf_mipsallegrexel_psp "$(tdir_elf_mipsallegrexel_psp)"
+ eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \
+ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)"
+diff -burN binutils-2.16.1/ld/Makefile.in binutils-psp/ld/Makefile.in
+--- binutils-2.16.1/ld/Makefile.in 2005-01-23 05:36:37.000000000 +0000
++++ binutils-psp/ld/Makefile.in 2006-01-10 23:31:51.000000000 +0000
+@@ -315,6 +315,7 @@
+ eelf_i386_chaos.o \
+ eelf_i386_fbsd.o \
+ eelf_i386_ldso.o \
++ eelf_mipsallegrexel_psp.o \
+ eelf_s390.o \
+ egld960.o \
+ egld960coff.o \
+@@ -1601,6 +1602,9 @@
+ eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \
+ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)"
++eelf_mipsallegrexel_psp.c: $(srcdir)/emulparams/elf_mipsallegrexel_psp.sh \
++ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_psp.sc ${GEN_DEPENDS}
++ ${GENSCRIPTS} elf_mipsallegrexel_psp "$(tdir_elf_mipsallegrexel_psp)"
+ eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \
+ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)"
+diff -burN binutils-2.16.1/ld/scripttempl/elf_psp.sc binutils-psp/ld/scripttempl/elf_psp.sc
+--- binutils-2.16.1/ld/scripttempl/elf_psp.sc 1970-01-01 01:00:00.000000000 +0100
++++ binutils-psp/ld/scripttempl/elf_psp.sc 2006-01-10 23:31:51.000000000 +0000
@@ -0,0 +1,496 @@
+#
+# Unusual variables checked by this code:
@@ -1762,8 +3378,9 @@
+ ${RELOCATING+${STACKNOTE}}
+}
+EOF
---- binutils-2.16.1.orig/opcodes/mips-dis.c 2005-03-03 03:49:50.000000000 -0800
-+++ binutils-psp/opcodes/mips-dis.c 2005-08-28 16:25:27.000000000 -0700
+diff -burN binutils-2.16.1/opcodes/mips-dis.c binutils-psp/opcodes/mips-dis.c
+--- binutils-2.16.1/opcodes/mips-dis.c 2005-03-03 11:49:50.000000000 +0000
++++ binutils-psp/opcodes/mips-dis.c 2006-01-10 23:31:51.000000000 +0000
@@ -140,6 +140,139 @@
"c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave",
};
@@ -2318,8 +3935,9 @@
default:
/* xgettext:c-format */
(*info->fprintf_func) (info->stream,
---- binutils-2.16.1.orig/opcodes/mips-opc.c 2005-03-03 03:49:50.000000000 -0800
-+++ binutils-psp/opcodes/mips-opc.c 2005-10-20 08:13:56.000000000 -0700
+diff -burN binutils-2.16.1/opcodes/mips-opc.c binutils-psp/opcodes/mips-opc.c
+--- binutils-2.16.1/opcodes/mips-opc.c 2005-03-03 11:49:50.000000000 +0000
++++ binutils-psp/opcodes/mips-opc.c 2006-01-10 23:31:51.000000000 +0000
@@ -109,6 +109,7 @@
#define N5 (INSN_5400 | INSN_5500)
#define N54 INSN_5400
diff --git a/dkpsp/patches/gcc-4.1.0.patch b/dkpsp/patches/gcc-4.1.0.patch
new file mode 100644
index 0000000..a372493
--- /dev/null
+++ b/dkpsp/patches/gcc-4.1.0.patch
@@ -0,0 +1,924 @@
+diff -Nbaur gcc-4.1.0/config.sub gcc-4.1.0-psp/config.sub
+--- gcc-4.1.0/config.sub Fri Dec 16 12:57:40 2005
++++ gcc-4.1.0-psp/config.sub Sun May 7 22:34:17 2006
+@@ -264,6 +264,7 @@
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
++ | mipsallegrex | mipsallegrexel \
+ | mn10200 | mn10300 \
+ | mt \
+ | msp430 \
+@@ -346,6 +347,7 @@
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
++ | mipsallegrex-* | mipsallegrexel-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+@@ -688,6 +690,10 @@
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
++ ;;
++ psp)
++ basic_machine=mipsallegrexel-psp
++ os=-elf
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+diff -Nbaur gcc-4.1.0/gcc/c-incpath.c gcc-4.1.0-psp/gcc/c-incpath.c
+--- gcc-4.1.0/gcc/c-incpath.c Sat Jun 25 03:02:01 2005
++++ gcc-4.1.0-psp/gcc/c-incpath.c Sun May 7 22:34:29 2006
+@@ -331,13 +331,18 @@
+ cpp_dir *p;
+
+ #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+- /* Convert all backslashes to slashes. The native CRT stat()
+- function does not recognize a directory that ends in a backslash
+- (unless it is a drive root dir, such "c:\"). Forward slashes,
+- trailing or otherwise, cause no problems for stat(). */
+- char* c;
+- for (c = path; *c; c++)
+- if (*c == '\\') *c = '/';
++ /* Remove unnecessary trailing slashes. On some versions of MS
++ Windows, trailing _forward_ slashes cause no problems for stat().
++ On newer versions, stat() does not recognise a directory that ends
++ in a '\\' or '/', unless it is a drive root dir, such as "c:/",
++ where it is obligatory. */
++ int pathlen = strlen (path);
++ char* end = path + pathlen - 1;
++ /* Preserve the lead '/' or lead "c:/". */
++ char* start = path + (pathlen > 2 && path[1] == ':' ? 3 : 1);
++
++ for (; end > start && IS_DIR_SEPARATOR (*end); end--)
++ *end = 0;
+ #endif
+
+ p = xmalloc (sizeof (cpp_dir));
+diff -Nbaur gcc-4.1.0/gcc/config/mips/allegrex.md gcc-4.1.0-psp/gcc/config/mips/allegrex.md
+--- gcc-4.1.0/gcc/config/mips/allegrex.md Thu Jan 1 00:00:00 1970
++++ gcc-4.1.0-psp/gcc/config/mips/allegrex.md Sun May 7 22:34:17 2006
+@@ -0,0 +1,183 @@
++;; Sony ALLEGREX instructions.
++;; Copyright (C) 2005 Free Software Foundation, Inc.
++;;
++;; This file is part of GCC.
++;;
++;; GCC is free software; you can redistribute it and/or modify
++;; it under the terms of the GNU General Public License as published by
++;; the Free Software Foundation; either version 2, or (at your option)
++;; any later version.
++;;
++;; GCC is distributed in the hope that it will be useful,
++;; but WITHOUT ANY WARRANTY; without even the implied warranty of
++;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++;; GNU General Public License for more details.
++;;
++;; You should have received a copy of the GNU General Public License
++;; along with GCC; see the file COPYING. If not, write to
++;; the Free Software Foundation, 59 Temple Place - Suite 330,
++;; Boston, MA 02111-1307, USA.
++
++; Multiply Add and Subtract.
++
++(define_insn "allegrex_madd"
++ [(set (match_operand:SI 0 "register_operand" "+l")
++ (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "d")
++ (match_operand:SI 2 "register_operand" "d"))
++ (match_dup 0)))
++ (clobber (match_scratch:SI 3 "=h"))]
++ "TARGET_ALLEGREX"
++ "madd\t%1,%2"
++ [(set_attr "type" "imadd")
++ (set_attr "mode" "SI")])
++
++(define_insn "allegrex_msub"
++ [(set (match_operand:SI 0 "register_operand" "+l")
++ (minus:SI (match_dup 0)
++ (mult:SI (match_operand:SI 1 "register_operand" "d")
++ (match_operand:SI 2 "register_operand" "d"))))
++ (clobber (match_scratch:SI 3 "=h"))]
++ "TARGET_ALLEGREX"
++ "msub\t%1,%2"
++ [(set_attr "type" "imadd")
++ (set_attr "mode" "SI")])
++
++
++; Min and max.
++
++(define_insn "sminsi3"
++ [(set (match_operand:SI 0 "register_operand" "=d")
++ (smin:SI (match_operand:SI 1 "register_operand" "d")
++ (match_operand:SI 2 "register_operand" "d")))]
++ "TARGET_ALLEGREX"
++ "min\t%0,%1,%2"
++ [(set_attr "type" "arith")
++ (set_attr "mode" "SI")])
++
++(define_insn "smaxsi3"
++ [(set (match_operand:SI 0 "register_operand" "=d")
++ (smax:SI (match_operand:SI 1 "register_operand" "d")
++ (match_operand:SI 2 "register_operand" "d")))]
++ "TARGET_ALLEGREX"
++ "max\t%0,%1,%2"
++ [(set_attr "type" "arith")
++ (set_attr "mode" "SI")])
++
++
++; Extended shift instructions.
++
++(define_insn "allegrex_bitrev"
++ [(set (match_operand:SI 0 "register_operand" "=d")
++ (unspec:SI [(match_operand:SI 1 "register_operand" "d")]
++ UNSPEC_BITREV))]
++ "TARGET_ALLEGREX"
++ "bitrev\t%0,%1"
++ [(set_attr "type" "arith")
++ (set_attr "mode" "SI")])
++
++(define_insn "allegrex_wsbh"
++ [(set (match_operand:SI 0 "register_operand" "=d")
++ (unspec:SI [(match_operand:SI 1 "register_operand" "d")]
++ UNSPEC_WSBH))]
++ "TARGET_ALLEGREX"
++ "wsbh\t%0,%1"
++ [(set_attr "type" "arith")
++ (set_attr "mode" "SI")])
++
++(define_insn "allegrex_wsbw"
++ [(set (match_operand:SI 0 "register_operand" "=d")
++ (unspec:SI [(match_operand:SI 1 "register_operand" "d")]
++ UNSPEC_WSBW))]
++ "TARGET_ALLEGREX"
++ "wsbw\t%0,%1"
++ [(set_attr "type" "arith")
++ (set_attr "mode" "SI")])
++
++
++; Count leading ones, count trailing zeros, and count trailing ones (clz is
++; already defined).
++
++(define_insn "allegrex_clo"
++ [(set (match_operand:SI 0 "register_operand" "=d")
++ (unspec:SI [(match_operand:SI 1 "register_operand" "d")]
++ UNSPEC_CLO))]
++ "TARGET_ALLEGREX"
++ "clo\t%0,%1"
++ [(set_attr "type" "clz")
++ (set_attr "mode" "SI")])
++
++(define_expand "ctzsi2"
++ [(set (match_operand:SI 0 "register_operand")
++ (ctz:SI (match_operand:SI 1 "register_operand")))]
++ "TARGET_ALLEGREX"
++{
++ rtx r1;
++
++ r1 = gen_reg_rtx (SImode);
++ emit_insn (gen_allegrex_bitrev (r1, operands[1]));
++ emit_insn (gen_clzsi2 (operands[0], r1));
++ DONE;
++})
++
++(define_expand "allegrex_cto"
++ [(set (match_operand:SI 0 "register_operand")
++ (unspec:SI [(match_operand:SI 1 "register_operand")]
++ UNSPEC_CTO))]
++ "TARGET_ALLEGREX"
++{
++ rtx r1;
++
++ r1 = gen_reg_rtx (SImode);
++ emit_insn (gen_allegrex_bitrev (r1, operands[1]));
++ emit_insn (gen_allegrex_clo (operands[0], r1));
++ DONE;
++})
++
++
++; Misc.
++
++(define_insn "allegrex_sync"
++ [(unspec_volatile [(const_int 0)] UNSPEC_SYNC)]
++ "TARGET_ALLEGREX"
++ "sync"
++ [(set_attr "type" "unknown")
++ (set_attr "mode" "none")])
++
++(define_insn "allegrex_cache"
++ [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "")
++ (match_operand:SI 1 "register_operand" "d")]
++ UNSPEC_CACHE)]
++ "TARGET_ALLEGREX"
++ "cache\t%0,0(%1)"
++ [(set_attr "type" "unknown")
++ (set_attr "mode" "none")])
++
++
++; Floating-point builtins.
++
++(define_insn "allegrex_ceil_w_s"
++ [(set (match_operand:SI 0 "register_operand" "=f")
++ (unspec:SI [(match_operand:SF 1 "register_operand" "f")]
++ UNSPEC_CEIL_W_S))]
++ "TARGET_ALLEGREX"
++ "ceil.w.s\t%0,%1"
++ [(set_attr "type" "fcvt")
++ (set_attr "mode" "SF")])
++
++(define_insn "allegrex_floor_w_s"
++ [(set (match_operand:SI 0 "register_operand" "=f")
++ (unspec:SI [(match_operand:SF 1 "register_operand" "f")]
++ UNSPEC_FLOOR_W_S))]
++ "TARGET_ALLEGREX"
++ "floor.w.s\t%0,%1"
++ [(set_attr "type" "fcvt")
++ (set_attr "mode" "SF")])
++
++(define_insn "allegrex_round_w_s"
++ [(set (match_operand:SI 0 "register_operand" "=f")
++ (unspec:SI [(match_operand:SF 1 "register_operand" "f")]
++ UNSPEC_ROUND_W_S))]
++ "TARGET_ALLEGREX"
++ "round.w.s\t%0,%1"
++ [(set_attr "type" "fcvt")
++ (set_attr "mode" "SF")])
+diff -Nbaur gcc-4.1.0/gcc/config/mips/mips.c gcc-4.1.0-psp/gcc/config/mips/mips.c
+--- gcc-4.1.0/gcc/config/mips/mips.c Fri Dec 9 08:15:58 2005
++++ gcc-4.1.0-psp/gcc/config/mips/mips.c Sun May 7 22:34:17 2006
+@@ -179,6 +179,12 @@
+ MIPS_VOID_FTYPE_V2HI_V2HI,
+ MIPS_VOID_FTYPE_V4QI_V4QI,
+
++ /* For the Sony ALLEGREX. */
++ MIPS_SI_FTYPE_QI,
++ MIPS_SI_FTYPE_HI,
++ MIPS_VOID_FTYPE_VOID,
++ MIPS_SI_FTYPE_SF,
++
+ /* The last type. */
+ MIPS_MAX_FTYPE_MAX
+ };
+@@ -220,6 +226,11 @@
+ /* As above, but the instruction only sets a single $fcc register. */
+ MIPS_BUILTIN_CMP_SINGLE,
+
++ /* The builtin corresponds to the ALLEGREX cache instruction. Operand 0
++ is the function code (must be less than 32) and operand 1 is the base
++ address. */
++ MIPS_BUILTIN_CACHE,
++
+ /* For generating bposge32 branch instructions in MIPS32 DSP ASE. */
+ MIPS_BUILTIN_BPOSGE32
+ };
+@@ -405,6 +416,7 @@
+ static rtx mips_expand_builtin_compare (enum mips_builtin_type,
+ enum insn_code, enum mips_fp_condition,
+ rtx, tree);
++static rtx mips_expand_builtin_cache (enum insn_code icode, rtx, tree);
+ static rtx mips_expand_builtin_bposge (enum mips_builtin_type, rtx);
+ static void mips_encode_section_info (tree, rtx, int);
+
+@@ -721,6 +733,7 @@
+
+ /* MIPS II */
+ { "r6000", PROCESSOR_R6000, 2 },
++ { "allegrex", PROCESSOR_ALLEGREX, 2 },
+
+ /* MIPS III */
+ { "r4000", PROCESSOR_R4000, 3 },
+@@ -10169,6 +10182,67 @@
+ BPOSGE_BUILTIN (32, MASK_DSP)
+ };
+
++/* Builtin functions for the Sony ALLEGREX processor.
++
++ These have the `__builtin_allgrex_' prefix instead of `__builtin_mips_'
++ to maintain compatibility with Sony's ALLEGREX GCC port.
++
++ Some of the builtins may seem redundant, but they are the same as the
++ builtins defined in the Sony compiler. I chose to map redundant and
++ trivial builtins to the original instruction instead of creating
++ duplicate patterns specifically for the ALLEGREX (as Sony does). */
++
++/* Define a MIPS_BUILTIN_DIRECT function for instruction CODE_FOR_allegrex_.
++ FUNCTION_TYPE and TARGET_FLAGS are builtin_description fields. */
++#define DIRECT_ALLEGREX_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS) \
++ { CODE_FOR_allegrex_ ## INSN, 0, "__builtin_allegrex_" #INSN, \
++ MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, TARGET_FLAGS }
++
++/* Same as the above, but mapped to an instruction that doesn't share the
++ NAME. NAME is the name of the builtin without the builtin prefix. */
++#define DIRECT_ALLEGREX_NAMED_BUILTIN(NAME, INSN, FUNCTION_TYPE, TARGET_FLAGS) \
++ { CODE_FOR_ ## INSN, 0, "__builtin_allegrex_" #NAME, \
++ MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, TARGET_FLAGS }
++
++/* Define a MIPS_BUILTIN_DIRECT_NO_TARGET function for instruction
++ CODE_FOR_allegrex_. FUNCTION_TYPE and TARGET_FLAGS are
++ builtin_description fields. */
++#define DIRECT_ALLEGREX_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS) \
++ { CODE_FOR_allegrex_ ## INSN, 0, "__builtin_allegrex_" #INSN, \
++ MIPS_BUILTIN_DIRECT_NO_TARGET, FUNCTION_TYPE, TARGET_FLAGS }
++
++/* Define a builtin with a specific function TYPE. */
++#define SPECIAL_ALLEGREX_BUILTIN(TYPE, INSN, FUNCTION_TYPE, TARGET_FLAGS) \
++ { CODE_FOR_allegrex_ ## INSN, 0, "__builtin_allegrex_" #INSN, \
++ MIPS_BUILTIN_ ## TYPE, FUNCTION_TYPE, TARGET_FLAGS }
++
++static const struct builtin_description allegrex_bdesc[] =
++{
++ DIRECT_ALLEGREX_BUILTIN(bitrev, MIPS_SI_FTYPE_SI, 0),
++ DIRECT_ALLEGREX_BUILTIN(wsbh, MIPS_SI_FTYPE_SI, 0),
++ DIRECT_ALLEGREX_BUILTIN(wsbw, MIPS_SI_FTYPE_SI, 0),
++ DIRECT_ALLEGREX_NAMED_BUILTIN(clz, clzsi2, MIPS_SI_FTYPE_SI, 0),
++ DIRECT_ALLEGREX_BUILTIN(clo, MIPS_SI_FTYPE_SI, 0),
++ DIRECT_ALLEGREX_NAMED_BUILTIN(ctz, ctzsi2, MIPS_SI_FTYPE_SI, 0),
++ DIRECT_ALLEGREX_BUILTIN(cto, MIPS_SI_FTYPE_SI, 0),
++ DIRECT_ALLEGREX_NAMED_BUILTIN(rotr, rotrsi3, MIPS_SI_FTYPE_SI_SI, 0),
++ DIRECT_ALLEGREX_NAMED_BUILTIN(rotl, rotlsi3, MIPS_SI_FTYPE_SI_SI, 0),
++
++ DIRECT_ALLEGREX_NAMED_BUILTIN(seb, extendqisi2, MIPS_SI_FTYPE_QI, 0),
++ DIRECT_ALLEGREX_NAMED_BUILTIN(seh, extendhisi2, MIPS_SI_FTYPE_HI, 0),
++ DIRECT_ALLEGREX_NAMED_BUILTIN(max, smaxsi3, MIPS_SI_FTYPE_SI_SI, 0),
++ DIRECT_ALLEGREX_NAMED_BUILTIN(min, sminsi3, MIPS_SI_FTYPE_SI_SI, 0),
++
++ DIRECT_ALLEGREX_NO_TARGET_BUILTIN(sync, MIPS_VOID_FTYPE_VOID, 0),
++ SPECIAL_ALLEGREX_BUILTIN(CACHE, cache, MIPS_VOID_FTYPE_SI_SI, 0),
++
++ DIRECT_ALLEGREX_NAMED_BUILTIN(sqrt_s, sqrtsf2, MIPS_SF_FTYPE_SF, 0),
++ DIRECT_ALLEGREX_BUILTIN(ceil_w_s, MIPS_SI_FTYPE_SF, 0),
++ DIRECT_ALLEGREX_BUILTIN(floor_w_s, MIPS_SI_FTYPE_SF, 0),
++ DIRECT_ALLEGREX_BUILTIN(round_w_s, MIPS_SI_FTYPE_SF, 0),
++ DIRECT_ALLEGREX_NAMED_BUILTIN(trunc_w_s, fix_truncsfsi2_insn, MIPS_SI_FTYPE_SF, 0)
++};
++
+ /* This helps provide a mapping from builtin function codes to bdesc
+ arrays. */
+
+@@ -10189,6 +10263,7 @@
+ {
+ { mips_bdesc, ARRAY_SIZE (mips_bdesc), PROCESSOR_MAX },
+ { sb1_bdesc, ARRAY_SIZE (sb1_bdesc), PROCESSOR_SB1 },
++ { allegrex_bdesc, ARRAY_SIZE (allegrex_bdesc), PROCESSOR_ALLEGREX },
+ { dsp_bdesc, ARRAY_SIZE (dsp_bdesc), PROCESSOR_MAX }
+ };
+
+@@ -10292,6 +10367,9 @@
+ case MIPS_BUILTIN_BPOSGE32:
+ return mips_expand_builtin_bposge (type, target);
+
++ case MIPS_BUILTIN_CACHE:
++ return mips_expand_builtin_cache (icode, target, arglist);
++
+ default:
+ return 0;
+ }
+@@ -10310,8 +10388,8 @@
+ tree V4QI_type_node;
+ unsigned int offset;
+
+- /* We have only builtins for -mpaired-single, -mips3d and -mdsp. */
+- if (!TARGET_PAIRED_SINGLE_FLOAT && !TARGET_DSP)
++ /* We have only builtins for -mpaired-single, -mips3d and -mdsp and the Sony ALLEGREX. */
++ if (!TARGET_PAIRED_SINGLE_FLOAT && !TARGET_DSP && !TARGET_ALLEGREX)
+ return;
+
+ if (TARGET_PAIRED_SINGLE_FLOAT)
+@@ -10376,6 +10454,44 @@
+ double_type_node, double_type_node, NULL_TREE);
+ }
+
++ if (TARGET_ALLEGREX)
++ {
++ types[MIPS_SI_FTYPE_QI]
++ = build_function_type_list (intSI_type_node,
++ intQI_type_node,
++ NULL_TREE);
++
++ types[MIPS_SI_FTYPE_HI]
++ = build_function_type_list (intSI_type_node,
++ intHI_type_node,
++ NULL_TREE);
++
++ types[MIPS_SI_FTYPE_SI]
++ = build_function_type_list (intSI_type_node,
++ intSI_type_node,
++ NULL_TREE);
++
++ types[MIPS_SI_FTYPE_SI_SI]
++ = build_function_type_list (intSI_type_node,
++ intSI_type_node, intSI_type_node,
++ NULL_TREE);
++
++ types[MIPS_VOID_FTYPE_VOID]
++ = build_function_type_list (void_type_node, void_type_node, NULL_TREE);
++
++ types[MIPS_VOID_FTYPE_SI_SI]
++ = build_function_type_list (void_type_node,
++ intSI_type_node, intSI_type_node, NULL_TREE);
++
++ types[MIPS_SF_FTYPE_SF]
++ = build_function_type_list (float_type_node,
++ float_type_node, NULL_TREE);
++
++ types[MIPS_SI_FTYPE_SF]
++ = build_function_type_list (intSI_type_node,
++ float_type_node, NULL_TREE);
++ }
++
+ if (TARGET_DSP)
+ {
+ V2HI_type_node = build_vector_type_for_mode (intHI_type_node, V2HImode);
+@@ -10557,6 +10673,10 @@
+
+ switch (i)
+ {
++ case 0:
++ emit_insn (GEN_FCN (icode) (0));
++ break;
++
+ case 2:
+ emit_insn (GEN_FCN (icode) (ops[0], ops[1]));
+ break;
+@@ -10765,6 +10885,28 @@
+ rtx symbol = XEXP (rtl, 0);
+ SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
+ }
++}
++
++/* Expand a __builtin_allegrex_cache() function. Make sure the passed
++ cache function code is less than 32. */
++
++static rtx
++mips_expand_builtin_cache (enum insn_code icode, rtx target, tree arglist)
++{
++ rtx op0, op1;
++
++ op0 = mips_prepare_builtin_arg (icode, 0, &arglist);
++ op1 = mips_prepare_builtin_arg (icode, 1, &arglist);
++
++ if (GET_CODE (op0) == CONST_INT)
++ if (INTVAL (op0) < 0 || INTVAL (op0) > 0x1f)
++ {
++ error ("invalid function code '%d'", INTVAL (op0));
++ return const0_rtx;
++ }
++
++ emit_insn (GEN_FCN (icode) (op0, op1));
++ return target;
+ }
+
+ #include "gt-mips.h"
+diff -Nbaur gcc-4.1.0/gcc/config/mips/mips.h gcc-4.1.0-psp/gcc/config/mips/mips.h
+--- gcc-4.1.0/gcc/config/mips/mips.h Fri Feb 17 21:38:59 2006
++++ gcc-4.1.0-psp/gcc/config/mips/mips.h Sun May 7 22:34:17 2006
+@@ -59,6 +59,7 @@
+ PROCESSOR_R9000,
+ PROCESSOR_SB1,
+ PROCESSOR_SR71000,
++ PROCESSOR_ALLEGREX,
+ PROCESSOR_MAX
+ };
+
+@@ -194,6 +195,7 @@
+ #define TARGET_MIPS9000 (mips_arch == PROCESSOR_R9000)
+ #define TARGET_SB1 (mips_arch == PROCESSOR_SB1)
+ #define TARGET_SR71K (mips_arch == PROCESSOR_SR71000)
++#define TARGET_ALLEGREX (mips_arch == PROCESSOR_ALLEGREX)
+
+ /* Scheduling target defines. */
+ #define TUNE_MIPS3000 (mips_tune == PROCESSOR_R3000)
+@@ -208,6 +210,7 @@
+ #define TUNE_MIPS7000 (mips_tune == PROCESSOR_R7000)
+ #define TUNE_MIPS9000 (mips_tune == PROCESSOR_R9000)
+ #define TUNE_SB1 (mips_tune == PROCESSOR_SB1)
++#define TUNE_ALLEGREX (mips_tune == PROCESSOR_ALLEGREX)
+
+ /* True if the pre-reload scheduler should try to create chains of
+ multiply-add or multiply-subtract instructions. For example,
+@@ -578,6 +581,9 @@
+ && !TARGET_MIPS5500 \
+ && !TARGET_MIPS16)
+
++/* ISA has just the integer condition move instructions (movn,movz) */
++#define ISA_HAS_INT_CONDMOVE (TARGET_ALLEGREX)
++
+ /* ISA has the mips4 FP condition code instructions: FP-compare to CC,
+ branch on CC, and move (both FP and non-FP) on CC. */
+ #define ISA_HAS_8CC (ISA_MIPS4 \
+@@ -594,7 +600,8 @@
+
+ /* ISA has conditional trap instructions. */
+ #define ISA_HAS_COND_TRAP (!ISA_MIPS1 \
+- && !TARGET_MIPS16)
++ && !TARGET_MIPS16 \
++ && !TARGET_ALLEGREX)
+
+ /* ISA has integer multiply-accumulate instructions, madd and msub. */
+ #define ISA_HAS_MADD_MSUB ((ISA_MIPS32 \
+@@ -612,6 +619,7 @@
+ #define ISA_HAS_CLZ_CLO ((ISA_MIPS32 \
+ || ISA_MIPS32R2 \
+ || ISA_MIPS64 \
++ || TARGET_ALLEGREX \
+ ) && !TARGET_MIPS16)
+
+ /* ISA has double-word count leading zeroes/ones instruction (not
+@@ -659,6 +667,7 @@
+ || TARGET_MIPS5400 \
+ || TARGET_MIPS5500 \
+ || TARGET_SR71K \
++ || TARGET_ALLEGREX \
+ ))
+
+ /* ISA has 64-bit rotate right instruction. */
+@@ -692,11 +701,13 @@
+ /* ISA includes the MIPS32r2 seb and seh instructions. */
+ #define ISA_HAS_SEB_SEH (!TARGET_MIPS16 \
+ && (ISA_MIPS32R2 \
++ || TARGET_ALLEGREX \
+ ))
+
+ /* ISA includes the MIPS32/64 rev 2 ext and ins instructions. */
+ #define ISA_HAS_EXT_INS (!TARGET_MIPS16 \
+ && (ISA_MIPS32R2 \
++ || TARGET_ALLEGREX \
+ ))
+
+ /* True if the result of a load is not available to the next instruction.
+@@ -727,7 +738,8 @@
+ #define ISA_HAS_HILO_INTERLOCKS (ISA_MIPS32 \
+ || ISA_MIPS32R2 \
+ || ISA_MIPS64 \
+- || TARGET_MIPS5500)
++ || TARGET_MIPS5500 \
++ || TARGET_ALLEGREX)
+
+ /* Add -G xx support. */
+
+@@ -1138,6 +1150,11 @@
+ /* Define if loading short immediate values into registers sign extends. */
+ #define SHORT_IMMEDIATES_SIGN_EXTEND
+
++/* The [d]clz instructions have the natural values at 0. */
++
++#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
++ ((VALUE) = GET_MODE_BITSIZE (MODE), true)
++
+ /* The [d]clz instructions have the natural values at 0. */
+
+ #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
+diff -Nbaur gcc-4.1.0/gcc/config/mips/mips.md gcc-4.1.0-psp/gcc/config/mips/mips.md
+--- gcc-4.1.0/gcc/config/mips/mips.md Fri Jul 29 18:25:27 2005
++++ gcc-4.1.0-psp/gcc/config/mips/mips.md Sun May 7 22:34:17 2006
+@@ -142,6 +142,21 @@
+ (UNSPEC_MTHLIP 365)
+ (UNSPEC_WRDSP 366)
+ (UNSPEC_RDDSP 367)
++
++ ;; Sony ALLEGREX instructions
++ (UNSPEC_WSBH 401)
++ (UNSPEC_WSBW 402)
++
++ (UNSPEC_CLO 403)
++ (UNSPEC_CTO 404)
++
++ (UNSPEC_CACHE 405)
++ (UNSPEC_SYNC 406)
++
++ (UNSPEC_CEIL_W_S 407)
++ (UNSPEC_FLOOR_W_S 408)
++ (UNSPEC_ROUND_W_S 409)
++
+ ]
+ )
+
+@@ -1601,9 +1616,9 @@
+ (mult:DI
+ (any_extend:DI (match_operand:SI 1 "register_operand" "d"))
+ (any_extend:DI (match_operand:SI 2 "register_operand" "d")))))]
+- "!TARGET_64BIT && ISA_HAS_MSAC"
++ "!TARGET_64BIT && (ISA_HAS_MSAC || TARGET_ALLEGREX)"
+ {
+- if (TARGET_MIPS5500)
++ if (TARGET_MIPS5500 || TARGET_ALLEGREX)
+ return "msub\t%1,%2";
+ else
+ return "msac\t$0,%1,%2";
+@@ -1718,12 +1733,12 @@
+ (mult:DI (any_extend:DI (match_operand:SI 1 "register_operand" "d"))
+ (any_extend:DI (match_operand:SI 2 "register_operand" "d")))
+ (match_operand:DI 3 "register_operand" "0")))]
+- "(TARGET_MAD || ISA_HAS_MACC)
++ "(TARGET_MAD || ISA_HAS_MACC || TARGET_ALLEGREX)
+ && !TARGET_64BIT"
+ {
+ if (TARGET_MAD)
+ return "mad\t%1,%2";
+- else if (TARGET_MIPS5500)
++ else if (TARGET_MIPS5500 || TARGET_ALLEGREX)
+ return "madd\t%1,%2";
+ else
+ /* See comment in *macc. */
+@@ -1995,6 +2010,32 @@
+ ;;
+ ;; ....................
+ ;;
++;; FIND FIRST BIT INSTRUCTION
++;;
++;; ....................
++;;
++
++(define_expand "ffs2"
++ [(set (match_operand:GPR 0 "register_operand" "")
++ (ffs:GPR (match_operand:GPR 1 "register_operand" "")))]
++ "ISA_HAS_CLZ_CLO"
++{
++ rtx r1, r2, r3, r4;
++
++ r1 = gen_reg_rtx (mode);
++ r2 = gen_reg_rtx (mode);
++ r3 = gen_reg_rtx (mode);
++ r4 = gen_reg_rtx (mode);
++ emit_insn (gen_neg2 (r1, operands[1]));
++ emit_insn (gen_and3 (r2, operands[1], r1));
++ emit_insn (gen_clz2 (r3, r2));
++ emit_move_insn (r4, GEN_INT (GET_MODE_BITSIZE (mode)));
++ emit_insn (gen_sub3 (operands[0], r4, r3));
++ DONE;
++})
++;;
++;; ....................
++;;
+ ;; NEGATION and ONE'S COMPLEMENT
+ ;;
+ ;; ....................
+@@ -4193,6 +4234,25 @@
+ [(set_attr "type" "shift")
+ (set_attr "mode" "")])
+
++(define_expand "rotl3"
++ [(set (match_operand:GPR 0 "register_operand")
++ (rotate:GPR (match_operand:GPR 1 "register_operand")
++ (match_operand:SI 2 "arith_operand")))]
++ "ISA_HAS_ROTR_"
++{
++ rtx temp;
++
++ if (GET_CODE (operands[2]) == CONST_INT)
++ temp = GEN_INT (GET_MODE_BITSIZE (mode) - INTVAL (operands[2]));
++ else
++ {
++ temp = gen_reg_rtx (mode);
++ emit_insn (gen_neg2 (temp, operands[2]));
++ }
++ emit_insn (gen_rotr3 (operands[0], operands[1], temp));
++ DONE;
++})
++
+ ;;
+ ;; ....................
+ ;;
+@@ -5306,7 +5366,7 @@
+ (const_int 0)])
+ (match_operand:GPR 2 "reg_or_0_operand" "dJ,0")
+ (match_operand:GPR 3 "reg_or_0_operand" "0,dJ")))]
+- "ISA_HAS_CONDMOVE"
++ "ISA_HAS_CONDMOVE || ISA_HAS_INT_CONDMOVE"
+ "@
+ mov%T4\t%0,%z2,%1
+ mov%t4\t%0,%z3,%1"
+@@ -5336,8 +5396,12 @@
+ (if_then_else:GPR (match_dup 5)
+ (match_operand:GPR 2 "reg_or_0_operand")
+ (match_operand:GPR 3 "reg_or_0_operand")))]
+- "ISA_HAS_CONDMOVE"
++ "ISA_HAS_CONDMOVE || ISA_HAS_INT_CONDMOVE"
+ {
++ if (ISA_HAS_INT_CONDMOVE
++ && GET_MODE_CLASS (GET_MODE (cmp_operands[0])) == MODE_FLOAT)
++ FAIL;
++
+ gen_conditional_move (operands);
+ DONE;
+ })
+@@ -5428,3 +5492,6 @@
+ ; The MIPS DSP Instructions.
+
+ (include "mips-dsp.md")
++
++; Sony ALLEGREX instructions.
++(include "allegrex.md")
+diff -Nbaur gcc-4.1.0/gcc/config/mips/psp.h gcc-4.1.0-psp/gcc/config/mips/psp.h
+--- gcc-4.1.0/gcc/config/mips/psp.h Thu Jan 1 00:00:00 1970
++++ gcc-4.1.0-psp/gcc/config/mips/psp.h Sun May 7 22:34:17 2006
+@@ -0,0 +1,31 @@
++/* Support for Sony's Playstation Portable (PSP).
++ Copyright (C) 2005 Free Software Foundation, Inc.
++ Contributed by Marcus R. Brown
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 2, or (at your option)
++any later version.
++
++GCC is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with GCC; see the file COPYING. If not, write to
++the Free Software Foundation, 59 Temple Place - Suite 330,
++Boston, MA 02111-1307, USA. */
++
++/* Override the startfile spec to include crt0.o. */
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC "crt0%O%s crti%O%s crtbegin%O%s"
++
++#undef SUBTARGET_CPP_SPEC
++#define SUBTARGET_CPP_SPEC "-DPSP=1 -D__psp__=1 -D_PSP=1"
++
++/* Get rid of the .pdr section. */
++#undef SUBTARGET_ASM_SPEC
++#define SUBTARGET_ASM_SPEC "-mno-pdr"
+diff -Nbaur gcc-4.1.0/gcc/config/mips/t-allegrex gcc-4.1.0-psp/gcc/config/mips/t-allegrex
+--- gcc-4.1.0/gcc/config/mips/t-allegrex Thu Jan 1 00:00:00 1970
++++ gcc-4.1.0-psp/gcc/config/mips/t-allegrex Sun May 7 22:34:17 2006
+@@ -0,0 +1,29 @@
++# Suppress building libgcc1.a, since the MIPS compiler port is complete
++# and does not need anything from libgcc1.a.
++LIBGCC1 =
++CROSS_LIBGCC1 =
++
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crti.o crtn.o
++# Don't let CTOR_LIST end up in sdata section.
++CRTSTUFF_T_CFLAGS = -G 0
++
++# Assemble startup files.
++$(T)crti.o: $(srcdir)/config/mips/crti.asm $(GCC_PASSES)
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
++ -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/mips/crti.asm
++
++$(T)crtn.o: $(srcdir)/config/mips/crtn.asm $(GCC_PASSES)
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
++ -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/mips/crtn.asm
++
++# We must build libgcc2.a with -G 0, in case the user wants to link
++# without the $gp register.
++TARGET_LIBGCC2_CFLAGS = -G 0
++
++# Build the libraries for both hard and soft floating point
++
++MULTILIB_OPTIONS =
++MULTILIB_DIRNAMES =
++
++LIBGCC = stmp-multilib
++INSTALL_LIBGCC = install-multilib
+diff -Nbaur gcc-4.1.0/gcc/config.gcc gcc-4.1.0-psp/gcc/config.gcc
+--- gcc-4.1.0/gcc/config.gcc Mon Feb 6 16:07:46 2006
++++ gcc-4.1.0-psp/gcc/config.gcc Sun May 7 22:34:17 2006
+@@ -406,12 +406,6 @@
+ tm_defines="${tm_defines} FBSD_MAJOR=5" ;;
+ *-*-freebsd6 | *-*-freebsd[6].*)
+ tm_defines="${tm_defines} FBSD_MAJOR=6" ;;
+- *-*-freebsd7 | *-*-freebsd[7].*)
+- tm_defines="${tm_defines} FBSD_MAJOR=7" ;;
+- *-*-freebsd8 | *-*-freebsd[8].*)
+- tm_defines="${tm_defines} FBSD_MAJOR=8" ;;
+- *-*-freebsd9 | *-*-freebsd[9].*)
+- tm_defines="${tm_defines} FBSD_MAJOR=9" ;;
+ *)
+ echo 'Please update *-*-freebsd* in gcc/config.gcc'
+ exit 1
+@@ -756,11 +750,6 @@
+ tmake_file=bfin/t-bfin-elf
+ use_collect2=no
+ ;;
+-bfin*-uclinux*)
+- tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h bfin/uclinux.h"
+- tmake_file=bfin/t-bfin-elf
+- use_collect2=no
+- ;;
+ bfin*-*)
+ tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h"
+ tmake_file=bfin/t-bfin
+@@ -1582,6 +1571,18 @@
+ mipstx39-*-elf* | mipstx39el-*-elf*)
+ tm_file="elfos.h ${tm_file} mips/r3900.h mips/elf.h"
+ tmake_file=mips/t-r3900
++ use_fixproto=yes
++ ;;
++mipsallegrex-*-elf* | mipsallegrexel-*-elf*)
++ tm_file="elfos.h ${tm_file} mips/elf.h"
++ tmake_file=mips/t-allegrex
++ target_cpu_default="MASK_SINGLE_FLOAT|MASK_DIVIDE_BREAKS"
++ tm_defines="MIPS_ISA_DEFAULT=2 MIPS_CPU_STRING_DEFAULT=\\\"allegrex\\\" MIPS_ABI_DEFAULT=ABI_EABI"
++ case ${target} in
++ mipsallegrex*-psp-elf*)
++ tm_file="${tm_file} mips/psp.h"
++ ;;
++ esac
+ use_fixproto=yes
+ ;;
+ mmix-knuth-mmixware)
+diff -Nbaur gcc-4.1.0/gcc/gcc.c gcc-4.1.0-psp/gcc/gcc.c
+--- gcc-4.1.0/gcc/gcc.c Sat Jan 21 18:29:08 2006
++++ gcc-4.1.0-psp/gcc/gcc.c Sun May 7 22:34:29 2006
+@@ -3250,8 +3250,6 @@
+ gcc_libexec_prefix = make_relative_prefix (argv[0],
+ standard_bindir_prefix,
+ standard_libexec_prefix);
+- if (gcc_exec_prefix)
+- putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
+ }
+ else
+ gcc_libexec_prefix = make_relative_prefix (gcc_exec_prefix,
+@@ -6148,10 +6146,10 @@
+
+ /* We need to check standard_exec_prefix/just_machine_suffix/specs
+ for any override of as, ld and libraries. */
+- specs_file = alloca (strlen (standard_exec_prefix)
++ specs_file = alloca (strlen (gcc_exec_prefix)
+ + strlen (just_machine_suffix) + sizeof ("specs"));
+
+- strcpy (specs_file, standard_exec_prefix);
++ strcpy (specs_file, gcc_exec_prefix);
+ strcat (specs_file, just_machine_suffix);
+ strcat (specs_file, "specs");
+ if (access (specs_file, R_OK) == 0)
+diff -Nbaur gcc-4.1.0/gcc/prefix.c gcc-4.1.0-psp/gcc/prefix.c
+--- gcc-4.1.0/gcc/prefix.c Sat Jun 25 03:02:01 2005
++++ gcc-4.1.0-psp/gcc/prefix.c Sun May 7 22:34:29 2006
+@@ -246,13 +246,16 @@
+ The returned string is always malloc-ed, and the caller is
+ responsible for freeing it. */
+
++
++static const char *old_prefix = PREFIX;
++
+ char *
+ update_path (const char *path, const char *key)
+ {
+ char *result, *p;
+- const int len = strlen (std_prefix);
++ const int len = strlen (old_prefix);
+
+- if (! strncmp (path, std_prefix, len)
++ if (! strncmp (path, old_prefix, len)
+ && (IS_DIR_SEPARATOR(path[len])
+ || path[len] == '\0')
+ && key != 0)
+@@ -354,4 +357,6 @@
+ set_std_prefix (const char *prefix, int len)
+ {
+ std_prefix = save_string (prefix, len);
++
++ putenv (concat ("GCC_EXEC_PREFIX=", std_prefix, NULL));
+ }
+diff -Nbaur gcc-4.1.0/gcc/toplev.c gcc-4.1.0-psp/gcc/toplev.c
+--- gcc-4.1.0/gcc/toplev.c Sat Feb 4 22:13:20 2006
++++ gcc-4.1.0-psp/gcc/toplev.c Sun May 7 22:34:29 2006
+@@ -82,6 +82,7 @@
+ #include "value-prof.h"
+ #include "alloc-pool.h"
+ #include "tree-mudflap.h"
++#include "prefix.h"
+
+ #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
+ #include "dwarf2out.h"
+@@ -1434,6 +1435,10 @@
+ progname = p;
+
+ xmalloc_set_program_name (progname);
++
++ p = getenv("GCC_EXEC_PREFIX");
++ set_std_prefix (p, strlen(p));
++
+
+ hex_init ();
+
+diff -Nbaur gcc-4.1.0/gcc/version.c gcc-4.1.0-psp/gcc/version.c
+--- gcc-4.1.0/gcc/version.c Wed Mar 16 06:04:10 2005
++++ gcc-4.1.0-psp/gcc/version.c Sun May 7 22:37:23 2006
+@@ -8,7 +8,7 @@
+ in parentheses. You may also wish to include a number indicating
+ the revision of your modified compiler. */
+
+-#define VERSUFFIX ""
++#define VERSUFFIX " (PSPDEV 20060507)"
+
+ /* This is the location of the online document giving instructions for
+ reporting bugs. If you distribute a modified version of GCC,
+@@ -17,7 +17,7 @@
+ forward us bugs reported to you, if you determine that they are
+ not bugs in your modifications.) */
+
+-const char bug_report_url[] = "";
++const char bug_report_url[] = "";
+
+ /* The complete version string, assembled from several pieces.
+ BASEVER, DATESTAMP, and DEVPHASE are defined by the Makefile. */
diff --git a/dkpsp/patches/newlib-1.14.0.patch b/dkpsp/patches/newlib-1.14.0.patch
new file mode 100644
index 0000000..1227057
--- /dev/null
+++ b/dkpsp/patches/newlib-1.14.0.patch
@@ -0,0 +1,8016 @@
+--- newlib-1.13.0/config.sub 2004-11-15 20:18:39.000000000 -0500
++++ newlib-psp/config.sub 2005-07-24 01:06:05.000000000 -0400
+@@ -253,6 +253,7 @@
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
++ | mipsallegrex | mipsallegrexel \
+ | mn10200 | mn10300 \
+ | msp430 \
+ | ns16k | ns32k \
+@@ -326,6 +327,7 @@
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
++ | mipsallegrex-* | mipsallegrexel-* \
+ | mmix-* \
+ | msp430-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+@@ -665,6 +667,10 @@
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
++ psp)
++ basic_machine=mipsallegrexel-psp
++ os=-elf
++ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+--- newlib-1.13.0/configure 2004-12-16 14:51:28.000000000 -0500
++++ newlib-psp/configure 2005-07-24 01:06:05.000000000 -0400
+@@ -1507,6 +1507,9 @@
+ mips*-*-linux*)
+ noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+ ;;
++ mipsallegrex*-*-*)
++ noconfigdirs="$noconfigdirs target-libgloss"
++ ;;
+ mips*-*-*)
+ noconfigdirs="$noconfigdirs gprof ${libgcj}"
+ ;;
+--- newlib-1.13.0/configure.in 2004-12-16 14:51:28.000000000 -0500
++++ newlib-psp/configure.in 2005-07-24 01:06:05.000000000 -0400
+@@ -716,6 +716,9 @@
+ mips*-*-linux*)
+ noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+ ;;
++ mipsallegrex*-*-*)
++ noconfigdirs="$noconfigdirs target-libgloss"
++ ;;
+ mips*-*-*)
+ noconfigdirs="$noconfigdirs gprof ${libgcj}"
+ ;;
+--- newlib-1.13.0/newlib/Makefile.am 2004-12-03 18:46:28.000000000 -0500
++++ newlib-psp/newlib/Makefile.am 2005-12-12 19:16:32.000000000 -0500
+@@ -251,6 +251,18 @@
+ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/machine/`basename $$i`; \
+ else true; fi ; \
+ done; \
++ $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/netinet; \
++ for i in $(srcdir)/libc/sys/$(sys_dir)/netinet/*.h; do \
++ if [ -f $$i ]; then \
++ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/netinet/`basename $$i`; \
++ else true; fi ; \
++ done ; \
++ $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/arpa; \
++ for i in $(srcdir)/libc/sys/$(sys_dir)/arpa/*.h; do \
++ if [ -f $$i ]; then \
++ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/arpa/`basename $$i`; \
++ else true; fi ; \
++ done ; \
+ $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/sys; \
+ for i in $(srcdir)/libc/include/sys/*.h; do \
+ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/sys/`basename $$i`; \
+--- newlib-1.13.0/newlib/Makefile.in 2004-12-03 18:46:28.000000000 -0500
++++ newlib-psp/newlib/Makefile.in 2005-12-12 19:16:32.000000000 -0500
+@@ -214,7 +214,7 @@
+
+ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+-TAR = gtar
++TAR = tar
+ GZIP_ENV = --best
+ DIST_SUBDIRS = libc libm doc . @EXTRA_DIRS@
+ EXPECT = `if test -f $(top_builddir)/../expect/expect; then echo $(top_builddir)/../expect/expect; else echo expect; fi`
+@@ -472,7 +472,7 @@
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)newlib.hin$$unique$(LISP)$$tags" \
+- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags newlib.hin $$unique $(LISP) -o $$here/TAGS)
++ || (cd $(srcdir) && etags -o $$here/TAGS $(ETAGS_ARGS) $$tags newlib.hin $$unique $(LISP))
+
+ mostlyclean-tags:
+
+@@ -756,6 +756,18 @@
+ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/machine/`basename $$i`; \
+ else true; fi ; \
+ done; \
++ $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/netinet; \
++ for i in $(srcdir)/libc/sys/$(sys_dir)/netinet/*.h; do \
++ if [ -f $$i ]; then \
++ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/netinet/`basename $$i`; \
++ else true; fi ; \
++ done ; \
++ $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/arpa; \
++ for i in $(srcdir)/libc/sys/$(sys_dir)/arpa/*.h; do \
++ if [ -f $$i ]; then \
++ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/arpa/`basename $$i`; \
++ else true; fi ; \
++ done ; \
+ $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/sys; \
+ for i in $(srcdir)/libc/include/sys/*.h; do \
+ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/sys/`basename $$i`; \
+--- newlib-1.13.0/newlib/configure.host 2004-10-05 15:44:24.000000000 -0400
++++ newlib-psp/newlib/configure.host 2006-04-28 09:34:11.000000000 -0400
+@@ -570,7 +570,14 @@
+ ;;
+ mips*-*-elf*)
+ default_newlib_io_long_long="yes"
+- newlib_cflags="${newlib_cflags} -DMISSING_SYSCALL_NAMES"
++ case "${host}" in
++ mipsallegrex*-psp-*)
++ sys_dir=psp
++ syscall_dir=syscalls
++ newlib_cflags="${newlib_cflags} -G0 -mno-explicit-relocs -DCOMPACT_CTYPE -DCLOCK_PROVIDED -DHAVE_FCNTL -DMALLOC_ALIGNMENT=16 -I${prefix}/psp/sdk/include" ;;
++ *)
++ newlib_cflags="${newlib_cflags} -DMISSING_SYSCALL_NAMES" ;;
++ esac
+ ;;
+ mmix-*)
+ syscall_dir=syscalls
+--- newlib-1.13.0/newlib/libc/include/machine/time.h 2000-12-04 14:06:37.000000000 -0500
++++ newlib-psp/newlib/libc/include/machine/time.h 2005-10-28 12:26:33.000000000 -0400
+@@ -9,6 +9,10 @@
+ #endif
+ #endif /* !__rtems__ */
+
++#if defined(__psp__)
++#define _CLOCKS_PER_SEC_ 1000000
++#endif
++
+ #endif /* _MACHTIME_H_ */
+
+
+--- newlib-1.13.0/newlib/libc/include/sys/config.h 2004-06-22 17:54:51.000000000 -0400
++++ newlib-psp/newlib/libc/include/sys/config.h 2005-09-07 13:04:52.000000000 -0400
+@@ -94,6 +94,12 @@
+ #endif
+ #endif
+
++/* We compile newlib with -G0 for PSP, but if we're compiling an app with $gp enabled,
++ then _impure_ptr is expected to live in .sdata. */
++#if defined(__psp__)
++#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata")))
++#endif
++
+ #ifdef __xstormy16__
+ #define __SMALL_BITFIELDS
+ #undef INT_MAX
+--- newlib-1.13.0/newlib/libc/include/sys/types.h 2003-07-02 16:32:07.000000000 -0400
++++ newlib-psp/newlib/libc/include/sys/types.h 2005-12-12 19:16:32.000000000 -0500
+@@ -188,52 +188,6 @@
+
+ typedef unsigned short nlink_t;
+
+-/* We don't define fd_set and friends if we are compiling POSIX
+- source, or if we have included (or may include as indicated
+- by __USE_W32_SOCKETS) the W32api winsock[2].h header which
+- defines Windows versions of them. Note that a program which
+- includes the W32api winsock[2].h header must know what it is doing;
+- it must not call the cygwin32 select function.
+-*/
+-# if !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined (__USE_W32_SOCKETS))
+-# define _SYS_TYPES_FD_SET
+-# define NBBY 8 /* number of bits in a byte */
+-/*
+- * Select uses bit masks of file descriptors in longs.
+- * These macros manipulate such bit fields (the filesystem macros use chars).
+- * FD_SETSIZE may be defined by the user, but the default here
+- * should be >= NOFILE (param.h).
+- */
+-# ifndef FD_SETSIZE
+-# define FD_SETSIZE 64
+-# endif
+-
+-typedef long fd_mask;
+-# define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */
+-# ifndef howmany
+-# define howmany(x,y) (((x)+((y)-1))/(y))
+-# endif
+-
+-/* We use a macro for fd_set so that including Sockets.h afterwards
+- can work. */
+-typedef struct _types_fd_set {
+- fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
+-} _types_fd_set;
+-
+-#define fd_set _types_fd_set
+-
+-# define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1L << ((n) % NFDBITS)))
+-# define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1L << ((n) % NFDBITS)))
+-# define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1L << ((n) % NFDBITS)))
+-# define FD_ZERO(p) (__extension__ (void)({ \
+- size_t __i; \
+- char *__tmp = (char *)p; \
+- for (__i = 0; __i < sizeof (*(p)); ++__i) \
+- *__tmp++ = 0; \
+-}))
+-
+-# endif /* !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined (__USE_W32_SOCKETS)) */
+-
+ #undef __MS_types__
+ #undef _ST_INT32
+
+--- newlib-1.13.0/newlib/libc/sys/psp/Makefile.am 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/Makefile.am 2006-04-28 15:21:57.000000000 -0400
+@@ -0,0 +1,65 @@
++## Process this file with automake to generate Makefile.in
++
++AUTOMAKE_OPTIONS = cygnus
++
++INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
++
++noinst_LIBRARIES = lib.a
++
++LIBCGLUE_MULT_OBJS = _close.o _exit.o _fork.o _fstat.o _getpid.o \
++ _gettimeofday.o _kill.o _lseek.o _open.o _read.o \
++ _sbrk.o _wait.o _write.o clock.o isatty.o time.o \
++ _link.o _unlink.o sleep.o opendir.o readdir.o \
++ closedir.o getcwd.o chdir.o mkdir.o rmdir.o \
++ realpath.o _stat.o truncate.o access.o tzset.o \
++ __psp_set_errno.o mlock.o _fcntl.o
++
++SOCKET_MULT_OBJS = socket.o accept.o bind.o connect.o getsockopt.o \
++ listen.o recv.o recvfrom.o send.o sendto.o \
++ setsockopt.o shutdown.o getsockname.o getpeername.o \
++ inet_ntoa.o
++
++PIPE_OBJS = pipe.o
++
++FDMAN_OBJS = fdman.o
++
++SELECT_OBJS = select.o
++
++INTERRUPT_OBJS = interrupt.o
++
++XPRINTF_MULT_OBJS = vxprintf.o _xprintf.o __sout.o vsnprintf.o snprintf.o vsprintf.o sprintf.o __mout.o mprintf.o vmprintf.o asprintf.o vasprintf.o __fout.o fprintf.o vfprintf.o printf.o vprintf.o _sprintf_r.o
++
++NETDB_MULT_OBJS = h_errno.o gethostbyaddr.o gethostbyname.o
++
++lib_a_SOURCES = libcglue.c socket.c pspcwd.c xprintf.c netdb.c pipe.c fdman.c select.c interrupt.S
++lib_a_LIBADD = $(LIBCGLUE_MULT_OBJS) $(SOCKET_MULT_OBJS) $(XPRINTF_MULT_OBJS) \
++ $(NETDB_MULT_OBJS) $(PIPE_OBJS) $(FDMAN_OBJS) $(SELECT_OBJS) $(INTERRUPT_OBJS)
++
++all: crt0.o
++
++$(LIBCGLUE_MULT_OBJS): libcglue.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(SOCKET_MULT_OBJS): socket.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(XPRINTF_MULT_OBJS): xprintf.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(NETDB_MULT_OBJS): netdb.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(PIPE_OBJS): pipe.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(FDMAN_OBJS): fdman.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(SELECT_OBJS): select.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(INTERRUPT_OBJS): interrupt.S
++ $(COMPILE) -DF_$* $< -c -o $@
++
++ACLOCAL_AMFLAGS = -I ../../..
++CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
+--- newlib-1.13.0/newlib/libc/sys/psp/Makefile.in 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/Makefile.in 2006-04-28 15:22:03.000000000 -0400
+@@ -0,0 +1,389 @@
++# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am
++
++# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
++# This Makefile.in is free software; the Free Software Foundation
++# gives unlimited permission to copy and/or distribute it,
++# with or without modifications, as long as this notice is preserved.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++# PARTICULAR PURPOSE.
++
++
++SHELL = @SHELL@
++
++srcdir = @srcdir@
++top_srcdir = @top_srcdir@
++VPATH = @srcdir@
++prefix = @prefix@
++exec_prefix = @exec_prefix@
++
++bindir = @bindir@
++sbindir = @sbindir@
++libexecdir = @libexecdir@
++datadir = @datadir@
++sysconfdir = @sysconfdir@
++sharedstatedir = @sharedstatedir@
++localstatedir = @localstatedir@
++libdir = @libdir@
++infodir = @infodir@
++mandir = @mandir@
++includedir = @includedir@
++oldincludedir = /usr/include
++
++DESTDIR =
++
++pkgdatadir = $(datadir)/@PACKAGE@
++pkglibdir = $(libdir)/@PACKAGE@
++pkgincludedir = $(includedir)/@PACKAGE@
++
++top_builddir = .
++
++ACLOCAL = @ACLOCAL@
++AUTOCONF = @AUTOCONF@
++AUTOMAKE = @AUTOMAKE@
++AUTOHEADER = @AUTOHEADER@
++
++INSTALL = @INSTALL@
++INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
++INSTALL_DATA = @INSTALL_DATA@
++INSTALL_SCRIPT = @INSTALL_SCRIPT@
++transform = @program_transform_name@
++
++NORMAL_INSTALL = :
++PRE_INSTALL = :
++POST_INSTALL = :
++NORMAL_UNINSTALL = :
++PRE_UNINSTALL = :
++POST_UNINSTALL = :
++build_alias = @build_alias@
++build_triplet = @build@
++host_alias = @host_alias@
++host_triplet = @host@
++target_alias = @target_alias@
++target_triplet = @target@
++AR = @AR@
++AS = @AS@
++CC = @CC@
++CPP = @CPP@
++EXEEXT = @EXEEXT@
++HAVE_LIB = @HAVE_LIB@
++LDFLAGS = @LDFLAGS@
++LIB = @LIB@
++LTLIB = @LTLIB@
++MAINT = @MAINT@
++MAKEINFO = @MAKEINFO@
++NEWLIB_CFLAGS = @NEWLIB_CFLAGS@
++OBJEXT = @OBJEXT@
++PACKAGE = @PACKAGE@
++RANLIB = @RANLIB@
++VERSION = @VERSION@
++aext = @aext@
++libm_machine_dir = @libm_machine_dir@
++machine_dir = @machine_dir@
++newlib_basedir = @newlib_basedir@
++oext = @oext@
++sys_dir = @sys_dir@
++
++AUTOMAKE_OPTIONS = cygnus
++
++INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
++
++noinst_LIBRARIES = lib.a
++
++LIBCGLUE_MULT_OBJS = _close.o _exit.o _fork.o _fstat.o _getpid.o _gettimeofday.o _kill.o _lseek.o _open.o _read.o _sbrk.o _wait.o _write.o clock.o isatty.o time.o _link.o _unlink.o sleep.o opendir.o readdir.o closedir.o getcwd.o chdir.o mkdir.o rmdir.o realpath.o _stat.o truncate.o access.o tzset.o __psp_set_errno.o mlock.o _fcntl.o
++
++
++SOCKET_MULT_OBJS = socket.o accept.o bind.o connect.o getsockopt.o listen.o recv.o recvfrom.o send.o sendto.o setsockopt.o shutdown.o getsockname.o getpeername.o inet_ntoa.o
++
++
++PIPE_OBJS = pipe.o
++
++FDMAN_OBJS = fdman.o
++
++SELECT_OBJS = select.o
++
++INTERRUPT_OBJS = interrupt.o
++
++XPRINTF_MULT_OBJS = vxprintf.o _xprintf.o __sout.o vsnprintf.o snprintf.o vsprintf.o sprintf.o __mout.o mprintf.o vmprintf.o asprintf.o vasprintf.o __fout.o fprintf.o vfprintf.o printf.o vprintf.o _sprintf_r.o
++
++NETDB_MULT_OBJS = h_errno.o gethostbyaddr.o gethostbyname.o
++
++lib_a_SOURCES = libcglue.c socket.c pspcwd.c xprintf.c netdb.c pipe.c fdman.c select.c interrupt.S
++lib_a_LIBADD = $(LIBCGLUE_MULT_OBJS) $(SOCKET_MULT_OBJS) $(XPRINTF_MULT_OBJS) $(NETDB_MULT_OBJS) $(PIPE_OBJS) $(FDMAN_OBJS) $(SELECT_OBJS) $(INTERRUPT_OBJS)
++
++
++ACLOCAL_AMFLAGS = -I ../../..
++CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
++mkinstalldirs = $(SHELL) $(top_srcdir)/../../../../mkinstalldirs
++CONFIG_CLEAN_FILES =
++LIBRARIES = $(noinst_LIBRARIES)
++
++
++DEFS = @DEFS@ -I. -I$(srcdir)
++CPPFLAGS = @CPPFLAGS@
++LIBS = @LIBS@
++lib_a_DEPENDENCIES = _close.o _exit.o _fork.o _fstat.o _getpid.o \
++_gettimeofday.o _kill.o _lseek.o _open.o _read.o _sbrk.o _wait.o \
++_write.o clock.o isatty.o time.o _link.o _unlink.o sleep.o opendir.o \
++readdir.o closedir.o getcwd.o chdir.o mkdir.o rmdir.o realpath.o \
++_stat.o truncate.o access.o tzset.o __psp_set_errno.o mlock.o _fcntl.o \
++socket.o accept.o bind.o connect.o getsockopt.o listen.o recv.o \
++recvfrom.o send.o sendto.o setsockopt.o shutdown.o getsockname.o \
++getpeername.o inet_ntoa.o vxprintf.o _xprintf.o __sout.o vsnprintf.o \
++snprintf.o vsprintf.o sprintf.o __mout.o mprintf.o vmprintf.o \
++asprintf.o vasprintf.o __fout.o fprintf.o vfprintf.o printf.o vprintf.o \
++_sprintf_r.o h_errno.o gethostbyaddr.o gethostbyname.o pipe.o fdman.o \
++select.o interrupt.o
++lib_a_OBJECTS = libcglue.o socket.o pspcwd.o xprintf.o netdb.o pipe.o \
++fdman.o select.o interrupt.o
++CFLAGS = @CFLAGS@
++COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
++CCLD = $(CC)
++LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
++DIST_COMMON = README Makefile.am Makefile.in aclocal.m4 configure \
++configure.in
++
++
++DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
++
++TAR = tar
++GZIP_ENV = --best
++SOURCES = $(lib_a_SOURCES)
++OBJECTS = $(lib_a_OBJECTS)
++
++all: all-redirect
++.SUFFIXES:
++.SUFFIXES: .S .c .o .s
++$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
++ cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile
++
++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
++ cd $(top_builddir) \
++ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
++
++$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in \
++ ../../../acinclude.m4 ../../../aclocal.m4 \
++ ../../../libtool.m4
++ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
++
++config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++ $(SHELL) ./config.status --recheck
++$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
++ cd $(srcdir) && $(AUTOCONF)
++
++mostlyclean-noinstLIBRARIES:
++
++clean-noinstLIBRARIES:
++ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
++
++distclean-noinstLIBRARIES:
++
++maintainer-clean-noinstLIBRARIES:
++
++.c.o:
++ $(COMPILE) -c $<
++
++.s.o:
++ $(COMPILE) -c $<
++
++.S.o:
++ $(COMPILE) -c $<
++
++mostlyclean-compile:
++ -rm -f *.o core *.core
++
++clean-compile:
++
++distclean-compile:
++ -rm -f *.tab.c
++
++maintainer-clean-compile:
++
++lib.a: $(lib_a_OBJECTS) $(lib_a_DEPENDENCIES)
++ -rm -f lib.a
++ $(AR) cru lib.a $(lib_a_OBJECTS) $(lib_a_LIBADD)
++ $(RANLIB) lib.a
++
++tags: TAGS
++
++ID: $(HEADERS) $(SOURCES) $(LISP)
++ list='$(SOURCES) $(HEADERS)'; \
++ unique=`for i in $$list; do echo $$i; done | \
++ awk ' { files[$$0] = 1; } \
++ END { for (i in files) print i; }'`; \
++ here=`pwd` && cd $(srcdir) \
++ && mkid -f$$here/ID $$unique $(LISP)
++
++TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
++ tags=; \
++ here=`pwd`; \
++ list='$(SOURCES) $(HEADERS)'; \
++ unique=`for i in $$list; do echo $$i; done | \
++ awk ' { files[$$0] = 1; } \
++ END { for (i in files) print i; }'`; \
++ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
++ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
++
++mostlyclean-tags:
++
++clean-tags:
++
++distclean-tags:
++ -rm -f TAGS ID
++
++maintainer-clean-tags:
++
++distdir = $(PACKAGE)-$(VERSION)
++top_distdir = $(distdir)
++
++# This target untars the dist file and tries a VPATH configuration. Then
++# it guarantees that the distribution is self-contained by making another
++# tarfile.
++distcheck: dist
++ -rm -rf $(distdir)
++ GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
++ mkdir $(distdir)/=build
++ mkdir $(distdir)/=inst
++ dc_install_base=`cd $(distdir)/=inst && pwd`; \
++ cd $(distdir)/=build \
++ && ../configure --srcdir=.. --prefix=$$dc_install_base \
++ && $(MAKE) $(AM_MAKEFLAGS) \
++ && $(MAKE) $(AM_MAKEFLAGS) dvi \
++ && $(MAKE) $(AM_MAKEFLAGS) check \
++ && $(MAKE) $(AM_MAKEFLAGS) install \
++ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
++ && $(MAKE) $(AM_MAKEFLAGS) dist
++ -rm -rf $(distdir)
++ @banner="$(distdir).tar.gz is ready for distribution"; \
++ dashes=`echo "$$banner" | sed s/./=/g`; \
++ echo "$$dashes"; \
++ echo "$$banner"; \
++ echo "$$dashes"
++dist: distdir
++ -chmod -R a+r $(distdir)
++ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
++ -rm -rf $(distdir)
++dist-all: distdir
++ -chmod -R a+r $(distdir)
++ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
++ -rm -rf $(distdir)
++distdir: $(DISTFILES)
++ -rm -rf $(distdir)
++ mkdir $(distdir)
++ -chmod 777 $(distdir)
++ @for file in $(DISTFILES); do \
++ if test -f $$file; then d=.; else d=$(srcdir); fi; \
++ if test -d $$d/$$file; then \
++ cp -pr $$d/$$file $(distdir)/$$file; \
++ else \
++ test -f $(distdir)/$$file \
++ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
++ || cp -p $$d/$$file $(distdir)/$$file || :; \
++ fi; \
++ done
++info-am:
++info: info-am
++dvi-am:
++dvi: dvi-am
++check-am:
++check: check-am
++installcheck-am:
++installcheck: installcheck-am
++install-info-am:
++install-info: install-info-am
++install-exec-am:
++install-exec: install-exec-am
++
++install-data-am:
++install-data: install-data-am
++
++install-am: all-am
++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
++install: install-am
++uninstall-am:
++uninstall: uninstall-am
++all-am: Makefile $(LIBRARIES)
++all-redirect: all-am
++install-strip:
++ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
++installdirs:
++
++
++mostlyclean-generic:
++
++clean-generic:
++
++distclean-generic:
++ -rm -f Makefile $(CONFIG_CLEAN_FILES)
++ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
++
++maintainer-clean-generic:
++mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
++ mostlyclean-tags mostlyclean-generic
++
++mostlyclean: mostlyclean-am
++
++clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
++ mostlyclean-am
++
++clean: clean-am
++
++distclean-am: distclean-noinstLIBRARIES distclean-compile \
++ distclean-tags distclean-generic clean-am
++
++distclean: distclean-am
++ -rm -f config.status
++
++maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
++ maintainer-clean-compile maintainer-clean-tags \
++ maintainer-clean-generic distclean-am
++ @echo "This command is intended for maintainers to use;"
++ @echo "it deletes files that may require special tools to rebuild."
++
++maintainer-clean: maintainer-clean-am
++ -rm -f config.status
++
++.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
++clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
++mostlyclean-compile distclean-compile clean-compile \
++maintainer-clean-compile tags mostlyclean-tags distclean-tags \
++clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
++check-am installcheck-am installcheck install-info-am install-info \
++install-exec-am install-exec install-data-am install-data install-am \
++install uninstall-am uninstall all-redirect all-am all installdirs \
++mostlyclean-generic distclean-generic clean-generic \
++maintainer-clean-generic clean mostlyclean distclean maintainer-clean
++
++
++all: crt0.o
++
++$(LIBCGLUE_MULT_OBJS): libcglue.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(SOCKET_MULT_OBJS): socket.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(XPRINTF_MULT_OBJS): xprintf.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(NETDB_MULT_OBJS): netdb.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(PIPE_OBJS): pipe.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(FDMAN_OBJS): fdman.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(SELECT_OBJS): select.c
++ $(COMPILE) -DF_$* $< -c -o $@
++
++$(INTERRUPT_OBJS): interrupt.S
++ $(COMPILE) -DF_$* $< -c -o $@
++
++# Tell versions [3.59,3.63) of GNU make to not export all variables.
++# Otherwise a system limit (for SysV at least) may be exceeded.
++.NOEXPORT:
+--- newlib-1.13.0/newlib/libc/sys/psp/README 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/README 2006-05-02 11:27:31.000000000 -0400
+@@ -0,0 +1,16 @@
++Newlib for PSP
++--
++
++This sys/psp directory depends on PSPSDK headers. It expects them to live in
++${prefix}/psp/sdk/include (see newlib/configure.host).
++
++I used automake 1.4-p6 to generate aclocal.m4 and Makefile.in:
++
++ aclocal -I ../../..
++ automake --cygnus
++
++Autoconf refused to work for me, so I copied configure from sys/sh and modified
++$ac_unique_file to point libcglue.c.
++
++--
++Marcus R. Brown
+--- newlib-1.13.0/newlib/libc/sys/psp/aclocal.m4 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/aclocal.m4 2006-05-02 11:27:31.000000000 -0400
+@@ -0,0 +1,1185 @@
++dnl aclocal.m4 generated automatically by aclocal 1.4-p6
++
++dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
++dnl This file is free software; the Free Software Foundation
++dnl gives unlimited permission to copy and/or distribute it,
++dnl with or without modifications, as long as this notice is preserved.
++
++dnl This program is distributed in the hope that it will be useful,
++dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++dnl PARTICULAR PURPOSE.
++
++# lib-prefix.m4 serial 4 (gettext-0.14.2)
++dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
++dnl This file is free software; the Free Software Foundation
++dnl gives unlimited permission to copy and/or distribute it,
++dnl with or without modifications, as long as this notice is preserved.
++
++dnl From Bruno Haible.
++
++dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
++dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
++dnl require excessive bracketing.
++ifdef([AC_HELP_STRING],
++[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
++[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
++
++dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
++dnl to access previously installed libraries. The basic assumption is that
++dnl a user will want packages to use other packages he previously installed
++dnl with the same --prefix option.
++dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
++dnl libraries, but is otherwise very convenient.
++AC_DEFUN([AC_LIB_PREFIX],
++[
++ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
++ AC_REQUIRE([AC_PROG_CC])
++ AC_REQUIRE([AC_CANONICAL_HOST])
++ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
++ dnl By default, look in $includedir and $libdir.
++ use_additional=yes
++ AC_LIB_WITH_FINAL_PREFIX([
++ eval additional_includedir=\"$includedir\"
++ eval additional_libdir=\"$libdir\"
++ ])
++ AC_LIB_ARG_WITH([lib-prefix],
++[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
++ --without-lib-prefix don't search for libraries in includedir and libdir],
++[
++ if test "X$withval" = "Xno"; then
++ use_additional=no
++ else
++ if test "X$withval" = "X"; then
++ AC_LIB_WITH_FINAL_PREFIX([
++ eval additional_includedir=\"$includedir\"
++ eval additional_libdir=\"$libdir\"
++ ])
++ else
++ additional_includedir="$withval/include"
++ additional_libdir="$withval/lib"
++ fi
++ fi
++])
++ if test $use_additional = yes; then
++ dnl Potentially add $additional_includedir to $CPPFLAGS.
++ dnl But don't add it
++ dnl 1. if it's the standard /usr/include,
++ dnl 2. if it's already present in $CPPFLAGS,
++ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
++ dnl 4. if it doesn't exist as a directory.
++ if test "X$additional_includedir" != "X/usr/include"; then
++ haveit=
++ for x in $CPPFLAGS; do
++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
++ if test "X$x" = "X-I$additional_includedir"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ if test "X$additional_includedir" = "X/usr/local/include"; then
++ if test -n "$GCC"; then
++ case $host_os in
++ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
++ esac
++ fi
++ fi
++ if test -z "$haveit"; then
++ if test -d "$additional_includedir"; then
++ dnl Really add $additional_includedir to $CPPFLAGS.
++ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
++ fi
++ fi
++ fi
++ fi
++ dnl Potentially add $additional_libdir to $LDFLAGS.
++ dnl But don't add it
++ dnl 1. if it's the standard /usr/lib,
++ dnl 2. if it's already present in $LDFLAGS,
++ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
++ dnl 4. if it doesn't exist as a directory.
++ if test "X$additional_libdir" != "X/usr/lib"; then
++ haveit=
++ for x in $LDFLAGS; do
++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
++ if test "X$x" = "X-L$additional_libdir"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ if test "X$additional_libdir" = "X/usr/local/lib"; then
++ if test -n "$GCC"; then
++ case $host_os in
++ linux*) haveit=yes;;
++ esac
++ fi
++ fi
++ if test -z "$haveit"; then
++ if test -d "$additional_libdir"; then
++ dnl Really add $additional_libdir to $LDFLAGS.
++ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
++ fi
++ fi
++ fi
++ fi
++ fi
++])
++
++dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
++dnl acl_final_exec_prefix, containing the values to which $prefix and
++dnl $exec_prefix will expand at the end of the configure script.
++AC_DEFUN([AC_LIB_PREPARE_PREFIX],
++[
++ dnl Unfortunately, prefix and exec_prefix get only finally determined
++ dnl at the end of configure.
++ if test "X$prefix" = "XNONE"; then
++ acl_final_prefix="$ac_default_prefix"
++ else
++ acl_final_prefix="$prefix"
++ fi
++ if test "X$exec_prefix" = "XNONE"; then
++ acl_final_exec_prefix='${prefix}'
++ else
++ acl_final_exec_prefix="$exec_prefix"
++ fi
++ acl_save_prefix="$prefix"
++ prefix="$acl_final_prefix"
++ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
++ prefix="$acl_save_prefix"
++])
++
++dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
++dnl variables prefix and exec_prefix bound to the values they will have
++dnl at the end of the configure script.
++AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
++[
++ acl_save_prefix="$prefix"
++ prefix="$acl_final_prefix"
++ acl_save_exec_prefix="$exec_prefix"
++ exec_prefix="$acl_final_exec_prefix"
++ $1
++ exec_prefix="$acl_save_exec_prefix"
++ prefix="$acl_save_prefix"
++])
++
++# lib-link.m4 serial 6 (gettext-0.14.3)
++dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
++dnl This file is free software; the Free Software Foundation
++dnl gives unlimited permission to copy and/or distribute it,
++dnl with or without modifications, as long as this notice is preserved.
++
++dnl From Bruno Haible.
++
++AC_PREREQ(2.50)
++
++dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
++dnl the libraries corresponding to explicit and implicit dependencies.
++dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
++dnl augments the CPPFLAGS variable.
++AC_DEFUN([AC_LIB_LINKFLAGS],
++[
++ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
++ AC_REQUIRE([AC_LIB_RPATH])
++ define([Name],[translit([$1],[./-], [___])])
++ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
++ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
++ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
++ AC_LIB_LINKFLAGS_BODY([$1], [$2])
++ ac_cv_lib[]Name[]_libs="$LIB[]NAME"
++ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
++ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
++ ])
++ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
++ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
++ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
++ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
++ AC_SUBST([LIB]NAME)
++ AC_SUBST([LTLIB]NAME)
++ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
++ dnl results of this search when this library appears as a dependency.
++ HAVE_LIB[]NAME=yes
++ undefine([Name])
++ undefine([NAME])
++])
++
++dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
++dnl searches for libname and the libraries corresponding to explicit and
++dnl implicit dependencies, together with the specified include files and
++dnl the ability to compile and link the specified testcode. If found, it
++dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
++dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
++dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
++dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
++AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
++[
++ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
++ AC_REQUIRE([AC_LIB_RPATH])
++ define([Name],[translit([$1],[./-], [___])])
++ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
++ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
++
++ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
++ dnl accordingly.
++ AC_LIB_LINKFLAGS_BODY([$1], [$2])
++
++ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
++ dnl because if the user has installed lib[]Name and not disabled its use
++ dnl via --without-lib[]Name-prefix, he wants to use it.
++ ac_save_CPPFLAGS="$CPPFLAGS"
++ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
++
++ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
++ ac_save_LIBS="$LIBS"
++ LIBS="$LIBS $LIB[]NAME"
++ AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
++ LIBS="$ac_save_LIBS"
++ ])
++ if test "$ac_cv_lib[]Name" = yes; then
++ HAVE_LIB[]NAME=yes
++ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
++ AC_MSG_CHECKING([how to link with lib[]$1])
++ AC_MSG_RESULT([$LIB[]NAME])
++ else
++ HAVE_LIB[]NAME=no
++ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
++ dnl $INC[]NAME either.
++ CPPFLAGS="$ac_save_CPPFLAGS"
++ LIB[]NAME=
++ LTLIB[]NAME=
++ fi
++ AC_SUBST([HAVE_LIB]NAME)
++ AC_SUBST([LIB]NAME)
++ AC_SUBST([LTLIB]NAME)
++ undefine([Name])
++ undefine([NAME])
++])
++
++dnl Determine the platform dependent parameters needed to use rpath:
++dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
++dnl hardcode_direct, hardcode_minus_L.
++AC_DEFUN([AC_LIB_RPATH],
++[
++ dnl Tell automake >= 1.10 to complain if config.rpath is missing.
++ m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
++ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
++ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
++ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
++ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
++ AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
++ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
++ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
++ . ./conftest.sh
++ rm -f ./conftest.sh
++ acl_cv_rpath=done
++ ])
++ wl="$acl_cv_wl"
++ libext="$acl_cv_libext"
++ shlibext="$acl_cv_shlibext"
++ hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
++ hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
++ hardcode_direct="$acl_cv_hardcode_direct"
++ hardcode_minus_L="$acl_cv_hardcode_minus_L"
++ dnl Determine whether the user wants rpath handling at all.
++ AC_ARG_ENABLE(rpath,
++ [ --disable-rpath do not hardcode runtime library paths],
++ :, enable_rpath=yes)
++])
++
++dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
++dnl the libraries corresponding to explicit and implicit dependencies.
++dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
++AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
++[
++ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
++ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
++ dnl By default, look in $includedir and $libdir.
++ use_additional=yes
++ AC_LIB_WITH_FINAL_PREFIX([
++ eval additional_includedir=\"$includedir\"
++ eval additional_libdir=\"$libdir\"
++ ])
++ AC_LIB_ARG_WITH([lib$1-prefix],
++[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
++ --without-lib$1-prefix don't search for lib$1 in includedir and libdir],
++[
++ if test "X$withval" = "Xno"; then
++ use_additional=no
++ else
++ if test "X$withval" = "X"; then
++ AC_LIB_WITH_FINAL_PREFIX([
++ eval additional_includedir=\"$includedir\"
++ eval additional_libdir=\"$libdir\"
++ ])
++ else
++ additional_includedir="$withval/include"
++ additional_libdir="$withval/lib"
++ fi
++ fi
++])
++ dnl Search the library and its dependencies in $additional_libdir and
++ dnl $LDFLAGS. Using breadth-first-seach.
++ LIB[]NAME=
++ LTLIB[]NAME=
++ INC[]NAME=
++ rpathdirs=
++ ltrpathdirs=
++ names_already_handled=
++ names_next_round='$1 $2'
++ while test -n "$names_next_round"; do
++ names_this_round="$names_next_round"
++ names_next_round=
++ for name in $names_this_round; do
++ already_handled=
++ for n in $names_already_handled; do
++ if test "$n" = "$name"; then
++ already_handled=yes
++ break
++ fi
++ done
++ if test -z "$already_handled"; then
++ names_already_handled="$names_already_handled $name"
++ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
++ dnl or AC_LIB_HAVE_LINKFLAGS call.
++ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
++ eval value=\"\$HAVE_LIB$uppername\"
++ if test -n "$value"; then
++ if test "$value" = yes; then
++ eval value=\"\$LIB$uppername\"
++ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
++ eval value=\"\$LTLIB$uppername\"
++ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
++ else
++ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
++ dnl that this library doesn't exist. So just drop it.
++ :
++ fi
++ else
++ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
++ dnl and the already constructed $LIBNAME/$LTLIBNAME.
++ found_dir=
++ found_la=
++ found_so=
++ found_a=
++ if test $use_additional = yes; then
++ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
++ found_dir="$additional_libdir"
++ found_so="$additional_libdir/lib$name.$shlibext"
++ if test -f "$additional_libdir/lib$name.la"; then
++ found_la="$additional_libdir/lib$name.la"
++ fi
++ else
++ if test -f "$additional_libdir/lib$name.$libext"; then
++ found_dir="$additional_libdir"
++ found_a="$additional_libdir/lib$name.$libext"
++ if test -f "$additional_libdir/lib$name.la"; then
++ found_la="$additional_libdir/lib$name.la"
++ fi
++ fi
++ fi
++ fi
++ if test "X$found_dir" = "X"; then
++ for x in $LDFLAGS $LTLIB[]NAME; do
++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
++ case "$x" in
++ -L*)
++ dir=`echo "X$x" | sed -e 's/^X-L//'`
++ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
++ found_dir="$dir"
++ found_so="$dir/lib$name.$shlibext"
++ if test -f "$dir/lib$name.la"; then
++ found_la="$dir/lib$name.la"
++ fi
++ else
++ if test -f "$dir/lib$name.$libext"; then
++ found_dir="$dir"
++ found_a="$dir/lib$name.$libext"
++ if test -f "$dir/lib$name.la"; then
++ found_la="$dir/lib$name.la"
++ fi
++ fi
++ fi
++ ;;
++ esac
++ if test "X$found_dir" != "X"; then
++ break
++ fi
++ done
++ fi
++ if test "X$found_dir" != "X"; then
++ dnl Found the library.
++ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
++ if test "X$found_so" != "X"; then
++ dnl Linking with a shared library. We attempt to hardcode its
++ dnl directory into the executable's runpath, unless it's the
++ dnl standard /usr/lib.
++ if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
++ dnl No hardcoding is needed.
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
++ else
++ dnl Use an explicit option to hardcode DIR into the resulting
++ dnl binary.
++ dnl Potentially add DIR to ltrpathdirs.
++ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
++ haveit=
++ for x in $ltrpathdirs; do
++ if test "X$x" = "X$found_dir"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ ltrpathdirs="$ltrpathdirs $found_dir"
++ fi
++ dnl The hardcoding into $LIBNAME is system dependent.
++ if test "$hardcode_direct" = yes; then
++ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
++ dnl resulting binary.
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
++ else
++ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
++ dnl Use an explicit option to hardcode DIR into the resulting
++ dnl binary.
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
++ dnl Potentially add DIR to rpathdirs.
++ dnl The rpathdirs will be appended to $LIBNAME at the end.
++ haveit=
++ for x in $rpathdirs; do
++ if test "X$x" = "X$found_dir"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ rpathdirs="$rpathdirs $found_dir"
++ fi
++ else
++ dnl Rely on "-L$found_dir".
++ dnl But don't add it if it's already contained in the LDFLAGS
++ dnl or the already constructed $LIBNAME
++ haveit=
++ for x in $LDFLAGS $LIB[]NAME; do
++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
++ if test "X$x" = "X-L$found_dir"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
++ fi
++ if test "$hardcode_minus_L" != no; then
++ dnl FIXME: Not sure whether we should use
++ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
++ dnl here.
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
++ else
++ dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
++ dnl here, because this doesn't fit in flags passed to the
++ dnl compiler. So give up. No hardcoding. This affects only
++ dnl very old systems.
++ dnl FIXME: Not sure whether we should use
++ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
++ dnl here.
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
++ fi
++ fi
++ fi
++ fi
++ else
++ if test "X$found_a" != "X"; then
++ dnl Linking with a static library.
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
++ else
++ dnl We shouldn't come here, but anyway it's good to have a
++ dnl fallback.
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
++ fi
++ fi
++ dnl Assume the include files are nearby.
++ additional_includedir=
++ case "$found_dir" in
++ */lib | */lib/)
++ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
++ additional_includedir="$basedir/include"
++ ;;
++ esac
++ if test "X$additional_includedir" != "X"; then
++ dnl Potentially add $additional_includedir to $INCNAME.
++ dnl But don't add it
++ dnl 1. if it's the standard /usr/include,
++ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
++ dnl 3. if it's already present in $CPPFLAGS or the already
++ dnl constructed $INCNAME,
++ dnl 4. if it doesn't exist as a directory.
++ if test "X$additional_includedir" != "X/usr/include"; then
++ haveit=
++ if test "X$additional_includedir" = "X/usr/local/include"; then
++ if test -n "$GCC"; then
++ case $host_os in
++ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
++ esac
++ fi
++ fi
++ if test -z "$haveit"; then
++ for x in $CPPFLAGS $INC[]NAME; do
++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
++ if test "X$x" = "X-I$additional_includedir"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ if test -d "$additional_includedir"; then
++ dnl Really add $additional_includedir to $INCNAME.
++ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
++ fi
++ fi
++ fi
++ fi
++ fi
++ dnl Look for dependencies.
++ if test -n "$found_la"; then
++ dnl Read the .la file. It defines the variables
++ dnl dlname, library_names, old_library, dependency_libs, current,
++ dnl age, revision, installed, dlopen, dlpreopen, libdir.
++ save_libdir="$libdir"
++ case "$found_la" in
++ */* | *\\*) . "$found_la" ;;
++ *) . "./$found_la" ;;
++ esac
++ libdir="$save_libdir"
++ dnl We use only dependency_libs.
++ for dep in $dependency_libs; do
++ case "$dep" in
++ -L*)
++ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
++ dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
++ dnl But don't add it
++ dnl 1. if it's the standard /usr/lib,
++ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
++ dnl 3. if it's already present in $LDFLAGS or the already
++ dnl constructed $LIBNAME,
++ dnl 4. if it doesn't exist as a directory.
++ if test "X$additional_libdir" != "X/usr/lib"; then
++ haveit=
++ if test "X$additional_libdir" = "X/usr/local/lib"; then
++ if test -n "$GCC"; then
++ case $host_os in
++ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
++ esac
++ fi
++ fi
++ if test -z "$haveit"; then
++ haveit=
++ for x in $LDFLAGS $LIB[]NAME; do
++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
++ if test "X$x" = "X-L$additional_libdir"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ if test -d "$additional_libdir"; then
++ dnl Really add $additional_libdir to $LIBNAME.
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
++ fi
++ fi
++ haveit=
++ for x in $LDFLAGS $LTLIB[]NAME; do
++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
++ if test "X$x" = "X-L$additional_libdir"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ if test -d "$additional_libdir"; then
++ dnl Really add $additional_libdir to $LTLIBNAME.
++ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
++ fi
++ fi
++ fi
++ fi
++ ;;
++ -R*)
++ dir=`echo "X$dep" | sed -e 's/^X-R//'`
++ if test "$enable_rpath" != no; then
++ dnl Potentially add DIR to rpathdirs.
++ dnl The rpathdirs will be appended to $LIBNAME at the end.
++ haveit=
++ for x in $rpathdirs; do
++ if test "X$x" = "X$dir"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ rpathdirs="$rpathdirs $dir"
++ fi
++ dnl Potentially add DIR to ltrpathdirs.
++ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
++ haveit=
++ for x in $ltrpathdirs; do
++ if test "X$x" = "X$dir"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ ltrpathdirs="$ltrpathdirs $dir"
++ fi
++ fi
++ ;;
++ -l*)
++ dnl Handle this in the next round.
++ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
++ ;;
++ *.la)
++ dnl Handle this in the next round. Throw away the .la's
++ dnl directory; it is already contained in a preceding -L
++ dnl option.
++ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
++ ;;
++ *)
++ dnl Most likely an immediate library name.
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
++ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
++ ;;
++ esac
++ done
++ fi
++ else
++ dnl Didn't find the library; assume it is in the system directories
++ dnl known to the linker and runtime loader. (All the system
++ dnl directories known to the linker should also be known to the
++ dnl runtime loader, otherwise the system is severely misconfigured.)
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
++ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
++ fi
++ fi
++ fi
++ done
++ done
++ if test "X$rpathdirs" != "X"; then
++ if test -n "$hardcode_libdir_separator"; then
++ dnl Weird platform: only the last -rpath option counts, the user must
++ dnl pass all path elements in one option. We can arrange that for a
++ dnl single library, but not when more than one $LIBNAMEs are used.
++ alldirs=
++ for found_dir in $rpathdirs; do
++ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
++ done
++ dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
++ acl_save_libdir="$libdir"
++ libdir="$alldirs"
++ eval flag=\"$hardcode_libdir_flag_spec\"
++ libdir="$acl_save_libdir"
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
++ else
++ dnl The -rpath options are cumulative.
++ for found_dir in $rpathdirs; do
++ acl_save_libdir="$libdir"
++ libdir="$found_dir"
++ eval flag=\"$hardcode_libdir_flag_spec\"
++ libdir="$acl_save_libdir"
++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
++ done
++ fi
++ fi
++ if test "X$ltrpathdirs" != "X"; then
++ dnl When using libtool, the option that works for both libraries and
++ dnl executables is -R. The -R options are cumulative.
++ for found_dir in $ltrpathdirs; do
++ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
++ done
++ fi
++])
++
++dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
++dnl unless already present in VAR.
++dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
++dnl contains two or three consecutive elements that belong together.
++AC_DEFUN([AC_LIB_APPENDTOVAR],
++[
++ for element in [$2]; do
++ haveit=
++ for x in $[$1]; do
++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
++ if test "X$x" = "X$element"; then
++ haveit=yes
++ break
++ fi
++ done
++ if test -z "$haveit"; then
++ [$1]="${[$1]}${[$1]:+ }$element"
++ fi
++ done
++])
++
++# lib-ld.m4 serial 3 (gettext-0.13)
++dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
++dnl This file is free software; the Free Software Foundation
++dnl gives unlimited permission to copy and/or distribute it,
++dnl with or without modifications, as long as this notice is preserved.
++
++dnl Subroutines of libtool.m4,
++dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
++dnl with libtool.m4.
++
++dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
++AC_DEFUN([AC_LIB_PROG_LD_GNU],
++[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
++[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
++case `$LD -v 2>&1 conf$$.sh
++ echo "exit 0" >>conf$$.sh
++ chmod +x conf$$.sh
++ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
++ PATH_SEPARATOR=';'
++ else
++ PATH_SEPARATOR=:
++ fi
++ rm -f conf$$.sh
++fi
++ac_prog=ld
++if test "$GCC" = yes; then
++ # Check if gcc -print-prog-name=ld gives a path.
++ AC_MSG_CHECKING([for ld used by GCC])
++ case $host in
++ *-*-mingw*)
++ # gcc leaves a trailing carriage return which upsets mingw
++ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
++ *)
++ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
++ esac
++ case $ac_prog in
++ # Accept absolute paths.
++ [[\\/]* | [A-Za-z]:[\\/]*)]
++ [re_direlt='/[^/][^/]*/\.\./']
++ # Canonicalize the path of ld
++ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
++ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
++ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
++ done
++ test -z "$LD" && LD="$ac_prog"
++ ;;
++ "")
++ # If it fails, then pretend we aren't using GCC.
++ ac_prog=ld
++ ;;
++ *)
++ # If it is relative, then search for the first ld in PATH.
++ with_gnu_ld=unknown
++ ;;
++ esac
++elif test "$with_gnu_ld" = yes; then
++ AC_MSG_CHECKING([for GNU ld])
++else
++ AC_MSG_CHECKING([for non-GNU ld])
++fi
++AC_CACHE_VAL(acl_cv_path_LD,
++[if test -z "$LD"; then
++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
++ for ac_dir in $PATH; do
++ test -z "$ac_dir" && ac_dir=.
++ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
++ acl_cv_path_LD="$ac_dir/$ac_prog"
++ # Check to see if the program is GNU ld. I'd rather use --version,
++ # but apparently some GNU ld's only accept -v.
++ # Break only if it was the GNU/non-GNU ld that we prefer.
++ case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
++ *GNU* | *'with BFD'*)
++ test "$with_gnu_ld" != no && break ;;
++ *)
++ test "$with_gnu_ld" != yes && break ;;
++ esac
++ fi
++ done
++ IFS="$ac_save_ifs"
++else
++ acl_cv_path_LD="$LD" # Let the user override the test with a path.
++fi])
++LD="$acl_cv_path_LD"
++if test -n "$LD"; then
++ AC_MSG_RESULT($LD)
++else
++ AC_MSG_RESULT(no)
++fi
++test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
++AC_LIB_PROG_LD_GNU
++])
++
++dnl This provides configure definitions used by all the newlib
++dnl configure.in files.
++
++dnl Basic newlib configury. This calls basic introductory stuff,
++dnl including AM_INIT_AUTOMAKE and AC_CANONICAL_HOST. It also runs
++dnl configure.host. The only argument is the relative path to the top
++dnl newlib directory.
++
++AC_DEFUN(NEWLIB_CONFIGURE,
++[
++dnl Default to --enable-multilib
++AC_ARG_ENABLE(multilib,
++[ --enable-multilib build many library versions (default)],
++[case "${enableval}" in
++ yes) multilib=yes ;;
++ no) multilib=no ;;
++ *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;;
++ esac], [multilib=yes])dnl
++
++dnl Support --enable-target-optspace
++AC_ARG_ENABLE(target-optspace,
++[ --enable-target-optspace optimize for space],
++[case "${enableval}" in
++ yes) target_optspace=yes ;;
++ no) target_optspace=no ;;
++ *) AC_MSG_ERROR(bad value ${enableval} for target-optspace option) ;;
++ esac], [target_optspace=])dnl
++
++dnl Support --enable-malloc-debugging - currently only supported for Cygwin
++AC_ARG_ENABLE(malloc-debugging,
++[ --enable-malloc-debugging indicate malloc debugging requested],
++[case "${enableval}" in
++ yes) malloc_debugging=yes ;;
++ no) malloc_debugging=no ;;
++ *) AC_MSG_ERROR(bad value ${enableval} for malloc-debugging option) ;;
++ esac], [malloc_debugging=])dnl
++
++dnl Support --enable-newlib-multithread
++AC_ARG_ENABLE(newlib-multithread,
++[ --enable-newlib-multithread enable support for multiple threads],
++[case "${enableval}" in
++ yes) newlib_multithread=yes ;;
++ no) newlib_multithread=no ;;
++ *) AC_MSG_ERROR(bad value ${enableval} for newlib-multithread option) ;;
++ esac], [newlib_multithread=yes])dnl
++
++dnl Support --enable-newlib-iconv
++AC_ARG_ENABLE(newlib-iconv,
++[ --enable-newlib-iconv enable iconv library support],
++[if test "${newlib_iconv+set}" != set; then
++ case "${enableval}" in
++ yes) newlib_iconv=yes ;;
++ no) newlib_iconv=no ;;
++ *) AC_MSG_ERROR(bad value ${enableval} for newlib-iconv option) ;;
++ esac
++ fi], [newlib_iconv=${newlib_iconv}])dnl
++
++dnl Support --enable-newlib-elix-level
++AC_ARG_ENABLE(newlib-elix-level,
++[ --enable-newlib-elix-level supply desired elix library level (1-4)],
++[case "${enableval}" in
++ 0) newlib_elix_level=0 ;;
++ 1) newlib_elix_level=1 ;;
++ 2) newlib_elix_level=2 ;;
++ 3) newlib_elix_level=3 ;;
++ 4) newlib_elix_level=4 ;;
++ *) AC_MSG_ERROR(bad value ${enableval} for newlib-elix-level option) ;;
++ esac], [newlib_elix_level=0])dnl
++
++dnl Support --disable-newlib-io-float
++AC_ARG_ENABLE(newlib-io-float,
++[ --disable-newlib-io-float disable printf/scanf family float support],
++[case "${enableval}" in
++ yes) newlib_io_float=yes ;;
++ no) newlib_io_float=no ;;
++ *) AC_MSG_ERROR(bad value ${enableval} for newlib-io-float option) ;;
++ esac], [newlib_io_float=yes])dnl
++
++dnl Support --disable-newlib-supplied-syscalls
++AC_ARG_ENABLE(newlib-supplied-syscalls,
++[ --disable-newlib-supplied-syscalls disable newlib from supplying syscalls],
++[case "${enableval}" in
++ yes) newlib_may_supply_syscalls=yes ;;
++ no) newlib_may_supply_syscalls=no ;;
++ *) AC_MSG_ERROR(bad value ${enableval} for newlib-supplied-syscalls option) ;;
++ esac], [newlib_may_supply_syscalls=yes])dnl
++
++AM_CONDITIONAL(MAY_SUPPLY_SYSCALLS, test x[$]{newlib_may_supply_syscalls} = xyes)
++
++dnl We may get other options which we don't document:
++dnl --with-target-subdir, --with-multisrctop, --with-multisubdir
++
++test -z "[$]{with_target_subdir}" && with_target_subdir=.
++
++if test "[$]{srcdir}" = "."; then
++ if test "[$]{with_target_subdir}" != "."; then
++ newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1"
++ else
++ newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}$1"
++ fi
++else
++ newlib_basedir="[$]{srcdir}/$1"
++fi
++AC_SUBST(newlib_basedir)
++
++AC_CANONICAL_SYSTEM
++
++AM_INIT_AUTOMAKE(newlib, 1.13.0)
++
++# FIXME: We temporarily define our own version of AC_PROG_CC. This is
++# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
++# are probably using a cross compiler, which will not be able to fully
++# link an executable. This should really be fixed in autoconf
++# itself.
++
++AC_DEFUN(LIB_AC_PROG_CC,
++[AC_BEFORE([$0], [AC_PROG_CPP])dnl
++AC_CHECK_PROG(CC, gcc, gcc)
++if test -z "$CC"; then
++ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
++ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
++fi
++
++AC_PROG_CC_GNU
++
++if test $ac_cv_prog_gcc = yes; then
++ GCC=yes
++dnl Check whether -g works, even if CFLAGS is set, in case the package
++dnl plays around with CFLAGS (such as to build both debugging and
++dnl normal versions of a library), tasteless as that idea is.
++ ac_test_CFLAGS="${CFLAGS+set}"
++ ac_save_CFLAGS="$CFLAGS"
++ CFLAGS=
++ AC_PROG_CC_G
++ if test "$ac_test_CFLAGS" = set; then
++ CFLAGS="$ac_save_CFLAGS"
++ elif test $ac_cv_prog_cc_g = yes; then
++ CFLAGS="-g -O2"
++ else
++ CFLAGS="-O2"
++ fi
++else
++ GCC=
++ test "${CFLAGS+set}" = set || CFLAGS="-g"
++fi
++])
++
++LIB_AC_PROG_CC
++
++AC_CHECK_TOOL(AS, as)
++AC_CHECK_TOOL(AR, ar)
++AC_CHECK_TOOL(RANLIB, ranlib, :)
++
++AC_PROG_INSTALL
++
++AM_MAINTAINER_MODE
++
++# We need AC_EXEEXT to keep automake happy in cygnus mode. However,
++# at least currently, we never actually build a program, so we never
++# need to use $(EXEEXT). Moreover, the test for EXEEXT normally
++# fails, because we are probably configuring with a cross compiler
++# which can't create executables. So we include AC_EXEEXT to keep
++# automake happy, but we don't execute it, since we don't care about
++# the result.
++if false; then
++ AC_EXEEXT
++fi
++
++. [$]{newlib_basedir}/configure.host
++
++newlib_cflags="[$]{newlib_cflags} -fno-builtin"
++
++NEWLIB_CFLAGS=${newlib_cflags}
++AC_SUBST(NEWLIB_CFLAGS)
++
++LDFLAGS=${ldflags}
++AC_SUBST(LDFLAGS)
++
++AM_CONDITIONAL(ELIX_LEVEL_0, test x[$]{newlib_elix_level} = x0)
++AM_CONDITIONAL(ELIX_LEVEL_1, test x[$]{newlib_elix_level} = x1)
++AM_CONDITIONAL(ELIX_LEVEL_2, test x[$]{newlib_elix_level} = x2)
++AM_CONDITIONAL(ELIX_LEVEL_3, test x[$]{newlib_elix_level} = x3)
++AM_CONDITIONAL(ELIX_LEVEL_4, test x[$]{newlib_elix_level} = x4)
++
++AM_CONDITIONAL(USE_LIBTOOL, test x[$]{use_libtool} = xyes)
++
++# Hard-code OBJEXT. Normally it is set by AC_OBJEXT, but we
++# use oext, which is set in configure.host based on the target platform.
++OBJEXT=${oext}
++
++AC_SUBST(OBJEXT)
++AC_SUBST(oext)
++AC_SUBST(aext)
++
++AC_SUBST(libm_machine_dir)
++AC_SUBST(machine_dir)
++AC_SUBST(sys_dir)
++])
++
++# Do all the work for Automake. This macro actually does too much --
++# some checks are only needed if your package does certain things.
++# But this isn't really a big deal.
++
++# serial 1
++
++dnl Usage:
++dnl AM_INIT_AUTOMAKE(package,version, [no-define])
++
++AC_DEFUN([AM_INIT_AUTOMAKE],
++[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
++AC_REQUIRE([AC_PROG_INSTALL])
++PACKAGE=[$1]
++AC_SUBST(PACKAGE)
++VERSION=[$2]
++AC_SUBST(VERSION)
++dnl test to see if srcdir already configured
++if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
++ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
++fi
++ifelse([$3],,
++AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
++AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
++AC_REQUIRE([AM_SANITY_CHECK])
++AC_REQUIRE([AC_ARG_PROGRAM])
++dnl FIXME This is truly gross.
++missing_dir=`cd $ac_aux_dir && pwd`
++AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}, $missing_dir)
++AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
++AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}, $missing_dir)
++AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
++AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
++AC_REQUIRE([AC_PROG_MAKE_SET])])
++
++# Copyright 2002 Free Software Foundation, Inc.
++
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2, or (at your option)
++# any later version.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
++
++# AM_AUTOMAKE_VERSION(VERSION)
++# ----------------------------
++# Automake X.Y traces this macro to ensure aclocal.m4 has been
++# generated from the m4 files accompanying Automake X.Y.
++AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.4"])
++
++# AM_SET_CURRENT_AUTOMAKE_VERSION
++# -------------------------------
++# Call AM_AUTOMAKE_VERSION so it can be traced.
++# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
++AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
++ [AM_AUTOMAKE_VERSION([1.4-p6])])
++
++#
++# Check to make sure that the build environment is sane.
++#
++
++AC_DEFUN([AM_SANITY_CHECK],
++[AC_MSG_CHECKING([whether build environment is sane])
++# Just in case
++sleep 1
++echo timestamp > conftestfile
++# Do `set' in a subshell so we don't clobber the current shell's
++# arguments. Must try -L first in case configure is actually a
++# symlink; some systems play weird games with the mod time of symlinks
++# (eg FreeBSD returns the mod time of the symlink's containing
++# directory).
++if (
++ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
++ if test "[$]*" = "X"; then
++ # -L didn't work.
++ set X `ls -t $srcdir/configure conftestfile`
++ fi
++ if test "[$]*" != "X $srcdir/configure conftestfile" \
++ && test "[$]*" != "X conftestfile $srcdir/configure"; then
++
++ # If neither matched, then we have a broken ls. This can happen
++ # if, for instance, CONFIG_SHELL is bash and it inherits a
++ # broken ls alias from the environment. This has actually
++ # happened. Such a system could not be considered "sane".
++ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
++alias in your environment])
++ fi
++
++ test "[$]2" = conftestfile
++ )
++then
++ # Ok.
++ :
++else
++ AC_MSG_ERROR([newly created file is older than distributed files!
++Check your system clock])
++fi
++rm -f conftest*
++AC_MSG_RESULT(yes)])
++
++dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
++dnl The program must properly implement --version.
++AC_DEFUN([AM_MISSING_PROG],
++[AC_MSG_CHECKING(for working $2)
++# Run test in a subshell; some versions of sh will print an error if
++# an executable is not found, even if stderr is redirected.
++# Redirect stdin to placate older versions of autoconf. Sigh.
++if ($2 --version) < /dev/null > /dev/null 2>&1; then
++ $1=$2
++ AC_MSG_RESULT(found)
++else
++ $1="$3/missing $2"
++ AC_MSG_RESULT(missing)
++fi
++AC_SUBST($1)])
++
++# Define a conditional.
++
++AC_DEFUN([AM_CONDITIONAL],
++[AC_SUBST($1_TRUE)
++AC_SUBST($1_FALSE)
++if $2; then
++ $1_TRUE=
++ $1_FALSE='#'
++else
++ $1_TRUE='#'
++ $1_FALSE=
++fi])
++
++# Add --enable-maintainer-mode option to configure.
++# From Jim Meyering
++
++# serial 1
++
++AC_DEFUN([AM_MAINTAINER_MODE],
++[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
++ dnl maintainer-mode is disabled by default
++ AC_ARG_ENABLE(maintainer-mode,
++[ --enable-maintainer-mode enable make rules and dependencies not useful
++ (and sometimes confusing) to the casual installer],
++ USE_MAINTAINER_MODE=$enableval,
++ USE_MAINTAINER_MODE=no)
++ AC_MSG_RESULT($USE_MAINTAINER_MODE)
++ AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes)
++ MAINT=$MAINTAINER_MODE_TRUE
++ AC_SUBST(MAINT)dnl
++]
++)
++
+--- newlib-1.13.0/newlib/libc/sys/psp/arpa/inet.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/arpa/inet.h 2006-05-02 11:27:30.000000000 -0400
+@@ -0,0 +1,26 @@
++/* arpa/inet.h - Functions for converting IP addresses between strings and numbers */
++
++#ifndef _ARPA_INET_H_
++#define _ARPA_INET_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include
++
++in_addr_t sceNetInetInetAddr(const char *ip);
++int sceNetInetInetAton(const char *ip, struct in_addr *in);
++const char* sceNetInetInetNtop(int af, const void *src, char *dst, socklen_t cnt);
++int sceNetInetInetPton(int af, const char *src, void *dst);
++
++char *inet_ntoa(struct in_addr in);
++#define inet_addr sceNetInetInetAddr
++#define inet_aton sceNetInetInetAton
++#define inet_ntop sceNetInetInetNtop
++#define inet_pton sceNetInetInetPton
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* _ARPA_INET_H_ */
+--- newlib-1.13.0/newlib/libc/sys/psp/confdefs.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/confdefs.h 2005-10-12 15:36:20.000000000 -0400
+@@ -0,0 +1 @@
++
+--- newlib-1.13.0/newlib/libc/sys/psp/configure 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/configure 2006-05-02 11:27:31.000000000 -0400
+@@ -0,0 +1,1880 @@
++#! /bin/sh
++
++# Guess values for system-dependent variables and create Makefiles.
++# Generated automatically using autoconf version 2.13
++# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
++#
++# This configure script is free software; the Free Software Foundation
++# gives unlimited permission to copy, distribute and modify it.
++
++# Defaults:
++ac_help=
++ac_default_prefix=/usr/local
++# Any additions from configure.in:
++ac_help="$ac_help
++ --enable-multilib build many library versions (default)"
++ac_help="$ac_help
++ --enable-target-optspace optimize for space"
++ac_help="$ac_help
++ --enable-malloc-debugging indicate malloc debugging requested"
++ac_help="$ac_help
++ --enable-newlib-multithread enable support for multiple threads"
++ac_help="$ac_help
++ --enable-newlib-iconv enable iconv library support"
++ac_help="$ac_help
++ --enable-newlib-elix-level supply desired elix library level (1-4)"
++ac_help="$ac_help
++ --disable-newlib-io-float disable printf/scanf family float support"
++ac_help="$ac_help
++ --disable-newlib-supplied-syscalls disable newlib from supplying syscalls"
++ac_help="$ac_help
++ --enable-maintainer-mode enable make rules and dependencies not useful
++ (and sometimes confusing) to the casual installer"
++
++# Initialize some variables set by options.
++# The variables have the same names as the options, with
++# dashes changed to underlines.
++build=NONE
++cache_file=./config.cache
++exec_prefix=NONE
++host=NONE
++no_create=
++nonopt=NONE
++no_recursion=
++prefix=NONE
++program_prefix=NONE
++program_suffix=NONE
++program_transform_name=s,x,x,
++silent=
++site=
++srcdir=
++target=NONE
++verbose=
++x_includes=NONE
++x_libraries=NONE
++bindir='${exec_prefix}/bin'
++sbindir='${exec_prefix}/sbin'
++libexecdir='${exec_prefix}/libexec'
++datadir='${prefix}/share'
++sysconfdir='${prefix}/etc'
++sharedstatedir='${prefix}/com'
++localstatedir='${prefix}/var'
++libdir='${exec_prefix}/lib'
++includedir='${prefix}/include'
++oldincludedir='/usr/include'
++infodir='${prefix}/info'
++mandir='${prefix}/man'
++
++# Initialize some other variables.
++subdirs=
++MFLAGS= MAKEFLAGS=
++SHELL=${CONFIG_SHELL-/bin/sh}
++# Maximum number of lines to put in a shell here document.
++ac_max_here_lines=12
++
++ac_prev=
++for ac_option
++do
++
++ # If the previous option needs an argument, assign it.
++ if test -n "$ac_prev"; then
++ eval "$ac_prev=\$ac_option"
++ ac_prev=
++ continue
++ fi
++
++ case "$ac_option" in
++ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
++ *) ac_optarg= ;;
++ esac
++
++ # Accept the important Cygnus configure options, so we can diagnose typos.
++
++ case "$ac_option" in
++
++ -bindir | --bindir | --bindi | --bind | --bin | --bi)
++ ac_prev=bindir ;;
++ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
++ bindir="$ac_optarg" ;;
++
++ -build | --build | --buil | --bui | --bu)
++ ac_prev=build ;;
++ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
++ build="$ac_optarg" ;;
++
++ -cache-file | --cache-file | --cache-fil | --cache-fi \
++ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
++ ac_prev=cache_file ;;
++ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
++ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
++ cache_file="$ac_optarg" ;;
++
++ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
++ ac_prev=datadir ;;
++ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
++ | --da=*)
++ datadir="$ac_optarg" ;;
++
++ -disable-* | --disable-*)
++ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
++ # Reject names that are not valid shell variable names.
++ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
++ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
++ fi
++ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
++ eval "enable_${ac_feature}=no" ;;
++
++ -enable-* | --enable-*)
++ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
++ # Reject names that are not valid shell variable names.
++ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
++ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
++ fi
++ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
++ case "$ac_option" in
++ *=*) ;;
++ *) ac_optarg=yes ;;
++ esac
++ eval "enable_${ac_feature}='$ac_optarg'" ;;
++
++ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
++ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
++ | --exec | --exe | --ex)
++ ac_prev=exec_prefix ;;
++ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
++ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
++ | --exec=* | --exe=* | --ex=*)
++ exec_prefix="$ac_optarg" ;;
++
++ -gas | --gas | --ga | --g)
++ # Obsolete; use --with-gas.
++ with_gas=yes ;;
++
++ -help | --help | --hel | --he)
++ # Omit some internal or obsolete options to make the list less imposing.
++ # This message is too long to be a string in the A/UX 3.1 sh.
++ cat << EOF
++Usage: configure [options] [host]
++Options: [defaults in brackets after descriptions]
++Configuration:
++ --cache-file=FILE cache test results in FILE
++ --help print this message
++ --no-create do not create output files
++ --quiet, --silent do not print \`checking...' messages
++ --version print the version of autoconf that created configure
++Directory and file names:
++ --prefix=PREFIX install architecture-independent files in PREFIX
++ [$ac_default_prefix]
++ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
++ [same as prefix]
++ --bindir=DIR user executables in DIR [EPREFIX/bin]
++ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
++ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
++ --datadir=DIR read-only architecture-independent data in DIR
++ [PREFIX/share]
++ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
++ --sharedstatedir=DIR modifiable architecture-independent data in DIR
++ [PREFIX/com]
++ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
++ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
++ --includedir=DIR C header files in DIR [PREFIX/include]
++ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
++ --infodir=DIR info documentation in DIR [PREFIX/info]
++ --mandir=DIR man documentation in DIR [PREFIX/man]
++ --srcdir=DIR find the sources in DIR [configure dir or ..]
++ --program-prefix=PREFIX prepend PREFIX to installed program names
++ --program-suffix=SUFFIX append SUFFIX to installed program names
++ --program-transform-name=PROGRAM
++ run sed PROGRAM on installed program names
++EOF
++ cat << EOF
++Host type:
++ --build=BUILD configure for building on BUILD [BUILD=HOST]
++ --host=HOST configure for HOST [guessed]
++ --target=TARGET configure for TARGET [TARGET=HOST]
++Features and packages:
++ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
++ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
++ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
++ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
++ --x-includes=DIR X include files are in DIR
++ --x-libraries=DIR X library files are in DIR
++EOF
++ if test -n "$ac_help"; then
++ echo "--enable and --with options recognized:$ac_help"
++ fi
++ exit 0 ;;
++
++ -host | --host | --hos | --ho)
++ ac_prev=host ;;
++ -host=* | --host=* | --hos=* | --ho=*)
++ host="$ac_optarg" ;;
++
++ -includedir | --includedir | --includedi | --included | --include \
++ | --includ | --inclu | --incl | --inc)
++ ac_prev=includedir ;;
++ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
++ | --includ=* | --inclu=* | --incl=* | --inc=*)
++ includedir="$ac_optarg" ;;
++
++ -infodir | --infodir | --infodi | --infod | --info | --inf)
++ ac_prev=infodir ;;
++ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
++ infodir="$ac_optarg" ;;
++
++ -libdir | --libdir | --libdi | --libd)
++ ac_prev=libdir ;;
++ -libdir=* | --libdir=* | --libdi=* | --libd=*)
++ libdir="$ac_optarg" ;;
++
++ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
++ | --libexe | --libex | --libe)
++ ac_prev=libexecdir ;;
++ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
++ | --libexe=* | --libex=* | --libe=*)
++ libexecdir="$ac_optarg" ;;
++
++ -localstatedir | --localstatedir | --localstatedi | --localstated \
++ | --localstate | --localstat | --localsta | --localst \
++ | --locals | --local | --loca | --loc | --lo)
++ ac_prev=localstatedir ;;
++ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
++ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
++ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
++ localstatedir="$ac_optarg" ;;
++
++ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
++ ac_prev=mandir ;;
++ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
++ mandir="$ac_optarg" ;;
++
++ -nfp | --nfp | --nf)
++ # Obsolete; use --without-fp.
++ with_fp=no ;;
++
++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
++ | --no-cr | --no-c)
++ no_create=yes ;;
++
++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
++ no_recursion=yes ;;
++
++ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
++ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
++ | --oldin | --oldi | --old | --ol | --o)
++ ac_prev=oldincludedir ;;
++ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
++ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
++ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
++ oldincludedir="$ac_optarg" ;;
++
++ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
++ ac_prev=prefix ;;
++ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
++ prefix="$ac_optarg" ;;
++
++ -program-prefix | --program-prefix | --program-prefi | --program-pref \
++ | --program-pre | --program-pr | --program-p)
++ ac_prev=program_prefix ;;
++ -program-prefix=* | --program-prefix=* | --program-prefi=* \
++ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
++ program_prefix="$ac_optarg" ;;
++
++ -program-suffix | --program-suffix | --program-suffi | --program-suff \
++ | --program-suf | --program-su | --program-s)
++ ac_prev=program_suffix ;;
++ -program-suffix=* | --program-suffix=* | --program-suffi=* \
++ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
++ program_suffix="$ac_optarg" ;;
++
++ -program-transform-name | --program-transform-name \
++ | --program-transform-nam | --program-transform-na \
++ | --program-transform-n | --program-transform- \
++ | --program-transform | --program-transfor \
++ | --program-transfo | --program-transf \
++ | --program-trans | --program-tran \
++ | --progr-tra | --program-tr | --program-t)
++ ac_prev=program_transform_name ;;
++ -program-transform-name=* | --program-transform-name=* \
++ | --program-transform-nam=* | --program-transform-na=* \
++ | --program-transform-n=* | --program-transform-=* \
++ | --program-transform=* | --program-transfor=* \
++ | --program-transfo=* | --program-transf=* \
++ | --program-trans=* | --program-tran=* \
++ | --progr-tra=* | --program-tr=* | --program-t=*)
++ program_transform_name="$ac_optarg" ;;
++
++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
++ | -silent | --silent | --silen | --sile | --sil)
++ silent=yes ;;
++
++ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
++ ac_prev=sbindir ;;
++ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
++ | --sbi=* | --sb=*)
++ sbindir="$ac_optarg" ;;
++
++ -sharedstatedir | --sharedstatedir | --sharedstatedi \
++ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
++ | --sharedst | --shareds | --shared | --share | --shar \
++ | --sha | --sh)
++ ac_prev=sharedstatedir ;;
++ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
++ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
++ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
++ | --sha=* | --sh=*)
++ sharedstatedir="$ac_optarg" ;;
++
++ -site | --site | --sit)
++ ac_prev=site ;;
++ -site=* | --site=* | --sit=*)
++ site="$ac_optarg" ;;
++
++ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
++ ac_prev=srcdir ;;
++ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
++ srcdir="$ac_optarg" ;;
++
++ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
++ | --syscon | --sysco | --sysc | --sys | --sy)
++ ac_prev=sysconfdir ;;
++ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
++ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
++ sysconfdir="$ac_optarg" ;;
++
++ -target | --target | --targe | --targ | --tar | --ta | --t)
++ ac_prev=target ;;
++ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
++ target="$ac_optarg" ;;
++
++ -v | -verbose | --verbose | --verbos | --verbo | --verb)
++ verbose=yes ;;
++
++ -version | --version | --versio | --versi | --vers)
++ echo "configure generated by autoconf version 2.13"
++ exit 0 ;;
++
++ -with-* | --with-*)
++ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
++ # Reject names that are not valid shell variable names.
++ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
++ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
++ fi
++ ac_package=`echo $ac_package| sed 's/-/_/g'`
++ case "$ac_option" in
++ *=*) ;;
++ *) ac_optarg=yes ;;
++ esac
++ eval "with_${ac_package}='$ac_optarg'" ;;
++
++ -without-* | --without-*)
++ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
++ # Reject names that are not valid shell variable names.
++ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
++ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
++ fi
++ ac_package=`echo $ac_package| sed 's/-/_/g'`
++ eval "with_${ac_package}=no" ;;
++
++ --x)
++ # Obsolete; use --with-x.
++ with_x=yes ;;
++
++ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
++ | --x-incl | --x-inc | --x-in | --x-i)
++ ac_prev=x_includes ;;
++ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
++ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
++ x_includes="$ac_optarg" ;;
++
++ -x-libraries | --x-libraries | --x-librarie | --x-librari \
++ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
++ ac_prev=x_libraries ;;
++ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
++ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
++ x_libraries="$ac_optarg" ;;
++
++ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
++ ;;
++
++ *)
++ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
++ echo "configure: warning: $ac_option: invalid host type" 1>&2
++ fi
++ if test "x$nonopt" != xNONE; then
++ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
++ fi
++ nonopt="$ac_option"
++ ;;
++
++ esac
++done
++
++if test -n "$ac_prev"; then
++ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
++fi
++
++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
++
++# File descriptor usage:
++# 0 standard input
++# 1 file creation
++# 2 errors and warnings
++# 3 some systems may open it to /dev/tty
++# 4 used on the Kubota Titan
++# 6 checking for... messages and results
++# 5 compiler messages saved in config.log
++if test "$silent" = yes; then
++ exec 6>/dev/null
++else
++ exec 6>&1
++fi
++exec 5>./config.log
++
++echo "\
++This file contains any messages produced by compilers while
++running configure, to aid debugging if configure makes a mistake.
++" 1>&5
++
++# Strip out --no-create and --no-recursion so they do not pile up.
++# Also quote any args containing shell metacharacters.
++ac_configure_args=
++for ac_arg
++do
++ case "$ac_arg" in
++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
++ | --no-cr | --no-c) ;;
++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
++ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
++ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
++ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
++ esac
++done
++
++# NLS nuisances.
++# Only set these to C if already set. These must not be set unconditionally
++# because not all systems understand e.g. LANG=C (notably SCO).
++# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
++# Non-C LC_CTYPE values break the ctype check.
++if test "${LANG+set}" = set; then LANG=C; export LANG; fi
++if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
++if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
++if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
++
++# confdefs.h avoids OS command line length limits that DEFS can exceed.
++rm -rf conftest* confdefs.h
++# AIX cpp loses on an empty file, so make sure it contains at least a newline.
++echo > confdefs.h
++
++# A filename unique to this package, relative to the directory that
++# configure is in, which we can look for to find out if srcdir is correct.
++ac_unique_file=libcglue.c
++
++# Find the source files, if location was not specified.
++if test -z "$srcdir"; then
++ ac_srcdir_defaulted=yes
++ # Try the directory containing this script, then its parent.
++ ac_prog=$0
++ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
++ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
++ srcdir=$ac_confdir
++ if test ! -r $srcdir/$ac_unique_file; then
++ srcdir=..
++ fi
++else
++ ac_srcdir_defaulted=no
++fi
++if test ! -r $srcdir/$ac_unique_file; then
++ if test "$ac_srcdir_defaulted" = yes; then
++ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
++ else
++ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
++ fi
++fi
++srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
++
++# Prefer explicitly selected file to automatically selected ones.
++if test -z "$CONFIG_SITE"; then
++ if test "x$prefix" != xNONE; then
++ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
++ else
++ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
++ fi
++fi
++for ac_site_file in $CONFIG_SITE; do
++ if test -r "$ac_site_file"; then
++ echo "loading site script $ac_site_file"
++ . "$ac_site_file"
++ fi
++done
++
++if test -r "$cache_file"; then
++ echo "loading cache $cache_file"
++ . $cache_file
++else
++ echo "creating cache $cache_file"
++ > $cache_file
++fi
++
++ac_ext=c
++# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
++ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
++cross_compiling=$ac_cv_prog_cc_cross
++
++ac_exeext=
++ac_objext=o
++if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
++ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
++ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
++ ac_n= ac_c='
++' ac_t=' '
++ else
++ ac_n=-n ac_c= ac_t=
++ fi
++else
++ ac_n= ac_c='\c' ac_t=
++fi
++
++
++
++ac_aux_dir=
++for ac_dir in ../../../.. $srcdir/../../../..; do
++ if test -f $ac_dir/install-sh; then
++ ac_aux_dir=$ac_dir
++ ac_install_sh="$ac_aux_dir/install-sh -c"
++ break
++ elif test -f $ac_dir/install.sh; then
++ ac_aux_dir=$ac_dir
++ ac_install_sh="$ac_aux_dir/install.sh -c"
++ break
++ fi
++done
++if test -z "$ac_aux_dir"; then
++ { echo "configure: error: can not find install-sh or install.sh in ../../../.. $srcdir/../../../.." 1>&2; exit 1; }
++fi
++ac_config_guess=$ac_aux_dir/config.guess
++ac_config_sub=$ac_aux_dir/config.sub
++ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
++
++
++am__api_version="1.4"
++# Find a good install program. We prefer a C program (faster),
++# so one script is as good as another. But avoid the broken or
++# incompatible versions:
++# SysV /etc/install, /usr/sbin/install
++# SunOS /usr/etc/install
++# IRIX /sbin/install
++# AIX /bin/install
++# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
++# AFS /usr/afsws/bin/install, which mishandles nonexistent args
++# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
++# ./install, which can be erroneously created by make from ./install.sh.
++echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
++echo "configure:578: checking for a BSD compatible install" >&5
++if test -z "$INSTALL"; then
++if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
++ for ac_dir in $PATH; do
++ # Account for people who put trailing slashes in PATH elements.
++ case "$ac_dir/" in
++ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
++ *)
++ # OSF1 and SCO ODT 3.0 have their own names for install.
++ # Don't use installbsd from OSF since it installs stuff as root
++ # by default.
++ for ac_prog in ginstall scoinst install; do
++ if test -f $ac_dir/$ac_prog; then
++ if test $ac_prog = install &&
++ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
++ # AIX install. It has an incompatible calling convention.
++ :
++ else
++ ac_cv_path_install="$ac_dir/$ac_prog -c"
++ break 2
++ fi
++ fi
++ done
++ ;;
++ esac
++ done
++ IFS="$ac_save_IFS"
++
++fi
++ if test "${ac_cv_path_install+set}" = set; then
++ INSTALL="$ac_cv_path_install"
++ else
++ # As a last resort, use the slow shell script. We don't cache a
++ # path for INSTALL within a source directory, because that will
++ # break other packages using the cache if that directory is
++ # removed, or if the path is relative.
++ INSTALL="$ac_install_sh"
++ fi
++fi
++echo "$ac_t""$INSTALL" 1>&6
++
++# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
++# It thinks the first close brace ends the variable substitution.
++test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
++
++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
++
++test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
++
++echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
++echo "configure:631: checking whether build environment is sane" >&5
++# Just in case
++sleep 1
++echo timestamp > conftestfile
++# Do `set' in a subshell so we don't clobber the current shell's
++# arguments. Must try -L first in case configure is actually a
++# symlink; some systems play weird games with the mod time of symlinks
++# (eg FreeBSD returns the mod time of the symlink's containing
++# directory).
++if (
++ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
++ if test "$*" = "X"; then
++ # -L didn't work.
++ set X `ls -t $srcdir/configure conftestfile`
++ fi
++ if test "$*" != "X $srcdir/configure conftestfile" \
++ && test "$*" != "X conftestfile $srcdir/configure"; then
++
++ # If neither matched, then we have a broken ls. This can happen
++ # if, for instance, CONFIG_SHELL is bash and it inherits a
++ # broken ls alias from the environment. This has actually
++ # happened. Such a system could not be considered "sane".
++ { echo "configure: error: ls -t appears to fail. Make sure there is not a broken
++alias in your environment" 1>&2; exit 1; }
++ fi
++
++ test "$2" = conftestfile
++ )
++then
++ # Ok.
++ :
++else
++ { echo "configure: error: newly created file is older than distributed files!
++Check your system clock" 1>&2; exit 1; }
++fi
++rm -f conftest*
++echo "$ac_t""yes" 1>&6
++if test "$program_transform_name" = s,x,x,; then
++ program_transform_name=
++else
++ # Double any \ or $. echo might interpret backslashes.
++ cat <<\EOF_SED > conftestsed
++s,\\,\\\\,g; s,\$,$$,g
++EOF_SED
++ program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
++ rm -f conftestsed
++fi
++test "$program_prefix" != NONE &&
++ program_transform_name="s,^,${program_prefix},; $program_transform_name"
++# Use a double $ so make ignores it.
++test "$program_suffix" != NONE &&
++ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
++
++# sed with no file args requires a program.
++test "$program_transform_name" = "" && program_transform_name="s,x,x,"
++
++echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
++echo "configure:688: checking whether ${MAKE-make} sets \${MAKE}" >&5
++set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
++if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ cat > conftestmake <<\EOF
++all:
++ @echo 'ac_maketemp="${MAKE}"'
++EOF
++# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
++eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
++if test -n "$ac_maketemp"; then
++ eval ac_cv_prog_make_${ac_make}_set=yes
++else
++ eval ac_cv_prog_make_${ac_make}_set=no
++fi
++rm -f conftestmake
++fi
++if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
++ echo "$ac_t""yes" 1>&6
++ SET_MAKE=
++else
++ echo "$ac_t""no" 1>&6
++ SET_MAKE="MAKE=${MAKE-make}"
++fi
++
++if test $host != $build; then
++ ac_tool_prefix=${host_alias}-
++else
++ ac_tool_prefix=
++fi
++
++echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
++echo "configure:721: checking for Cygwin environment" >&5
++if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then
++ rm -rf conftest*
++ ac_cv_cygwin=yes
++else
++ echo "configure: failed program was:" >&5
++ cat conftest.$ac_ext >&5
++ rm -rf conftest*
++ ac_cv_cygwin=no
++fi
++rm -f conftest*
++rm -f conftest*
++fi
++
++echo "$ac_t""$ac_cv_cygwin" 1>&6
++CYGWIN=
++test "$ac_cv_cygwin" = yes && CYGWIN=yes
++echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
++echo "configure:754: checking for mingw32 environment" >&5
++if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then
++ rm -rf conftest*
++ ac_cv_mingw32=yes
++else
++ echo "configure: failed program was:" >&5
++ cat conftest.$ac_ext >&5
++ rm -rf conftest*
++ ac_cv_mingw32=no
++fi
++rm -f conftest*
++rm -f conftest*
++fi
++
++echo "$ac_t""$ac_cv_mingw32" 1>&6
++MINGW32=
++test "$ac_cv_mingw32" = yes && MINGW32=yes
++
++# Check whether --enable-multilib or --disable-multilib was given.
++if test "${enable_multilib+set}" = set; then
++ enableval="$enable_multilib"
++ case "${enableval}" in
++ yes) multilib=yes ;;
++ no) multilib=no ;;
++ *) { echo "configure: error: bad value ${enableval} for multilib option" 1>&2; exit 1; } ;;
++ esac
++else
++ multilib=yes
++fi
++
++# Check whether --enable-target-optspace or --disable-target-optspace was given.
++if test "${enable_target_optspace+set}" = set; then
++ enableval="$enable_target_optspace"
++ case "${enableval}" in
++ yes) target_optspace=yes ;;
++ no) target_optspace=no ;;
++ *) { echo "configure: error: bad value ${enableval} for target-optspace option" 1>&2; exit 1; } ;;
++ esac
++else
++ target_optspace=
++fi
++
++# Check whether --enable-malloc-debugging or --disable-malloc-debugging was given.
++if test "${enable_malloc_debugging+set}" = set; then
++ enableval="$enable_malloc_debugging"
++ case "${enableval}" in
++ yes) malloc_debugging=yes ;;
++ no) malloc_debugging=no ;;
++ *) { echo "configure: error: bad value ${enableval} for malloc-debugging option" 1>&2; exit 1; } ;;
++ esac
++else
++ malloc_debugging=
++fi
++
++# Check whether --enable-newlib-multithread or --disable-newlib-multithread was given.
++if test "${enable_newlib_multithread+set}" = set; then
++ enableval="$enable_newlib_multithread"
++ case "${enableval}" in
++ yes) newlib_multithread=yes ;;
++ no) newlib_multithread=no ;;
++ *) { echo "configure: error: bad value ${enableval} for newlib-multithread option" 1>&2; exit 1; } ;;
++ esac
++else
++ newlib_multithread=yes
++fi
++
++# Check whether --enable-newlib-iconv or --disable-newlib-iconv was given.
++if test "${enable_newlib_iconv+set}" = set; then
++ enableval="$enable_newlib_iconv"
++ if test "${newlib_iconv+set}" != set; then
++ case "${enableval}" in
++ yes) newlib_iconv=yes ;;
++ no) newlib_iconv=no ;;
++ *) { echo "configure: error: bad value ${enableval} for newlib-iconv option" 1>&2; exit 1; } ;;
++ esac
++ fi
++else
++ newlib_iconv=${newlib_iconv}
++fi
++
++# Check whether --enable-newlib-elix-level or --disable-newlib-elix-level was given.
++if test "${enable_newlib_elix_level+set}" = set; then
++ enableval="$enable_newlib_elix_level"
++ case "${enableval}" in
++ 0) newlib_elix_level=0 ;;
++ 1) newlib_elix_level=1 ;;
++ 2) newlib_elix_level=2 ;;
++ 3) newlib_elix_level=3 ;;
++ 4) newlib_elix_level=4 ;;
++ *) { echo "configure: error: bad value ${enableval} for newlib-elix-level option" 1>&2; exit 1; } ;;
++ esac
++else
++ newlib_elix_level=0
++fi
++
++# Check whether --enable-newlib-io-float or --disable-newlib-io-float was given.
++if test "${enable_newlib_io_float+set}" = set; then
++ enableval="$enable_newlib_io_float"
++ case "${enableval}" in
++ yes) newlib_io_float=yes ;;
++ no) newlib_io_float=no ;;
++ *) { echo "configure: error: bad value ${enableval} for newlib-io-float option" 1>&2; exit 1; } ;;
++ esac
++else
++ newlib_io_float=yes
++fi
++
++# Check whether --enable-newlib-supplied-syscalls or --disable-newlib-supplied-syscalls was given.
++if test "${enable_newlib_supplied_syscalls+set}" = set; then
++ enableval="$enable_newlib_supplied_syscalls"
++ case "${enableval}" in
++ yes) newlib_may_supply_syscalls=yes ;;
++ no) newlib_may_supply_syscalls=no ;;
++ *) { echo "configure: error: bad value ${enableval} for newlib-supplied-syscalls option" 1>&2; exit 1; } ;;
++ esac
++else
++ newlib_may_supply_syscalls=yes
++fi
++
++
++
++if test x${newlib_may_supply_syscalls} = xyes; then
++ MAY_SUPPLY_SYSCALLS_TRUE=
++ MAY_SUPPLY_SYSCALLS_FALSE='#'
++else
++ MAY_SUPPLY_SYSCALLS_TRUE='#'
++ MAY_SUPPLY_SYSCALLS_FALSE=
++fi
++
++
++test -z "${with_target_subdir}" && with_target_subdir=.
++
++if test "${srcdir}" = "."; then
++ if test "${with_target_subdir}" != "."; then
++ newlib_basedir="${srcdir}/${with_multisrctop}../../../.."
++ else
++ newlib_basedir="${srcdir}/${with_multisrctop}../../.."
++ fi
++else
++ newlib_basedir="${srcdir}/../../.."
++fi
++
++
++
++# Do some error checking and defaulting for the host and target type.
++# The inputs are:
++# configure --host=HOST --target=TARGET --build=BUILD NONOPT
++#
++# The rules are:
++# 1. You are not allowed to specify --host, --target, and nonopt at the
++# same time.
++# 2. Host defaults to nonopt.
++# 3. If nonopt is not specified, then host defaults to the current host,
++# as determined by config.guess.
++# 4. Target and build default to nonopt.
++# 5. If nonopt is not specified, then target and build default to host.
++
++# The aliases save the names the user supplied, while $host etc.
++# will get canonicalized.
++case $host---$target---$nonopt in
++NONE---*---* | *---NONE---* | *---*---NONE) ;;
++*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
++esac
++
++
++# Make sure we can run config.sub.
++if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
++else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
++fi
++
++echo $ac_n "checking host system type""... $ac_c" 1>&6
++echo "configure:936: checking host system type" >&5
++
++host_alias=$host
++case "$host_alias" in
++NONE)
++ case $nonopt in
++ NONE)
++ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
++ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
++ fi ;;
++ *) host_alias=$nonopt ;;
++ esac ;;
++esac
++
++host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
++host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
++host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
++host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
++echo "$ac_t""$host" 1>&6
++
++echo $ac_n "checking target system type""... $ac_c" 1>&6
++echo "configure:957: checking target system type" >&5
++
++target_alias=$target
++case "$target_alias" in
++NONE)
++ case $nonopt in
++ NONE) target_alias=$host_alias ;;
++ *) target_alias=$nonopt ;;
++ esac ;;
++esac
++
++target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
++target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
++target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
++target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
++echo "$ac_t""$target" 1>&6
++
++echo $ac_n "checking build system type""... $ac_c" 1>&6
++echo "configure:975: checking build system type" >&5
++
++build_alias=$build
++case "$build_alias" in
++NONE)
++ case $nonopt in
++ NONE) build_alias=$host_alias ;;
++ *) build_alias=$nonopt ;;
++ esac ;;
++esac
++
++build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
++build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
++build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
++build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
++echo "$ac_t""$build" 1>&6
++
++test "$host_alias" != "$target_alias" &&
++ test "$program_prefix$program_suffix$program_transform_name" = \
++ NONENONEs,x,x, &&
++ program_prefix=${target_alias}-
++
++
++
++PACKAGE=newlib
++
++VERSION=1.13.0
++
++if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
++ { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
++fi
++cat >> confdefs.h <> confdefs.h <&6
++echo "configure:1018: checking for working aclocal-${am__api_version}" >&5
++# Run test in a subshell; some versions of sh will print an error if
++# an executable is not found, even if stderr is redirected.
++# Redirect stdin to placate older versions of autoconf. Sigh.
++if (aclocal-${am__api_version} --version) < /dev/null > /dev/null 2>&1; then
++ ACLOCAL=aclocal-${am__api_version}
++ echo "$ac_t""found" 1>&6
++else
++ ACLOCAL="$missing_dir/missing aclocal-${am__api_version}"
++ echo "$ac_t""missing" 1>&6
++fi
++
++echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
++echo "configure:1031: checking for working autoconf" >&5
++# Run test in a subshell; some versions of sh will print an error if
++# an executable is not found, even if stderr is redirected.
++# Redirect stdin to placate older versions of autoconf. Sigh.
++if (autoconf --version) < /dev/null > /dev/null 2>&1; then
++ AUTOCONF=autoconf
++ echo "$ac_t""found" 1>&6
++else
++ AUTOCONF="$missing_dir/missing autoconf"
++ echo "$ac_t""missing" 1>&6
++fi
++
++echo $ac_n "checking for working automake-${am__api_version}""... $ac_c" 1>&6
++echo "configure:1044: checking for working automake-${am__api_version}" >&5
++# Run test in a subshell; some versions of sh will print an error if
++# an executable is not found, even if stderr is redirected.
++# Redirect stdin to placate older versions of autoconf. Sigh.
++if (automake-${am__api_version} --version) < /dev/null > /dev/null 2>&1; then
++ AUTOMAKE=automake-${am__api_version}
++ echo "$ac_t""found" 1>&6
++else
++ AUTOMAKE="$missing_dir/missing automake-${am__api_version}"
++ echo "$ac_t""missing" 1>&6
++fi
++
++echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
++echo "configure:1057: checking for working autoheader" >&5
++# Run test in a subshell; some versions of sh will print an error if
++# an executable is not found, even if stderr is redirected.
++# Redirect stdin to placate older versions of autoconf. Sigh.
++if (autoheader --version) < /dev/null > /dev/null 2>&1; then
++ AUTOHEADER=autoheader
++ echo "$ac_t""found" 1>&6
++else
++ AUTOHEADER="$missing_dir/missing autoheader"
++ echo "$ac_t""missing" 1>&6
++fi
++
++echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
++echo "configure:1070: checking for working makeinfo" >&5
++# Run test in a subshell; some versions of sh will print an error if
++# an executable is not found, even if stderr is redirected.
++# Redirect stdin to placate older versions of autoconf. Sigh.
++if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
++ MAKEINFO=makeinfo
++ echo "$ac_t""found" 1>&6
++else
++ MAKEINFO="$missing_dir/missing makeinfo"
++ echo "$ac_t""missing" 1>&6
++fi
++
++
++
++# FIXME: We temporarily define our own version of AC_PROG_CC. This is
++# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
++# are probably using a cross compiler, which will not be able to fully
++# link an executable. This should really be fixed in autoconf
++# itself.
++
++
++
++# Extract the first word of "gcc", so it can be a program name with args.
++set dummy gcc; ac_word=$2
++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
++echo "configure:1095: checking for $ac_word" >&5
++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ if test -n "$CC"; then
++ ac_cv_prog_CC="$CC" # Let the user override the test.
++else
++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
++ ac_dummy="$PATH"
++ for ac_dir in $ac_dummy; do
++ test -z "$ac_dir" && ac_dir=.
++ if test -f $ac_dir/$ac_word; then
++ ac_cv_prog_CC="gcc"
++ break
++ fi
++ done
++ IFS="$ac_save_ifs"
++fi
++fi
++CC="$ac_cv_prog_CC"
++if test -n "$CC"; then
++ echo "$ac_t""$CC" 1>&6
++else
++ echo "$ac_t""no" 1>&6
++fi
++
++if test -z "$CC"; then
++ # Extract the first word of "cc", so it can be a program name with args.
++set dummy cc; ac_word=$2
++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
++echo "configure:1125: checking for $ac_word" >&5
++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ if test -n "$CC"; then
++ ac_cv_prog_CC="$CC" # Let the user override the test.
++else
++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
++ ac_prog_rejected=no
++ ac_dummy="$PATH"
++ for ac_dir in $ac_dummy; do
++ test -z "$ac_dir" && ac_dir=.
++ if test -f $ac_dir/$ac_word; then
++ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
++ ac_prog_rejected=yes
++ continue
++ fi
++ ac_cv_prog_CC="cc"
++ break
++ fi
++ done
++ IFS="$ac_save_ifs"
++if test $ac_prog_rejected = yes; then
++ # We found a bogon in the path, so make sure we never use it.
++ set dummy $ac_cv_prog_CC
++ shift
++ if test $# -gt 0; then
++ # We chose a different compiler from the bogus one.
++ # However, it has the same basename, so the bogon will be chosen
++ # first if we set CC to just the basename; use the full file name.
++ shift
++ set dummy "$ac_dir/$ac_word" "$@"
++ shift
++ ac_cv_prog_CC="$@"
++ fi
++fi
++fi
++fi
++CC="$ac_cv_prog_CC"
++if test -n "$CC"; then
++ echo "$ac_t""$CC" 1>&6
++else
++ echo "$ac_t""no" 1>&6
++fi
++
++ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
++fi
++
++echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
++echo "configure:1174: checking whether we are using GNU C" >&5
++if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
++ ac_cv_prog_gcc=yes
++else
++ ac_cv_prog_gcc=no
++fi
++fi
++
++echo "$ac_t""$ac_cv_prog_gcc" 1>&6
++
++if test $ac_cv_prog_gcc = yes; then
++ GCC=yes
++ ac_test_CFLAGS="${CFLAGS+set}"
++ ac_save_CFLAGS="$CFLAGS"
++ CFLAGS=
++ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
++echo "configure:1198: checking whether ${CC-cc} accepts -g" >&5
++if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ echo 'void f(){}' > conftest.c
++if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
++ ac_cv_prog_cc_g=yes
++else
++ ac_cv_prog_cc_g=no
++fi
++rm -f conftest*
++
++fi
++
++echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
++ if test "$ac_test_CFLAGS" = set; then
++ CFLAGS="$ac_save_CFLAGS"
++ elif test $ac_cv_prog_cc_g = yes; then
++ CFLAGS="-g -O2"
++ else
++ CFLAGS="-O2"
++ fi
++else
++ GCC=
++ test "${CFLAGS+set}" = set || CFLAGS="-g"
++fi
++
++
++# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
++set dummy ${ac_tool_prefix}as; ac_word=$2
++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
++echo "configure:1229: checking for $ac_word" >&5
++if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ if test -n "$AS"; then
++ ac_cv_prog_AS="$AS" # Let the user override the test.
++else
++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
++ ac_dummy="$PATH"
++ for ac_dir in $ac_dummy; do
++ test -z "$ac_dir" && ac_dir=.
++ if test -f $ac_dir/$ac_word; then
++ ac_cv_prog_AS="${ac_tool_prefix}as"
++ break
++ fi
++ done
++ IFS="$ac_save_ifs"
++ test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as"
++fi
++fi
++AS="$ac_cv_prog_AS"
++if test -n "$AS"; then
++ echo "$ac_t""$AS" 1>&6
++else
++ echo "$ac_t""no" 1>&6
++fi
++
++
++
++# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
++set dummy ${ac_tool_prefix}ar; ac_word=$2
++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
++echo "configure:1261: checking for $ac_word" >&5
++if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ if test -n "$AR"; then
++ ac_cv_prog_AR="$AR" # Let the user override the test.
++else
++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
++ ac_dummy="$PATH"
++ for ac_dir in $ac_dummy; do
++ test -z "$ac_dir" && ac_dir=.
++ if test -f $ac_dir/$ac_word; then
++ ac_cv_prog_AR="${ac_tool_prefix}ar"
++ break
++ fi
++ done
++ IFS="$ac_save_ifs"
++ test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
++fi
++fi
++AR="$ac_cv_prog_AR"
++if test -n "$AR"; then
++ echo "$ac_t""$AR" 1>&6
++else
++ echo "$ac_t""no" 1>&6
++fi
++
++
++
++# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
++set dummy ${ac_tool_prefix}ranlib; ac_word=$2
++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
++echo "configure:1293: checking for $ac_word" >&5
++if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ if test -n "$RANLIB"; then
++ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
++else
++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
++ ac_dummy="$PATH"
++ for ac_dir in $ac_dummy; do
++ test -z "$ac_dir" && ac_dir=.
++ if test -f $ac_dir/$ac_word; then
++ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
++ break
++ fi
++ done
++ IFS="$ac_save_ifs"
++fi
++fi
++RANLIB="$ac_cv_prog_RANLIB"
++if test -n "$RANLIB"; then
++ echo "$ac_t""$RANLIB" 1>&6
++else
++ echo "$ac_t""no" 1>&6
++fi
++
++
++if test -z "$ac_cv_prog_RANLIB"; then
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "ranlib", so it can be a program name with args.
++set dummy ranlib; ac_word=$2
++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
++echo "configure:1325: checking for $ac_word" >&5
++if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ if test -n "$RANLIB"; then
++ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
++else
++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
++ ac_dummy="$PATH"
++ for ac_dir in $ac_dummy; do
++ test -z "$ac_dir" && ac_dir=.
++ if test -f $ac_dir/$ac_word; then
++ ac_cv_prog_RANLIB="ranlib"
++ break
++ fi
++ done
++ IFS="$ac_save_ifs"
++ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
++fi
++fi
++RANLIB="$ac_cv_prog_RANLIB"
++if test -n "$RANLIB"; then
++ echo "$ac_t""$RANLIB" 1>&6
++else
++ echo "$ac_t""no" 1>&6
++fi
++
++else
++ RANLIB=":"
++fi
++fi
++
++
++# Find a good install program. We prefer a C program (faster),
++# so one script is as good as another. But avoid the broken or
++# incompatible versions:
++# SysV /etc/install, /usr/sbin/install
++# SunOS /usr/etc/install
++# IRIX /sbin/install
++# AIX /bin/install
++# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
++# AFS /usr/afsws/bin/install, which mishandles nonexistent args
++# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
++# ./install, which can be erroneously created by make from ./install.sh.
++echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
++echo "configure:1370: checking for a BSD compatible install" >&5
++if test -z "$INSTALL"; then
++if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
++ for ac_dir in $PATH; do
++ # Account for people who put trailing slashes in PATH elements.
++ case "$ac_dir/" in
++ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
++ *)
++ # OSF1 and SCO ODT 3.0 have their own names for install.
++ # Don't use installbsd from OSF since it installs stuff as root
++ # by default.
++ for ac_prog in ginstall scoinst install; do
++ if test -f $ac_dir/$ac_prog; then
++ if test $ac_prog = install &&
++ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
++ # AIX install. It has an incompatible calling convention.
++ :
++ else
++ ac_cv_path_install="$ac_dir/$ac_prog -c"
++ break 2
++ fi
++ fi
++ done
++ ;;
++ esac
++ done
++ IFS="$ac_save_IFS"
++
++fi
++ if test "${ac_cv_path_install+set}" = set; then
++ INSTALL="$ac_cv_path_install"
++ else
++ # As a last resort, use the slow shell script. We don't cache a
++ # path for INSTALL within a source directory, because that will
++ # break other packages using the cache if that directory is
++ # removed, or if the path is relative.
++ INSTALL="$ac_install_sh"
++ fi
++fi
++echo "$ac_t""$INSTALL" 1>&6
++
++# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
++# It thinks the first close brace ends the variable substitution.
++test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
++
++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
++
++test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
++
++
++echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
++echo "configure:1424: checking whether to enable maintainer-specific portions of Makefiles" >&5
++ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
++if test "${enable_maintainer_mode+set}" = set; then
++ enableval="$enable_maintainer_mode"
++ USE_MAINTAINER_MODE=$enableval
++else
++ USE_MAINTAINER_MODE=no
++fi
++
++ echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6
++
++
++if test $USE_MAINTAINER_MODE = yes; then
++ MAINTAINER_MODE_TRUE=
++ MAINTAINER_MODE_FALSE='#'
++else
++ MAINTAINER_MODE_TRUE='#'
++ MAINTAINER_MODE_FALSE=
++fi
++ MAINT=$MAINTAINER_MODE_TRUE
++
++
++
++# We need AC_EXEEXT to keep automake happy in cygnus mode. However,
++# at least currently, we never actually build a program, so we never
++# need to use $(EXEEXT). Moreover, the test for EXEEXT normally
++# fails, because we are probably configuring with a cross compiler
++# which can't create executables. So we include AC_EXEEXT to keep
++# automake happy, but we don't execute it, since we don't care about
++# the result.
++if false; then
++
++
++echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
++echo "configure:1458: checking for executable suffix" >&5
++if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
++ echo $ac_n "(cached) $ac_c" 1>&6
++else
++ if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
++ ac_cv_exeext=.exe
++else
++ rm -f conftest*
++ echo 'int main () { return 0; }' > conftest.$ac_ext
++ ac_cv_exeext=
++ if { (eval echo configure:1468: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
++ for file in conftest.*; do
++ case $file in
++ *.c | *.o | *.obj) ;;
++ *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
++ esac
++ done
++ else
++ { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
++ fi
++ rm -f conftest*
++ test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
++fi
++fi
++
++EXEEXT=""
++test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
++echo "$ac_t""${ac_cv_exeext}" 1>&6
++ac_exeext=$EXEEXT
++
++fi
++
++. ${newlib_basedir}/configure.host
++
++newlib_cflags="${newlib_cflags} -fno-builtin"
++
++NEWLIB_CFLAGS=${newlib_cflags}
++
++
++LDFLAGS=${ldflags}
++
++
++
++
++if test x${newlib_elix_level} = x0; then
++ ELIX_LEVEL_0_TRUE=
++ ELIX_LEVEL_0_FALSE='#'
++else
++ ELIX_LEVEL_0_TRUE='#'
++ ELIX_LEVEL_0_FALSE=
++fi
++
++
++if test x${newlib_elix_level} = x1; then
++ ELIX_LEVEL_1_TRUE=
++ ELIX_LEVEL_1_FALSE='#'
++else
++ ELIX_LEVEL_1_TRUE='#'
++ ELIX_LEVEL_1_FALSE=
++fi
++
++
++if test x${newlib_elix_level} = x2; then
++ ELIX_LEVEL_2_TRUE=
++ ELIX_LEVEL_2_FALSE='#'
++else
++ ELIX_LEVEL_2_TRUE='#'
++ ELIX_LEVEL_2_FALSE=
++fi
++
++
++if test x${newlib_elix_level} = x3; then
++ ELIX_LEVEL_3_TRUE=
++ ELIX_LEVEL_3_FALSE='#'
++else
++ ELIX_LEVEL_3_TRUE='#'
++ ELIX_LEVEL_3_FALSE=
++fi
++
++
++if test x${newlib_elix_level} = x4; then
++ ELIX_LEVEL_4_TRUE=
++ ELIX_LEVEL_4_FALSE='#'
++else
++ ELIX_LEVEL_4_TRUE='#'
++ ELIX_LEVEL_4_FALSE=
++fi
++
++
++
++if test x${use_libtool} = xyes; then
++ USE_LIBTOOL_TRUE=
++ USE_LIBTOOL_FALSE='#'
++else
++ USE_LIBTOOL_TRUE='#'
++ USE_LIBTOOL_FALSE=
++fi
++
++# Hard-code OBJEXT. Normally it is set by AC_OBJEXT, but we
++# use oext, which is set in configure.host based on the target platform.
++OBJEXT=${oext}
++
++
++
++
++
++
++
++
++
++
++trap '' 1 2 15
++cat > confcache <<\EOF
++# This file is a shell script that caches the results of configure
++# tests run on this system so they can be shared between configure
++# scripts and configure runs. It is not useful on other systems.
++# If it contains results you don't want to keep, you may remove or edit it.
++#
++# By default, configure uses ./config.cache as the cache file,
++# creating it if it does not exist already. You can give configure
++# the --cache-file=FILE option to use a different cache file; that is
++# what configure does when it calls configure scripts in
++# subdirectories, so they share the cache.
++# Giving --cache-file=/dev/null disables caching, for debugging configure.
++# config.status only pays attention to the cache file if you give it the
++# --recheck option to rerun configure.
++#
++EOF
++# The following way of writing the cache mishandles newlines in values,
++# but we know of no workaround that is simple, portable, and efficient.
++# So, don't put newlines in cache variables' values.
++# Ultrix sh set writes to stderr and can't be redirected directly,
++# and sets the high bit in the cache file unless we assign to the vars.
++(set) 2>&1 |
++ case `(ac_space=' '; set | grep ac_space) 2>&1` in
++ *ac_space=\ *)
++ # `set' does not quote correctly, so add quotes (double-quote substitution
++ # turns \\\\ into \\, and sed turns \\ into \).
++ sed -n \
++ -e "s/'/'\\\\''/g" \
++ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
++ ;;
++ *)
++ # `set' quotes correctly as required by POSIX, so do not add quotes.
++ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
++ ;;
++ esac >> confcache
++if cmp -s $cache_file confcache; then
++ :
++else
++ if test -w $cache_file; then
++ echo "updating cache $cache_file"
++ cat confcache > $cache_file
++ else
++ echo "not updating unwritable cache $cache_file"
++ fi
++fi
++rm -f confcache
++
++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
++
++test "x$prefix" = xNONE && prefix=$ac_default_prefix
++# Let make expand exec_prefix.
++test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
++
++# Any assignment to VPATH causes Sun make to only execute
++# the first set of double-colon rules, so remove it if not needed.
++# If there is a colon in the path, we need to keep it.
++if test "x$srcdir" = x.; then
++ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
++fi
++
++trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
++
++# Transform confdefs.h into DEFS.
++# Protect against shell expansion while executing Makefile rules.
++# Protect against Makefile macro expansion.
++cat > conftest.defs <<\EOF
++s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
++s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
++s%\[%\\&%g
++s%\]%\\&%g
++s%\$%$$%g
++EOF
++DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
++rm -f conftest.defs
++
++
++# Without the "./", some shells look in PATH for config.status.
++: ${CONFIG_STATUS=./config.status}
++
++echo creating $CONFIG_STATUS
++rm -f $CONFIG_STATUS
++cat > $CONFIG_STATUS </dev/null | sed 1q`:
++#
++# $0 $ac_configure_args
++#
++# Compiler output produced by configure, useful for debugging
++# configure, is in ./config.log if it exists.
++
++ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
++for ac_option
++do
++ case "\$ac_option" in
++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
++ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
++ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
++ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
++ echo "$CONFIG_STATUS generated by autoconf version 2.13"
++ exit 0 ;;
++ -help | --help | --hel | --he | --h)
++ echo "\$ac_cs_usage"; exit 0 ;;
++ *) echo "\$ac_cs_usage"; exit 1 ;;
++ esac
++done
++
++ac_given_srcdir=$srcdir
++ac_given_INSTALL="$INSTALL"
++
++trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
++EOF
++cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF
++$ac_vpsub
++$extrasub
++s%@SHELL@%$SHELL%g
++s%@CFLAGS@%$CFLAGS%g
++s%@CPPFLAGS@%$CPPFLAGS%g
++s%@CXXFLAGS@%$CXXFLAGS%g
++s%@FFLAGS@%$FFLAGS%g
++s%@DEFS@%$DEFS%g
++s%@LDFLAGS@%$LDFLAGS%g
++s%@LIBS@%$LIBS%g
++s%@exec_prefix@%$exec_prefix%g
++s%@prefix@%$prefix%g
++s%@program_transform_name@%$program_transform_name%g
++s%@bindir@%$bindir%g
++s%@sbindir@%$sbindir%g
++s%@libexecdir@%$libexecdir%g
++s%@datadir@%$datadir%g
++s%@sysconfdir@%$sysconfdir%g
++s%@sharedstatedir@%$sharedstatedir%g
++s%@localstatedir@%$localstatedir%g
++s%@libdir@%$libdir%g
++s%@includedir@%$includedir%g
++s%@oldincludedir@%$oldincludedir%g
++s%@infodir@%$infodir%g
++s%@mandir@%$mandir%g
++s%@MAY_SUPPLY_SYSCALLS_TRUE@%$MAY_SUPPLY_SYSCALLS_TRUE%g
++s%@MAY_SUPPLY_SYSCALLS_FALSE@%$MAY_SUPPLY_SYSCALLS_FALSE%g
++s%@newlib_basedir@%$newlib_basedir%g
++s%@host@%$host%g
++s%@host_alias@%$host_alias%g
++s%@host_cpu@%$host_cpu%g
++s%@host_vendor@%$host_vendor%g
++s%@host_os@%$host_os%g
++s%@target@%$target%g
++s%@target_alias@%$target_alias%g
++s%@target_cpu@%$target_cpu%g
++s%@target_vendor@%$target_vendor%g
++s%@target_os@%$target_os%g
++s%@build@%$build%g
++s%@build_alias@%$build_alias%g
++s%@build_cpu@%$build_cpu%g
++s%@build_vendor@%$build_vendor%g
++s%@build_os@%$build_os%g
++s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
++s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
++s%@INSTALL_DATA@%$INSTALL_DATA%g
++s%@PACKAGE@%$PACKAGE%g
++s%@VERSION@%$VERSION%g
++s%@ACLOCAL@%$ACLOCAL%g
++s%@AUTOCONF@%$AUTOCONF%g
++s%@AUTOMAKE@%$AUTOMAKE%g
++s%@AUTOHEADER@%$AUTOHEADER%g
++s%@MAKEINFO@%$MAKEINFO%g
++s%@SET_MAKE@%$SET_MAKE%g
++s%@CC@%$CC%g
++s%@AS@%$AS%g
++s%@AR@%$AR%g
++s%@RANLIB@%$RANLIB%g
++s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g
++s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g
++s%@MAINT@%$MAINT%g
++s%@EXEEXT@%$EXEEXT%g
++s%@NEWLIB_CFLAGS@%$NEWLIB_CFLAGS%g
++s%@ELIX_LEVEL_0_TRUE@%$ELIX_LEVEL_0_TRUE%g
++s%@ELIX_LEVEL_0_FALSE@%$ELIX_LEVEL_0_FALSE%g
++s%@ELIX_LEVEL_1_TRUE@%$ELIX_LEVEL_1_TRUE%g
++s%@ELIX_LEVEL_1_FALSE@%$ELIX_LEVEL_1_FALSE%g
++s%@ELIX_LEVEL_2_TRUE@%$ELIX_LEVEL_2_TRUE%g
++s%@ELIX_LEVEL_2_FALSE@%$ELIX_LEVEL_2_FALSE%g
++s%@ELIX_LEVEL_3_TRUE@%$ELIX_LEVEL_3_TRUE%g
++s%@ELIX_LEVEL_3_FALSE@%$ELIX_LEVEL_3_FALSE%g
++s%@ELIX_LEVEL_4_TRUE@%$ELIX_LEVEL_4_TRUE%g
++s%@ELIX_LEVEL_4_FALSE@%$ELIX_LEVEL_4_FALSE%g
++s%@USE_LIBTOOL_TRUE@%$USE_LIBTOOL_TRUE%g
++s%@USE_LIBTOOL_FALSE@%$USE_LIBTOOL_FALSE%g
++s%@OBJEXT@%$OBJEXT%g
++s%@oext@%$oext%g
++s%@aext@%$aext%g
++s%@libm_machine_dir@%$libm_machine_dir%g
++s%@machine_dir@%$machine_dir%g
++s%@sys_dir@%$sys_dir%g
++
++CEOF
++EOF
++
++cat >> $CONFIG_STATUS <<\EOF
++
++# Split the substitutions into bite-sized pieces for seds with
++# small command number limits, like on Digital OSF/1 and HP-UX.
++ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
++ac_file=1 # Number of current file.
++ac_beg=1 # First line for current file.
++ac_end=$ac_max_sed_cmds # Line after last line for current file.
++ac_more_lines=:
++ac_sed_cmds=""
++while $ac_more_lines; do
++ if test $ac_beg -gt 1; then
++ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
++ else
++ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
++ fi
++ if test ! -s conftest.s$ac_file; then
++ ac_more_lines=false
++ rm -f conftest.s$ac_file
++ else
++ if test -z "$ac_sed_cmds"; then
++ ac_sed_cmds="sed -f conftest.s$ac_file"
++ else
++ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
++ fi
++ ac_file=`expr $ac_file + 1`
++ ac_beg=$ac_end
++ ac_end=`expr $ac_end + $ac_max_sed_cmds`
++ fi
++done
++if test -z "$ac_sed_cmds"; then
++ ac_sed_cmds=cat
++fi
++EOF
++
++cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF
++for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
++ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
++ case "$ac_file" in
++ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
++ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
++ *) ac_file_in="${ac_file}.in" ;;
++ esac
++
++ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
++
++ # Remove last slash and all that follows it. Not all systems have dirname.
++ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
++ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
++ # The file is in a subdirectory.
++ test ! -d "$ac_dir" && mkdir "$ac_dir"
++ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
++ # A "../" for each directory in $ac_dir_suffix.
++ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
++ else
++ ac_dir_suffix= ac_dots=
++ fi
++
++ case "$ac_given_srcdir" in
++ .) srcdir=.
++ if test -z "$ac_dots"; then top_srcdir=.
++ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
++ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
++ *) # Relative path.
++ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
++ top_srcdir="$ac_dots$ac_given_srcdir" ;;
++ esac
++
++ case "$ac_given_INSTALL" in
++ [/$]*) INSTALL="$ac_given_INSTALL" ;;
++ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
++ esac
++
++ echo creating "$ac_file"
++ rm -f "$ac_file"
++ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
++ case "$ac_file" in
++ *Makefile*) ac_comsub="1i\\
++# $configure_input" ;;
++ *) ac_comsub= ;;
++ esac
++
++ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
++ sed -e "$ac_comsub
++s%@configure_input@%$configure_input%g
++s%@srcdir@%$srcdir%g
++s%@top_srcdir@%$top_srcdir%g
++s%@INSTALL@%$INSTALL%g
++" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
++fi; done
++rm -f conftest.s*
++
++EOF
++cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF
++
++exit 0
++EOF
++chmod +x $CONFIG_STATUS
++rm -fr confdefs* $ac_clean_files
++test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
++
+--- newlib-1.13.0/newlib/libc/sys/psp/configure.in 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/configure.in 2006-05-02 11:27:31.000000000 -0400
+@@ -0,0 +1,12 @@
++dnl This is the newlib/libc/sys/psp configure.in file.
++dnl Process this file with autoconf to produce a configure script.
++
++AC_PREREQ(2.5)
++AC_INIT(libcglue.c)
++
++dnl Can't be done in NEWLIB_CONFIGURE because that confuses automake.
++AC_CONFIG_AUX_DIR(../../../..)
++
++NEWLIB_CONFIGURE(../../..)
++
++AC_OUTPUT(Makefile)
+--- newlib-1.13.0/newlib/libc/sys/psp/crt0.c 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/crt0.c 2006-03-13 00:00:00.000000000 -0500
+@@ -0,0 +1,3 @@
++/* The real crt0.c lives in PSPSDK. */
++
++void _start() { }
+--- newlib-1.13.0/newlib/libc/sys/psp/fdman.c 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/fdman.c 2006-05-02 11:02:56.000000000 -0400
+@@ -0,0 +1,115 @@
++/*
++ * PSP Software Development Kit - http://www.pspdev.org
++ * -----------------------------------------------------------------------
++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
++ *
++ * fdman.c - File descriptor management.
++ *
++ * Copyright (c) 2006 Rafael Cabezas
++ */
++#include
++#include
++#include "fdman.h"
++
++extern int pspDisableInterrupts();
++extern void pspEnableInterrupts(int);
++
++static __psp_descriptormap_type __psp_descriptor_data_pool[__PSP_FILENO_MAX];
++__psp_descriptormap_type *__psp_descriptormap [__PSP_FILENO_MAX];
++
++void __psp_fdman_init()
++{
++ int scefd;
++
++ /* Initialize descriptor data*/
++ memset(__psp_descriptor_data_pool, 0, sizeof(__psp_descriptormap_type) *__PSP_FILENO_MAX);
++ /* Initialize descriptor map*/
++ memset(__psp_descriptormap, 0, sizeof(__psp_descriptormap_type*)*__PSP_FILENO_MAX);
++
++ scefd = sceKernelStdin();
++ if ((scefd >= 0) && (scefd < __PSP_FILENO_MAX)) {
++ __psp_descriptormap[0] = &__psp_descriptor_data_pool[0];
++ __psp_descriptormap[0]->sce_descriptor = scefd;
++ __psp_descriptormap[0]->type = __PSP_DESCRIPTOR_TYPE_TTY;
++ }
++ scefd = sceKernelStdout();
++ if ((scefd >= 0) && (scefd < __PSP_FILENO_MAX)) {
++ __psp_descriptormap[1] = &__psp_descriptor_data_pool[1];
++ __psp_descriptormap[1]->sce_descriptor = scefd;
++ __psp_descriptormap[1]->type = __PSP_DESCRIPTOR_TYPE_TTY;
++ }
++ scefd = sceKernelStderr();
++ if ((scefd >= 0) && (scefd < __PSP_FILENO_MAX)) {
++ __psp_descriptormap[2] = &__psp_descriptor_data_pool[2];
++ __psp_descriptormap[2]->sce_descriptor = scefd;
++ __psp_descriptormap[2]->type = __PSP_DESCRIPTOR_TYPE_TTY;
++ }
++}
++
++int __psp_fdman_get_new_descriptor()
++{
++ int i = 0;
++ int inten;
++
++ inten = pspDisableInterrupts(); /* lock here to make thread safe */
++ for (i = 0; i < __PSP_FILENO_MAX; i++) {
++ if (__psp_descriptormap[i] == NULL) {
++ __psp_descriptormap[i] = &__psp_descriptor_data_pool[i];
++ __psp_descriptormap[i]->ref_count++;
++ pspEnableInterrupts(inten); /* release lock */
++ return i;
++ }
++ }
++ pspEnableInterrupts(inten); /* release lock */
++
++ errno = ENOMEM;
++ return -1;
++}
++
++int __psp_fdman_get_dup_descriptor(int fd)
++{
++ int i = 0;
++ int inten;
++
++ if (!__PSP_IS_FD_VALID(fd)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ inten = pspDisableInterrupts(); /* lock here to make thread safe */
++ for (i = 0; i < __PSP_FILENO_MAX; i++) {
++ if (__psp_descriptormap[i] == NULL) {
++ __psp_descriptormap[i] = &__psp_descriptor_data_pool[fd];
++ __psp_descriptormap[i]->ref_count++;
++ pspEnableInterrupts(inten); /* release lock */
++ return i;
++ }
++ }
++ pspEnableInterrupts(inten); /* release lock */
++
++ errno = ENOMEM;
++ return -1;
++}
++
++void __psp_fdman_release_descriptor(int fd)
++{
++ if (!__PSP_IS_FD_VALID(fd)) {
++ errno = EBADF;
++ return;
++ }
++
++ __psp_descriptormap[fd]->ref_count--;
++
++ if (__psp_descriptormap[fd]->ref_count == 0) {
++
++ if (__psp_descriptormap[fd]->filename != NULL) {
++ free(__psp_descriptormap[fd]->filename);
++ }
++ __psp_descriptormap[fd]->filename = NULL;
++ __psp_descriptormap[fd]->sce_descriptor = 0;
++ __psp_descriptormap[fd]->type = 0;
++ __psp_descriptormap[fd]->flags = 0;
++
++ }
++ __psp_descriptormap[fd] = NULL;
++}
+--- newlib-1.13.0/newlib/libc/sys/psp/fdman.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/fdman.h 2006-04-28 10:06:39.000000000 -0400
+@@ -0,0 +1,44 @@
++/*
++ * PSP Software Development Kit - http://www.pspdev.org
++ * -----------------------------------------------------------------------
++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
++ *
++ * fdman.h - File descriptor management.
++ *
++ * Copyright (c) 2006 Rafael Cabezas
++ */
++
++#ifndef _FDMAN_H_
++ #define _FDMAN_H_
++
++ #define __PSP_FILENO_MAX 1024
++
++ #define __PSP_IS_FD_VALID(FD) \
++ ( (FD >= 0) && (FD < __PSP_FILENO_MAX) && (__psp_descriptormap[FD] != NULL) )
++
++ #define __PSP_IS_FD_OF_TYPE(FD, TYPE) \
++ ( (__PSP_IS_FD_VALID(FD)) && (__psp_descriptormap[FD]->type == TYPE) )
++
++ typedef enum {
++ __PSP_DESCRIPTOR_TYPE_FILE ,
++ __PSP_DESCRIPTOR_TYPE_PIPE ,
++ __PSP_DESCRIPTOR_TYPE_SOCKET,
++ __PSP_DESCRIPTOR_TYPE_TTY
++ } __psp_fdman_fd_types;
++
++ typedef struct {
++ char * filename;
++ u8 type;
++ u32 sce_descriptor;
++ u32 flags;
++ u32 ref_count;
++ } __psp_descriptormap_type;
++
++ extern __psp_descriptormap_type *__psp_descriptormap[__PSP_FILENO_MAX];
++
++ void __psp_fdman_init();
++ int __psp_fdman_get_new_descriptor();
++ int __psp_fdman_get_dup_descriptor(int fd);
++ void __psp_fdman_release_descriptor(int fd);
++
++#endif
+--- newlib-1.13.0/newlib/libc/sys/psp/include/netdb.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/include/netdb.h 2006-05-02 11:27:30.000000000 -0400
+@@ -0,0 +1,36 @@
++/* Simple gethostbyname and gethostbyaddr replacements, note not thread safe */
++#ifndef __NETDB_H__
++#define __NETDB_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define NETDB_INTERNAL -1 /* see errno */
++#define NETDB_SUCCESS 0 /* no problem */
++#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */
++#define TRY_AGAIN 2 /* Non-Authoritative Host not found, or SERVERFAIL */
++#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
++#define NO_DATA 4 /* Valid name, no data record of requested type */
++#define NO_ADDRESS NO_DATA /* no address, look for MX record */
++
++extern int h_errno;
++
++struct hostent
++{
++ char *h_name;
++ char **h_aliases;
++ int h_addrtype;
++ int h_length;
++ char **h_addr_list;
++ char *h_addr;
++};
++
++struct hostent *gethostbyaddr(const void *addr, int len, int type);
++struct hostent *gethostbyname(const char *name);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+--- newlib-1.13.0/newlib/libc/sys/psp/interrupt.S 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/interrupt.S 2006-05-02 11:28:43.000000000 -0400
+@@ -0,0 +1,66 @@
++
++ .set noreorder
++ .set noat
++
++ .global pspDisableInterrupts
++ .ent pspDisableInterrupts
++
++pspDisableInterrupts:
++ mfic $v0, $0
++ mtic $0, $0
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ jr $ra
++ nop
++
++ .end pspDisableInterrupts
++
++ .global pspEnableInterrupts
++ .ent pspEnableInterrupts
++
++pspEnableInterrupts:
++ mtic $a0, $0
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ nop
++ jr $ra
++ nop
++
++ .end pspEnableInterrupts
+--- newlib-1.13.0/newlib/libc/sys/psp/libcglue.c 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/libcglue.c 2006-05-02 11:03:27.000000000 -0400
+@@ -0,0 +1,898 @@
++/*
++ * PSP Software Development Kit - http://www.pspdev.org
++ * -----------------------------------------------------------------------
++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
++ *
++ * libcglue.c - Newlib-compatible system calls.
++ *
++ * Copyright (c) 2005 Marcus R. Brown
++ * Copyright (c) 2005 James Forshaw
++ * Copyright (c) 2005 John Kelley
++ * Copyright (c) 2005 Jim Paris
++ *
++ */
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include "fdman.h"
++
++extern char __psp_cwd[MAXPATHLEN + 1];
++extern void __psp_init_cwd(char *argv_0);
++extern int __psp_path_absolute(const char *in, char *out, int len);
++extern int pspDisableInterrupts();
++extern void pspEnableInterrupts(int);
++
++/* The following functions are defined in socket.c. They have weak linkage so
++ that the user doesn't have to link against the PSP network libraries if they
++ don't use the sockets API. */
++extern int __psp_socket_close(int s) __attribute__((weak));
++extern ssize_t __psp_socket_recv(int s, void *buf, size_t len, int flags) __attribute__((weak));
++extern ssize_t __psp_socket_send(int s, const void *buf, size_t len, int flags) __attribute__((weak));
++
++extern int pipe(int fildes[2]);
++extern int __psp_pipe_close(int filedes);
++extern int __psp_pipe_nonblocking_read(int fd, void *buf, size_t len);
++extern int __psp_pipe_read(int fd, void *buf, size_t len);
++extern int __psp_pipe_write(int fd, const void *buf, size_t size);
++extern int __psp_pipe_nonblocking_write(int fd, const void *buf, size_t len);
++
++int __psp_set_errno(int code);
++
++#ifdef F___psp_set_errno
++int __psp_set_errno(int code)
++{
++ if ((code & 0x80010000) == 0x80010000) {
++ errno = code & 0xFFFF;
++ return -1;
++ }
++ return code;
++}
++#endif
++
++#ifdef F_getcwd
++char *getcwd(char *buf, size_t size)
++{
++ if(!buf) {
++ errno = EINVAL;
++ return NULL;
++ }
++
++ if(strlen(__psp_cwd) >= size) {
++ errno = ERANGE;
++ return NULL;
++ }
++
++ strcpy(buf, __psp_cwd);
++ return buf;
++}
++#endif
++
++#ifdef F_chdir
++int chdir(const char *path)
++{
++ char dest[MAXPATHLEN + 1];
++ SceUID uid;
++
++ if(__psp_path_absolute(path, dest, MAXPATHLEN) < 0) {
++ errno = ENAMETOOLONG;
++ return -1;
++ }
++
++ /* sceIoChdir doesn't give an indication of whether it worked,
++ so test for existence by attempting to open the dir */
++ uid = sceIoDopen(dest);
++ if(uid < 0) {
++ errno = ENOTDIR;
++ return -1;
++ }
++ sceIoDclose(uid);
++
++ sceIoChdir(dest);
++ strcpy(__psp_cwd, dest);
++ return 0;
++}
++#endif
++
++#ifdef F_mkdir
++int mkdir(const char *pathname, mode_t mode)
++{
++ char dest[MAXPATHLEN + 1];
++
++ if(__psp_path_absolute(pathname, dest, MAXPATHLEN) < 0) {
++ errno = ENAMETOOLONG;
++ return -1;
++ }
++
++ return __psp_set_errno(sceIoMkdir(dest, mode));
++}
++#endif
++
++#ifdef F_rmdir
++int rmdir(const char *pathname)
++{
++ char dest[MAXPATHLEN + 1];
++
++ if(__psp_path_absolute(pathname, dest, MAXPATHLEN) < 0) {
++ errno = ENAMETOOLONG;
++ return -1;
++ }
++
++ return __psp_set_errno(sceIoRmdir(dest));
++}
++#endif
++
++#ifdef F_realpath
++char *realpath(const char *path, char *resolved_path)
++{
++ if(!path || !resolved_path) {
++ errno = EINVAL;
++ return NULL;
++ }
++ if(__psp_path_absolute(path, resolved_path, MAXPATHLEN) < 0) {
++ errno = ENAMETOOLONG;
++ return NULL;
++ }
++ if(access(resolved_path, F_OK) < 0) {
++ errno = ENOENT;
++ return NULL;
++ }
++ return resolved_path;
++}
++#endif
++
++/* Wrappers of the standard open(), close(), read(), write(), unlink() and lseek() routines. */
++#ifdef F__open
++int _open(const char *name, int flags, int mode)
++{
++ int scefd, fd;
++ int sce_flags;
++ char dest[MAXPATHLEN + 1];
++
++ if(__psp_path_absolute(name, dest, MAXPATHLEN) < 0) {
++ errno = ENAMETOOLONG;
++ return -1;
++ }
++
++ /* O_RDONLY starts at 0, where PSP_O_RDONLY starts at 1, so remap the read/write
++ flags by adding 1. */
++ sce_flags = (flags & O_ACCMODE) + 1;
++
++ /* Translate standard open flags into the flags understood by the PSP kernel. */
++ if (flags & O_APPEND) {
++ sce_flags |= PSP_O_APPEND;
++ }
++ if (flags & O_CREAT) {
++ sce_flags |= PSP_O_CREAT;
++ }
++ if (flags & O_TRUNC) {
++ sce_flags |= PSP_O_TRUNC;
++ }
++ if (flags & O_EXCL) {
++ sce_flags |= PSP_O_EXCL;
++ }
++ if (flags & O_NONBLOCK) {
++ sce_flags |= PSP_O_NBLOCK;
++ }
++
++ scefd = sceIoOpen(dest, sce_flags, mode);
++ if (scefd >= 0) {
++ fd = __psp_fdman_get_new_descriptor();
++ if (fd != -1) {
++ __psp_descriptormap[fd]->sce_descriptor = scefd;
++ __psp_descriptormap[fd]->type = __PSP_DESCRIPTOR_TYPE_FILE;
++ __psp_descriptormap[fd]->flags = flags;
++ __psp_descriptormap[fd]->filename = strdup(dest);
++ return fd;
++ }
++ else {
++ sceIoClose(scefd);
++ errno = ENOMEM;
++ return -1;
++ }
++ }
++ else {
++ return __psp_set_errno(scefd);
++ }
++
++}
++#endif
++
++#ifdef F__close
++int _close(int fd)
++{
++ int ret = 0;
++
++ if (!__PSP_IS_FD_VALID(fd)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ switch(__psp_descriptormap[fd]->type)
++ {
++ case __PSP_DESCRIPTOR_TYPE_FILE:
++ case __PSP_DESCRIPTOR_TYPE_TTY:
++ if (__psp_descriptormap[fd]->ref_count == 1) {
++ ret = __psp_set_errno(sceIoClose(__psp_descriptormap[fd]->sce_descriptor));
++ }
++ __psp_fdman_release_descriptor(fd);
++ return ret;
++ break;
++ case __PSP_DESCRIPTOR_TYPE_PIPE:
++ return __psp_pipe_close(fd);
++ break;
++ case __PSP_DESCRIPTOR_TYPE_SOCKET:
++ if (__psp_socket_close != NULL) {
++ ret = __psp_socket_close(fd);
++ return ret;
++ }
++ break;
++ default:
++ break;
++ }
++
++ errno = EBADF;
++ return -1;
++}
++#endif
++
++#ifdef F__read
++int _read(int fd, void *buf, size_t size)
++{
++ if (!__PSP_IS_FD_VALID(fd)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ switch(__psp_descriptormap[fd]->type)
++ {
++ case __PSP_DESCRIPTOR_TYPE_FILE:
++ case __PSP_DESCRIPTOR_TYPE_TTY:
++ return __psp_set_errno(sceIoRead(__psp_descriptormap[fd]->sce_descriptor, buf, size));
++ break;
++ case __PSP_DESCRIPTOR_TYPE_PIPE:
++ if (__psp_descriptormap[fd]->flags & O_NONBLOCK) {
++ return __psp_pipe_nonblocking_read(fd, buf, size);
++ }
++ else {
++ return __psp_pipe_read(fd, buf, size);
++ }
++ break;
++ case __PSP_DESCRIPTOR_TYPE_SOCKET:
++ if (__psp_socket_recv != NULL) {
++ return __psp_socket_recv(fd, buf, size, 0);
++ }
++ break;
++ default:
++ break;
++ }
++
++ errno = EBADF;
++ return -1;
++
++}
++#endif
++
++#ifdef F__write
++int _write(int fd, const void *buf, size_t size)
++{
++ if (!__PSP_IS_FD_VALID(fd)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ switch(__psp_descriptormap[fd]->type)
++ {
++ case __PSP_DESCRIPTOR_TYPE_FILE:
++ case __PSP_DESCRIPTOR_TYPE_TTY:
++ return __psp_set_errno(sceIoWrite(__psp_descriptormap[fd]->sce_descriptor, buf, size));
++ break;
++ case __PSP_DESCRIPTOR_TYPE_PIPE:
++ if (__psp_descriptormap[fd]->flags & O_NONBLOCK) {
++ return __psp_pipe_nonblocking_write(fd, buf, size);
++ }
++ else {
++ return __psp_pipe_write(fd, buf, size);
++ }
++ break;
++ break;
++ case __PSP_DESCRIPTOR_TYPE_SOCKET:
++ if (__psp_socket_send != NULL) {
++ return __psp_socket_send(fd, buf, size, 0);
++ }
++ break;
++ default:
++ break;
++ }
++
++ errno = EBADF;
++ return -1;
++}
++#endif
++
++#ifdef F__lseek
++off_t _lseek(int fd, off_t offset, int whence)
++{
++ if (!__PSP_IS_FD_VALID(fd)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ switch(__psp_descriptormap[fd]->type)
++ {
++ case __PSP_DESCRIPTOR_TYPE_FILE:
++ /* We don't have to do anything with the whence argument because SEEK_* == PSP_SEEK_*. */
++ return (off_t) __psp_set_errno(sceIoLseek(__psp_descriptormap[fd]->sce_descriptor, offset, whence));
++ break;
++ case __PSP_DESCRIPTOR_TYPE_PIPE:
++ break;
++ case __PSP_DESCRIPTOR_TYPE_SOCKET:
++ break;
++ default:
++ break;
++ }
++
++ errno = EBADF;
++ return -1;
++
++}
++#endif
++
++#ifdef F__unlink
++int _unlink(const char *path)
++{
++ char dest[MAXPATHLEN + 1];
++
++ if(__psp_path_absolute(path, dest, MAXPATHLEN) < 0) {
++ errno = ENAMETOOLONG;
++ return -1;
++ }
++
++ return __psp_set_errno(sceIoRemove(dest));
++}
++#endif
++
++#ifdef F__link
++int _link(const char *name1, const char *name2)
++{
++ errno = ENOSYS;
++ return -1; /* not supported */
++}
++#endif
++
++#ifdef F_opendir
++DIR *opendir(const char *filename)
++{
++ char dest[MAXPATHLEN + 1];
++ DIR *dirp;
++ SceUID uid;
++
++ /* Normalize pathname so that opendir(".") works */
++ if(__psp_path_absolute(filename, dest, MAXPATHLEN) < 0) {
++ errno = ENOENT;
++ return NULL;
++ }
++
++ dirp = (DIR *)malloc(sizeof(DIR));
++
++ uid = sceIoDopen(dest);
++
++ if (uid < 0)
++ {
++ free(dirp);
++ (void) __psp_set_errno(uid);
++ return NULL;
++ }
++
++ dirp->uid = uid;
++
++ return dirp;
++}
++#endif
++
++#ifdef F_readdir
++struct dirent *readdir(DIR *dirp)
++{
++ int ret;
++
++ /* Zero the dirent, to avoid possible problems with sceIoDread */
++ memset(&dirp->de, 0, sizeof(struct dirent));
++
++ ret = sceIoDread(dirp->uid, (SceIoDirent *)&dirp->de);
++ if (ret == 0) {
++ /* EOF */
++ errno = 0;
++ return NULL;
++ }
++ if (ret < 0) {
++ (void) __psp_set_errno(ret);
++ return NULL;
++ }
++
++ return &dirp->de;
++}
++#endif
++
++#ifdef F_closedir
++int closedir(DIR *dirp)
++{
++ if (dirp != NULL)
++ {
++ int uid;
++ uid = dirp->uid;
++ free (dirp);
++ return __psp_set_errno(sceIoDclose(uid));
++ }
++ errno = EBADF;
++ return -1;
++}
++#endif
++
++/* Time routines. These wrap around the routines provided by the kernel. */
++#ifdef F__gettimeofday
++int _gettimeofday(struct timeval *tp, struct timezone *tzp)
++{
++ return __psp_set_errno(sceKernelLibcGettimeofday(tp, tzp));
++}
++
++#endif
++
++#if defined(F_clock)
++clock_t clock(void)
++{
++ return sceKernelLibcClock();
++}
++#endif
++
++#if defined(F_time)
++time_t time(time_t *t)
++{
++ return __psp_set_errno(sceKernelLibcTime(t));
++}
++#endif
++
++#if defined(F_sleep)
++unsigned int sleep(unsigned int secs) {
++ while(secs--) {
++ sceKernelDelayThreadCB(1000000);
++ }
++ return 0;
++}
++#endif
++
++/* PSP-compatible sbrk(). */
++#if defined(F__sbrk) || defined(F_glue__sbrk)
++/* TODO: Currently our default heap is set to the maximum available block size
++ when sbrk() is first called. Sony seems to always use a default of 64KB,
++ with the expectation that user programs will override the default size with
++ their own desired size. The only reason I can think of them doing this is
++ to allow each PRX to have their own seperate heap. I think that their
++ method is overkill for most user programs.
++
++ What I'd like to do instead is to use the default of 64KB for PRXes as Sony
++ does, but use the maximum available block size for executables. This avoids
++ the requirement of specifying the heap size manually in user programs.
++ However, we currently don't have a clean way to distinguish PRXes and normal
++ executables, so this code needs to be revisited once we do come up with a
++ way. */
++#define DEFAULT_PRX_HEAP_SIZE_KB 64
++
++/* If defined it specifies the desired size of the heap, in KB. */
++extern unsigned int sce_newlib_heap_kb_size __attribute__((weak));
++extern int __pspsdk_is_prx __attribute__((weak));
++
++/* UID of the memory block that represents the heap. */
++static SceUID __psp_heap_blockid;
++
++void * _sbrk(ptrdiff_t incr)
++{
++ static void * heap_bottom = NULL;
++ static void * heap_top = NULL;
++ static void * heap_ptr = NULL;
++
++ /* Has our heap been initialized? */
++ if (heap_bottom == NULL) {
++ /* No, initialize the heap. */
++ SceSize heap_size;
++
++ if (&sce_newlib_heap_kb_size != NULL) {
++ heap_size = sce_newlib_heap_kb_size * 1024;
++ } else {
++ if (&__pspsdk_is_prx != NULL) {
++ heap_size = DEFAULT_PRX_HEAP_SIZE_KB * 1024;
++ } else {
++ heap_size = sceKernelMaxFreeMemSize();
++ }
++ }
++
++ __psp_heap_blockid = sceKernelAllocPartitionMemory(2, "block", PSP_SMEM_Low, heap_size, NULL);
++ if (__psp_heap_blockid > 0) {
++ heap_bottom = sceKernelGetBlockHeadAddr(__psp_heap_blockid);
++ heap_ptr = heap_bottom;
++ heap_top = (unsigned char *) heap_bottom + heap_size;
++ }
++ }
++
++ void * heap_addr = (void *) -1;
++ void * next_heap_ptr = (void *) ((ptrdiff_t) heap_ptr + incr);
++ if ((heap_bottom != NULL) && (next_heap_ptr >= heap_bottom) && (next_heap_ptr < heap_top)) {
++ heap_addr = heap_ptr;
++ heap_ptr = next_heap_ptr;
++ }
++
++ return heap_addr;
++}
++
++/* Free the heap. */
++int __psp_free_heap(void)
++{
++ if (__psp_heap_blockid > 0) {
++ return sceKernelFreePartitionMemory(__psp_heap_blockid);
++ }
++
++ return __psp_heap_blockid;
++}
++#endif
++
++/* Other POSIX routines that must be defined. */
++#ifdef F__fstat
++int _fstat(int fd, struct stat *sbuf)
++{
++ int ret;
++ SceOff oldpos;
++ if (!__PSP_IS_FD_VALID(fd)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ switch(__psp_descriptormap[fd]->type)
++ {
++ case __PSP_DESCRIPTOR_TYPE_TTY:
++ memset(sbuf, '\0', sizeof(struct stat));
++ sbuf->st_mode = S_IFCHR;
++ return 0;
++ break;
++ case __PSP_DESCRIPTOR_TYPE_FILE:
++ if (__psp_descriptormap[fd]->filename != NULL) {
++ ret = stat(__psp_descriptormap[fd]->filename, sbuf);
++
++ /* Find true size of the open file */
++ oldpos = sceIoLseek(__psp_descriptormap[fd]->sce_descriptor, 0, SEEK_CUR);
++ if (oldpos != (off_t) -1) {
++ sbuf->st_size = (off_t) sceIoLseek(__psp_descriptormap[fd]->sce_descriptor, 0, SEEK_END);
++ sceIoLseek(__psp_descriptormap[fd]->sce_descriptor, oldpos, SEEK_SET);
++ }
++ return ret;
++ }
++ break;
++ case __PSP_DESCRIPTOR_TYPE_PIPE:
++ case __PSP_DESCRIPTOR_TYPE_SOCKET:
++ default:
++ break;
++ }
++
++ errno = EBADF;
++ return -1;
++}
++#endif
++
++#ifdef F_isatty
++int isatty(int fd)
++{
++ if (!__PSP_IS_FD_VALID(fd)) {
++ errno = EBADF;
++ return 0;
++ }
++
++ if (__psp_descriptormap[fd]->type == __PSP_DESCRIPTOR_TYPE_TTY) {
++ return 1;
++ }
++ else {
++ return 0;
++ }
++}
++#endif
++
++#ifdef F__stat
++static time_t psp_to_epoch_time(ScePspDateTime psp_time)
++{
++ struct tm conv_time;
++ conv_time.tm_year = psp_time.year;
++ conv_time.tm_mon = psp_time.month;
++ conv_time.tm_mday = psp_time.day;
++ conv_time.tm_hour = psp_time.hour;
++ conv_time.tm_min = psp_time.minute;
++ conv_time.tm_sec = psp_time.second;
++ conv_time.tm_isdst = -1;
++ return mktime(&conv_time);
++}
++
++int _stat(const char *filename, struct stat *buf)
++{
++ SceIoStat psp_stat;
++ char dest[MAXPATHLEN + 1];
++ int ret;
++
++ if(__psp_path_absolute(filename, dest, MAXPATHLEN) < 0) {
++ errno = ENAMETOOLONG;
++ return -1;
++ }
++
++ memset(buf, '\0', sizeof(struct stat));
++ ret = sceIoGetstat(dest, &psp_stat);
++ if (ret < 0) {
++ return __psp_set_errno(ret);
++ }
++
++ buf->st_ctime = psp_to_epoch_time(psp_stat.st_ctime);
++ buf->st_atime = psp_to_epoch_time(psp_stat.st_atime);
++ buf->st_mtime = psp_to_epoch_time(psp_stat.st_mtime);
++
++ buf->st_mode = (psp_stat.st_mode & 0xfff) |
++ ((FIO_S_ISLNK(psp_stat.st_mode))?(S_IFLNK):(0)) |
++ ((FIO_S_ISREG(psp_stat.st_mode))?(S_IFREG):(0)) |
++ ((FIO_S_ISDIR(psp_stat.st_mode))?(S_IFDIR):(0));
++ buf->st_size = psp_stat.st_size;
++ return 0;
++}
++#endif
++
++/* from stat.h in ps2sdk, this function may be correct */
++#define FIO_CST_SIZE 0x0004
++
++#ifdef F_truncate
++int truncate(const char *filename, off_t length)
++{
++ SceIoStat psp_stat;
++ char dest[MAXPATHLEN + 1];
++
++ if(__psp_path_absolute(filename, dest, MAXPATHLEN) < 0) {
++ errno = ENAMETOOLONG;
++ return -1;
++ }
++
++ psp_stat.st_size = length;
++ if(length < 0)
++ {
++ errno = EINVAL;
++ return -1;
++ }
++ return __psp_set_errno(sceIoChstat(dest, &psp_stat, FIO_CST_SIZE));
++}
++#endif
++
++/* Unsupported newlib system calls. */
++#ifdef F__fork
++pid_t fork(void)
++{
++ errno = ENOSYS;
++ return (pid_t) -1;
++}
++#endif
++
++#ifdef F__getpid
++pid_t _getpid(void)
++{
++ errno = ENOSYS;
++ return (pid_t) -1;
++}
++#endif
++
++#ifdef F__kill
++int _kill(int unused, int unused2)
++{
++ errno = ENOSYS;
++ return -1;
++}
++#endif
++
++#ifdef F__wait
++pid_t _wait(int *unused)
++{
++ errno = ENOSYS;
++ return (pid_t) -1;
++}
++#endif
++
++#ifdef F_access
++int access(const char *fn, int flags)
++{
++ struct stat s;
++ if (stat(fn, &s))
++ return -1;
++ if (s.st_mode & S_IFDIR)
++ return 0;
++ if (flags & W_OK)
++ {
++ if (s.st_mode & S_IWRITE)
++ return 0;
++ errno = EACCES;
++ return -1;
++ }
++ return 0;
++}
++#endif
++
++#ifdef F__fcntl
++int _fcntl(int fd, int cmd, ...)
++{
++ if (!__PSP_IS_FD_VALID(fd)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ switch (cmd)
++ {
++ case F_DUPFD:
++ {
++ return __psp_fdman_get_dup_descriptor(fd);
++ break;
++ }
++ case F_GETFL:
++ {
++ return __psp_descriptormap[fd]->flags;
++ break;
++ }
++ case F_SETFL:
++ {
++ int newfl;
++ va_list args;
++
++ va_start (args, cmd); /* Initialize the argument list. */
++ newfl = va_arg(args, int);
++ va_end (args); /* Clean up. */
++
++ __psp_descriptormap[fd]->flags = newfl;
++
++ switch(__psp_descriptormap[fd]->type)
++ {
++ case __PSP_DESCRIPTOR_TYPE_FILE:
++ break;
++ case __PSP_DESCRIPTOR_TYPE_PIPE:
++ break;
++ case __PSP_DESCRIPTOR_TYPE_SOCKET:
++ if (newfl & O_NONBLOCK)
++ {
++ int one = 1;
++ return setsockopt(fd, SOL_SOCKET, SO_NONBLOCK, (char *)&one, sizeof(one));
++ }
++ else
++ {
++ int zero = 0;
++ return setsockopt(fd, SOL_SOCKET, SO_NONBLOCK, (char *)&zero, sizeof(zero));
++ }
++ break;
++ default:
++ break;
++ }
++ return 0;
++ break;
++ }
++ }
++
++ errno = EBADF;
++ return -1;
++}
++#endif /* F__fcntl */
++
++#ifdef F_tzset
++void tzset(void)
++{
++ static int initialized = 0;
++
++ if (!initialized)
++ {
++ initialized = 1;
++
++ /* Don't init if TZ has already been set once, this probably means the user
++ wanted to override what we would set below. */
++ if (getenv("TZ") == NULL)
++ {
++ /* Initialize timezone from PSP configuration */
++ int tzOffset = 0;
++ sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_TIMEZONE, &tzOffset);
++ int tzOffsetAbs = tzOffset < 0 ? -tzOffset : tzOffset;
++ int hours = tzOffsetAbs / 60;
++ int minutes = tzOffsetAbs - hours * 60;
++ int pspDaylight = 0;
++ sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_DAYLIGHTSAVINGS, &pspDaylight);
++ static char tz[18];
++ sprintf(tz, "GMT%s%02i:%02i%s", tzOffset < 0 ? "+" : "-", hours, minutes, pspDaylight ? "daylight" : "");
++ setenv("TZ", tz, 1);
++ }
++ }
++
++ _tzset_r(_REENT);
++}
++#endif
++
++#ifdef F_mlock
++static unsigned int lock_count = 0;
++static unsigned int intr_flags = 0;
++
++void __malloc_lock(struct _reent *ptr)
++{
++ unsigned int flags = pspDisableInterrupts();
++
++ if (lock_count == 0) {
++ intr_flags = flags;
++ }
++
++ lock_count++;
++}
++
++void __malloc_unlock(struct _reent *ptr)
++{
++ if (--lock_count == 0) {
++ pspEnableInterrupts(intr_flags);
++ }
++}
++#endif
++
++/* Exit. */
++#if defined(F__exit) || defined(F_glue__exit)
++extern int sce_newlib_nocreate_thread_in_start __attribute__((weak));
++
++extern int __psp_free_heap(void);
++
++void _exit(int status)
++{
++ if (&sce_newlib_nocreate_thread_in_start == NULL) {
++ /* Free the heap created by _sbrk(). */
++ __psp_free_heap();
++
++ sceKernelSelfStopUnloadModule(1, 0, NULL);
++ } else {
++ if (status == 0) {
++ /* Free the heap created by _sbrk(). */
++ __psp_free_heap();
++ }
++
++ sceKernelExitThread(status);
++ }
++
++ while (1) ;
++}
++
++/* Note: This function is being linked into _exit.o.
++
++ Because __psp_libc_init is a weak import in crt0.c, the linker
++ chooses to ignore an object file in libc.a that contains just this
++ function, since it's not necessary for successful compilation.
++
++ By putting it instead in _exit.o, which is already used by crt0.c,
++ the linker sees __psp_libc_init and resolves the symbol properly.
++*/
++void __psp_libc_init(int argc, char *argv[])
++{
++ (void) argc;
++
++ /* Initialize cwd from this program's path */
++ __psp_init_cwd(argv[0]);
++
++ /* Initialize filedescriptor management */
++ __psp_fdman_init();
++}
++
++#endif /* F__exit */
++
+--- newlib-1.13.0/newlib/libc/sys/psp/netdb.c 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/netdb.c 2006-03-13 00:00:00.000000000 -0500
+@@ -0,0 +1,101 @@
++/* Simple gethostbyname and gethostbyaddr replacements using the resolver lib */
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++#define MAX_NAME 512
++
++#ifdef F_h_errno
++int h_errno = NETDB_SUCCESS;
++#endif
++
++#ifdef F_gethostbyaddr
++struct hostent *gethostbyaddr(const void *addr, int len, int type)
++{
++ static struct hostent ent;
++ char buf[1024];
++ static char sname[MAX_NAME] = "";
++ static struct in_addr saddr = { 0 };
++ static char *addrlist[2] = { (char *) &saddr, NULL };
++ int rid;
++ int err;
++
++ if((len != sizeof(struct in_addr)) || (type != AF_INET) || (addr == NULL))
++ {
++ h_errno = HOST_NOT_FOUND;
++ return NULL;
++ }
++
++ memcpy(&saddr, addr, len);
++
++ if(sceNetResolverCreate(&rid, buf, sizeof(buf)) < 0)
++ {
++ h_errno = NO_RECOVERY;
++ return NULL;
++ }
++
++ err = sceNetResolverStartAtoN(rid, &saddr, sname, sizeof(sname), 2, 3);
++ sceNetResolverDelete(rid);
++ if(err < 0)
++ {
++ h_errno = HOST_NOT_FOUND;
++ return NULL;
++ }
++
++ ent.h_name = sname;
++ ent.h_aliases = 0;
++ ent.h_addrtype = AF_INET;
++ ent.h_length = sizeof(struct in_addr);
++ ent.h_addr_list = addrlist;
++ ent.h_addr = (char *) &saddr;
++
++ return &ent;
++}
++#endif
++
++#ifdef F_gethostbyname
++struct hostent *gethostbyname(const char *name)
++{
++ static struct hostent ent;
++ char buf[1024];
++ static char sname[MAX_NAME] = "";
++ static struct in_addr saddr = { 0 };
++ static char *addrlist[2] = { (char *) &saddr, NULL };
++ int rid;
++
++ if(sceNetInetInetAton(name, &saddr) == 0)
++ {
++ int err;
++
++ if(sceNetResolverCreate(&rid, buf, sizeof(buf)) < 0)
++ {
++ h_errno = NO_RECOVERY;
++ return NULL;
++ }
++
++ err = sceNetResolverStartNtoA(rid, name, &saddr, 2, 3);
++ sceNetResolverDelete(rid);
++ if(err < 0)
++ {
++ h_errno = HOST_NOT_FOUND;
++ return NULL;
++ }
++
++ }
++
++ snprintf(sname, MAX_NAME, "%s", name);
++ ent.h_name = sname;
++ ent.h_aliases = 0;
++ ent.h_addrtype = AF_INET;
++ ent.h_length = sizeof(struct in_addr);
++ ent.h_addr_list = addrlist;
++ ent.h_addr = (char *) &saddr;
++
++ return &ent;
++}
++
++#endif
+--- newlib-1.13.0/newlib/libc/sys/psp/netinet/in.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/netinet/in.h 2006-05-02 11:27:30.000000000 -0400
+@@ -0,0 +1,271 @@
++/* $NetBSD: in.h,v 1.71 2005/08/05 09:21:25 elad Exp $ */
++
++/*
++ * Copyright (c) 1982, 1986, 1990, 1993
++ * The Regents of the University of California. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. Neither the name of the University nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ * @(#)in.h 8.3 (Berkeley) 1/3/94
++ */
++
++/*
++ * Constants and structures defined by the internet system,
++ * Per RFC 790, September 1981, and numerous additions.
++ */
++
++#ifndef _NETINET_IN_H_
++#define _NETINET_IN_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include
++
++typedef uint32_t in_addr_t;
++typedef uint16_t in_port_t;
++
++/*
++ * Protocols
++ */
++#define IPPROTO_IP 0 /* dummy for IP */
++#define IPPROTO_HOPOPTS 0 /* IP6 hop-by-hop options */
++#define IPPROTO_ICMP 1 /* control message protocol */
++#define IPPROTO_IGMP 2 /* group mgmt protocol */
++#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */
++#define IPPROTO_IPV4 4 /* IP header */
++#define IPPROTO_IPIP 4 /* IP inside IP */
++#define IPPROTO_TCP 6 /* tcp */
++#define IPPROTO_EGP 8 /* exterior gateway protocol */
++#define IPPROTO_PUP 12 /* pup */
++#define IPPROTO_UDP 17 /* user datagram protocol */
++#define IPPROTO_IDP 22 /* xns idp */
++#define IPPROTO_TP 29 /* tp-4 w/ class negotiation */
++#define IPPROTO_IPV6 41 /* IP6 header */
++#define IPPROTO_ROUTING 43 /* IP6 routing header */
++#define IPPROTO_FRAGMENT 44 /* IP6 fragmentation header */
++#define IPPROTO_RSVP 46 /* resource reservation */
++#define IPPROTO_GRE 47 /* GRE encaps RFC 1701 */
++#define IPPROTO_ESP 50 /* encap. security payload */
++#define IPPROTO_AH 51 /* authentication header */
++#define IPPROTO_MOBILE 55 /* IP Mobility RFC 2004 */
++#define IPPROTO_IPV6_ICMP 58 /* IPv6 ICMP */
++#define IPPROTO_ICMPV6 58 /* ICMP6 */
++#define IPPROTO_NONE 59 /* IP6 no next header */
++#define IPPROTO_DSTOPTS 60 /* IP6 destination option */
++#define IPPROTO_EON 80 /* ISO cnlp */
++#define IPPROTO_ETHERIP 97 /* Ethernet-in-IP */
++#define IPPROTO_ENCAP 98 /* encapsulation header */
++#define IPPROTO_PIM 103 /* Protocol indep. multicast */
++#define IPPROTO_IPCOMP 108 /* IP Payload Comp. Protocol */
++#define IPPROTO_VRRP 112 /* VRRP RFC 2338 */
++
++#define IPPROTO_RAW 255 /* raw IP packet */
++#define IPPROTO_MAX 256
++
++/* last return value of *_input(), meaning "all job for this pkt is done". */
++#define IPPROTO_DONE 257
++
++/* sysctl placeholder for (FAST_)IPSEC */
++#define CTL_IPPROTO_IPSEC 258
++
++
++/*
++ * Local port number conventions:
++ *
++ * Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root),
++ * unless a kernel is compiled with IPNOPRIVPORTS defined.
++ *
++ * When a user does a bind(2) or connect(2) with a port number of zero,
++ * a non-conflicting local port address is chosen.
++ *
++ * The default range is IPPORT_ANONMIN to IPPORT_ANONMAX, although
++ * that is settable by sysctl(3); net.inet.ip.anonportmin and
++ * net.inet.ip.anonportmax respectively.
++ *
++ * A user may set the IPPROTO_IP option IP_PORTRANGE to change this
++ * default assignment range.
++ *
++ * The value IP_PORTRANGE_DEFAULT causes the default behavior.
++ *
++ * The value IP_PORTRANGE_HIGH is the same as IP_PORTRANGE_DEFAULT,
++ * and exists only for FreeBSD compatibility purposes.
++ *
++ * The value IP_PORTRANGE_LOW changes the range to the "low" are
++ * that is (by convention) restricted to privileged processes.
++ * This convention is based on "vouchsafe" principles only.
++ * It is only secure if you trust the remote host to restrict these ports.
++ * The range is IPPORT_RESERVEDMIN to IPPORT_RESERVEDMAX.
++ */
++
++#define IPPORT_RESERVED 1024
++#define IPPORT_ANONMIN 49152
++#define IPPORT_ANONMAX 65535
++#define IPPORT_RESERVEDMIN 600
++#define IPPORT_RESERVEDMAX (IPPORT_RESERVED-1)
++
++/*
++ * Internet address (a structure for historical reasons)
++ */
++struct in_addr {
++ in_addr_t s_addr;
++} __attribute__((__packed__));
++
++#define __IPADDR(x) ((uint32_t)(x))
++
++#define IN_CLASSA(i) (((uint32_t)(i) & __IPADDR(0x80000000)) == \
++ __IPADDR(0x00000000))
++#define IN_CLASSA_NET __IPADDR(0xff000000)
++#define IN_CLASSA_NSHIFT 24
++#define IN_CLASSA_HOST __IPADDR(0x00ffffff)
++#define IN_CLASSA_MAX 128
++
++#define IN_CLASSB(i) (((uint32_t)(i) & __IPADDR(0xc0000000)) == \
++ __IPADDR(0x80000000))
++#define IN_CLASSB_NET __IPADDR(0xffff0000)
++#define IN_CLASSB_NSHIFT 16
++#define IN_CLASSB_HOST __IPADDR(0x0000ffff)
++#define IN_CLASSB_MAX 65536
++
++#define IN_CLASSC(i) (((uint32_t)(i) & __IPADDR(0xe0000000)) == \
++ __IPADDR(0xc0000000))
++#define IN_CLASSC_NET __IPADDR(0xffffff00)
++#define IN_CLASSC_NSHIFT 8
++#define IN_CLASSC_HOST __IPADDR(0x000000ff)
++
++#define IN_CLASSD(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \
++ __IPADDR(0xe0000000))
++/* These ones aren't really net and host fields, but routing needn't know. */
++#define IN_CLASSD_NET __IPADDR(0xf0000000)
++#define IN_CLASSD_NSHIFT 28
++#define IN_CLASSD_HOST __IPADDR(0x0fffffff)
++#define IN_MULTICAST(i) IN_CLASSD(i)
++
++#define IN_EXPERIMENTAL(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \
++ __IPADDR(0xf0000000))
++#define IN_BADCLASS(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \
++ __IPADDR(0xf0000000))
++
++#define IN_LOCAL_GROUP(i) (((uint32_t)(i) & __IPADDR(0xffffff00)) == \
++ __IPADDR(0xe0000000))
++
++#define INADDR_ANY __IPADDR(0x00000000)
++#define INADDR_LOOPBACK __IPADDR(0x7f000001)
++#define INADDR_BROADCAST __IPADDR(0xffffffff) /* must be masked */
++
++#define INADDR_UNSPEC_GROUP __IPADDR(0xe0000000) /* 224.0.0.0 */
++#define INADDR_ALLHOSTS_GROUP __IPADDR(0xe0000001) /* 224.0.0.1 */
++#define INADDR_ALLRTRS_GROUP __IPADDR(0xe0000002) /* 224.0.0.2 */
++#define INADDR_MAX_LOCAL_GROUP __IPADDR(0xe00000ff) /* 224.0.0.255 */
++
++#define IN_LOOPBACKNET 127 /* official! */
++
++/*
++ * Socket address, internet style.
++ */
++struct sockaddr_in {
++ uint8_t sin_len;
++ sa_family_t sin_family;
++ in_port_t sin_port;
++ struct in_addr sin_addr;
++ int8_t sin_zero[8];
++};
++
++#define INET_ADDRSTRLEN 16
++
++/*
++ * Structure used to describe IP options.
++ * Used to store options internally, to pass them to a process,
++ * or to restore options retrieved earlier.
++ * The ip_dst is used for the first-hop gateway when using a source route
++ * (this gets put into the header proper).
++ */
++struct ip_opts {
++ struct in_addr ip_dst; /* first hop, 0 w/o src rt */
++#if defined(__cplusplus)
++ int8_t Ip_opts[40]; /* actually variable in size */
++#else
++ int8_t ip_opts[40]; /* actually variable in size */
++#endif
++};
++
++/*
++ * Options for use with [gs]etsockopt at the IP level.
++ * First word of comment is data type; bool is stored in int.
++ */
++#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */
++#define IP_HDRINCL 2 /* int; header is included with data */
++#define IP_TOS 3 /* int; IP type of service and preced. */
++#define IP_TTL 4 /* int; IP time to live */
++#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */
++#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */
++#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */
++#define IP_RETOPTS 8 /* ip_opts; set/get IP options */
++#define IP_MULTICAST_IF 9 /* in_addr; set/get IP multicast i/f */
++#define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */
++#define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */
++#define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */
++#define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */
++#define IP_PORTRANGE 19 /* int; range to use for ephemeral port */
++#define IP_RECVIF 20 /* bool; receive reception if w/dgram */
++#define IP_ERRORMTU 21 /* int; get MTU of last xmit = EMSGSIZE */
++#if 1 /*IPSEC*/
++#define IP_IPSEC_POLICY 22 /* struct; get/set security policy */
++#endif
++
++/*
++ * Defaults and limits for options
++ */
++#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */
++#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */
++#define IP_MAX_MEMBERSHIPS 20 /* per socket; must fit in one mbuf */
++
++/*
++ * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP.
++ */
++struct ip_mreq {
++ struct in_addr imr_multiaddr; /* IP multicast address of group */
++ struct in_addr imr_interface; /* local IP address of interface */
++};
++
++/*
++ * Argument for IP_PORTRANGE:
++ * - which range to search when port is unspecified at bind() or connect()
++ */
++#define IP_PORTRANGE_DEFAULT 0 /* default range */
++#define IP_PORTRANGE_HIGH 1 /* same as DEFAULT (FreeBSD compat) */
++#define IP_PORTRANGE_LOW 2 /* use privileged range */
++
++#define ntohs(x) __builtin_allegrex_wsbh(x)
++#define ntohl(x) __builtin_allegrex_wsbw(x)
++#define htons(x) __builtin_allegrex_wsbh(x)
++#define htonl(x) __builtin_allegrex_wsbw(x)
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* !_NETINET_IN_H_ */
+--- newlib-1.13.0/newlib/libc/sys/psp/netinet/tcp.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/netinet/tcp.h 2006-05-02 11:27:30.000000000 -0400
+@@ -0,0 +1,12 @@
++#ifndef __NETINET_TCP_H__
++#define __NETINET_TCP_H__
++
++#include
++
++#define SOL_TCP IPPROTO_TCP
++
++/* Socket options */
++#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
++#define TCP_MAXSEG 0x02 /* set maximum segment size */
++
++#endif
+--- newlib-1.13.0/newlib/libc/sys/psp/pipe.c 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/pipe.c 2006-04-28 10:08:50.000000000 -0400
+@@ -0,0 +1,271 @@
++/*
++ * PSP Software Development Kit - http://www.pspdev.org
++ * -----------------------------------------------------------------------
++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
++ *
++ * pipe.c - Socket wrappers to provide similar functions to normal unix
++ *
++ * Copyright (c) 2006 Rafael Cabezas
++ *
++ */
++#include
++#include
++#include
++#include
++
++#include
++#include
++#include
++#include
++#include "fdman.h"
++
++/* Pipe functions */
++/* Returns how many bytes are in the pipe -- waiting to be read */
++size_t __psp_pipe_peekmsgsize(int fd)
++{
++ SceKernelMppInfo info;
++ info.size = sizeof(info);
++
++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ if (sceKernelReferMsgPipeStatus(__psp_descriptormap[fd]->sce_descriptor, &info) == 0) {
++ return (info.bufSize - info.freeSize);
++ }
++ else {
++ return -1;
++ }
++}
++
++int pipe(int fildes[2])
++{
++ static int iIndex = 0;
++ char name[32];
++ iIndex++;
++
++ sprintf(name, "__psp_pipe_%02d", iIndex);
++
++ SceUID uid = sceKernelCreateMsgPipe(name, PSP_MEMORY_PARTITION_USER, 0, (void *)PIPE_BUF, NULL);
++
++ if (uid >= 0) {
++ fildes[0] = __psp_fdman_get_new_descriptor();
++ if (fildes[0] != -1) {
++ __psp_descriptormap[fildes[0]]->sce_descriptor = uid;
++ __psp_descriptormap[fildes[0]]->type = __PSP_DESCRIPTOR_TYPE_PIPE;
++ }
++ else {
++ sceKernelDeleteMsgPipe(uid);
++ errno = EFAULT;
++ return -1;
++ }
++
++ fildes[1] = __psp_fdman_get_dup_descriptor(fildes[0]);
++ if (fildes[1] != -1) {
++ __psp_descriptormap[fildes[1]]->sce_descriptor = uid;
++ return 0;
++ }
++ else {
++ sceKernelDeleteMsgPipe(uid);
++ errno = EFAULT;
++ return -1;
++ }
++
++ }
++ else {
++ errno = EFAULT;
++ return -1;
++ }
++}
++
++int __psp_pipe_close(int fd)
++{
++ int ret = 0;
++
++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) {
++ errno = EBADF;
++ return -1;
++ }
++
++
++ if ( __psp_descriptormap[fd]->ref_count == 1 ) {
++ /**
++ * Delete a message pipe
++ *
++ * @param uid - The UID of the pipe
++ *
++ * @return 0 on success, < 0 on error
++ */
++ ret = sceKernelDeleteMsgPipe(__psp_descriptormap[fd]->sce_descriptor);
++ }
++
++ __psp_fdman_release_descriptor(fd);
++
++ if(ret < 0) {
++ return __psp_set_errno(ret);
++ }
++
++ return 0;
++}
++
++int __psp_pipe_nonblocking_read(int fd, void *buf, size_t len)
++{
++ int ret;
++ int sceuid;
++ int size;
++
++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ sceuid = __psp_descriptormap[fd]->sce_descriptor;
++
++ size = __psp_pipe_peekmsgsize(fd);
++ if (size > 0) {
++ if (size < len) {
++ len = size;
++ }
++ }
++ else {
++ errno = EBADF;
++ return -1;
++ }
++
++ /**
++ * Receive a message from a pipe
++ *
++ * @param uid - The UID of the pipe
++ * @param message - Pointer to the message
++ * @param size - Size of the message
++ * @param unk1 - Unknown
++ * @param unk2 - Unknown
++ * @param timeout - Timeout for receive
++ *
++ * @return 0 on success, < 0 on error
++ */
++ ret = sceKernelTryReceiveMsgPipe(sceuid, buf, len, 0, 0);
++
++ if (ret == 0) {/* Success - Data */
++ return len;
++ }
++ else if (ret == SCE_KERNEL_ERROR_MPP_EMPTY) {/* No data */
++ errno = EAGAIN;
++ return -1;
++ }
++ else {/* Error */
++ return __psp_set_errno(ret);
++ }
++}
++
++int __psp_pipe_read(int fd, void *buf, size_t len)
++{
++ int ret;
++ int sceuid;
++ int size;
++
++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ sceuid = __psp_descriptormap[fd]->sce_descriptor;
++
++ size = __psp_pipe_peekmsgsize(fd);
++ if (size > 0) {
++ if (size < len) {
++ len = size;
++ }
++ }
++ else {
++ errno = EBADF;
++ return -1;
++ }
++
++ /**
++ * Receive a message from a pipe
++ *
++ * @param uid - The UID of the pipe
++ * @param message - Pointer to the message
++ * @param size - Size of the message
++ * @param unk1 - Unknown
++ * @param unk2 - Unknown
++ * @param timeout - Timeout for receive
++ *
++ * @return 0 on success, < 0 on error
++ */
++ ret = sceKernelReceiveMsgPipe(sceuid, buf, len, 0, NULL, NULL);
++
++ if (ret == 0) {/* Success - Data */
++ return len;
++ }
++ else {/* Error */
++ return __psp_set_errno(ret);
++ }
++}
++
++int __psp_pipe_write(int fd, const void *buf, size_t len)
++{
++ int ret;
++ int sceuid;
++ char *cbuf;
++
++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ sceuid = __psp_descriptormap[fd]->sce_descriptor;
++
++ /**
++ * Send a message to a pipe
++ *
++ * @param uid - The UID of the pipe
++ * @param message - Pointer to the message
++ * @param size - Size of the message
++ * @param unk1 - Unknown
++ * @param unk2 - Unknown
++ * @param timeout - Timeout for send
++ *
++ * @return 0 on success, < 0 on error
++ */
++ cbuf = (char *)buf;
++ ret = sceKernelSendMsgPipe(sceuid, cbuf, len, 0, NULL, NULL);
++
++ if (ret == 0) {/* Success - Data */
++ return len;
++ }
++ else {/* Error */
++ return __psp_set_errno(ret);
++ }
++}
++
++int __psp_pipe_nonblocking_write(int fd, const void *buf, size_t len)
++{
++ int ret;
++ int sceuid;
++ char *cbuf;
++
++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ sceuid = __psp_descriptormap[fd]->sce_descriptor;
++
++ cbuf = (char *)buf;
++ ret = sceKernelTrySendMsgPipe(sceuid, cbuf, len, 0, 0);
++
++ if (ret == 0) {/* Success - Data */
++ return len;
++ }
++ else if (ret == SCE_KERNEL_ERROR_MPP_FULL) {
++ errno = EAGAIN;
++ return -1;
++ }
++ else {/* Error */
++ return __psp_set_errno(ret);
++ }
++}
++
+--- newlib-1.13.0/newlib/libc/sys/psp/pspcwd.c 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/pspcwd.c 2006-04-26 10:50:46.000000000 -0400
+@@ -0,0 +1,166 @@
++/*
++ * PSP Software Development Kit - http://www.pspdev.org
++ * -----------------------------------------------------------------------
++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
++ *
++ * pspcwd.c - Current working directory emulation helper functions
++ *
++ * Copyright (c) 2005 Marcus R. Brown
++ * Copyright (c) 2005 James Forshaw
++ * Copyright (c) 2005 John Kelley
++ * Copyright (c) 2005 Jim Paris
++ *
++ */
++#include
++#include
++#include
++
++#include
++#include
++
++char __psp_cwd[MAXPATHLEN + 1] = { 0 };
++
++/* Set the current working directory (CWD) to the path where the module was launched. */
++void __psp_init_cwd(char *argv_0)
++{
++ if (argv_0 != NULL) {
++ char base_path[MAXPATHLEN + 1];
++ char *end;
++
++ strncpy(base_path, argv_0, sizeof(base_path) - 1);
++ base_path[sizeof(base_path) - 1] = '\0';
++ end = strrchr(base_path, '/');
++ if (end != NULL) {
++ *(end + 1) = '\0';
++ chdir(base_path);
++ }
++ }
++}
++
++/* Return the number of bytes taken up by the "drive:" prefix,
++ or -1 if it's not found */
++int __psp_get_drive(const char *d)
++{
++ int i;
++ for(i=0; d[i]; i++) {
++ if(! ((d[i] >= 'a' && d[i] <= 'z') ||
++ (d[i] >= '0' && d[i] <= '9') ))
++ break;
++ }
++ if(d[i] == ':') return i+1;
++ return -1;
++}
++
++/* Like strcpy, but returns 0 if the string doesn't fit */
++int __psp_safe_strcpy(char *out, const char *in, int maxlen)
++{
++ for( ; maxlen > 0 && *in ; maxlen-- )
++ *(out++) = *(in++);
++ if(maxlen < 1) return 0;
++ *out = 0;
++ return 1;
++}
++
++/* Like strcat, but returns 0 if the string doesn't fit */
++int __psp_safe_strcat(char *out, const char *in, int maxlen)
++{
++ for( ; *out ; out++,maxlen-- )
++ continue;
++ return __psp_safe_strcpy(out, in, maxlen);
++}
++
++/* Normalize a pathname (without leading "drive:") by removing
++ . and .. components, duplicated /, etc. */
++int __psp_path_normalize(char *out, int len)
++{
++ int i, j;
++ int first, next;
++
++ /* First append "/" to make the rest easier */
++ if(!__psp_safe_strcat(out,"/",len)) return -10;
++
++ /* Convert "//" to "/" */
++ for(i=0; out[i+1]; i++) {
++ if(out[i]=='/' && out[i+1]=='/') {
++ for(j=i+1; out[j]; j++)
++ out[j] = out[j+1];
++ i--;
++ }
++ }
++
++ /* Convert "/./" to "/" */
++ for(i=0; out[i] && out[i+1] && out[i+2]; i++) {
++ if(out[i]=='/' && out[i+1]=='.' && out[i+2]=='/') {
++ for(j=i+1; out[j]; j++)
++ out[j] = out[j+2];
++ i--;
++ }
++ }
++
++ /* Convert "/asdf/../" to "/" until we can't anymore. Also
++ * convert leading "/../" to "/" */
++ first = next = 0;
++ while(1) {
++ /* If a "../" follows, remove it and the parent */
++ if(out[next+1] && out[next+1]=='.' &&
++ out[next+2] && out[next+2]=='.' &&
++ out[next+3] && out[next+3]=='/') {
++ for(j=0; out[first+j+1]; j++)
++ out[first+j+1] = out[next+j+4];
++ first = next = 0;
++ continue;
++ }
++
++ /* Find next slash */
++ first = next;
++ for(next=first+1; out[next] && out[next] != '/'; next++)
++ continue;
++ if(!out[next]) break;
++ }
++
++ /* Remove trailing "/" */
++ for(i=1; out[i]; i++)
++ continue;
++ if(i >= 1 && out[i-1] == '/')
++ out[i-1] = 0;
++
++ return 0;
++}
++
++/* Convert relative path to absolute path. */
++int __psp_path_absolute(const char *in, char *out, int len)
++{
++ int dr;
++
++ /* See what the relative URL starts with */
++ dr = __psp_get_drive(in);
++ if(dr > 0 && in[dr] == '/') {
++ /* It starts with "drive:/", so it's already absolute */
++ if(!__psp_safe_strcpy(out, in, len))
++ return -1;
++ } else if(in[0] == '/') {
++ /* It's absolute, but missing the drive, so use cwd's drive */
++ if(strlen(__psp_cwd) >= len)
++ return -2;
++ strcpy(out, __psp_cwd);
++ dr = __psp_get_drive(out);
++ out[dr] = 0;
++ if(!__psp_safe_strcat(out, in, len))
++ return -3;
++ } else {
++ /* It's not absolute, so append it to the current cwd */
++ if(strlen(__psp_cwd) >= len)
++ return -4;
++ strcpy(out, __psp_cwd);
++ if(!__psp_safe_strcat(out, "/", len))
++ return -6;
++ if(!__psp_safe_strcat(out, in, len))
++ return -7;
++ }
++
++ /* Now normalize the pathname portion */
++ dr = __psp_get_drive(out);
++ if(dr < 0) dr = 0;
++ return __psp_path_normalize(out + dr, len - dr);
++}
++
+--- newlib-1.13.0/newlib/libc/sys/psp/select.c 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/select.c 2006-04-28 09:10:56.000000000 -0400
+@@ -0,0 +1,172 @@
++/*
++ * PSP Software Development Kit - http://www.pspdev.org
++ * -----------------------------------------------------------------------
++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
++ *
++ * select.c - Socket wrappers to provide similar functions to normal unix
++ *
++ * Copyright (c) 2006 Rafael Cabezas
++ *
++ */
++#include
++#include
++#include
++#include
++#include
++
++#include "fdman.h"
++
++#define SELECT_POLLING_DELAY_IN_us 100
++
++static int __psp_poll_select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds);
++
++int select(int n, fd_set *readfds, fd_set *writefds,
++ fd_set *exceptfds, struct timeval *timeout)
++{
++ int count;
++ clock_t start_time, time;
++
++ start_time = clock();
++
++ count = 0;
++
++ if (timeout) {
++ time = (timeout->tv_sec * CLOCKS_PER_SEC) + (timeout->tv_usec * (1*1000*1000/CLOCKS_PER_SEC));
++ }
++ else {
++ time = 0;
++ }
++
++ for (;;) {
++ count = __psp_poll_select(n, readfds, writefds, exceptfds);
++ /* If timeout == NULL, then don't timeout! */
++ if ( (count > 0) || ((timeout != NULL) && ((clock() - start_time) >= time)) ) {
++ break;
++ }
++ else {
++ /* Nothing found, and not timed-out yet; let's yield for SELECT_POLLING_DELAY_IN_us, so we're not in a busy loop */
++ sceKernelDelayThread(SELECT_POLLING_DELAY_IN_us);
++ }
++ }
++
++ return count;
++}
++
++#define SCE_FD_SET(n, p) \
++ ((p)->fds_bits[((n) & 0xFF) /__NFDBITS] |= (1 << ((n) % __NFDBITS)))
++
++static int __psp_poll_select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds)
++{
++ int fd, count;
++ fd_set ready_readfds, ready_writefds, ready_exceptfds;
++ fd_set scereadfds, scewritefds, sceexceptfds;
++ SceKernelMppInfo info;
++ struct timeval scetv;
++
++ FD_ZERO(&ready_readfds);
++ FD_ZERO(&ready_writefds);
++ FD_ZERO(&ready_exceptfds);
++
++ info.size = sizeof(info);
++ scetv.tv_sec = 0;
++ scetv.tv_usec = 0;
++ count = 0;
++
++ for (fd = 0; fd < n; fd++)
++ {
++ if (__psp_descriptormap[fd] != NULL) {
++ switch(__psp_descriptormap[fd]->type)
++ {
++ case __PSP_DESCRIPTOR_TYPE_PIPE:
++ if (readfds && FD_ISSET(fd, readfds)) {
++ if (sceKernelReferMsgPipeStatus(__psp_descriptormap[fd]->sce_descriptor, &info) == 0) {
++ if (info.bufSize != info.freeSize) {
++ FD_SET(fd, &ready_readfds);
++ count++;
++ }
++ }
++ else {
++ FD_SET(fd, &ready_exceptfds);
++ count++;
++ }
++ }
++ if (writefds && FD_ISSET(fd, writefds)) {
++ if (sceKernelReferMsgPipeStatus(__psp_descriptormap[fd]->sce_descriptor, &info) == 0) {
++ if (info.freeSize > 0) {
++ FD_SET(fd, &ready_writefds);
++ count++;
++ }
++ }
++ else {
++ FD_SET(fd, &ready_exceptfds);
++ count++;
++ }
++ }
++ break;
++ case __PSP_DESCRIPTOR_TYPE_FILE:
++ if (readfds && FD_ISSET(fd, readfds)) {
++ if (readfds && FD_ISSET(fd, readfds)) {
++ /** Just set it for now */
++ FD_SET(fd, &ready_readfds);
++ count++;
++ }
++ }
++ break;
++ case __PSP_DESCRIPTOR_TYPE_SOCKET:
++ if (readfds && FD_ISSET(fd, readfds)) {
++ int sce_ret, sce_fd;
++ sce_fd = __psp_descriptormap[fd]->sce_descriptor;
++ FD_ZERO(&scereadfds);
++ SCE_FD_SET(sce_fd, &scereadfds);
++ errno = 0;
++ sce_ret = sceNetInetSelect (sce_fd+1, &scereadfds, NULL, NULL, &scetv);
++ if (sce_ret>0) {
++ FD_SET(fd, &ready_readfds);
++ count++;
++ }
++ else if (sce_ret == -1) {
++ errno = sceNetInetGetErrno();
++ if (exceptfds && FD_ISSET(fd, exceptfds)) {
++ FD_SET(fd, &ready_exceptfds);
++ count++;
++ } else {
++ count = -1;
++ }
++ }
++ }
++ if (writefds && FD_ISSET(fd, writefds)) {
++ int sce_ret;
++ FD_ZERO(&scewritefds);
++ SCE_FD_SET(__psp_descriptormap[fd]->sce_descriptor, &scewritefds);
++ sce_ret = sceNetInetSelect (__psp_descriptormap[fd]->sce_descriptor+1, NULL, &scewritefds, NULL, &scetv);
++ if (sce_ret>0) {
++ FD_SET(fd, &ready_writefds);
++ count++;
++ }
++ else if (sce_ret == -1) {
++ if (exceptfds && FD_ISSET(fd, exceptfds)) {
++ FD_SET(fd, &ready_exceptfds);
++ count++;
++ }
++ else {
++ count = -1;
++ }
++ }
++ }
++ break;
++ }
++ }
++ }
++
++ if (count > 0) {
++ if (readfds)
++ *readfds = ready_readfds;
++ if (writefds)
++ *writefds = ready_writefds;
++ if (exceptfds)
++ *exceptfds = ready_exceptfds;
++ }
++
++ return count;
++}
++
+--- newlib-1.13.0/newlib/libc/sys/psp/socket.c 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/socket.c 2006-04-28 10:11:57.000000000 -0400
+@@ -0,0 +1,390 @@
++/*
++ * PSP Software Development Kit - http://www.pspdev.org
++ * -----------------------------------------------------------------------
++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
++ *
++ * socket.c - Socket wrappers to provide similar functions to normal unix
++ *
++ * Copyright (c) 2005 Marcus R. Brown
++ * Copyright (c) 2005 James Forshaw
++ *
++ */
++#include
++#include
++#include
++#include
++#include
++#include
++
++#include
++#include "fdman.h"
++
++#ifdef F_socket
++int socket(int domain, int type, int protocol)
++{
++ int sock, scesock;
++ int i;
++
++ scesock = sceNetInetSocket(domain, type, protocol);
++ if(scesock < 0) {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ sock = __psp_fdman_get_new_descriptor();
++ if( sock != -1 ) {
++ __psp_descriptormap[sock]->sce_descriptor = scesock;
++ __psp_descriptormap[sock]->type = __PSP_DESCRIPTOR_TYPE_SOCKET;
++ }
++ else {
++ sceNetInetClose(scesock);
++ errno = ENOENT;
++ return -1;
++ }
++
++ return sock;
++}
++
++/* These are glue routines that are called from _close(), _read(), and
++ _write(). They are here so that any program that uses socket() will pull
++ them in and have expanded socket capability. */
++
++int __psp_socket_close(int sock)
++{
++ int ret = 0;
++
++ if (__psp_descriptormap[sock]->ref_count == 1) {
++ ret = sceNetInetClose(__psp_descriptormap[sock]->sce_descriptor);
++ }
++
++ __psp_fdman_release_descriptor(sock);
++
++ if(ret < 0)
++ {
++ /* If close is defined likely errno is */
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return 0;
++}
++
++ssize_t __psp_socket_recv(int s, void *buf, size_t len, int flags)
++{
++ return recv(s, buf, len, flags);
++}
++
++ssize_t __psp_socket_send(int s, const void *buf, size_t len, int flags)
++{
++ return send(s, buf, len, flags);
++}
++#endif
++
++#ifdef F_accept
++int accept(int s, struct sockaddr *addr, socklen_t *addrlen)
++{
++ int newscesock, newsock;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ newscesock = sceNetInetAccept(__psp_descriptormap[s]->sce_descriptor, addr, addrlen);
++ if( (newscesock >= 0) ) {
++ newsock = __psp_fdman_get_new_descriptor();
++ if ( newsock != -1 ) {
++ __psp_descriptormap[newsock]->sce_descriptor = newscesock;
++ __psp_descriptormap[newsock]->type = __PSP_DESCRIPTOR_TYPE_SOCKET;
++ }
++ else {
++ sceNetInetClose(newscesock);
++ errno = ENOENT;
++ return -1;
++ }
++ }
++ else {
++ errno = ENOENT;
++ return -1;
++ }
++
++ return newsock;
++}
++#endif
++
++#ifdef F_bind
++int bind(int s, const struct sockaddr *my_addr, socklen_t addrlen)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetBind(__psp_descriptormap[s]->sce_descriptor, my_addr, addrlen);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return 0;
++}
++#endif
++
++#ifdef F_connect
++int connect(int s, const struct sockaddr *serv_addr, socklen_t addrlen)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetConnect(__psp_descriptormap[s]->sce_descriptor, serv_addr, addrlen);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return 0;
++}
++#endif
++
++#ifdef F_setsockopt
++int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetGetsockopt(__psp_descriptormap[s]->sce_descriptor, level, optname, optval, optlen);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return 0;
++}
++#endif
++
++#ifdef F_listen
++int listen(int s, int backlog)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetListen(__psp_descriptormap[s]->sce_descriptor, backlog);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return 0;
++}
++#endif
++
++#ifdef F_recv
++ssize_t recv(int s, void *buf, size_t len, int flags)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetRecv(__psp_descriptormap[s]->sce_descriptor, buf, len, flags);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return ret;
++}
++#endif
++
++#ifdef F_recvfrom
++ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetRecvfrom(__psp_descriptormap[s]->sce_descriptor, buf, len, flags, from, fromlen);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return ret;
++}
++#endif
++
++#ifdef F_send
++ssize_t send(int s, const void *buf, size_t len, int flags)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetSend(__psp_descriptormap[s]->sce_descriptor, buf, len, flags);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return ret;
++}
++#endif
++
++#ifdef F_sendto
++ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetSendto(__psp_descriptormap[s]->sce_descriptor, buf, len, flags, to, tolen);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return ret;
++}
++#endif
++
++#ifdef F_setsockopt
++int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetSetsockopt(__psp_descriptormap[s]->sce_descriptor, level, optname, optval, optlen);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++ else
++ {
++ if ( (level == SOL_SOCKET) && (optname == SO_NONBLOCK) ) {
++ if (*((int*)optval) == 1) {
++ __psp_descriptormap[s]->flags |= O_NONBLOCK;
++ }
++ else {
++ __psp_descriptormap[s]->flags &= ~O_NONBLOCK;
++ }
++ }
++ }
++
++ return 0;
++}
++#endif
++
++#ifdef F_shutdown
++int shutdown(int s, int how)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetShutdown(__psp_descriptormap[s]->sce_descriptor, how);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return 0;
++}
++#endif
++
++#ifdef F_getpeername
++int getpeername(int s, struct sockaddr *name, socklen_t *namelen)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetGetpeername(__psp_descriptormap[s]->sce_descriptor, name, namelen);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return 0;
++}
++#endif
++
++#ifdef F_getsockname
++int getsockname(int s, struct sockaddr *name, socklen_t *namelen)
++{
++ int ret;
++
++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) {
++ errno = EBADF;
++ return -1;
++ }
++
++ ret = sceNetInetGetsockname(__psp_descriptormap[s]->sce_descriptor, name, namelen);
++ if(ret < 0)
++ {
++ errno = sceNetInetGetErrno();
++ return -1;
++ }
++
++ return 0;
++}
++#endif
++
++#ifdef F_inet_ntoa
++char *inet_ntoa(struct in_addr in)
++{
++ static char ip_addr[INET_ADDRSTRLEN+1];
++
++ if(sceNetInetInetNtop(AF_INET, &in, ip_addr, INET_ADDRSTRLEN) == NULL)
++ {
++ strcpy(ip_addr, "Invalid");
++ }
++
++ return ip_addr;
++}
++#endif
+--- newlib-1.13.0/newlib/libc/sys/psp/sys/dirent.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/sys/dirent.h 2006-05-02 11:27:31.000000000 -0400
+@@ -0,0 +1,39 @@
++#ifndef _SYS_DIRENT_H
++#define _SYS_DIRENT_H
++
++/* PSP dirent.h, based on pspiofilemgr_dirent.h
++ by Jim Paris */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include
++
++#define MAXNAMLEN 255
++
++/* Same as SceIoDirent, just with a different name. */
++struct dirent {
++ /** File status. */
++ SceIoStat d_stat;
++ /** File name. */
++ char d_name[256];
++ /** Device-specific data. */
++ void * d_private;
++ int dummy;
++};
++
++typedef struct {
++ SceUID uid;
++ struct dirent de;
++} DIR;
++
++DIR *opendir (const char *);
++struct dirent *readdir (DIR *);
++int closedir (DIR *);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+--- newlib-1.13.0/newlib/libc/sys/psp/sys/errno.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/sys/errno.h 2006-05-02 11:27:31.000000000 -0400
+@@ -0,0 +1,158 @@
++/* errno.h for PSP, based on newlib/libc/include/sys/errno.h. */
++
++#ifndef _SYS_ERRNO_H_
++#ifdef __cplusplus
++extern "C" {
++#endif
++#define _SYS_ERRNO_H_
++
++#include
++
++#ifndef _REENT_ONLY
++#define errno (*__errno())
++extern int *__errno _PARAMS ((void));
++#endif
++
++/* Please don't use these variables directly.
++ Use strerror instead. */
++extern __IMPORT _CONST char * _CONST _sys_errlist[];
++extern __IMPORT int _sys_nerr;
++#ifdef __CYGWIN__
++extern __IMPORT const char * const sys_errlist[];
++extern __IMPORT int sys_nerr;
++#endif
++
++#define __errno_r(ptr) ((ptr)->_errno)
++
++#define EPERM 1 /* Not super-user */
++#define ENOENT 2 /* No such file or directory */
++#define ESRCH 3 /* No such process */
++#define EINTR 4 /* Interrupted system call */
++#define EIO 5 /* I/O error */
++#define ENXIO 6 /* No such device or address */
++#define E2BIG 7 /* Arg list too long */
++#define ENOEXEC 8 /* Exec format error */
++#define EBADF 9 /* Bad file number */
++#define ECHILD 10 /* No children */
++#define EAGAIN 11 /* No more processes */
++#define ENOMEM 12 /* Not enough core */
++#define EACCES 13 /* Permission denied */
++#define EFAULT 14 /* Bad address */
++#define ENOTBLK 15 /* Block device required */
++#define EBUSY 16 /* Mount device busy */
++#define EEXIST 17 /* File exists */
++#define EXDEV 18 /* Cross-device link */
++#define ENODEV 19 /* No such device */
++#define ENOTDIR 20 /* Not a directory */
++#define EISDIR 21 /* Is a directory */
++#define EINVAL 22 /* Invalid argument */
++#define ENFILE 23 /* Too many open files in system */
++#define EMFILE 24 /* Too many open files */
++#define ENOTTY 25 /* Not a typewriter */
++#define ETXTBSY 26 /* Text file busy */
++#define EFBIG 27 /* File too large */
++#define ENOSPC 28 /* No space left on device */
++#define ESPIPE 29 /* Illegal seek */
++#define EROFS 30 /* Read only file system */
++#define EMLINK 31 /* Too many links */
++#define EPIPE 32 /* Broken pipe */
++#define EDOM 33 /* Math arg out of domain of func */
++#define ERANGE 34 /* Math result not representable */
++#define ENOMSG 35 /* No message of desired type */
++#define EIDRM 36 /* Identifier removed */
++#define ECHRNG 37 /* Channel number out of range */
++#define EL2NSYNC 38 /* Level 2 not synchronized */
++#define EL3HLT 39 /* Level 3 halted */
++#define EL3RST 40 /* Level 3 reset */
++#define ELNRNG 41 /* Link number out of range */
++#define EUNATCH 42 /* Protocol driver not attached */
++#define ENOCSI 43 /* No CSI structure available */
++#define EL2HLT 44 /* Level 2 halted */
++#define EDEADLK 45 /* Deadlock condition */
++#define ENOLCK 46 /* No record locks available */
++#define EBADE 50 /* Invalid exchange */
++#define EBADR 51 /* Invalid request descriptor */
++#define EXFULL 52 /* Exchange full */
++#define ENOANO 53 /* No anode */
++#define EBADRQC 54 /* Invalid request code */
++#define EBADSLT 55 /* Invalid slot */
++#define EDEADLOCK 56 /* File locking deadlock error */
++#define EBFONT 57 /* Bad font file fmt */
++#define ENOSTR 60 /* Device not a stream */
++#define ENODATA 61 /* No data (for no delay io) */
++#define ETIME 62 /* Timer expired */
++#define ENOSR 63 /* Out of streams resources */
++#define ENONET 64 /* Machine is not on the network */
++#define ENOPKG 65 /* Package not installed */
++#define EREMOTE 66 /* The object is remote */
++#define ENOLINK 67 /* The link has been severed */
++#define EADV 68 /* Advertise error */
++#define ESRMNT 69 /* Srmount error */
++#define ECOMM 70 /* Communication error on send */
++#define EPROTO 71 /* Protocol error */
++#define EMULTIHOP 74 /* Multihop attempted */
++#define ELBIN 75 /* Inode is remote (not really error) */
++#define EDOTDOT 76 /* Cross mount point (not really error) */
++#define EBADMSG 77 /* Trying to read unreadable message */
++#define EFTYPE 79 /* Inappropriate file type or format */
++#define ENOTUNIQ 80 /* Given log. name not unique */
++#define EBADFD 81 /* f.d. invalid for this operation */
++#define EREMCHG 82 /* Remote address changed */
++#define ELIBACC 83 /* Can't access a needed shared lib */
++#define ELIBBAD 84 /* Accessing a corrupted shared lib */
++#define ELIBSCN 85 /* .lib section in a.out corrupted */
++#define ELIBMAX 86 /* Attempting to link in too many libs */
++#define ELIBEXEC 87 /* Attempting to exec a shared library */
++#define ENOSYS 88 /* Function not implemented */
++#define ENMFILE 89 /* No more files */
++#define ENOTEMPTY 90 /* Directory not empty */
++#define ENAMETOOLONG 91 /* File or path name too long */
++#define ELOOP 92 /* Too many symbolic links */
++#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
++#define EPFNOSUPPORT 96 /* Protocol family not supported */
++#define ECONNRESET 104 /* Connection reset by peer */
++#define ENOBUFS 105 /* No buffer space available */
++#define EAFNOSUPPORT 106 /* Address family not supported by protocol family */
++#define EPROTOTYPE 107 /* Protocol wrong type for socket */
++#define ENOTSOCK 108 /* Socket operation on non-socket */
++#define ENOPROTOOPT 109 /* Protocol not available */
++#define ESHUTDOWN 110 /* Can't send after socket shutdown */
++#define ECONNREFUSED 111 /* Connection refused */
++#define EADDRINUSE 112 /* Address already in use */
++#define ECONNABORTED 113 /* Connection aborted */
++#define ENETUNREACH 114 /* Network is unreachable */
++#define ENETDOWN 115 /* Network interface is not configured */
++#define ETIMEDOUT 116 /* Connection timed out */
++#define EHOSTDOWN 117 /* Host is down */
++#define EHOSTUNREACH 118 /* Host is unreachable */
++#define EINPROGRESS 119 /* Connection already in progress */
++#define EALREADY 120 /* Socket already connected */
++#define EDESTADDRREQ 121 /* Destination address required */
++#define EMSGSIZE 122 /* Message too long */
++#define EPROTONOSUPPORT 123 /* Unknown protocol */
++#define ESOCKTNOSUPPORT 124 /* Socket type not supported */
++#define EADDRNOTAVAIL 125 /* Address not available */
++#define ENETRESET 126
++#define EISCONN 127 /* Socket is already connected */
++#define ENOTCONN 128 /* Socket is not connected */
++#define ETOOMANYREFS 129
++#define EPROCLIM 130
++#define EUSERS 131
++#define EDQUOT 132
++#define ESTALE 133
++#define ENOTSUP 134 /* Not supported */
++#define ENOMEDIUM 135 /* No medium (in tape drive) */
++#define ENOSHARE 136 /* No such host or network path */
++#define ECASECLASH 137 /* Filename exists with different case */
++#define EILSEQ 138
++#define EOVERFLOW 139 /* Value too large for defined data type */
++
++/* From cygwin32. */
++#define EWOULDBLOCK EAGAIN /* Operation would block */
++
++#define __ELASTERROR 2000 /* Users can add values starting here */
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* _SYS_ERRNO_H */
+--- newlib-1.13.0/newlib/libc/sys/psp/sys/fd_set.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/sys/fd_set.h 2006-05-02 11:27:31.000000000 -0400
+@@ -0,0 +1,69 @@
++/* $NetBSD: fd_set.h,v 1.1 2005/05/22 12:44:24 kleink Exp $ */
++
++/*-
++ * Copyright (c) 1992, 1993
++ * The Regents of the University of California. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. Neither the name of the University nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ * from: @(#)types.h 8.4 (Berkeley) 1/21/94
++ */
++
++#ifndef _SYS_FD_SET_H_
++#define _SYS_FD_SET_H_
++
++#include
++#include
++
++/*
++ * Implementation dependent defines, hidden from user space. X/Open does not
++ * specify them.
++ */
++#define __NBBY 8 /* number of bits in a byte */
++typedef uint32_t __fd_mask;
++
++/* bits per mask */
++#define __NFDBITS ((unsigned int)sizeof(__fd_mask) * __NBBY)
++
++#define __howmany(x, y) (((x) + ((y) - 1)) / (y))
++
++#define FD_SETSIZE 256
++
++typedef struct fd_set {
++ __fd_mask fds_bits[__howmany(FD_SETSIZE, __NFDBITS)];
++} fd_set;
++
++#define FD_SET(n, p) \
++ ((p)->fds_bits[(n) /__NFDBITS] |= (1 << ((n) % __NFDBITS)))
++
++#define FD_CLR(n, p) \
++ ((p)->fds_bits[(n) /__NFDBITS] &= ~(1 << ((n) % __NFDBITS)))
++
++#define FD_ISSET(n, p) \
++ ((p)->fds_bits[(n) /__NFDBITS] & (1 << ((n) % __NFDBITS)))
++
++#define FD_ZERO(p) (void)__builtin_memset((p), 0, sizeof(*(p)))
++
++#endif /* _SYS_FD_SET_H_ */
+--- newlib-1.13.0/newlib/libc/sys/psp/sys/ioctl.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/sys/ioctl.h 2006-05-02 11:27:31.000000000 -0400
+@@ -0,0 +1 @@
++/* Empty file, here for compatibility */
+--- newlib-1.13.0/newlib/libc/sys/psp/sys/select.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/sys/select.h 2006-05-02 11:27:31.000000000 -0400
+@@ -0,0 +1,54 @@
++/* $NetBSD: select.h,v 1.24 2005/05/22 12:44:24 kleink Exp $ */
++
++/*-
++ * Copyright (c) 1992, 1993
++ * The Regents of the University of California. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. Neither the name of the University nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ * @(#)select.h 8.2 (Berkeley) 1/4/94
++ */
++
++#ifndef _SYS_SELECT_H_
++#define _SYS_SELECT_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include
++#include
++
++int sceNetInetSelect(int n, fd_set *readfds, fd_set *writefds,
++ fd_set *exceptfds, struct timeval *timeout);
++
++int select(int n, fd_set *readfds, fd_set *writefds,
++ fd_set *exceptfds, struct timeval *timeout);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* !_SYS_SELECT_H_ */
+--- newlib-1.13.0/newlib/libc/sys/psp/sys/socket.h 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/sys/socket.h 2006-05-02 11:27:31.000000000 -0400
+@@ -0,0 +1,294 @@
++/* $NetBSD: socket.h,v 1.77 2005/11/29 03:12:16 christos Exp $ */
++
++/*
++ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. Neither the name of the project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++/*
++ * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994
++ * The Regents of the University of California. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. Neither the name of the University nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ * @(#)socket.h 8.6 (Berkeley) 5/3/95
++ */
++
++#ifndef _SYS_SOCKET_H_
++#define _SYS_SOCKET_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include
++#include
++#include
++
++typedef uint8_t sa_family_t;
++typedef uint32_t socklen_t;
++
++/*
++ * Socket types.
++ */
++#define SOCK_STREAM 1 /* stream socket */
++#define SOCK_DGRAM 2 /* datagram socket */
++#define SOCK_RAW 3 /* raw-protocol interface */
++#define SOCK_RDM 4 /* reliably-delivered message */
++#define SOCK_SEQPACKET 5 /* sequenced packet stream */
++
++/*
++ * Option flags per-socket.
++ */
++#define SO_DEBUG 0x0001 /* turn on debugging info recording */
++#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
++#define SO_REUSEADDR 0x0004 /* allow local address reuse */
++#define SO_KEEPALIVE 0x0008 /* keep connections alive */
++#define SO_DONTROUTE 0x0010 /* just use interface addresses */
++#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */
++#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */
++#define SO_LINGER 0x0080 /* linger on close if data present */
++#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */
++#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */
++#define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */
++
++/*
++ * Additional options, not kept in so_options.
++ */
++#define SO_SNDBUF 0x1001 /* send buffer size */
++#define SO_RCVBUF 0x1002 /* receive buffer size */
++#define SO_SNDLOWAT 0x1003 /* send low-water mark */
++#define SO_RCVLOWAT 0x1004 /* receive low-water mark */
++#define SO_SNDTIMEO 0x1005 /* send timeout */
++#define SO_RCVTIMEO 0x1006 /* receive timeout */
++#define SO_ERROR 0x1007 /* get error status and clear */
++#define SO_TYPE 0x1008 /* get socket type */
++#define SO_OVERFLOWED 0x1009 /* datagrams: return packets dropped */
++#define SO_NONBLOCK 0x1009 /* non-blocking I/O */
++
++/*
++ * Structure used for manipulating linger option.
++ */
++struct linger {
++ int l_onoff; /* option on/off */
++ int l_linger; /* linger time in seconds */
++};
++
++/*
++ * Level number for (get/set)sockopt() to apply to socket itself.
++ */
++#define SOL_SOCKET 0xffff /* options for socket level */
++
++/*
++ * Address families.
++ */
++#define AF_UNSPEC 0 /* unspecified */
++#define AF_LOCAL 1 /* local to host (pipes, portals) */
++#define AF_UNIX AF_LOCAL /* backward compatibility */
++#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
++#define AF_IMPLINK 3 /* arpanet imp addresses */
++#define AF_PUP 4 /* pup protocols: e.g. BSP */
++#define AF_CHAOS 5 /* mit CHAOS protocols */
++#define AF_NS 6 /* XEROX NS protocols */
++#define AF_ISO 7 /* ISO protocols */
++#define AF_OSI AF_ISO
++#define AF_ECMA 8 /* european computer manufacturers */
++#define AF_DATAKIT 9 /* datakit protocols */
++#define AF_CCITT 10 /* CCITT protocols, X.25 etc */
++#define AF_SNA 11 /* IBM SNA */
++#define AF_DECnet 12 /* DECnet */
++#define AF_DLI 13 /* DEC Direct data link interface */
++#define AF_LAT 14 /* LAT */
++#define AF_HYLINK 15 /* NSC Hyperchannel */
++#define AF_APPLETALK 16 /* Apple Talk */
++#define AF_ROUTE 17 /* Internal Routing Protocol */
++#define AF_LINK 18 /* Link layer interface */
++#define AF_COIP 20 /* connection-oriented IP, aka ST II */
++#define AF_CNT 21 /* Computer Network Technology */
++#define AF_IPX 23 /* Novell Internet Protocol */
++#define AF_INET6 24 /* IP version 6 */
++#define AF_ISDN 26 /* Integrated Services Digital Network*/
++#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */
++#define AF_NATM 27 /* native ATM access */
++#define AF_ARP 28 /* (rev.) addr. res. prot. (RFC 826) */
++#define AF_MAX 31
++
++/*
++ * Structure used by kernel to store most
++ * addresses.
++ */
++struct sockaddr {
++ uint8_t sa_len; /* total length */
++ sa_family_t sa_family; /* address family */
++ char sa_data[14]; /* actually longer; address value */
++};
++
++/*
++ * Protocol families, same as address families for now.
++ */
++#define PF_UNSPEC AF_UNSPEC
++#define PF_LOCAL AF_LOCAL
++#define PF_UNIX PF_LOCAL /* backward compatibility */
++#define PF_INET AF_INET
++#define PF_IMPLINK AF_IMPLINK
++#define PF_PUP AF_PUP
++#define PF_CHAOS AF_CHAOS
++#define PF_NS AF_NS
++#define PF_ISO AF_ISO
++#define PF_OSI AF_ISO
++#define PF_ECMA AF_ECMA
++#define PF_DATAKIT AF_DATAKIT
++#define PF_CCITT AF_CCITT
++#define PF_SNA AF_SNA
++#define PF_DECnet AF_DECnet
++#define PF_DLI AF_DLI
++#define PF_LAT AF_LAT
++#define PF_HYLINK AF_HYLINK
++#define PF_APPLETALK AF_APPLETALK
++#define PF_ROUTE AF_ROUTE
++#define PF_LINK AF_LINK
++#if defined(_NETBSD_SOURCE)
++#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */
++#endif
++#define PF_COIP AF_COIP
++#define PF_CNT AF_CNT
++#define PF_INET6 AF_INET6
++#define PF_IPX AF_IPX /* same format as AF_NS */
++#if defined(_NETBSD_SOURCE)
++#define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */
++#define PF_PIP pseudo_AF_PIP
++#endif
++#define PF_ISDN AF_ISDN /* same as E164 */
++#define PF_E164 AF_E164
++#define PF_NATM AF_NATM
++#define PF_ARP AF_ARP
++#if defined(_NETBSD_SOURCE)
++#define PF_KEY pseudo_AF_KEY /* like PF_ROUTE, only for key mgmt */
++#endif
++
++#define PF_MAX AF_MAX
++
++#define MSG_OOB 0x1 /* process out-of-band data */
++#define MSG_PEEK 0x2 /* peek at incoming message */
++#define MSG_DONTROUTE 0x4 /* send without using routing tables */
++#define MSG_EOR 0x8 /* data completes record */
++#define MSG_TRUNC 0x10 /* data discarded before delivery */
++#define MSG_CTRUNC 0x20 /* control data lost before delivery */
++#define MSG_WAITALL 0x40 /* wait for full request or error */
++#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */
++#define MSG_BCAST 0x100 /* this message was rcvd using link-level brdcst */
++#define MSG_MCAST 0x200 /* this message was rcvd using link-level mcast */
++
++/*
++ * Types of socket shutdown(2).
++ */
++#define SHUT_RD 0 /* Disallow further receives. */
++#define SHUT_WR 1 /* Disallow further sends. */
++#define SHUT_RDWR 2 /* Disallow further sends/receives. */
++
++struct iovec {
++ void *iov_base; /* Base address. */
++ size_t iov_len; /* Length. */
++};
++
++struct msghdr {
++ void *msg_name; /* optional address */
++ socklen_t msg_namelen; /* size of address */
++ struct iovec *msg_iov; /* scatter/gather array */
++ int msg_iovlen; /* # elements in msg_iov */
++ void *msg_control; /* ancillary data, see below */
++ socklen_t msg_controllen; /* ancillary data buffer len */
++ int msg_flags; /* flags on received message */
++};
++
++/* BSD-compatible socket API. */
++int accept(int, struct sockaddr * __restrict, socklen_t * __restrict);
++int bind(int, const struct sockaddr *, socklen_t);
++int connect(int, const struct sockaddr *, socklen_t);
++int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict);
++int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict);
++int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict);
++int listen(int, int);
++ssize_t recv(int, void *, size_t, int);
++ssize_t recvfrom(int, void * __restrict, size_t, int,
++ struct sockaddr * __restrict, socklen_t * __restrict);
++ssize_t recvmsg(int s, struct msghdr *msg, int flags);
++ssize_t send(int, const void *, size_t, int);
++ssize_t sendto(int, const void *,
++ size_t, int, const struct sockaddr *, socklen_t);
++ssize_t sendmsg(int s, const struct msghdr *msg, int flags);
++int setsockopt(int, int, int, const void *, socklen_t);
++int shutdown(int, int);
++int socket(int, int, int);
++
++/* sceNetInet socket API. */
++int sceNetInetAccept(int s, struct sockaddr *addr, socklen_t *addrlen);
++int sceNetInetBind(int s, const struct sockaddr *my_addr, socklen_t addrlen);
++int sceNetInetConnect(int s, const struct sockaddr *serv_addr, socklen_t addrlen);
++int sceNetInetGetsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);
++int sceNetInetListen(int s, int backlog);
++ssize_t sceNetInetRecv(int s, void *buf, size_t len, int flags);
++ssize_t sceNetInetRecvfrom(int s, void *buf, size_t flags, int, struct sockaddr *from, socklen_t *fromlen);
++ssize_t sceNetInetRecvmsg(int s, struct msghdr *msg, int flags);
++ssize_t sceNetInetSend(int s, const void *buf, size_t len, int flags);
++ssize_t sceNetInetSendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
++ssize_t sceNetInetSendmsg(int s, const struct msghdr *msg, int flags);
++int sceNetInetSetsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
++int sceNetInetShutdown(int s, int how);
++int sceNetInetSocket(int domain, int type, int protocol);
++int sceNetInetClose(int s);
++int sceNetInetGetErrno(void);
++int sceNetInetGetsockname(int s, struct sockaddr *name, socklen_t *namelen);
++int sceNetInetGetpeername(int s, struct sockaddr *name, socklen_t *namelen);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* !_SYS_SOCKET_H_ */
+--- newlib-1.13.0/newlib/libc/sys/psp/xprintf.c 1969-12-31 19:00:00.000000000 -0500
++++ newlib-psp/newlib/libc/sys/psp/xprintf.c 2006-03-13 00:00:00.000000000 -0500
+@@ -0,0 +1,984 @@
++/*
++ * PSP Software Development Kit - http://www.pspdev.org
++ * -----------------------------------------------------------------------
++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
++ *
++ * xprintf.c - Various *printf functions.
++ *
++ * Copyright (c) 2005 Marcus R. Brown
++ * Copyright (c) 2005 James Forshaw
++ * Copyright (c) 2005 John Kelley
++ *
++ * $Id: newlib-1.14.0.patch,v 1.1 2006-05-07 23:13:24 wntrmute Exp $
++ */
++/* Code borrowed from mysql's xprintf.c, by Richard Hipp */
++/* This xprintf.c file on which this one is based is in public domain. */
++
++#include
++#include
++#include
++
++#include
++#include
++
++/*
++** The maximum number of digits of accuracy in a floating-point conversion.
++*/
++#define MAXDIG 20
++
++/* Instead of including ctype.h, use the isdigit() prototype because psplibc doesn't
++ know about newlib, and newlib defines isdigit as a macro that uses _ctype_. */
++int isdigit(int __c);
++
++int vxprintf(void (*func)(char *, int, void *), void *arg, const char *format, va_list ap);
++
++#ifdef F_vxprintf
++/*
++** Conversion types fall into various categories as defined by the
++** following enumeration.
++*/
++
++enum e_type { /* The type of the format field */
++ RADIX, /* Integer types. %d, %x, %o, and so forth */
++ FLOAT, /* Floating point. %f */
++ EXP, /* Exponentional notation. %e and %E */
++ GENERIC, /* Floating or exponential, depending on exponent. %g */
++ SIZE, /* Return number of characters processed so far. %n */
++ STRING, /* Strings. %s */
++ PERCENT, /* Percent symbol. %% */
++ CHAR, /* Characters. %c */
++ ERROR, /* Used to indicate no such conversion type */
++/* The rest are extensions, not normally found in printf() */
++ CHARLIT, /* Literal characters. %' */
++ SEEIT, /* Strings with visible control characters. %S */
++ MEM_STRING, /* A string which should be deleted after use. %z */
++ ORDINAL, /* 1st, 2nd, 3rd and so forth */
++};
++
++/*
++** Each builtin conversion character (ex: the 'd' in "%d") is described
++** by an instance of the following structure
++*/
++typedef struct s_info { /* Information about each format field */
++ int fmttype; /* The format field code letter */
++ int base; /* The base for radix conversion */
++ char *charset; /* The character set for conversion */
++ int flag_signed; /* Is the quantity signed? */
++ char *prefix; /* Prefix on non-zero values in alt format */
++ enum e_type type; /* Conversion paradigm */
++} info;
++
++/*
++** The following table is searched linearly, so it is good to put the
++** most frequently used conversion types first.
++*/
++static info fmtinfo[] = {
++ { 'd', 10, "0123456789", 1, 0, RADIX, },
++ { 's', 0, 0, 0, 0, STRING, },
++ { 'S', 0, 0, 0, 0, SEEIT, },
++ { 'z', 0, 0, 0, 0, MEM_STRING, },
++ { 'c', 0, 0, 0, 0, CHAR, },
++ { 'o', 8, "01234567", 0, "0", RADIX, },
++ { 'u', 10, "0123456789", 0, 0, RADIX, },
++ { 'x', 16, "0123456789abcdef", 0, "x0", RADIX, },
++ { 'X', 16, "0123456789ABCDEF", 0, "X0", RADIX, },
++ { 'r', 10, "0123456789", 0, 0, ORDINAL, },
++ { 'f', 0, 0, 1, 0, FLOAT, },
++ { 'e', 0, "e", 1, 0, EXP, },
++ { 'E', 0, "E", 1, 0, EXP, },
++ { 'g', 0, "e", 1, 0, GENERIC, },
++ { 'G', 0, "E", 1, 0, GENERIC, },
++ { 'i', 10, "0123456789", 1, 0, RADIX, },
++ { 'n', 0, 0, 0, 0, SIZE, },
++ { 'S', 0, 0, 0, 0, SEEIT, },
++ { '%', 0, 0, 0, 0, PERCENT, },
++ { 'b', 2, "01", 0, "b0", RADIX, }, /* Binary notation */
++ { 'p', 16, "0123456789ABCDEF", 0, "x0", RADIX, }, /* Pointers */
++ { '\'', 0, 0, 0, 0, CHARLIT, }, /* Literal char */
++};
++#define NINFO (sizeof(fmtinfo)/sizeof(info)) /* Size of the fmtinfo table */
++
++/*
++** If NOFLOATINGPOINT is defined, then none of the floating point
++** conversions will work.
++*/
++#ifndef NOFLOATINGPOINT
++/*
++** "*val" is a double such that 0.1 <= *val < 10.0
++** Return the ascii code for the leading digit of *val, then
++** multiply "*val" by 10.0 to renormalize.
++**
++** Example:
++** input: *val = 3.14159
++** output: *val = 1.4159 function return = '3'
++**
++** The counter *cnt is incremented each time. After counter exceeds
++** 16 (the number of significant digits in a 64-bit float) '0' is
++** always returned.
++*/
++static int getdigit(long double *val, int *cnt){
++ int digit;
++ long double d;
++ if( (*cnt)++ >= MAXDIG ) return '0';
++ digit = (int)*val;
++ d = digit;
++ digit += '0';
++ *val = (*val - d)*10.0;
++ return digit;
++}
++#endif
++
++/*
++** Setting the size of the BUFFER involves trade-offs. No %d or %f
++** conversion can have more than BUFSIZE characters. If the field
++** width is larger than BUFSIZE, it is silently shortened. On the
++** other hand, this routine consumes more stack space with larger
++** BUFSIZEs. If you have some threads for which you want to minimize
++** stack space, you should keep BUFSIZE small.
++*/
++#define BUFSIZE 100 /* Size of the output buffer */
++
++/*
++** The root program. All variations call this core.
++**
++** INPUTS:
++** func This is a pointer to a function taking three arguments
++** 1. A pointer to the list of characters to be output
++** (Note, this list is NOT null terminated.)
++** 2. An integer number of characters to be output.
++** (Note: This number might be zero.)
++** 3. A pointer to anything. Same as the "arg" parameter.
++**
++** arg This is the pointer to anything which will be passed as the
++** third argument to "func". Use it for whatever you like.
++**
++** fmt This is the format string, as in the usual print.
++**
++** ap This is a pointer to a list of arguments. Same as in
++** vfprint.
++**
++** OUTPUTS:
++** The return value is the total number of characters sent to
++** the function "func". Returns -1 on a error.
++**
++** Note that the order in which automatic variables are declared below
++** seems to make a big difference in determining how fast this beast
++** will run.
++*/
++
++int vxprintf(func,arg,format,ap)
++ void (*func)(char*,int,void*);
++ void *arg;
++ const char *format;
++ va_list ap;
++{
++ register const char *fmt; /* The format string. */
++ register int c; /* Next character in the format string */
++ register char *bufpt; /* Pointer to the conversion buffer */
++ register int precision; /* Precision of the current field */
++ register int length; /* Length of the field */
++ register int idx; /* A general purpose loop counter */
++ int count; /* Total number of characters output */
++ int width; /* Width of the current field */
++ int flag_leftjustify; /* True if "-" flag is present */
++ int flag_plussign; /* True if "+" flag is present */
++ int flag_blanksign; /* True if " " flag is present */
++ int flag_alternateform; /* True if "#" flag is present */
++ int flag_zeropad; /* True if field width constant starts with zero */
++ int flag_long; /* True if "l" flag is present */
++ int flag_center; /* True if "=" flag is present */
++ unsigned long long longvalue; /* Value for integer types */
++
++ long double realvalue; /* Value for real types */
++ info *infop; /* Pointer to the appropriate info structure */
++ char buf[BUFSIZE]; /* Conversion buffer */
++ char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
++ int errorflag = 0; /* True if an error is encountered */
++ enum e_type xtype; /* Conversion paradigm */
++ char *zMem = 0; /* String to be freed */
++ static char spaces[] =
++ " ";
++#define SPACESIZE (sizeof(spaces)-1)
++#ifndef NOFLOATINGPOINT
++ int exp; /* exponent of real numbers */
++ long double rounder; /* Used for rounding floating point values */
++ int flag_dp; /* True if decimal point should be shown */
++ int flag_rtz; /* True if trailing zeros should be removed */
++ int flag_exp; /* True to force display of the exponent */
++ int nsd; /* Number of significant digits returned */
++#endif
++
++ fmt = format; /* Put in a register for speed */
++ count = length = 0;
++ bufpt = 0;
++ for(; (c=(*fmt))!=0; ++fmt){
++ if( c!='%' ){
++ register int amt;
++ bufpt = (char *)fmt;
++ amt = 1;
++ while( (c=(*++fmt))!='%' && c!=0 ) amt++;
++ (*func)(bufpt,amt,arg);
++ count += amt;
++ if( c==0 ) break;
++ }
++ if( (c=(*++fmt))==0 ){
++ errorflag = 1;
++ (*func)("%",1,arg);
++ count++;
++ break;
++ }
++ /* Find out what flags are present */
++ flag_leftjustify = flag_plussign = flag_blanksign =
++ flag_alternateform = flag_zeropad = flag_center = 0;
++ do{
++ switch( c ){
++ case '-': flag_leftjustify = 1; c = 0; break;
++ case '+': flag_plussign = 1; c = 0; break;
++ case ' ': flag_blanksign = 1; c = 0; break;
++ case '#': flag_alternateform = 1; c = 0; break;
++ case '0': flag_zeropad = 1; c = 0; break;
++ case '=': flag_center = 1; c = 0; break;
++ default: break;
++ }
++ }while( c==0 && (c=(*++fmt))!=0 );
++ if( flag_center ) flag_leftjustify = 0;
++ /* Get the field width */
++ width = 0;
++ if( c=='*' ){
++ width = va_arg(ap,int);
++ if( width<0 ){
++ flag_leftjustify = 1;
++ width = -width;
++ }
++ c = *++fmt;
++ }else{
++ while( isdigit(c) ){
++ width = width*10 + c - '0';
++ c = *++fmt;
++ }
++ }
++ if( width > BUFSIZE-10 ){
++ width = BUFSIZE-10;
++ }
++ /* Get the precision */
++ if( c=='.' ){
++ precision = 0;
++ c = *++fmt;
++ if( c=='*' ){
++ precision = va_arg(ap,int);
++#ifndef COMPATIBILITY
++ /* This is sensible, but SUN OS 4.1 doesn't do it. */
++ if( precision<0 ) precision = -precision;
++#endif
++ c = *++fmt;
++ }else{
++ while( isdigit(c) ){
++ precision = precision*10 + c - '0';
++ c = *++fmt;
++ }
++ }
++ /* Limit the precision to prevent overflowing buf[] during conversion */
++ if( precision>BUFSIZE-40 ) precision = BUFSIZE-40;
++ }else{
++ precision = -1;
++ }
++ /* Get the conversion type modifier */
++ if( c=='l' ){
++ flag_long = 1;
++ c = *++fmt;
++ if( c == 'l' ){
++ flag_long = 2;
++ c = *++fmt;
++ }
++ }else{
++ flag_long = 0;
++ }
++ /* Fetch the info entry for the field */
++ infop = 0;
++ for(idx=0; idxtype;
++ }
++
++ /*
++ ** At this point, variables are initialized as follows:
++ **
++ ** flag_alternateform TRUE if a '#' is present.
++ ** flag_plussign TRUE if a '+' is present.
++ ** flag_leftjustify TRUE if a '-' is present or if the
++ ** field width was negative.
++ ** flag_zeropad TRUE if the width began with 0.
++ ** flag_long TRUE if the letter 'l' (ell) prefixed
++ ** the conversion character.
++ ** flag_blanksign TRUE if a ' ' is present.
++ ** width The specified field width. This is
++ ** always non-negative. Zero is the default.
++ ** precision The specified precision. The default
++ ** is -1.
++ ** xtype The class of the conversion.
++ ** infop Pointer to the appropriate info struct.
++ */
++ switch( xtype ){
++ case ORDINAL:
++ case RADIX:
++ if(( flag_long>1 )&&( infop->flag_signed )){
++ signed long long t = va_arg(ap,signed long long);
++ longvalue = t;
++ }else if(( flag_long>1 )&&( !infop->flag_signed )){
++ unsigned long long t = va_arg(ap,unsigned long long);
++ longvalue = t;
++ }else if(( flag_long )&&( infop->flag_signed )){
++ signed long t = va_arg(ap,signed long);
++ longvalue = t;
++ }else if(( flag_long )&&( !infop->flag_signed )){
++ unsigned long t = va_arg(ap,unsigned long);
++ longvalue = t;
++ }else if(( !flag_long )&&( infop->flag_signed )){
++ signed int t = va_arg(ap,signed int) & ((unsigned long) 0xffffffff);
++ longvalue = t;
++ }else{
++ unsigned int t = va_arg(ap,unsigned int) & ((unsigned long) 0xffffffff);
++ longvalue = t;
++ }
++#ifdef COMPATIBILITY
++ /* For the format %#x, the value zero is printed "0" not "0x0".
++ ** I think this is stupid. */
++ if( longvalue==0 ) flag_alternateform = 0;
++#else
++ /* More sensible: turn off the prefix for octal (to prevent "00"),
++ ** but leave the prefix for hex. */
++ if( longvalue==0 && infop->base==8 ) flag_alternateform = 0;
++#endif
++ if( infop->flag_signed ){
++ if( *(long long*)&longvalue<0 ){
++ longvalue = -*(long long*)&longvalue;
++ prefix = '-';
++ }else if( flag_plussign ) prefix = '+';
++ else if( flag_blanksign ) prefix = ' ';
++ else prefix = 0;
++ }else prefix = 0;
++ if( flag_zeropad && precision3 || (b>10 && b<14) ){
++ bufpt[0] = 't';
++ bufpt[1] = 'h';
++ }else if( a==1 ){
++ bufpt[0] = 's';
++ bufpt[1] = 't';
++ }else if( a==2 ){
++ bufpt[0] = 'n';
++ bufpt[1] = 'd';
++ }else if( a==3 ){
++ bufpt[0] = 'r';
++ bufpt[1] = 'd';
++ }
++ }
++ {
++ register char *cset; /* Use registers for speed */
++ register int base;
++ cset = infop->charset;
++ base = infop->base;
++ do{ /* Convert to ascii */
++ *(--bufpt) = cset[longvalue%base];
++ longvalue = longvalue/base;
++ }while( longvalue>0 );
++ }
++ length = (int)(&buf[BUFSIZE]-bufpt);
++ if(infop->fmttype == 'p')
++ {
++ precision = 8;
++ flag_alternateform = 1;
++ }
++
++ for(idx=precision-length; idx>0; idx--){
++ *(--bufpt) = '0'; /* Zero pad */
++ }
++ if( prefix ) *(--bufpt) = prefix; /* Add sign */
++ if( flag_alternateform && infop->prefix ){ /* Add "0" or "0x" */
++ char *pre, x;
++ pre = infop->prefix;
++ if( *bufpt!=pre[0] ){
++ for(pre=infop->prefix; (x=(*pre))!=0; pre++) *(--bufpt) = x;
++ }
++ }
++
++ length = (int)(&buf[BUFSIZE]-bufpt);
++ break;
++ case FLOAT:
++ case EXP:
++ case GENERIC:
++ realvalue = va_arg(ap,double);
++#ifndef NOFLOATINGPOINT
++ if( precision<0 ) precision = 6; /* Set default precision */
++ if( precision>BUFSIZE-10 ) precision = BUFSIZE-10;
++ if( realvalue<0.0 ){
++ realvalue = -realvalue;
++ prefix = '-';
++ }else{
++ if( flag_plussign ) prefix = '+';
++ else if( flag_blanksign ) prefix = ' ';
++ else prefix = 0;
++ }
++ if( infop->type==GENERIC && precision>0 ) precision--;
++ rounder = 0.0;
++#ifdef COMPATIBILITY
++ /* Rounding works like BSD when the constant 0.4999 is used. Wierd! */
++ for(idx=precision, rounder=0.4999; idx>0; idx--, rounder*=0.1);
++#else
++ /* It makes more sense to use 0.5 */
++ if( precision>MAXDIG-1 ) idx = MAXDIG-1;
++ else idx = precision;
++ for(rounder=0.5; idx>0; idx--, rounder*=0.1);
++#endif
++ if( infop->type==FLOAT ) realvalue += rounder;
++ /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */
++ exp = 0;
++ if( realvalue>0.0 ){
++ int k = 0;
++ while( realvalue>=1e8 && k++<100 ){ realvalue *= 1e-8; exp+=8; }
++ while( realvalue>=10.0 && k++<100 ){ realvalue *= 0.1; exp++; }
++ while( realvalue<1e-8 && k++<100 ){ realvalue *= 1e8; exp-=8; }
++ while( realvalue<1.0 && k++<100 ){ realvalue *= 10.0; exp--; }
++ if( k>=100 ){
++ bufpt = "NaN";
++ length = 3;
++ break;
++ }
++ }
++ bufpt = buf;
++ /*
++ ** If the field type is GENERIC, then convert to either EXP
++ ** or FLOAT, as appropriate.
++ */
++ flag_exp = xtype==EXP;
++ if( xtype!=FLOAT ){
++ realvalue += rounder;
++ if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; }
++ }
++ if( xtype==GENERIC ){
++ flag_rtz = !flag_alternateform;
++ if( exp<-4 || exp>precision ){
++ xtype = EXP;
++ }else{
++ precision = precision - exp;
++ xtype = FLOAT;
++ }
++ }else{
++ flag_rtz = 0;
++ }
++ /*
++ ** The "exp+precision" test causes output to be of type EXP if
++ ** the precision is too large to fit in buf[].
++ */
++ nsd = 0;
++ if( xtype==FLOAT && exp+precision0 || flag_alternateform);
++ if( prefix ) *(bufpt++) = prefix; /* Sign */
++ if( exp<0 ) *(bufpt++) = '0'; /* Digits before "." */
++ else for(; exp>=0; exp--) *(bufpt++) = getdigit(&realvalue,&nsd);
++ if( flag_dp ) *(bufpt++) = '.'; /* The decimal point */
++ for(exp++; exp<0 && precision>0; precision--, exp++){
++ *(bufpt++) = '0';
++ }
++ while( (precision--)>0 ) *(bufpt++) = getdigit(&realvalue,&nsd);
++ *(bufpt--) = 0; /* Null terminate */
++ if( flag_rtz && flag_dp ){ /* Remove trailing zeros and "." */
++ while( bufpt>=buf && *bufpt=='0' ) *(bufpt--) = 0;
++ if( bufpt>=buf && *bufpt=='.' ) *(bufpt--) = 0;
++ }
++ bufpt++; /* point to next free slot */
++ }else{ /* EXP or GENERIC */
++ flag_dp = (precision>0 || flag_alternateform);
++ if( prefix ) *(bufpt++) = prefix; /* Sign */
++ *(bufpt++) = getdigit(&realvalue,&nsd); /* First digit */
++ if( flag_dp ) *(bufpt++) = '.'; /* Decimal point */
++ while( (precision--)>0 ) *(bufpt++) = getdigit(&realvalue,&nsd);
++ bufpt--; /* point to last digit */
++ if( flag_rtz && flag_dp ){ /* Remove tail zeros */
++ while( bufpt>=buf && *bufpt=='0' ) *(bufpt--) = 0;
++ if( bufpt>=buf && *bufpt=='.' ) *(bufpt--) = 0;
++ }
++ bufpt++; /* point to next free slot */
++ if( exp || flag_exp ){
++ *(bufpt++) = infop->charset[0];
++ if( exp<0 ){ *(bufpt++) = '-'; exp = -exp; } /* sign of exp */
++ else { *(bufpt++) = '+'; }
++ if( exp>=100 ){
++ *(bufpt++) = (exp/100)+'0'; /* 100's digit */
++ exp %= 100;
++ }
++ *(bufpt++) = exp/10+'0'; /* 10's digit */
++ *(bufpt++) = exp%10+'0'; /* 1's digit */
++ }
++ }
++ /* The converted number is in buf[] and zero terminated. Output it.
++ ** Note that the number is in the usual order, not reversed as with
++ ** integer conversions. */
++ length = (int)(bufpt-buf);
++ bufpt = buf;
++
++ /* Special case: Add leading zeros if the flag_zeropad flag is
++ ** set and we are not left justified */
++ if( flag_zeropad && !flag_leftjustify && length < width){
++ int i;
++ int nPad = width - length;
++ for(i=width; i>=nPad; i--){
++ bufpt[i] = bufpt[i-nPad];
++ }
++ i = prefix!=0;
++ while( nPad-- ) bufpt[i++] = '0';
++ length = width;
++ }
++#endif
++ break;
++ case SIZE:
++ *(va_arg(ap,int*)) = count;
++ length = width = 0;
++ break;
++ case PERCENT:
++ buf[0] = '%';
++ bufpt = buf;
++ length = 1;
++ break;
++ case CHARLIT:
++ case CHAR:
++ c = buf[0] = (xtype==CHAR ? va_arg(ap,int) : *++fmt);
++ if( precision>=0 ){
++ for(idx=1; idx=0 && precision=0x7f ){
++ buf[i++] = '^';
++ buf[i] = (c&0x1f)+0x40;
++ }else{
++ buf[i] = c;
++ }
++ }
++ bufpt = buf;
++ length = i;
++ if( precision>=0 && precision0 ){
++ if( flag_center ){
++ nspace = nspace/2;
++ width -= nspace;
++ flag_leftjustify = 1;
++ }
++ count += nspace;
++ while( nspace>=SPACESIZE ){
++ (*func)(spaces,SPACESIZE,arg);
++ nspace -= SPACESIZE;
++ }
++ if( nspace>0 ) (*func)(spaces,nspace,arg);
++ }
++ }
++ if( length>0 ){
++ (*func)(bufpt,length,arg);
++ count += length;
++ }
++ if( xtype==MEM_STRING && zMem ){
++ free(zMem);
++ }
++ if( flag_leftjustify ){
++ register int nspace;
++ nspace = width-length;
++ if( nspace>0 ){
++ count += nspace;
++ while( nspace>=SPACESIZE ){
++ (*func)(spaces,SPACESIZE,arg);
++ nspace -= SPACESIZE;
++ }
++ if( nspace>0 ) (*func)(spaces,nspace,arg);
++ }
++ }
++ }/* End for loop over the format string */
++ return errorflag ? -1 : count;
++} /* End of function */
++#endif
++
++#ifdef F__xprintf
++/*
++** This non-standard function is still occasionally useful....
++*/
++int xprintf(
++ void (*func)(char*,int,void*),
++ void *arg,
++ const char *format,
++ ...
++){
++ va_list ap;
++ va_start(ap,format);
++ return vxprintf(func,arg,format,ap);
++}
++#endif
++
++/*
++** Now for string-print, also as found in any standard library.
++** Add to this the snprint function which stops added characters
++** to the string at a given length.
++**
++** Note that snprint returns the length of the string as it would
++** be if there were no limit on the output.
++*/
++struct s_strargument { /* Describes the string being written to */
++ char *next; /* Next free slot in the string */
++ char *last; /* Last available slot in the string */
++};
++
++void __sout(char *, int, void *);
++#ifdef F___sout
++void __sout(txt,amt,arg)
++ char *txt;
++ int amt;
++ void *arg;
++{
++ register char *head;
++ register const char *t;
++ register int a;
++ register char *tail;
++ a = amt;
++ t = txt;
++ head = ((struct s_strargument*)arg)->next;
++ tail = ((struct s_strargument*)arg)->last;
++ if( tail ){
++ while( a-- >0 && head0 ) *(head++) = *(t++);
++ }
++ *head = 0;
++ ((struct s_strargument*)arg)->next = head;
++}
++#endif
++
++#ifdef F_vsnprintf
++int vsnprintf(char *buf, size_t n, const char *fmt, va_list ap){
++ struct s_strargument arg;
++ arg.next = buf;
++ arg.last = &buf[n-1];
++ *buf = 0;
++ return vxprintf(__sout,&arg,fmt,ap);
++}
++#endif
++
++#ifdef F_snprintf
++int snprintf(char *str, size_t sz, const char *format, ...)
++{
++ va_list args;
++ struct s_strargument arg;
++ int ret;
++
++ arg.next = str;
++ arg.last = &str[sz-1];
++
++ va_start(args, format);
++ ret = vxprintf(__sout, &arg, format, args);
++ va_end(args);
++
++ return ret;
++}
++#endif
++
++#ifdef F_vsprintf
++int vsprintf(char *buf, const char *fmt, va_list ap){
++ struct s_strargument arg;
++ arg.next = buf;
++ arg.last = NULL;
++ *buf = 0;
++ return vxprintf(__sout,&arg,fmt,ap);
++}
++#endif
++
++#ifdef F_sprintf
++int sprintf (char *str, const char *format, ...)
++{
++ va_list args;
++ struct s_strargument arg;
++ int ret;
++
++ arg.next = str;
++ arg.last = NULL;
++
++ va_start(args, format);
++ ret = vxprintf(__sout, &arg, format, args);
++ va_end(args);
++
++ return ret;
++}
++#endif
++
++/*
++** The following section of code handles the mprintf routine, that
++** writes to memory obtained from malloc().
++*/
++
++/* This structure is used to store state information about the
++** write in progress
++*/
++struct sgMprintf {
++ char *zBase; /* A base allocation */
++ char *zText; /* The string collected so far */
++ int nChar; /* Length of the string so far */
++ int nAlloc; /* Amount of space allocated in zText */
++};
++
++void __mout(char *, int, void*);
++
++#ifdef F___mout
++/* The xprintf callback function. */
++void __mout(zNewText,nNewChar,arg)
++ char *zNewText;
++ int nNewChar;
++ void *arg;
++{
++ struct sgMprintf *pM = (struct sgMprintf*)arg;
++ if( pM->nChar + nNewChar + 1 > pM->nAlloc ){
++ pM->nAlloc = pM->nChar + nNewChar*2 + 1;
++ if( pM->zText==pM->zBase ){
++ pM->zText = malloc(pM->nAlloc);
++ if( pM->zText && pM->nChar ) memcpy(pM->zText,pM->zBase,pM->nChar);
++ }else{
++ pM->zText = realloc(pM->zText, pM->nAlloc);
++ }
++ }
++ if( pM->zText ){
++ memcpy(&pM->zText[pM->nChar], zNewText, nNewChar);
++ pM->nChar += nNewChar;
++ pM->zText[pM->nChar] = 0;
++ }
++}
++#endif
++
++/*
++** mprintf() works like printf(), but allocations memory to hold the
++** resulting string and returns a pointer to the allocated memory.
++**
++** We changed the name to TclMPrint() to conform with the Tcl private
++** routine naming conventions.
++*/
++
++#ifdef F_mprintf
++char *mprintf(const char *zFormat, ...){
++ va_list ap;
++ struct sgMprintf sMprintf;
++ char *zNew;
++ char zBuf[200];
++
++ va_start(ap,zFormat);
++ sMprintf.nChar = 0;
++ sMprintf.nAlloc = sizeof(zBuf);
++ sMprintf.zText = zBuf;
++ sMprintf.zBase = zBuf;
++ vxprintf(__mout,&sMprintf,zFormat,ap);
++ va_end(ap);
++ if( sMprintf.zText==sMprintf.zBase ){
++ zNew = malloc( sMprintf.nChar+1 );
++ if( zNew ) strcpy(zNew,zBuf);
++ }else{
++ zNew = realloc(sMprintf.zText,sMprintf.nChar+1);
++ }
++
++ return zNew;
++}
++#endif
++
++/* This is the varargs version of mprintf.
++**
++** The name is changed to TclVMPrintf() to conform with Tcl naming
++** conventions.
++*/
++#ifdef F_vmprintf
++char *vmprintf(const char *zFormat,va_list ap){
++ struct sgMprintf sMprintf;
++ char zBuf[200];
++ sMprintf.nChar = 0;
++ sMprintf.zText = zBuf;
++ sMprintf.nAlloc = sizeof(zBuf);
++ sMprintf.zBase = zBuf;
++ vxprintf(__mout,&sMprintf,zFormat,ap);
++ if( sMprintf.zText==sMprintf.zBase ){
++ sMprintf.zText = malloc( strlen(zBuf)+1 );
++ if( sMprintf.zText ) strcpy(sMprintf.zText,zBuf);
++ }else{
++ sMprintf.zText = realloc(sMprintf.zText,sMprintf.nChar+1);
++ }
++ return sMprintf.zText;
++}
++#endif
++
++#ifdef F_asprintf
++int asprintf(char ** strp, const char *zFormat, ...){
++ va_list ap;
++ struct sgMprintf sMprintf;
++ char *zNew;
++ char zBuf[200];
++
++ va_start(ap,zFormat);
++ sMprintf.nChar = 0;
++ sMprintf.nAlloc = sizeof(zBuf);
++ sMprintf.zText = zBuf;
++ sMprintf.zBase = zBuf;
++ vxprintf(__mout,&sMprintf,zFormat,ap);
++ va_end(ap);
++ if( sMprintf.zText==sMprintf.zBase ){
++ zNew = malloc( sMprintf.nChar+1 );
++ if( zNew ) strcpy(zNew,zBuf);
++ }else{
++ zNew = realloc(sMprintf.zText,sMprintf.nChar+1);
++ }
++
++ *strp = zNew;
++
++ return sMprintf.nChar+1;
++}
++#endif
++
++#ifdef F_vasprintf
++int vasprintf(char **strp, const char *format, va_list ap) {
++ struct sgMprintf sMprintf;
++ char zBuf[200];
++ sMprintf.nChar = 0;
++ sMprintf.zText = zBuf;
++ sMprintf.nAlloc = sizeof(zBuf);
++ sMprintf.zBase = zBuf;
++ vxprintf(__mout,&sMprintf,format,ap);
++ if( sMprintf.zText==sMprintf.zBase ){
++ sMprintf.zText = malloc( strlen(zBuf)+1 );
++ if( sMprintf.zText ) strcpy(sMprintf.zText,zBuf);
++ }else{
++ sMprintf.zText = realloc(sMprintf.zText,sMprintf.nChar+1);
++ }
++ *strp = sMprintf.zText;
++ return sMprintf.nChar;
++}
++#endif
++
++/*
++** The following section of code handles the standard fprintf routines
++** for pthreads.
++*/
++
++void __fout(char *, int, void *);
++
++#ifdef F___fout
++void __fout(zNewText,nNewChar,arg)
++ char *zNewText;
++ int nNewChar;
++ void *arg;
++{
++ fwrite(zNewText,1,nNewChar,(FILE*)arg);
++}
++#endif
++
++#ifdef F_fprintf
++/* The public interface routines */
++int fprintf(FILE *pOut, const char *zFormat, ...){
++ va_list ap;
++ int retc;
++
++ va_start(ap,zFormat);
++ retc = vxprintf(__fout,pOut,zFormat,ap);
++ va_end(ap);
++ return retc;
++}
++#endif
++
++#ifdef F_vfprintf
++int vfprintf(FILE *pOut, const char *zFormat, va_list ap){
++ return vxprintf(__fout,pOut,zFormat,ap);
++}
++#endif
++
++
++#ifdef F_printf
++int printf(const char *format, ...)
++{
++ va_list args;
++ int ret;
++
++ va_start(args, format);
++ ret = vprintf(format, args);
++ va_end(args);
++
++ return ret;
++}
++#endif
++
++#ifdef F_vprintf
++int vprintf(const char *format, va_list args)
++{
++ return vxprintf(__fout, stdout, format, args);
++}
++#endif
++
++#ifdef F__sprintf_r
++/* Idiotic kludge to get around newlib stupidity. tmpnam() calls this
++ directly, but since sprintf() above replaces newlib's sprintf() (and
++ _sprintf_r()) we have to define this in order to link tmpnam(). */
++int _sprintf_r(struct _reent *unused, char *str, const char *format, ...)
++{
++ va_list args;
++ struct s_strargument arg;
++ int ret;
++
++ (void) unused;
++ arg.next = str;
++ arg.last = NULL;
++
++ va_start(args, format);
++ ret = vxprintf(__sout, &arg, format, args);
++ va_end(args);
++
++ return ret;
++}
++#endif
diff --git a/dkpsp/scripts/build-gcc.sh b/dkpsp/scripts/build-gcc.sh
index fbbd0d6..a2b57dc 100644
--- a/dkpsp/scripts/build-gcc.sh
+++ b/dkpsp/scripts/build-gcc.sh
@@ -57,6 +57,7 @@ cd pspsdk
./configure || { echo "ERROR RUNNING PSPSDK CONFIGURE"; exit 1; }
$MAKE install-data || { echo "ERROR INSTALLING PSPSDK HEADERS"; exit 1; }
+cd $BUILDSCRIPTDIR
#---------------------------------------------------------------------------------
# build and install newlib