{-# LANGUAGE CPP #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UnboxedTuples #-}
module Clash.GHC.Evaluator.Primitives.GHC.PrimopWrappers
( primitives
) where
import Data.Text (Text)
import Clash.Core.Evaluator.Types
#if MIN_VERSION_ghc_prim(0,12,0)
import Clash.Core.DataCon (DataCon (..))
import Clash.Core.Literal (Literal (..))
import Clash.Core.Term (Term (..))
import Clash.Util (textNameLit)
import qualified GHC.PrimopWrappers
import Clash.GHC.Evaluator.Primitive.Util
#endif
primitives :: [(Text, PrimStep)]
#if MIN_VERSION_ghc_prim(0,12,0)
primitives =
[ primStepEntry $(textNameLit 'GHC.PrimopWrappers.dataToTagSmall#) $ \case
PrimStepContext{..}
| [DC dc _] <- args
-> reduce (Literal (IntLiteral (toInteger (dcTag dc - 1))))
_ -> Nothing
, primStepEntry $(textNameLit 'GHC.PrimopWrappers.dataToTagLarge#) $ \case
PrimStepContext{..}
| [DC dc _] <- args
-> reduce (Literal (IntLiteral (toInteger (dcTag dc - 1))))
_ -> Nothing
]
#else
primitives :: [(Text, PrimStep)]
primitives = []
#endif