{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RecordWildCards #-}
module Language.C.Analysis.MachineDescs
  where

import Language.C.Analysis.ConstEval
import Language.C.Analysis.SemRep

x86_64 :: MachineDesc
x86_64 =
  let iSize = \case
        TyBool    -> 1
        TyChar    -> 1
        TySChar   -> 1
        TyUChar   -> 1
        TyShort   -> 2
        TyUShort  -> 2
        TyInt     -> 4
        TyUInt    -> 4
        TyLong    -> 8
        TyULong   -> 8
        TyLLong   -> 8
        TyULLong  -> 8
        TyInt128  -> 16
        TyUInt128 -> 16
      fSize = \case
        TyFloat    -> 4
        TyDouble   -> 8
        TyLDouble  -> 16
        TyFloatN{} -> error "TyFloatN"
      builtinSize = \case
        TyVaList -> 24
        TyAny    -> error "TyAny"
      ptrSize  = 8
      voidSize = 1
      iAlign   = \case
        TyBool    -> 1
        TyChar    -> 1
        TySChar   -> 1
        TyUChar   -> 1
        TyShort   -> 2
        TyUShort  -> 2
        TyInt     -> 4
        TyUInt    -> 4
        TyLong    -> 8
        TyULong   -> 8
        TyLLong   -> 8
        TyULLong  -> 8
        TyInt128  -> 16
        TyUInt128 -> 16
      fAlign = \case
        TyFloat    -> 4
        TyDouble   -> 8
        TyLDouble  -> 16
        TyFloatN{} -> error "TyFloatN"
      builtinAlign = \case
        TyVaList -> 8
        TyAny    -> error "TyAny"
      ptrAlign  = 8
      voidAlign = 1
  in  MachineDesc { .. }

armv7l :: MachineDesc
armv7l =
  let iSize = \case
        TyBool    -> 1
        TyChar    -> 1
        TySChar   -> 1
        TyUChar   -> 1
        TyShort   -> 2
        TyUShort  -> 2
        TyInt     -> 4
        TyUInt    -> 4
        TyLong    -> 4
        TyULong   -> 4
        TyLLong   -> 8
        TyULLong  -> 8
        TyInt128  -> error "TyInt128 on armv7l"
        TyUInt128 -> error "TyUInt128 on armv7l"
      fSize = \case
        TyFloat    -> 4
        TyDouble   -> 8
        TyLDouble  -> 8
        TyFloatN{} -> error "TyFloatN"
      builtinSize = \case
        TyVaList -> 4
        TyAny    -> error "TyAny"
      ptrSize  = 4
      voidSize = 1
      iAlign   = \case
        TyBool    -> 1
        TyChar    -> 1
        TySChar   -> 1
        TyUChar   -> 1
        TyShort   -> 2
        TyUShort  -> 2
        TyInt     -> 4
        TyUInt    -> 4
        TyLong    -> 4
        TyULong   -> 4
        TyLLong   -> 8
        TyULLong  -> 8
        TyInt128  -> error "TyInt128 on armv7l"
        TyUInt128 -> error "TyUInt128 on armv7l"
      fAlign = \case
        TyFloat    -> 4
        TyDouble   -> 8
        TyLDouble  -> 8
        TyFloatN{} -> error "TyFloatN"
      builtinAlign = \case
        TyVaList -> 4
        TyAny    -> error "TyAny"
      ptrAlign  = 4
      voidAlign = 1
  in  MachineDesc { .. }
