diff options
-rw-r--r-- | compiler/cmm/CmmCallConv.hs | 7 | ||||
-rw-r--r-- | includes/rts/Constants.h | 1 | ||||
-rw-r--r-- | includes/stg/MachRegs.h | 18 | ||||
-rw-r--r-- | utils/deriveConstants/Main.hs | 2 |
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 |