summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2017-05-26 18:25:48 -0400
committerBen Gamari <ben@smart-cactus.org>2019-06-26 23:22:45 -0400
commitf509f72b909b6c2c2f50518664c474d880fd36ff (patch)
tree01956d112e71d0b68475643568eb0ac136ad1a27
parent1c4f18d071dcd76d068ae06d43d7c5048b57d980 (diff)
downloadhaskell-f509f72b909b6c2c2f50518664c474d880fd36ff.tar.gz
YMM support?
-rw-r--r--compiler/cmm/CmmCallConv.hs7
-rw-r--r--includes/rts/Constants.h1
-rw-r--r--includes/stg/MachRegs.h18
-rw-r--r--utils/deriveConstants/Main.hs2
4 files changed, 28 insertions, 0 deletions
diff --git a/compiler/cmm/CmmCallConv.hs b/compiler/cmm/CmmCallConv.hs
index 4e6a9d293a..f0051f48d1 100644
--- a/compiler/cmm/CmmCallConv.hs
+++ b/compiler/cmm/CmmCallConv.hs
@@ -162,16 +162,19 @@ getRegsWithNode dflags =
allFloatRegs, allDoubleRegs, allLongRegs :: DynFlags -> [GlobalReg]
allVanillaRegs :: DynFlags -> [VGcPtr -> GlobalReg]
allXmmRegs :: DynFlags -> [Int]
+allYmmRegs :: DynFlags -> [Int]
allVanillaRegs dflags = map VanillaReg $ regList (mAX_Vanilla_REG dflags)
allFloatRegs dflags = map FloatReg $ regList (mAX_Float_REG dflags)
allDoubleRegs dflags = map DoubleReg $ regList (mAX_Double_REG dflags)
allLongRegs dflags = map LongReg $ regList (mAX_Long_REG dflags)
allXmmRegs dflags = regList (mAX_XMM_REG dflags)
+allYmmRegs dflags = regList (mAX_YMM_REG dflags)
realFloatRegs, realDoubleRegs, realLongRegs :: DynFlags -> [GlobalReg]
realVanillaRegs :: DynFlags -> [VGcPtr -> GlobalReg]
realXmmRegNos :: DynFlags -> [Int]
+realYmmRegNos :: DynFlags -> [Int]
realVanillaRegs dflags = map VanillaReg $ regList (mAX_Real_Vanilla_REG dflags)
realFloatRegs dflags = map FloatReg $ regList (mAX_Real_Float_REG dflags)
@@ -182,6 +185,10 @@ realXmmRegNos dflags
| isSse2Enabled dflags = regList (mAX_Real_XMM_REG dflags)
| otherwise = []
+realYmmRegNos dflags
+ | isAvxEnabled dflags = regList (mAX_Real_YMM_REG dflags)
+ | otherwise = []
+
regList :: Int -> [Int]
regList n = [1 .. n]
diff --git a/includes/rts/Constants.h b/includes/rts/Constants.h
index 9364bccae2..33cf5e2d87 100644
--- a/includes/rts/Constants.h
+++ b/includes/rts/Constants.h
@@ -84,6 +84,7 @@
#define MAX_DOUBLE_REG 6
#define MAX_LONG_REG 1
#define MAX_XMM_REG 6
+#define MAX_YMM_REG 6
/* -----------------------------------------------------------------------------
Semi-Tagging constants
diff --git a/includes/stg/MachRegs.h b/includes/stg/MachRegs.h
index 0afc88152e..60308d971f 100644
--- a/includes/stg/MachRegs.h
+++ b/includes/stg/MachRegs.h
@@ -692,6 +692,24 @@ the stack. See Note [Overlapping global registers] for implications.
# endif
#endif
+#if !defined(MAX_REAL_YMM_REG)
+# if defined(REG_YMM6)
+# define MAX_REAL_YMM_REG 6
+# elif defined(REG_YMM5)
+# define MAX_REAL_YMM_REG 5
+# elif defined(REG_YMM4)
+# define MAX_REAL_YMM_REG 4
+# elif defined(REG_YMM3)
+# define MAX_REAL_YMM_REG 3
+# elif defined(REG_YMM2)
+# define MAX_REAL_YMM_REG 2
+# elif defined(REG_YMM1)
+# define MAX_REAL_YMM_REG 1
+# else
+# define MAX_REAL_YMM_REG 0
+# endif
+#endif
+
/* define NO_ARG_REGS if we have no argument registers at all (we can
* optimise certain code paths using this predicate).
*/
diff --git a/utils/deriveConstants/Main.hs b/utils/deriveConstants/Main.hs
index a812ac42c8..397dbcd685 100644
--- a/utils/deriveConstants/Main.hs
+++ b/utils/deriveConstants/Main.hs
@@ -639,10 +639,12 @@ wanteds os = concat
,constantWord Haskell "MAX_Double_REG" "MAX_DOUBLE_REG"
,constantWord Haskell "MAX_Long_REG" "MAX_LONG_REG"
,constantWord Haskell "MAX_XMM_REG" "MAX_XMM_REG"
+ ,constantWord Haskell "MAX_YMM_REG" "MAX_YMM_REG"
,constantWord Haskell "MAX_Real_Vanilla_REG" "MAX_REAL_VANILLA_REG"
,constantWord Haskell "MAX_Real_Float_REG" "MAX_REAL_FLOAT_REG"
,constantWord Haskell "MAX_Real_Double_REG" "MAX_REAL_DOUBLE_REG"
,constantWord Haskell "MAX_Real_XMM_REG" "MAX_REAL_XMM_REG"
+ ,constantWord Haskell "MAX_Real_YMM_REG" "MAX_REAL_YMM_REG"
,constantWord Haskell "MAX_Real_Long_REG" "MAX_REAL_LONG_REG"
-- This tells the native code generator the size of the spill