@@ -1,4 +1,3 @@
-
/* Copyright (C) 2011 Free Software Foundation, Inc.
Contributed by Richard Henderson <rth@redhat.com>.
@@ -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 */
new file mode 100644
@@ -0,0 +1,54 @@
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+ Contributed by Richard Henderson <rth@redhat.com>.
+
+ 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;
+}
new file mode 100644
@@ -0,0 +1,38 @@
+/* Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+ Contributed by Richard Henderson <rth@redhat.com>.
+
+ 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
new file mode 100644
@@ -0,0 +1,336 @@
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+ Contributed by Richard Henderson <rth@redhat.com>.
+
+ 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
new file mode 100644
@@ -0,0 +1,65 @@
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+ Contributed by Richard Henderson <rth@redhat.com>.
+
+ 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
@@ -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* \