packages feed

cao-0.1: src/Language/CAO/Syntax/Codes.hs

{- |
Module      :  $Header$
Description :  Mapping of CAO syntax to operation codes.
Copyright   :  (c) SMART Team / HASLab
License     :  GPL

Maintainer  :  Paulo Silva <paufil@di.uminho.pt>
Stability   :  experimental
Portability :  non-portable

-}

module Language.CAO.Syntax.Codes where

import Language.CAO.Platform.Naming
import Language.CAO.Common.SrcLoc

import Language.CAO.Syntax

instance Codes a => Codes (Located a) where
    codeOf (L _ e) = codeOf e

instance Codes a => Codes (TExpr a) where
    codeOf (TyE _ e) = codeOf e

instance Codes (Expr a) where
    codeOf = opCode

-- Operation names --
opCode :: Expr a -> OpCode
opCode (Lit _)         = code_init
opCode (StructProj _ _)  = code_select
opCode (UnaryOp op _)    = codeOf op
opCode (BinaryOp op _ _) = codeOf op
opCode (Access _ op)   = codeOf op
opCode _ =
    error $ "<CaoToC.h>.<opCode> - Not implemented translation"

instance Codes UOp where
    codeOf = uopCode

uopCode :: UOp -> OpCode
uopCode op = 
    case op of
        Sym    -> code_sym
        Not    -> code_not
        BNot   -> code_not

instance Codes (BinOp id) where
    codeOf = bopCode

bopCode :: BinOp id -> OpCode
bopCode (ArithOp op) = 
    case op of
        Plus   -> code_add
        Minus  -> code_sub
        Times  -> code_mul
        Power  -> code_pow
        Div    -> code_div
        ModOp  -> code_mod
bopCode (BoolOp op)   =  
    case op of
        Or     -> code_or
        And    -> code_and
        Xor    -> code_xor
bopCode (BitOp op)    = 
    case op of
        BWOr   -> code_or
        BWAnd  -> code_and
        BWXor  -> code_xor
bopCode (BitsSROp op) = 
    case op of
        SUp    -> code_shift_up
        SDown  -> code_shift_down
        RUp    -> code_rot_up
        RDown  -> code_rot_down
bopCode (CmpOp _ op)    = 
    case op of
        Eq     -> code_equal
        Neq    -> code_nequal
        Leq    -> code_lte
        Lt     -> code_lt
        Gt     -> code_gt
        Geq    -> code_gte
bopCode Concat        = code_concat

instance Codes (APat id) where
    codeOf = apatCode

apatCode :: APat id -> OpCode
apatCode pat = 
    case pat of
        VectP (CElem _)                 -> code_select
        VectP (CRange _ _)              -> code_range_select
        MatP  (CElem _)    (CElem _)    -> code_select
        MatP  (CRange _ _) (CRange _ _) -> code_range_select
        MatP  (CRange _ _) (CElem _)    -> code_row_range_select
        MatP  (CElem _)    (CRange _ _) -> code_col_range_select