packages feed

llvm-general-0.1: src/LLVM/General/Internal/CallingConvention.hs

{-# LANGUAGE
  MultiParamTypeClasses,
  TemplateHaskell,
  QuasiQuotes,
  FlexibleInstances
  #-}
module LLVM.General.Internal.CallingConvention where

import LLVM.General.Internal.Coding

import qualified LLVM.General.Internal.FFI.LLVMCTypes as FFI

import qualified LLVM.General.AST.CallingConvention as A.CC

instance Monad m => EncodeM m A.CC.CallingConvention FFI.CallConv where
  encodeM cc = return $ 
        case cc of
          A.CC.C -> FFI.callConvC
          A.CC.Fast -> FFI.callConvFast
          A.CC.Cold -> FFI.callConvCold
          A.CC.GHC ->  FFI.CallConv 10
          A.CC.Numbered cc' -> FFI.CallConv (fromIntegral cc')

instance Monad m => DecodeM m A.CC.CallingConvention FFI.CallConv where
  decodeM cc = return $ case cc of
    [FFI.callConvP|C|] -> A.CC.C
    [FFI.callConvP|Fast|] -> A.CC.Fast
    [FFI.callConvP|Cold|] -> A.CC.Cold
    FFI.CallConv 10 -> A.CC.GHC
    FFI.CallConv ci | ci >= 64 -> A.CC.Numbered (fromIntegral ci)