From ff6bddffb362f4b987a2cbf53f42c27db45ceab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Thu, 14 May 2026 12:02:57 -0600 Subject: [PATCH] small --- app/Gyehoek/ANF.hs | 45 ++++++++++++++++++++++++++++--------------- app/Gyehoek/Syntax.hs | 10 ++++++---- bdwgc.nix | 18 +++++++++++++++++ flake.nix | 4 ++++ 4 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 bdwgc.nix diff --git a/app/Gyehoek/ANF.hs b/app/Gyehoek/ANF.hs index 0bae57c..e83a159 100644 --- a/app/Gyehoek/ANF.hs +++ b/app/Gyehoek/ANF.hs @@ -237,22 +237,40 @@ lowerVal (ValLit (LitInt n)) k = lowerVal (ValLit _) k = error "todo" lowerVal (ValVar x) k = k . QBE.ValTemporary . lowerName $ x -lowerBinaryOp :: QBE.Assignment -> Prim QBE.Val -> QBE.Inst -lowerBinaryOp r p = QBE.BinaryOp r bop x y +binaryPrim :: Prism' (Prim a) (QBE.BinaryOp, a, a) +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 (bop,x,y) = case p of PrimAdd a b -> (QBE.Add,a,b) PrimMul a b -> (QBE.Mul,a,b) _ -> _ --- lowerPrim --- :: forall es. (GenSym :> es) --- => Prim Val --- -> (QBE.Val -> Eff es BlockBuilder) --- -> Eff es BlockBuilder --- lowerPrim p k = telescope (lowerVal <$> p) \p' -> do --- Emit [ lowerBinaryOp (r QBE.:= QBE.Long) p' ] --- <$> k (QBE.ValTemporary r) +lowerCons :: QBE.Val -> QBE.Val -> _ +lowerCons = _ + +lowerPrim + :: forall es. (GenSym :> es) + => _ + -> _ + -> _ + -> (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' :: forall es. (GenSym :> es) @@ -262,13 +280,10 @@ lower' lower' (ExpVal v) k = lowerVal v k -lower' (ExpLetPrim r p e) k = - telescope (lowerVal <$> p) \p' -> do - Emit [ lowerBinaryOp (lowerName r QBE.:= QBE.Long) p' ] - <$> lower' e k +lower' (ExpLetPrim r p e) k = lowerPrim r p 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 (Just (lowerName r, QBE.AbiBaseTy QBE.Long)) f' diff --git a/app/Gyehoek/Syntax.hs b/app/Gyehoek/Syntax.hs index 1539eae..5e012cd 100644 --- a/app/Gyehoek/Syntax.hs +++ b/app/Gyehoek/Syntax.hs @@ -23,6 +23,7 @@ data Prim e | PrimSub e e | PrimMul e e | PrimDiv e e + | PrimCons e e deriving (Show, Generic, Functor, Foldable, Traversable) instance Each (Prim e) (Prim e') e e' @@ -47,10 +48,11 @@ data Exp instance SexpIso a => SexpIso (Prim a) where 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 where binop s = list $ el (sym s) >>> el sexpIso >>> el sexpIso diff --git a/bdwgc.nix b/bdwgc.nix new file mode 100644 index 0000000..2a08f99 --- /dev/null +++ b/bdwgc.nix @@ -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 + ]; +}) diff --git a/flake.nix b/flake.nix index 554a826..136e5d2 100644 --- a/flake.nix +++ b/flake.nix @@ -14,6 +14,9 @@ overlays = [ haskellNix.overlay + (final: prev: { + bdwgc = final.callPackage ./bdwgc.nix {}; + }) (final: prev: { # haskellPackages = prev.haskellPackages.override { # qbe = final.haskell-nix.project' { @@ -72,6 +75,7 @@ hf.packages.${system} // { default = hf.packages.${system}."gyehoek:exe:gyehoek"; runtime = pkgs.callPackage ./runtime {}; + inherit (pkgs) bdwgc; }); devShells = each-system