packages feed

apple-0.1.0.0: src/Asm/Ar.hs

{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Asm.Ar ( Arch (..) ) where

import qualified Asm.Aarch64    as AArch64
import qualified Asm.Aarch64.B  as AArch64
import qualified Asm.Aarch64.CF as AArch64
import           Asm.BB
import qualified Asm.X86        as X86
import qualified Asm.X86.B      as X86
import qualified Asm.X86.CF     as X86
import           CF
import           Class.E

class Arch arch reg freg where
    cf :: [BB arch reg freg () ()] -> [BB arch reg freg () ControlAnn]

    -- | result: src, dest
    mI :: arch reg freg a -> Maybe (reg, reg)
    mf :: arch reg freg a -> Maybe (freg, freg)

    bb :: [arch reg freg a] -> [BB arch reg freg a ()]
    expand :: BB arch reg freg () Liveness -> [arch reg freg Liveness]
    udd :: arch reg freg a -> UD

instance (E reg, E freg) => Arch X86.X86 reg freg where
    cf = X86.mkControlFlow

    mI (X86.MovRR _ r0 r1) = Just (r1, r0)
    mI _                   = Nothing

    mf (X86.Movapd _ r0 r1) = Just (r1, r0)
    mf _                    = Nothing

    bb = X86.bb
    expand = X86.expand
    udd = X86.udd

instance (E reg, E freg) => Arch AArch64.AArch64 reg freg where
    cf = AArch64.mkControlFlow

    mI (AArch64.MovRR _ r0 r1) = Just (r0, r1)
    mI _                       = Nothing

    mf (AArch64.FMovXX _ r0 r1) = Just (r0, r1)
    mf _                        = Nothing

    bb = AArch64.bb
    expand = AArch64.expand
    udd = AArch64.udd