Add support for -mavx512* flags.
authorGeoffrey Mainland <gmainlan@microsoft.com>
Sun, 15 Sep 2013 20:24:04 +0000 (16:24 -0400)
committerGeoffrey Mainland <gmainlan@microsoft.com>
Mon, 23 Sep 2013 02:34:00 +0000 (22:34 -0400)
compiler/main/DriverPipeline.hs
compiler/main/DynFlags.hs

index 76f6186..63f203a 100644 (file)
@@ -1382,6 +1382,7 @@ runPhase (RealPhase LlvmLlc) input_fn dflags
                 ++ map SysTools.Option abiOpts
                 ++ map SysTools.Option sseOpts
                 ++ map SysTools.Option avxOpts
+                ++ map SysTools.Option avx512Opts
                 ++ map SysTools.Option stackAlignOpts)
 
     return (RealPhase next_phase, output_fn)
@@ -1415,9 +1416,15 @@ runPhase (RealPhase LlvmLlc) input_fn dflags
                 | isSse2Enabled dflags   = ["-mattr=+sse2"]
                 | otherwise              = []
 
-        avxOpts | isAvx2Enabled dflags   = ["-mattr=+avx2"]
-                | isAvxEnabled dflags    = ["-mattr=+avx"]
-                | otherwise              = []
+        avxOpts | isAvx512fEnabled dflags = ["-mattr=+avx512f"]
+                | isAvx2Enabled dflags    = ["-mattr=+avx2"]
+                | isAvxEnabled dflags     = ["-mattr=+avx"]
+                | otherwise               = []
+
+        avx512Opts =
+          [ "-mattr=+avx512cd" | isAvx512cdEnabled dflags ] ++
+          [ "-mattr=+avx512er" | isAvx512erEnabled dflags ] ++
+          [ "-mattr=+avx512pf" | isAvx512pfEnabled dflags ]
 
         stackAlignOpts =
             case platformArch (targetPlatform dflags) of
@@ -2035,7 +2042,11 @@ doCpp dflags raw input_fn output_fn = do
 
     let avx_defs =
           [ "-D__AVX__=1"  | isAvxEnabled  dflags ] ++
-          [ "-D__AVX2__=1" | isAvx2Enabled dflags ]
+          [ "-D__AVX2__=1" | isAvx2Enabled dflags ] ++
+          [ "-D__AVX512CD__=1" | isAvx512cdEnabled dflags ] ++
+          [ "-D__AVX512ER__=1" | isAvx512erEnabled dflags ] ++
+          [ "-D__AVX512F__=1"  | isAvx512fEnabled  dflags ] ++
+          [ "-D__AVX512PF__=1" | isAvx512pfEnabled dflags ]
 
     backend_defs <- getBackendDefs dflags
 
index cf6db24..74241ba 100644 (file)
@@ -133,6 +133,10 @@ module DynFlags (
         isSse4_2Enabled,
         isAvxEnabled,
         isAvx2Enabled,
+        isAvx512cdEnabled,
+        isAvx512erEnabled,
+        isAvx512fEnabled,
+        isAvx512pfEnabled,
 
         -- * Linker information
         LinkerInfo(..),
@@ -774,6 +778,10 @@ data DynFlags = DynFlags {
   sseVersion            :: Maybe (Int, Int),  -- (major, minor)
   avx                   :: Bool,
   avx2                  :: Bool,
+  avx512cd              :: Bool, -- Enable AVX-512 Conflict Detection Instructions.
+  avx512er              :: Bool, -- Enable AVX-512 Exponential and Reciprocal Instructions.
+  avx512f               :: Bool, -- Enable AVX-512 instructions.
+  avx512pf              :: Bool, -- Enable AVX-512 PreFetch Instructions.
 
   -- | Run-time linker information (what options we need, etc.)
   rtldFlags             :: IORef (Maybe LinkerInfo)
@@ -1407,6 +1415,10 @@ defaultDynFlags mySettings =
         sseVersion = Nothing,
         avx = False,
         avx2 = False,
+        avx512cd = False,
+        avx512er = False,
+        avx512f = False,
+        avx512pf = False,
         rtldFlags = panic "defaultDynFlags: no rtldFlags"
       }
 
@@ -2313,6 +2325,10 @@ dynamic_flags = [
   , Flag "msse"         (versionSuffix (\maj min d -> d{ sseVersion = Just (maj, min) }))
   , Flag "mavx"         (noArg (\d -> d{ avx = True }))
   , Flag "mavx2"        (noArg (\d -> d{ avx2 = True }))
+  , Flag "mavx512cd"    (noArg (\d -> d{ avx512cd = True }))
+  , Flag "mavx512er"    (noArg (\d -> d{ avx512er = True }))
+  , Flag "mavx512f"     (noArg (\d -> d{ avx512f = True }))
+  , Flag "mavx512pf"    (noArg (\d -> d{ avx512pf = True }))
 
      ------ Warning opts -------------------------------------------------
   , Flag "W"      (NoArg (mapM_ setWarningFlag minusWOpts))
@@ -3614,10 +3630,22 @@ isSse4_2Enabled :: DynFlags -> Bool
 isSse4_2Enabled dflags = sseVersion dflags >= Just (4,2)
 
 isAvxEnabled :: DynFlags -> Bool
-isAvxEnabled dflags = avx dflags || avx2 dflags
+isAvxEnabled dflags = avx dflags || avx2 dflags || avx512f dflags
 
 isAvx2Enabled :: DynFlags -> Bool
-isAvx2Enabled dflags = avx2 dflags
+isAvx2Enabled dflags = avx2 dflags || avx512f dflags
+
+isAvx512cdEnabled :: DynFlags -> Bool
+isAvx512cdEnabled dflags = avx512cd dflags
+
+isAvx512erEnabled :: DynFlags -> Bool
+isAvx512erEnabled dflags = avx512er dflags
+
+isAvx512fEnabled :: DynFlags -> Bool
+isAvx512fEnabled dflags = avx512f dflags
+
+isAvx512pfEnabled :: DynFlags -> Bool
+isAvx512pfEnabled dflags = avx512pf dflags
 
 -- -----------------------------------------------------------------------------
 -- Linker information