-- Translate Yhc Core primitives to Erlang BIFs and runtime-provided -- functions. module Yhc.Core.BackEnd.Erlang.TransPrim where import Data.Char import Data.Maybe import qualified Data.Map as M import Yhc.Core.Extra import Yhc.Core.BackEnd.Erlang.TT.Ecore import Yhc.Core.BackEnd.Erlang.TT.Ebif import Yhc.Core.BackEnd.Erlang.CorePrep prim2bifAnno :: CoreFunc -> CoreAnnotations -> Maybe BifSpec prim2bifAnno cf anno = prim2bif cf prim2bif :: CoreFunc -> Maybe BifSpec prim2bif (CorePrim {coreFuncName = "MUL_W"}) = isBif "*" prim2bif (CorePrim {coreFuncName = "ADD_W"}) = isBif "+" prim2bif (CorePrim {coreFuncName = "SUB_W"}) = isBif "-" prim2bif (CorePrim {coreFuncName = "LE_W" }) = isBif "<=" prim2bif (CorePrim {coreFuncName = "LT_W" }) = isBif "<" prim2bif (CorePrim {coreFuncName = "GT_W" }) = isBif ">" prim2bif (CorePrim {coreFuncName = "GE_W" }) = isBif ">=" prim2bif (CorePrim {coreFuncName = "EQ_W" }) = isBif "==" prim2bif (CorePrim {coreFuncName = "NE_W" }) = isBif "=/=" prim2bif (CorePrim {coreFuncName = "NEG_W" }) = Just ("erlang", "-", 1) prim2bif (CorePrim {coreFuncName = "MUL_L"}) = isBif "*" prim2bif (CorePrim {coreFuncName = "ADD_L"}) = isBif "+" prim2bif (CorePrim {coreFuncName = "SUB_L"}) = isBif "-" prim2bif (CorePrim {coreFuncName = "LE_L" }) = isBif "<=" prim2bif (CorePrim {coreFuncName = "LT_L" }) = isBif "<" prim2bif (CorePrim {coreFuncName = "GT_L" }) = isBif ">" prim2bif (CorePrim {coreFuncName = "GE_L" }) = isBif ">=" prim2bif (CorePrim {coreFuncName = "EQ_L" }) = isBif "==" prim2bif (CorePrim {coreFuncName = "NE_L" }) = isBif "=/=" prim2bif (CorePrim {coreFuncName = "NEG_L" }) = Just ("erlang", "-", 1) prim2bif (CorePrim {coreFuncName = "EQ_C" }) = isBif "==" prim2bif (CorePrim {coreFuncName = "THROW_E" }) = Just ("erlang", "throw", 1) -- All primitives not listed above, and belonging to the Normal Set -- are expected to be implemented in Erlang in the module "yc2erl". -- Since original names of primitives are uppercased, they are lowercased -- in the Erlang implementation. That is, CMP_W corresponds to -- yc2erl:cmp_w prim2bif (CorePrim {coreFuncName = pn}) | pn `M.member` normPrimSpecMap = let (_:_:_:arity:_) = fromJust $ M.lookup pn normPrimSpecMap in Just ("yc2erl", map toLower pn, read arity) prim2bif z = error $ "prim2bif: primitive " ++ show z ++ " does not belong to the Normal Set " ++ "nor does it have proper annotation"