This commit is contained in:
2026-05-14 12:02:57 -06:00
parent 11e70f3ae1
commit ff6bddffb3
4 changed files with 58 additions and 19 deletions

View File

@@ -237,22 +237,40 @@ lowerVal (ValLit (LitInt n)) k =
lowerVal (ValLit _) k = error "todo" lowerVal (ValLit _) k = error "todo"
lowerVal (ValVar x) k = k . QBE.ValTemporary . lowerName $ x lowerVal (ValVar x) k = k . QBE.ValTemporary . lowerName $ x
lowerBinaryOp :: QBE.Assignment -> Prim QBE.Val -> QBE.Inst binaryPrim :: Prism' (Prim a) (QBE.BinaryOp, a, a)
lowerBinaryOp r p = QBE.BinaryOp r bop x y binaryPrim = prism' up down where
up (bop,a,b) = case bop of
QBE.Add -> _
QBE.Mul -> _
_ -> _
down = \case
PrimAdd a b -> Just (QBE.Add,a,b)
PrimMul a b -> Just (QBE.Mul,a,b)
_ -> Nothing
lowerArithmetic :: QBE.Assignment -> Prim QBE.Val -> QBE.Inst
lowerArithmetic r p = QBE.BinaryOp r bop x y
where where
(bop,x,y) = case p of (bop,x,y) = case p of
PrimAdd a b -> (QBE.Add,a,b) PrimAdd a b -> (QBE.Add,a,b)
PrimMul a b -> (QBE.Mul,a,b) PrimMul a b -> (QBE.Mul,a,b)
_ -> _ _ -> _
-- lowerPrim lowerCons :: QBE.Val -> QBE.Val -> _
-- :: forall es. (GenSym :> es) lowerCons = _
-- => Prim Val
-- -> (QBE.Val -> Eff es BlockBuilder) lowerPrim
-- -> Eff es BlockBuilder :: forall es. (GenSym :> es)
-- lowerPrim p k = telescope (lowerVal <$> p) \p' -> do => _
-- Emit [ lowerBinaryOp (r QBE.:= QBE.Long) p' ] -> _
-- <$> k (QBE.ValTemporary r) -> _
-> (QBE.Val -> Eff es BlockBuilder)
-> Eff es BlockBuilder
lowerPrim r p e k =
telescope (lowerVal <$> p) \case
(preview binaryPrim -> Just (bop,a,b)) ->
Emit [ QBE.BinaryOp r bop a b ] <$> lower' e k
PrimCons x y -> _
lower' lower'
:: forall es. (GenSym :> es) :: forall es. (GenSym :> es)
@@ -262,13 +280,10 @@ lower'
lower' (ExpVal v) k = lowerVal v k lower' (ExpVal v) k = lowerVal v k
lower' (ExpLetPrim r p e) k = lower' (ExpLetPrim r p e) k = lowerPrim r p e k
telescope (lowerVal <$> p) \p' -> do
Emit [ lowerBinaryOp (lowerName r QBE.:= QBE.Long) p' ]
<$> lower' e k
lower' (ExpLetApply r f xs e) k = lower' (ExpLetApply r f xs e) k =
telescope (lowerVal @es <$> (f:|xs)) \(f':|xs') -> do telescope (lowerVal @es <$> (f:|xs)) \(f':|xs') ->
Emit [ QBE.Call Emit [ QBE.Call
(Just (lowerName r, QBE.AbiBaseTy QBE.Long)) (Just (lowerName r, QBE.AbiBaseTy QBE.Long))
f' f'

View File

@@ -23,6 +23,7 @@ data Prim e
| PrimSub e e | PrimSub e e
| PrimMul e e | PrimMul e e
| PrimDiv e e | PrimDiv e e
| PrimCons e e
deriving (Show, Generic, Functor, Foldable, Traversable) deriving (Show, Generic, Functor, Foldable, Traversable)
instance Each (Prim e) (Prim e') e e' instance Each (Prim e) (Prim e') e e'
@@ -47,10 +48,11 @@ data Exp
instance SexpIso a => SexpIso (Prim a) where instance SexpIso a => SexpIso (Prim a) where
sexpIso = match sexpIso = match
$ With (. binop "prim-+") $ With (. binop "prim:+")
$ With (. binop "prim--") $ With (. binop "prim:-")
$ With (. binop "prim-*") $ With (. binop "prim:*")
$ With (. binop "prim-/") $ With (. binop "prim:/")
$ With (. binop "prim:cons")
$ End $ End
where where
binop s = list $ el (sym s) >>> el sexpIso >>> el sexpIso binop s = list $ el (sym s) >>> el sexpIso >>> el sexpIso

18
bdwgc.nix Normal file
View File

@@ -0,0 +1,18 @@
{ cmake
, stdenv
, fetchFromGitHub
}:
stdenv.mkDerivation (finalAttrs: {
pname = "bdwgc";
version = "8.2.12";
src = fetchFromGitHub {
owner = "bdwgc";
repo = "bdwgc";
tag = "v${finalAttrs.version}";
hash = "sha256-5yeAB5Y92YjOutwRXBJkMxoOLkmzmqIJs4PirKX89fE=";
};
nativeBuildInputs = [
cmake
];
})

View File

@@ -14,6 +14,9 @@
overlays = [ overlays = [
haskellNix.overlay haskellNix.overlay
(final: prev: {
bdwgc = final.callPackage ./bdwgc.nix {};
})
(final: prev: { (final: prev: {
# haskellPackages = prev.haskellPackages.override { # haskellPackages = prev.haskellPackages.override {
# qbe = final.haskell-nix.project' { # qbe = final.haskell-nix.project' {
@@ -72,6 +75,7 @@
hf.packages.${system} // { hf.packages.${system} // {
default = hf.packages.${system}."gyehoek:exe:gyehoek"; default = hf.packages.${system}."gyehoek:exe:gyehoek";
runtime = pkgs.callPackage ./runtime {}; runtime = pkgs.callPackage ./runtime {};
inherit (pkgs) bdwgc;
}); });
devShells = each-system devShells = each-system