libriscv-0.1.0.0: lib/LibRISCV/Semantics/RV32_I/Default.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE QualifiedDo #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module LibRISCV.Semantics.RV32_I.Default where
import Control.Monad.Freer
import LibRISCV.Effects.Decoding.Language (Decoding, decodeShamt)
import LibRISCV.Effects.Expressions.Expr
import LibRISCV.Effects.Expressions.Language (ExprEval)
import LibRISCV.Effects.Logging.Language (LogInstructionFetch)
import LibRISCV.Effects.Operations.Language (Operations (..))
import LibRISCV.Internal.Decoder.Opcodes (RV32_I (..))
import LibRISCV.Semantics.Utils
instrSemantics :: forall v r. (Member (Operations v) r, Member LogInstructionFetch r, Member (Decoding v) r, Member (ExprEval v) r) => RV32_I -> Eff r ()
instrSemantics = \case
SLLI -> do
(r1, rd, _) <- decodeAndReadIType @v
shamt <- decodeShamt
writeRegister rd $ r1 `lshlImm` shamt
SRLI -> do
(r1, rd, _) <- decodeAndReadIType @v
shamt <- decodeShamt
writeRegister rd $ r1 `lshrImm` shamt
SRAI -> do
(r1, rd, _) <- decodeAndReadIType @v
shamt <- decodeShamt
writeRegister rd $ r1 `ashrImm` shamt