diff options
author | Karel Gardas <karel.gardas@centrum.cz> | 2011-08-20 23:49:48 +0200 |
---|---|---|
committer | Karel Gardas <karel.gardas@centrum.cz> | 2011-08-21 08:50:57 +0200 |
commit | bab9a72d7f12a88bb38677db03ed4c956d0a7d99 (patch) | |
tree | c0a703e2770e7cf062904641f79cda08f6c9ca2d /compiler/utils | |
parent | 2906db6c3a3f1000bd7347c7d8e45e65eb2806cb (diff) | |
download | haskell-bab9a72d7f12a88bb38677db03ed4c956d0a7d99.tar.gz |
enhance ArchARM with ISA and ISA extensions
This patch enhances ArchARM with ARM ISA and ISA extensions details
as is suggested in the comment in Platform.hs file. The patch is needed
by future patch which will use ARM ISA information in order to pass
appropriate command-line option to the LLVM llc tool.
Diffstat (limited to 'compiler/utils')
-rw-r--r-- | compiler/utils/Platform.hs | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/compiler/utils/Platform.hs b/compiler/utils/Platform.hs index cff4a626e6..28532aa7f0 100644 --- a/compiler/utils/Platform.hs +++ b/compiler/utils/Platform.hs @@ -7,6 +7,8 @@ module Platform ( Platform(..), Arch(..), OS(..), + ArmISA(..), + ArmISAExt(..), defaultTargetPlatform, target32Bit, @@ -40,6 +42,8 @@ data Arch | ArchPPC_64 | ArchSPARC | ArchARM + { armISA :: ArmISA + , armISAExt :: [ArmISAExt] } deriving (Show, Eq) @@ -55,6 +59,22 @@ data OS | OSOpenBSD deriving (Show, Eq) +-- | ARM Instruction Set Architecture and Extensions +-- +data ArmISA + = ARMv5 + | ARMv6 + | ARMv7 + deriving (Show, Eq) + +data ArmISAExt + = VFPv2 + | VFPv3 + | VFPv3D16 + | NEON + | IWMMX2 + deriving (Show, Eq) + target32Bit :: Platform -> Bool target32Bit p = case platformArch p of @@ -64,7 +84,7 @@ target32Bit p = case platformArch p of ArchPPC -> True ArchPPC_64 -> False ArchSPARC -> True - ArchARM -> True + ArchARM _ _ -> True -- | This predicates tells us whether the OS supports ELF-like shared libraries. @@ -98,7 +118,7 @@ defaultTargetArch = ArchPPC_64 #elif sparc_TARGET_ARCH defaultTargetArch = ArchSPARC #elif arm_TARGET_ARCH -defaultTargetArch = ArchARM +defaultTargetArch = ArchARM defaultTargetArmISA defaultTargetArmISAExt #else defaultTargetArch = ArchUnknown #endif @@ -124,3 +144,22 @@ defaultTargetOS = OSOpenBSD defaultTargetOS = OSUnknown #endif +#if arm_TARGET_ARCH +defaultTargetArmISA :: ArmISA +#if defined(arm_HOST_ARCH_PRE_ARMv6) +defaultTargetArmISA = ARMv5 +#elif defined(arm_HOST_ARCH_PRE_ARMv7) +defaultTargetArmISA = ARMv6 +#else +defaultTargetArmISA = ARMv7 +#endif + +defaultTargetArmISAExt :: [ArmISAExt] +#if defined(arm_TARGET_ARCH) && !defined(arm_HOST_ARCH_PRE_ARMv7) +/* wild guess really, in case of ARMv7 we assume both VFPv3 and NEON presented + however this is not true for SoCs like NVidia Tegra2 and Marvell Dove */ +defaultTargetArmISAExt = [VFPv3, NEON] +#else +defaultTargetArmISAExt = [] +#endif +#endif /* arm_TARGET_ARCH */ |