[GHC] #8287: exploring calling convention changes and related engineering for 7.10
GHC
ghc-devs
Wed Oct 2 19:18:21 UTC 2013
#8287: exploring calling convention changes and related engineering for 7.10
-------------------------------------+------------------------------------
Reporter: carter | Owner:
Type: task | Status: new
Priority: high | Milestone: 7.10.1
Component: Compiler | Version: 7.6.3
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture: Unknown/Multiple
Type of failure: None/Unknown | Difficulty: Rocket Science
Test Case: | Blocked By: 8299
Blocking: | Related Tickets:
-------------------------------------+------------------------------------
Comment (by rwbarton):
I did a port of ghc to "real x32" with the following characteristics:
* produces x32 executables (these are 32-bit ELF files containing x86-64
object code and relocations, that use the x32 versions of system calls)
* in particular, the entire address space of the process lives below 4GB
* executables (and object files loaded by ghci) must be mapped below 2GB
to avoid over/underflow in x86-64 rip-relative addressing, but the heap
can use the full remaining space below 4GB (untested)
* dynamic Haskell libraries are not yet implemented
* Int is 32 bits, as is Addr#
* heap layout is just like on i386: everything on the heap is 4-byte
aligned and pointer tagging uses two bits
* now with integer-gmp, using 64-bit limbs!
* features a fairly small number of bizarre testsuite segfaults and other
errors
Effectively, it is like i386, but faster (**much** faster when doing large
Integer computations due to being able to do 64-bit arithmetic, but still
often faster when not), and with more crashes (but those could presumably
be sorted out) and a more awkward system library situation (there is no
libx32gmp10 package yet on Ubuntu, so I have to set LD_LIBRARY_PATH when
running ghc's x32 executables).
I attached nofib results comparing amd64 vs. x32 and i686 vs. x32; x32 is
about 15% faster on average than either.
I call this "real x32" because the compiler produces actual x32
executables. One could imagine a rather different set of design choices:
* produces x86-64 executables
* no address space limitations
* Int is 64 bits, as is Addr#
* heap layout is just like on x86-64 (in particular, closures are 8-byte
aligned) **except**: all pointers to other closures are stored as 4 bytes
rather than 8 (possibly using "compressed references", e.g., address an 8
GB heap by storing a pointer to a closure at address `p` as `p >> 1`, with
the two lowest bits used for pointer tagging)
This would be less time-efficient than "real x32", but still give much of
the space savings, while allowing a larger heap. Good for computations
that need between 1 and 2 billion pointers' worth of storage, like
compiling modestly complex Agda programs.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8287#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list