[GHC] #15486: primops.txt.pp still has support for WORD_SIZE_IN_BITS < 32
GHC
ghc-devs at haskell.org
Tue Aug 7 06:01:54 UTC 2018
#15486: primops.txt.pp still has support for WORD_SIZE_IN_BITS < 32
-------------------------------------+-------------------------------------
Reporter: ChaiTRex | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone: 8.6.1
Component: Compiler | Version: 8.4.3
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
Was support for `WORD_SIZE_IN_BITS < 32` dropped? According to
[https://github.com/ghc/ghc/commit/b38f08350d5c0efaa613f2f6c67dad5366aac271
this GHC commit], it appears that that support was dropped about seven
years ago. Also, `find -type f | xargs -n 5 egrep
'WORD_SIZE_IN_BITS\s*<\s*32'` only finds mention of it in
`primops.txt.pp`.
If support for that was dropped,
[https://github.com/ghc/ghc/blob/9897f6783a58265d5eaef5fb06f04320c7737e87/compiler/prelude/primops.txt.pp
the current version of compiler/prelude/primops.txt.pp] has dead code and
misleading documentation (that's apparently propagated to
[https://hackage.haskell.org/package/ghc-prim-0.5.2.0/docs/GHC-Prim.html
GHC.Prim documentation]) that might cause programmers to expend
unnecessary effort supporting `WORD_SIZE_IN_BITS < 32` in their own code.
The following documentation describes a situation that can no longer
happen and continues on incorrectly past these two paragraphs:
>Haskell98 specifies that signed integers (type `Int` must contain at
least 30 bits. GHC always implements `Int` using the primitive type
`Int#`, whose size equals the `MachDeps.h` constant `WORD_SIZE_IN_BITS`.
>
>This is normally set based on the `config.h` parameter `SIZEOF_HSWORD`,
i.e., 32 bits on 32-bit machines, 64 bits on 64-bit machines. However, it
can also be explicitly set to a smaller number, e.g., 31 bits, to allow
the possibility of using tag bits. Currently GHC itself has only 32-bit
and 64-bit variants, '''but 30 or 31-bit code can be exported as an
external core file for use in other back ends'''.
The following is dead code. Further, `INT32` and `WORD32` throughout the
document should be replaced with `Int#` and `Word#`:
{{{#!c
#if WORD_SIZE_IN_BITS < 32
#define INT32 Int32#
#define WORD32 Word32#
#else
#define INT32 Int#
#define WORD32 Word#
#endif
}}}
Also, all code inclusively between `#if WORD_SIZE_IN_BITS < 32` lines and
their matching `#endif`s can be eliminated.
----
On the other hand, if `WORD_SIZE_IN_BITS < 32` '''is''' still supported,
there are a lot of cases wherein a 64-bit version of an instruction uses
`INT64` or `WORD64` in its type signature, but the 32-bit version uses
`Int#` or `Word#`, which robs programmers of the ability to use speedy
hardware instructions on full untagged `Int32#`s or `Word32#`s. Also, the
`Double#` decoder to two `Word#`s for the mantissa assumes that the
`Word#`s can hold a full 32 bits according to its documentation. There are
some other problems that I've forgotten as well.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15486>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list