[PATCH] add better support for Raspberry Pi board
karel.gardas at centrum.cz
Fri Jan 25 22:23:35 CET 2013
BTW: I've forgot to mention: hard versus soft float abis are well
detected by configure itself. So this is not the problem in my patch.
The only issue is in testing/guessing for FPU/NEON. Good way may be to
grep /proc/cpuinfo but this is only applicable while doing native
compile on ARM-Linux platform. Is that what majority of GHC users will
do? I don't think so as I think the way for majority will be
cross-compilation but perhaps we can at least try it for those doing
native compiles? What do you think about it?
On 01/25/13 09:59 PM, Karel Gardas wrote:
> On 01/25/13 09:38 PM, Simon Marlow wrote:
>> This would improve things for RPi, but we shouldn't be guessing here.
>> gcc has predefines for the appropriate features:
>> #define __ARM_PCS_VFP 1
>> indicates hard-float ABI, and
>> #define __VFP_FP__ 1
>> indicates VFP presences (2 or 3? I don't know)
> The problem is that IIRC those defines are presented when you use
> appropriate GCC's command-line option. It does not tell anything about
> the target hardware itself. So that's why I'm just guessing in the
> patch. But honestly speaking do you think there is any other GHC user
> who would use GHC on ARMv6 and the hardware will be different than RPi?
> I think a chance for this is very low since otherwise everybody is using
> ARMv7 these days...
> Anyway, if you don't like guessing, what about to add few configure
> options which will drive the generation of ARM related bits into
> settings file and keeping some good defaults like we use now? i.e.
> ARMv7+VFPv3+NEON or ARMv6+VFPv2 or ARMv5 alone?
>> On 25/01/13 15:56, Karel Gardas wrote:
>>> This patch adds support for Raspberry Pi board. The board is based
>>> on Broadcom BCM2835, which includes ARM1176JZF-S CPU core. The core
>>> is classical ARM11 so implementing ARMv6 ISA, but also provides VFPv2
>>> unit. As this looks like fairly popular hardware, in this patch we
>>> detected ARMv6 hardware to support VFPv2. Also as Raspberry Pi is very
>>> used with hard-float ABI Linux distribution, the patch relaxes a
>>> of "hard-float support for ARMv7 only" to any general ARM core.
>>> aclocal.m4 | 2 +-
>>> compiler/main/DriverPipeline.hs | 9 ++++++---
>>> 2 files changed, 7 insertions(+), 4 deletions(-)
>>> diff --git a/aclocal.m4 b/aclocal.m4
>>> index edbe389..b23568f 100644
>>> --- a/aclocal.m4
>>> +++ b/aclocal.m4
>>> @@ -369,7 +369,7 @@ AC_DEFUN([GET_ARM_ISA],
>>> [AC_DEFINE(arm_HOST_ARCH_PRE_ARMv7, 1, [ARM pre v7])
>>> changequote(, )dnl
>>> - ARM_ISA_EXT=""
>>> + ARM_ISA_EXT="[VFPv2]"
>>> changequote([, ])dnl
>>> [changequote(, )dnl
>>> diff --git a/compiler/main/DriverPipeline.hs
>>> index c24bb51..81d0bc0 100644
>>> --- a/compiler/main/DriverPipeline.hs
>>> +++ b/compiler/main/DriverPipeline.hs
>>> @@ -1454,14 +1454,17 @@ runPhase LlvmLlc input_fn dflags
>>> else if (elem VFPv3D16 ext)
>>> then ["-mattr=+v7,+vfp3,+d16"]
>>> else 
>>> + ArchARM ARMv6 ext _ -> if (elem VFPv2 ext)
>>> + then ["-mattr=+v6,+vfp2"]
>>> + else ["-mattr=+v6"]
>>> _ -> 
>>> -- On Ubuntu/Debian with ARM hard float ABI, LLVM's llc still
>>> -- compiles into soft-float ABI. We need to explicitly set abi
>>> -- to hard
>>> abiOpts = case platformArch (targetPlatform dflags) of
>>> - ArchARM ARMv7 _ HARD -> ["-float-abi=hard"]
>>> - ArchARM ARMv7 _ _ -> 
>>> - _ -> 
>>> + ArchARM _ _ HARD -> ["-float-abi=hard"]
>>> + ArchARM _ _ _ -> 
>>> + _ -> 
>>> sseOpts | isSse4_2Enabled dflags = ["-mattr=+sse42"]
>>> | isSse2Enabled dflags = ["-mattr=+sse2"]
> ghc-devs mailing list
> ghc-devs at haskell.org
More information about the ghc-devs