summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorAdam Gundry <adam@well-typed.com>2015-10-16 13:58:52 +0100
committerAdam Gundry <adam@well-typed.com>2015-10-16 13:58:52 +0100
commit5a1b4f814f74ec1c48152d97523744518e212777 (patch)
tree7c2207ecacbd37f12c78dbcf9d4334827164e0fb /includes
parent6757950cdd8bb0af0355539987ee78401a6a8f6b (diff)
parent808bbdf08058785ae5bc59b5b4f2b04951d4cbbf (diff)
downloadhaskell-wip/orf-reboot.tar.gz
Merge remote-tracking branch 'origin/master' into wip/orf-rebootwip/orf-reboot
Conflicts: compiler/rename/RnNames.hs compiler/typecheck/TcRnMonad.hs utils/haddock
Diffstat (limited to 'includes')
-rw-r--r--includes/CodeGen.Platform.hs18
-rw-r--r--includes/stg/Prim.h72
2 files changed, 49 insertions, 41 deletions
diff --git a/includes/CodeGen.Platform.hs b/includes/CodeGen.Platform.hs
index b93f0074fd..b41ad54349 100644
--- a/includes/CodeGen.Platform.hs
+++ b/includes/CodeGen.Platform.hs
@@ -874,17 +874,25 @@ freeRegBase _ = True
#elif MACHREGS_powerpc
-freeReg 0 = False -- Hack: r0 can't be used in all insns,
- -- but it's actually free
+freeReg 0 = False -- Used by code setting the back chain pointer
+ -- in stack reallocations on Linux
+ -- r0 is not usable in all insns so also reserved
+ -- on Darwin.
freeReg 1 = False -- The Stack Pointer
# if !MACHREGS_darwin
-- most non-darwin powerpc OSes use r2 as a TOC pointer or something like that
freeReg 2 = False
--- TODO: make this conditonal for ppc64 ELF
-freeReg 13 = False -- reserved for system thread ID
--- TODO: do not reserve r30 in ppc64 ELF
+freeReg 13 = False -- reserved for system thread ID on 64 bit
-- at least linux in -fPIC relies on r30 in PLT stubs
freeReg 30 = False
+{- TODO: reserve r13 on 64 bit systems only and r30 on 32 bit respectively.
+ For now we use r30 on 64 bit and r13 on 32 bit as a temporary register
+ in stack handling code. See compiler/nativeGen/PPC/Ppr.hs.
+
+ Later we might want to reserve r13 and r30 only where it is required.
+ Then use r12 as temporary register, which is also what the C ABI does.
+-}
+
# endif
# ifdef REG_Base
freeReg REG_Base = False
diff --git a/includes/stg/Prim.h b/includes/stg/Prim.h
index b07e177542..9872512701 100644
--- a/includes/stg/Prim.h
+++ b/includes/stg/Prim.h
@@ -15,42 +15,42 @@
#define PRIM_H
/* libraries/ghc-prim/cbits/atomic.c */
-StgWord hs_atomic_add8(volatile StgWord8 *x, StgWord val);
-StgWord hs_atomic_add16(volatile StgWord16 *x, StgWord val);
-StgWord hs_atomic_add32(volatile StgWord32 *x, StgWord val);
-StgWord64 hs_atomic_add64(volatile StgWord64 *x, StgWord64 val);
-StgWord hs_atomic_sub8(volatile StgWord8 *x, StgWord val);
-StgWord hs_atomic_sub16(volatile StgWord16 *x, StgWord val);
-StgWord hs_atomic_sub32(volatile StgWord32 *x, StgWord val);
-StgWord64 hs_atomic_sub64(volatile StgWord64 *x, StgWord64 val);
-StgWord hs_atomic_and8(volatile StgWord8 *x, StgWord val);
-StgWord hs_atomic_and16(volatile StgWord16 *x, StgWord val);
-StgWord hs_atomic_and32(volatile StgWord32 *x, StgWord val);
-StgWord64 hs_atomic_and64(volatile StgWord64 *x, StgWord64 val);
-StgWord hs_atomic_nand8(volatile StgWord8 *x, StgWord val);
-StgWord hs_atomic_nand16(volatile StgWord16 *x, StgWord val);
-StgWord hs_atomic_nand32(volatile StgWord32 *x, StgWord val);
-StgWord64 hs_atomic_nand64(volatile StgWord64 *x, StgWord64 val);
-StgWord hs_atomic_or8(volatile StgWord8 *x, StgWord val);
-StgWord hs_atomic_or16(volatile StgWord16 *x, StgWord val);
-StgWord hs_atomic_or32(volatile StgWord32 *x, StgWord val);
-StgWord64 hs_atomic_or64(volatile StgWord64 *x, StgWord64 val);
-StgWord hs_atomic_xor8(volatile StgWord8 *x, StgWord val);
-StgWord hs_atomic_xor16(volatile StgWord16 *x, StgWord val);
-StgWord hs_atomic_xor32(volatile StgWord32 *x, StgWord val);
-StgWord64 hs_atomic_xor64(volatile StgWord64 *x, StgWord64 val);
-StgWord hs_cmpxchg8(volatile StgWord8 *x, StgWord old, StgWord new_);
-StgWord hs_cmpxchg16(volatile StgWord16 *x, StgWord old, StgWord new_);
-StgWord hs_cmpxchg32(volatile StgWord32 *x, StgWord old, StgWord new_);
-StgWord hs_cmpxchg64(volatile StgWord64 *x, StgWord64 old, StgWord64 new_);
-StgWord hs_atomicread8(volatile StgWord8 *x);
-StgWord hs_atomicread16(volatile StgWord16 *x);
-StgWord hs_atomicread32(volatile StgWord32 *x);
-StgWord64 hs_atomicread64(volatile StgWord64 *x);
-void hs_atomicwrite8(volatile StgWord8 *x, StgWord val);
-void hs_atomicwrite16(volatile StgWord16 *x, StgWord val);
-void hs_atomicwrite32(volatile StgWord32 *x, StgWord val);
-void hs_atomicwrite64(volatile StgWord64 *x, StgWord64 val);
+StgWord hs_atomic_add8(StgWord x, StgWord val);
+StgWord hs_atomic_add16(StgWord x, StgWord val);
+StgWord hs_atomic_add32(StgWord x, StgWord val);
+StgWord64 hs_atomic_add64(StgWord x, StgWord64 val);
+StgWord hs_atomic_sub8(StgWord x, StgWord val);
+StgWord hs_atomic_sub16(StgWord x, StgWord val);
+StgWord hs_atomic_sub32(StgWord x, StgWord val);
+StgWord64 hs_atomic_sub64(StgWord x, StgWord64 val);
+StgWord hs_atomic_and8(StgWord x, StgWord val);
+StgWord hs_atomic_and16(StgWord x, StgWord val);
+StgWord hs_atomic_and32(StgWord x, StgWord val);
+StgWord64 hs_atomic_and64(StgWord x, StgWord64 val);
+StgWord hs_atomic_nand8(StgWord x, StgWord val);
+StgWord hs_atomic_nand16(StgWord x, StgWord val);
+StgWord hs_atomic_nand32(StgWord x, StgWord val);
+StgWord64 hs_atomic_nand64(StgWord x, StgWord64 val);
+StgWord hs_atomic_or8(StgWord x, StgWord val);
+StgWord hs_atomic_or16(StgWord x, StgWord val);
+StgWord hs_atomic_or32(StgWord x, StgWord val);
+StgWord64 hs_atomic_or64(StgWord x, StgWord64 val);
+StgWord hs_atomic_xor8(StgWord x, StgWord val);
+StgWord hs_atomic_xor16(StgWord x, StgWord val);
+StgWord hs_atomic_xor32(StgWord x, StgWord val);
+StgWord64 hs_atomic_xor64(StgWord x, StgWord64 val);
+StgWord hs_cmpxchg8(StgWord x, StgWord old, StgWord new_);
+StgWord hs_cmpxchg16(StgWord x, StgWord old, StgWord new_);
+StgWord hs_cmpxchg32(StgWord x, StgWord old, StgWord new_);
+StgWord hs_cmpxchg64(StgWord x, StgWord64 old, StgWord64 new_);
+StgWord hs_atomicread8(StgWord x);
+StgWord hs_atomicread16(StgWord x);
+StgWord hs_atomicread32(StgWord x);
+StgWord64 hs_atomicread64(StgWord x);
+void hs_atomicwrite8(StgWord x, StgWord val);
+void hs_atomicwrite16(StgWord x, StgWord val);
+void hs_atomicwrite32(StgWord x, StgWord val);
+void hs_atomicwrite64(StgWord x, StgWord64 val);
/* libraries/ghc-prim/cbits/bswap.c */
StgWord16 hs_bswap16(StgWord16 x);