summaryrefslogtreecommitdiff
path: root/compiler/utils
diff options
context:
space:
mode:
authorKarel Gardas <karel.gardas@centrum.cz>2011-08-20 23:49:48 +0200
committerKarel Gardas <karel.gardas@centrum.cz>2011-08-21 08:50:57 +0200
commitbab9a72d7f12a88bb38677db03ed4c956d0a7d99 (patch)
treec0a703e2770e7cf062904641f79cda08f6c9ca2d /compiler/utils
parent2906db6c3a3f1000bd7347c7d8e45e65eb2806cb (diff)
downloadhaskell-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.hs43
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 */