{-# LANGUAGE MultiParamTypeClasses #-}
module Language.SpirV.FPFastMathMode where

import Data.Word (Word32)
import Language.SpirV.SpirEnum
import qualified Language.SpirV.Capability as Capability

data FPFastMathMode = None 
                    | NotNaN 
                    | NotInf 
                    | NSZ 
                    | AllowRecip 
                    | Fast
  deriving(Read, Show, Eq, Ord)

instance SpirEnum FPFastMathMode Word32 where
  toWord None = 0
  toWord NotNaN = 1
  toWord NotInf = 2
  toWord NSZ = 4
  toWord AllowRecip = 8
  toWord Fast = 16

  fromWord 0 = Just None
  fromWord 1 = Just NotNaN
  fromWord 2 = Just NotInf
  fromWord 4 = Just NSZ
  fromWord 8 = Just AllowRecip
  fromWord 16 = Just Fast
  fromWord _ = Nothing

  requiredCapabilities NotNaN = [Capability.Kernel]
  requiredCapabilities NotInf = [Capability.Kernel]
  requiredCapabilities NSZ = [Capability.Kernel]
  requiredCapabilities AllowRecip = [Capability.Kernel]
  requiredCapabilities Fast = [Capability.Kernel]
  requiredCapabilities _ = []