This is a tad rough, but not too bad.
No hwcap stuff. Probably something similar to what I did for ARM will work.
I'd prefer that someone else figure out what to do with all that, honestly.
No support for non-ELF, aka AIX and Darwin. I'm not 100% sure how to handle
the assembly markup for those, and I couldn't test it anyway. Again, I'd
prefer someone else figure that stuff out. These are still marked as
UNSUPPORTED, so I ought not be breaking the bootstrap there.
Nevertheless, this is good enough to pass all tests on ppc{,64}-linux.
Oh, for the record, I think we should probably be saving and restoring the fp
state on all targets. If we restart a transaction, we're really saying that
absolutely nothing happened. Something like
double a, b, c;
__transaction_atomic { a = b+c; }
shouldn't erroneously set the overflow flag if the first iteration of the
transaction generates an infinity but the final iteration doesn't. The x86
port is currently wrong for this, as is the port I just posted for ARM, but I
make the attempt here.
r~
commit ad469de30f6838bdf25df5a22f254609ddb43136
Author: Richard Henderson <[email protected]>
Date: Tue Nov 29 16:13:50 2011 -0800
libitm: Initial PowerPC support.
diff --git a/libitm/config/generic/asmcfi.h b/libitm/config/generic/asmcfi.h
index 4344d6f..0727f41 100644
--- a/libitm/config/generic/asmcfi.h
+++ b/libitm/config/generic/asmcfi.h
@@ -1,4 +1,3 @@
-
/* Copyright (C) 2011 Free Software Foundation, Inc.
Contributed by Richard Henderson <[email protected]>.
@@ -32,6 +31,9 @@
#define cfi_def_cfa_offset(n) .cfi_def_cfa_offset n
#define cfi_def_cfa(r,n) .cfi_def_cfa r, n
#define cfi_register(o,n) .cfi_register o, n
+#define cfi_offset(r,o) .cfi_offset r, o
+#define cfi_restore(r) .cfi_restore r
+#define cfi_undefined(r) .cfi_undefined r
#else
@@ -40,5 +42,8 @@
#define cfi_def_cfa_offset(n)
#define cfi_def_cfa(r,n)
#define cfi_register(o,n)
+#define cfi_offset(r,o)
+#define cfi_restore(r)
+#define cfi_undefined(r)
#endif /* HAVE_AS_CFI_PSEUDO_OP */
diff --git a/libitm/config/linux/powerpc/futex_bits.h
b/libitm/config/linux/powerpc/futex_bits.h
new file mode 100644
index 0000000..5587fca
--- /dev/null
+++ b/libitm/config/linux/powerpc/futex_bits.h
@@ -0,0 +1,54 @@
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+ Contributed by Richard Henderson <[email protected]>.
+
+ This file is part of the GNU Transactional Memory Library (libitm).
+
+ Libitm 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 3 of the License, or
+ (at your option) any later version.
+
+ Libitm 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.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sys/syscall.h>
+
+static inline long
+sys_futex0 (int *addr, int op, int val)
+{
+ register long int r0 __asm__ ("r0");
+ register long int r3 __asm__ ("r3");
+ register long int r4 __asm__ ("r4");
+ register long int r5 __asm__ ("r5");
+ register long int r6 __asm__ ("r6");
+
+ r0 = SYS_futex;
+ r3 = (long) addr;
+ r4 = op;
+ r5 = val;
+ r6 = 0;
+
+ /* ??? The powerpc64 sysdep.h file clobbers ctr; the powerpc32 sysdep.h
+ doesn't. It doesn't much matter for us. In the interest of unity,
+ go ahead and clobber it always. */
+
+ __asm volatile ("sc; mfcr %0"
+ : "=r"(r0), "=r"(r3), "=r"(r4), "=r"(r5), "=r"(r6)
+ : "r"(r0), "r"(r3), "r"(r4), "r"(r5), "r"(r6)
+ : "r7", "r8", "r9", "r10", "r11", "r12",
+ "cr0", "ctr", "memory");
+ if (__builtin_expect (r0 & (1 << 28), 0))
+ return r3;
+ return 0;
+}
diff --git a/libitm/config/powerpc/cacheline.h
b/libitm/config/powerpc/cacheline.h
new file mode 100644
index 0000000..e20cfec
--- /dev/null
+++ b/libitm/config/powerpc/cacheline.h
@@ -0,0 +1,38 @@
+/* Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+ Contributed by Richard Henderson <[email protected]>.
+
+ This file is part of the GNU Transactional Memory Library (libitm).
+
+ Libitm 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 3 of the License, or
+ (at your option) any later version.
+
+ Libitm 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.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef LIBITM_POWERPC_CACHELINE_H
+#define LIBITM_POWERPC_CACHELINE_H 1
+
+// A cacheline is the smallest unit with which locks are associated.
+// The current implementation of the _ITM_[RW] barriers assumes that
+// all data types can fit (aligned) within a cachline, which means
+// in practice sizeof(complex long double) is the smallest cacheline size.
+// It ought to be small enough for efficient manipulation of the
+// modification mask, below.
+#define CACHELINE_SIZE 64
+
+#include "config/generic/cacheline.h"
+
+#endif // LIBITM_POWERPC_CACHELINE_H
diff --git a/libitm/config/powerpc/sjlj.S b/libitm/config/powerpc/sjlj.S
new file mode 100644
index 0000000..51cce77
--- /dev/null
+++ b/libitm/config/powerpc/sjlj.S
@@ -0,0 +1,336 @@
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+ Contributed by Richard Henderson <[email protected]>.
+
+ This file is part of the GNU Transactional Memory Library (libitm).
+
+ Libitm 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 3 of the License, or
+ (at your option) any later version.
+
+ Libitm 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.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+ .text
+
+#include "asmcfi.h"
+
+#if defined(__powerpc64__) && defined(__ELF__)
+.macro FUNC name
+ .globl \name, .\name
+ .section ".opd","aw"
+ .align 3
+\name:
+ .quad .\name, .TOC.@tocbase, 0
+ .size \name, 24
+ .type .\name, @function
+ .text
+.\name:
+.endm
+.macro END name
+ .size .\name, . - .\name
+.endm
+.macro HIDDEN name
+ .hidden \name, .\name
+.endm
+#elif defined(__ELF__)
+.macro FUNC name
+ .globl \name
+ .type \name, @function
+\name:
+.endm
+.macro END name
+ .size \name, . - \name
+.endm
+.macro HIDDEN name
+ .hidden \name
+.endm
+#else
+#error "unsupported system"
+#endif
+
+/* Parameterize the code for 32-bit vs 64-bit. */
+#ifdef __powerpc64__
+#define ldreg ld
+#define streg std
+#define stregu stdu
+#define WS 8
+#else
+#define ldreg lwz
+#define streg stw
+#define stregu stwu
+#define WS 4
+#endif
+
+/* Parameterize the code for call frame constants. */
+#if defined(_CALL_AIXDESC)
+# define BASE 6*WS
+# define LR_SAVE 2*WS
+#elif defined(_CALL_SYSV)
+# define BASE 2*WS
+# define LR_SAVE 1*WS
+#else
+# error "unsupported system"
+#endif
+
+#if defined(__ALTIVEC__) || defined(__VSX__)
+# define OFS_VR 0
+# define OFS_VSCR 12*16
+# define OFS_VR_END OFS_VSCR + 8
+#else
+# define OFS_VR_END 0
+#endif
+#ifndef _SOFT_FLOAT
+# define OFS_FR OFS_VR_END
+# define OFS_FPSCR OFS_FR + 18*8
+# define OFS_FR_END OFS_FPSCR + 8
+#else
+# define OFS_FR_END OFS_VR_END
+#endif
+#define OFS_GR OFS_FR_END
+#define OFS_CFA OFS_GR + 18*WS
+#define OFS_LR OFS_CFA + WS
+#define OFS_TOC OFS_LR + WS
+#define OFS_END OFS_TOC + WS
+
+#define FRAME (((BASE + OFS_END + 15) / 16) * 16)
+#define VRSAVE 256
+
+ .align 4
+FUNC _ITM_beginTransaction
+ cfi_startproc
+ mflr %r0
+ streg %r0, LR_SAVE(%r1)
+ mr %r11, %r1
+ stregu %r1, -FRAME(%r1)
+ cfi_def_cfa_offset(FRAME)
+ cfi_offset(65, LR_SAVE)
+ streg %r11, OFS_CFA+BASE(%r1)
+ streg %r0, OFS_LR+BASE(%r1)
+ streg %r2, OFS_TOC+BASE(%r1)
+ streg %r14, 0*WS+OFS_GR+BASE(%r1)
+ streg %r15, 1*WS+OFS_GR+BASE(%r1)
+ streg %r16, 2*WS+OFS_GR+BASE(%r1)
+ streg %r17, 3*WS+OFS_GR+BASE(%r1)
+ streg %r18, 4*WS+OFS_GR+BASE(%r1)
+ streg %r19, 5*WS+OFS_GR+BASE(%r1)
+ streg %r20, 6*WS+OFS_GR+BASE(%r1)
+ streg %r21, 7*WS+OFS_GR+BASE(%r1)
+ streg %r22, 8*WS+OFS_GR+BASE(%r1)
+ streg %r23, 9*WS+OFS_GR+BASE(%r1)
+ streg %r24, 10*WS+OFS_GR+BASE(%r1)
+ streg %r25, 11*WS+OFS_GR+BASE(%r1)
+ streg %r26, 12*WS+OFS_GR+BASE(%r1)
+ streg %r27, 13*WS+OFS_GR+BASE(%r1)
+ streg %r28, 14*WS+OFS_GR+BASE(%r1)
+ streg %r29, 15*WS+OFS_GR+BASE(%r1)
+ streg %r30, 16*WS+OFS_GR+BASE(%r1)
+ streg %r31, 17*WS+OFS_GR+BASE(%r1)
+
+#ifndef _SOFT_FLOAT
+ /* ??? Determine when FPRs not present. */
+ /* ??? Test %r3 for pr_hasNoFloatUpdate and skip the fp save.
+ This is not yet set by the compiler. */
+ mffs %f0
+ stfd %f14, 0+OFS_FR+BASE(%r1)
+ stfd %f15, 8+OFS_FR+BASE(%r1)
+ stfd %f16, 16+OFS_FR+BASE(%r1)
+ stfd %f17, 24+OFS_FR+BASE(%r1)
+ stfd %f18, 32+OFS_FR+BASE(%r1)
+ stfd %f19, 40+OFS_FR+BASE(%r1)
+ stfd %f20, 48+OFS_FR+BASE(%r1)
+ stfd %f21, 56+OFS_FR+BASE(%r1)
+ stfd %f22, 64+OFS_FR+BASE(%r1)
+ stfd %f23, 72+OFS_FR+BASE(%r1)
+ stfd %f24, 80+OFS_FR+BASE(%r1)
+ stfd %f25, 88+OFS_FR+BASE(%r1)
+ stfd %f26, 96+OFS_FR+BASE(%r1)
+ stfd %f27,104+OFS_FR+BASE(%r1)
+ stfd %f28,112+OFS_FR+BASE(%r1)
+ stfd %f29,120+OFS_FR+BASE(%r1)
+ stfd %f30,128+OFS_FR+BASE(%r1)
+ stfd %f31,136+OFS_FR+BASE(%r1)
+ stfd %f0, OFS_FPSCR+BASE(%r1)
+#endif
+
+#if defined(__ALTIVEC__) || defined(__VSX__)
+ /* ??? Determine when VRs not present. */
+ /* ??? Test %r3 for pr_hasNoVectorUpdate and skip the vr save.
+ This is not yet set by the compiler. */
+ addi %r4, %r1, OFS_VR+BASE
+ addi %r5, %r1, OFS_VR+BASE+16
+ mfspr %r0, VRSAVE
+ stvx %v20, 0, %r4; addi %r4, %r4, 32
+ stvx %v21, 0, %r5; addi %r5, %r5, 32
+ stvx %v22, 0, %r4; addi %r4, %r4, 32
+ stvx %v23, 0, %r5; addi %r5, %r5, 32
+ stvx %v24, 0, %r4; addi %r4, %r4, 32
+ stvx %v25, 0, %r5; addi %r5, %r5, 32
+ stvx %v26, 0, %r4; addi %r4, %r4, 32
+ stvx %v27, 0, %r5; addi %r5, %r5, 32
+ stvx %v28, 0, %r4; addi %r4, %r4, 32
+ stvx %v29, 0, %r5; addi %r5, %r5, 32
+ stvx %v30, 0, %r4
+ stvx %v31, 0, %r5
+ streg %r0, OFS_VSCR+BASE(%r1)
+#endif
+
+ addi %r4, %r1, BASE
+ bl GTM_begin_transaction
+ nop
+
+ ldreg %r0, LR_SAVE+FRAME(%r1)
+ mtlr %r0
+ addi %r1, %r1, FRAME
+ cfi_def_cfa_offset(0)
+ cfi_restore(65)
+ blr
+ cfi_endproc
+END _ITM_beginTransaction
+
+ .align 4
+ HIDDEN GTM_longjmp
+FUNC GTM_longjmp
+ cfi_startproc
+#if defined(__ALTIVEC__) || defined(__VSX__)
+ /* ??? Determine when VRs not present. */
+ /* ??? Test %r5 for pr_hasNoVectorUpdate and skip the vr restore.
+ This is not yet set by the compiler. */
+ addi %r6, %r4, OFS_VR
+ addi %r7, %r4, OFS_VR+16
+ ldreg %r0, OFS_VSCR(%r4)
+ cfi_undefined(%v20)
+ cfi_undefined(%v21)
+ cfi_undefined(%v22)
+ cfi_undefined(%v23)
+ cfi_undefined(%v24)
+ cfi_undefined(%v25)
+ cfi_undefined(%v26)
+ cfi_undefined(%v27)
+ cfi_undefined(%v28)
+ cfi_undefined(%v29)
+ cfi_undefined(%v30)
+ cfi_undefined(%v31)
+ lvx %v20, 0, %r6; addi %r6, %r6, 32
+ lvx %v21, 0, %r7; addi %r7, %r7, 32
+ lvx %v22, 0, %r6; addi %r6, %r6, 32
+ lvx %v23, 0, %r7; addi %r7, %r7, 32
+ lvx %v24, 0, %r6; addi %r6, %r6, 32
+ lvx %v25, 0, %r7; addi %r7, %r7, 32
+ lvx %v26, 0, %r6; addi %r6, %r6, 32
+ lvx %v27, 0, %r7; addi %r7, %r7, 32
+ lvx %v28, 0, %r6; addi %r6, %r6, 32
+ lvx %v29, 0, %r7; addi %r7, %r7, 32
+ lvx %v30, 0, %r6
+ lvx %v31, 0, %r7
+ mtspr VRSAVE, %r0
+#endif
+
+#ifndef _SOFT_FLOAT
+ /* ??? Determine when FPRs not present. */
+ /* ??? Test %r5 for pr_hasNoFloatUpdate and skip the fp load.
+ This is not yet set by the compiler. */
+ lfd %f0, OFS_FPSCR(%r4)
+ cfi_undefined(%f14)
+ cfi_undefined(%f15)
+ cfi_undefined(%f16)
+ cfi_undefined(%f17)
+ cfi_undefined(%f18)
+ cfi_undefined(%f19)
+ cfi_undefined(%f20)
+ cfi_undefined(%f21)
+ cfi_undefined(%f22)
+ cfi_undefined(%f23)
+ cfi_undefined(%f24)
+ cfi_undefined(%f25)
+ cfi_undefined(%f26)
+ cfi_undefined(%f27)
+ cfi_undefined(%f28)
+ cfi_undefined(%f29)
+ cfi_undefined(%f30)
+ cfi_undefined(%f31)
+ lfd %f14, 0+OFS_FR(%r4)
+ lfd %f15, 8+OFS_FR(%r4)
+ lfd %f16, 16+OFS_FR(%r4)
+ lfd %f17, 24+OFS_FR(%r4)
+ lfd %f18, 32+OFS_FR(%r4)
+ lfd %f19, 40+OFS_FR(%r4)
+ lfd %f20, 48+OFS_FR(%r4)
+ lfd %f21, 56+OFS_FR(%r4)
+ lfd %f22, 64+OFS_FR(%r4)
+ lfd %f23, 72+OFS_FR(%r4)
+ lfd %f24, 80+OFS_FR(%r4)
+ lfd %f25, 88+OFS_FR(%r4)
+ lfd %f26, 96+OFS_FR(%r4)
+ lfd %f27,104+OFS_FR(%r4)
+ lfd %f28,112+OFS_FR(%r4)
+ lfd %f29,120+OFS_FR(%r4)
+ lfd %f30,128+OFS_FR(%r4)
+ lfd %f31,136+OFS_FR(%r4)
+ mtfsf 0xff, %f0
+#endif
+
+ ldreg %r6, OFS_CFA(%r4)
+ ldreg %r0, OFS_LR(%r4)
+ ldreg %r2, OFS_TOC(%r4)
+ /* At the instant we restore the LR, the only coherent view of
+ the world we have is into the new stack frame. Define the
+ CFA in terms of the not-yet-restored stack pointer. This will
+ last until the end of the function. */
+ mtlr %r0
+ cfi_def_cfa(%r6, 0)
+ cfi_undefined(%r14)
+ cfi_undefined(%r15)
+ cfi_undefined(%r16)
+ cfi_undefined(%r17)
+ cfi_undefined(%r18)
+ cfi_undefined(%r19)
+ cfi_undefined(%r20)
+ cfi_undefined(%r21)
+ cfi_undefined(%r22)
+ cfi_undefined(%r23)
+ cfi_undefined(%r24)
+ cfi_undefined(%r25)
+ cfi_undefined(%r26)
+ cfi_undefined(%r27)
+ cfi_undefined(%r28)
+ cfi_undefined(%r29)
+ cfi_undefined(%r30)
+ cfi_undefined(%r31)
+ ldreg %r14, 0*WS+OFS_GR(%r4)
+ ldreg %r15, 1*WS+OFS_GR(%r4)
+ ldreg %r16, 2*WS+OFS_GR(%r4)
+ ldreg %r17, 3*WS+OFS_GR(%r4)
+ ldreg %r18, 4*WS+OFS_GR(%r4)
+ ldreg %r19, 5*WS+OFS_GR(%r4)
+ ldreg %r20, 6*WS+OFS_GR(%r4)
+ ldreg %r21, 7*WS+OFS_GR(%r4)
+ ldreg %r22, 8*WS+OFS_GR(%r4)
+ ldreg %r23, 9*WS+OFS_GR(%r4)
+ ldreg %r24, 10*WS+OFS_GR(%r4)
+ ldreg %r25, 11*WS+OFS_GR(%r4)
+ ldreg %r26, 12*WS+OFS_GR(%r4)
+ ldreg %r27, 13*WS+OFS_GR(%r4)
+ ldreg %r28, 14*WS+OFS_GR(%r4)
+ ldreg %r29, 15*WS+OFS_GR(%r4)
+ ldreg %r30, 16*WS+OFS_GR(%r4)
+ ldreg %r31, 17*WS+OFS_GR(%r4)
+ mr %r1, %r6
+ blr
+ cfi_endproc
+END GTM_longjmp
+
+#ifdef __linux__
+.section .note.GNU-stack, "", @progbits
+#endif
diff --git a/libitm/config/powerpc/target.h b/libitm/config/powerpc/target.h
new file mode 100644
index 0000000..2d036cd
--- /dev/null
+++ b/libitm/config/powerpc/target.h
@@ -0,0 +1,65 @@
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+ Contributed by Richard Henderson <[email protected]>.
+
+ This file is part of the GNU Transactional Memory Library (libitm).
+
+ Libitm 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 3 of the License, or
+ (at your option) any later version.
+
+ Libitm 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.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+namespace GTM HIDDEN {
+
+typedef int v128 __attribute__((vector_size(16), may_alias, aligned(16)));
+typedef struct gtm_jmpbuf
+{
+#if defined(__ALTIVEC__) || defined(__VSX__)
+ v128 vr[12]; /* vr20-vr31 */
+ unsigned long long vscr; /* long long for padding only */
+#endif
+#ifndef _SOFT_FLOAT
+ double fr[18]; /* f14-f31 */
+ double fpscr;
+#endif
+ unsigned long gr[18]; /* r14-r31 */
+ void *cfa;
+ unsigned long pc;
+ unsigned long r2;
+} gtm_jmpbuf;
+
+/* The size of one line in hardware caches (in bytes). */
+#define HW_CACHELINE_SIZE 64
+
+static inline void
+cpu_relax (void)
+{
+ __asm volatile ("" : : : "memory");
+}
+
+static inline void
+atomic_read_barrier (void)
+{
+ __sync_synchronize ();
+}
+
+static inline void
+atomic_write_barrier (void)
+{
+ __sync_synchronize ();
+}
+
+} // namespace GTM
diff --git a/libitm/configure.tgt b/libitm/configure.tgt
index eac6f50..2549bbe 100644
--- a/libitm/configure.tgt
+++ b/libitm/configure.tgt
@@ -46,7 +46,8 @@ fi
# Map the target cpu to an ARCH sub-directory. At the same time,
# work out any special compilation flags as necessary.
case "${target_cpu}" in
- alpha*) ARCH=alpha ;;
+ alpha*) ARCH=alpha ;;
+ rs6000 | powerpc*) ARCH=powerpc ;;
i[3456]86)
case " ${CC} ${CFLAGS} " in
@@ -90,6 +91,11 @@ case "${target}" in
fi
;;
+ powerpc*-*-darwin* | powerpc*-*-aix* | rs6000-*-aix*)
+ # The system ought to be supported, but sjlj.S has not been ported.
+ UNSUPPORTED=1
+ ;;
+
*-*-gnu* | *-*-k*bsd*-gnu \
| *-*-netbsd* | *-*-freebsd* | *-*-openbsd* \
| *-*-solaris2* | *-*-sysv4* | *-*-irix6* | *-*-osf* | *-*-hpux11* \