From fd41c0c4d68e402add5b2e18cbfb890497473919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Wed, 6 May 2026 06:06:17 -0600 Subject: [PATCH] --- a.out | Bin 0 -> 15960 bytes app/Gyehoek/ANF.hs | 31 ++++++++++++++++---- closure.scm | 15 ++++++++++ t.s | 70 +++++++++++++++++++++++++++++++++++++++++++++ t.scm | 16 +++++++++++ t.ssa | 30 +++++++++++++++++++ 6 files changed, 156 insertions(+), 6 deletions(-) create mode 100755 a.out create mode 100644 closure.scm create mode 100644 t.s create mode 100644 t.scm create mode 100644 t.ssa diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..5b911a9f21c82c62a00838db3ed5508ad8fc1006 GIT binary patch literal 15960 zcmb<-^>JfjWMqH=W(GS35HCOgBH{p{7;czB84L^z4h$9yybKNuatyKzYzzzxEMPH+ zJWM@|zQF_$htV7mE(0@Ep9F}(z`%e`2Se4tXpoygLLeGsABc?&9{@Rsfq?-=GeG?T z(#HzY0OiBPVf0>*0tN;K7!4B#34`rZ0BL4mU_hgPK!ss6vObVgX6Ql`%&MAT}`=7R^CW z`*6iW1~fcjG$_77=IiHWR_GU(89soCMD|{>6sYmni}foWG3n7r0C{k=9O0HR#=$nnwjVo=j$1POl1J4dv<8r z2c<`3Kf&wadM+14{D#A$oAstX1A|BFffAIP!B9w_1b|A1e<0i^ISl=kSg z%>+sInkIoL&3_)9A3P4ev-ddogV}@en8(F`B_bZ(tfC;v)&nIR{~x6B%eycz!1ROM z*I=ut&%nS?svYXlZ2L)%fq}uJ^Jxi>N4M=aJqCssn*aa*f06S4|NmpGKlKM9*5OEm> z1_q7~|NpCj)VQ#NXOKYiwTHAL85tN+_)KVgkXn%0AoU>q zAUz=eae)}4cr*k?Ltr!nMnhmU1V%$(Gz3ONU^E0qLtr!n22lvW*5|?2S5Y(pw3Blw+{V5Q? z0MvSbr3>9uOoX4k8#B7*;?nhKav`It=EI15kCGP#R{Q9Fz}J_xnG@e~b(a zV4;6d{tl>l|Dk-ScNjiE`75CEKcRe>KcL1_je@NQM>o(6)agYRB!UlH-N|gSiY041d7t#o_r5 zCN9K?eOuUnk5A9Z zPfE;*PbtYSDvnPqtzbyb&n?JFElEw$Gr+C_v~)i+KC!4Mu`)h2ucWAwA+0DeH#I(` zG&i@BAwC|77oVAzS%RW8Il0Q+#4yA_FQ1_*wJ5)UAuTbvB)=##F^3_oxTFZ==+wLv zkdx!%-GUr_UE^K-T;k&y;$0&B9DO~V8RFyJ{X*kiJ)p84EX^^9AFy@j7=ab?-7B5x=24YC9x!t0qjla?gY42(4K_&c#u3~5kJO? z{`i#Q{P>K-ycE!Ce^3AT;*yliy!g`M)D(vJ)Vvgi`1qvaVyIr|ZioF6<6k#BqlNF6_*r2=nNPuGp{7IsDME)J+D+RBe6JxK`*5;uedT7 zLYEXlWXe*DiZk=`P&n~L40=VWIf)<*P*y=s34r6GBEx5rW5{mzQ6X3U*0BQGP*cQAs6K$kEAD7nEwjW2T(+U+DD)|1K#d{R^+gKYOsB2FiSvcVQdhs z4jsFO>4&wOU^HlK8>9|a-hdk!;4&X1%D|w^z`*eB|NnfLepovTMuW!JK`PPpgTz1> zw0#WJ#)9dGwZmXEsQv<}12tDbZim?qYY&++fOeCBc94KnF)+Z|bub#%j)Ta8>QopD zLW8!IfZ9kf`(f=O7|jP!2HraeV#3tHXi)tPYIDK(uyz-WhJ_!x`$1-ba3nM=Vftb1 zKo|{c2cm}`%>T(y{Z1gmK;=8MT?uPn!qkEEgX(zn@B?ki0);D78=`!MwqHQ$3u-i& z0+|D5Knc(aOJw~DP4))QG-&Pz*?w4k z2czRbk}%ECJx54fh9)%oVf8wUhV@TideHsf0o4!Riw0}&KxuUKFg}b1El3495f=Zj zb`Fe&;Iv}OgQlL6Drz`(GZ zfq?;8Kdk)>qoK}$>wx(iCUBC0fdQ1qpv4xv{R-O$iSAw)A4XqgU;wp>!214WhY}_AJ(puf$B#OZ%|r;=>^eWq4q%r6J`#GhNT^-5-?=|HE;#gVIY5i`pz)-!^$O2X!#A+ghbo`Z4d ts') (ds <> ds') (fs <> fs') instance Monoid QBE.Program where + mempty :: QBE.Program mempty = QBE.Program mempty mempty mempty funcdef :: QBE.Ident QBE.Global -> [QBE.Param] -> NonEmpty QBE.Block -> FuncDef @@ -148,6 +151,16 @@ buildBlock :: QBE.Ident QBE.Label -> BlockBuilder -> QBE.Block buildBlock n bb = QBE.Block n [] (is ^.. each) j where (is,j) = evalBlockBuilder bb +lowerName :: Name -> QBE.Ident t +lowerName = fromString . T.unpack + +lowerPrim :: Prim -> _ -> _ +lowerPrim PrimAdd k = k $ QBE.ValGlobal "plus" +lowerPrim PrimMul k = k $ QBE.ValGlobal "star" +lowerPrim PrimSub k = k $ QBE.ValGlobal "_" +lowerPrim PrimDiv k = k $ QBE.ValGlobal "slash" +lowerPrim p k = _ + lowerVal :: forall es. (GenSym :> es) => Val @@ -155,6 +168,8 @@ lowerVal -> Eff es BlockBuilder lowerVal (ValInt n) k = k . QBE.ValConst . QBE.CInt . fromIntegral $ n +lowerVal (ValVar x) k = k . QBE.ValTemporary . lowerName $ x +lowerVal (ValPrim p) k = lowerPrim p k lowerVal _ k = _ lower' @@ -167,9 +182,8 @@ lower' (ExpVal v) k = lowerVal v k lower' (ExpLetApply r f xs e) k = blah (lowerVal @es <$> (f:|xs)) \(f':xs') -> do - r <- gensym Emit [ QBE.Call - (Just (r, QBE.AbiBaseTy QBE.Long)) + (Just (lowerName r, QBE.AbiBaseTy QBE.Long)) f' Nothing (QBE.Arg (QBE.AbiBaseTy QBE.Long) <$> xs') @@ -179,6 +193,11 @@ lower' (ExpLetApply r f xs e) k = lower' _ k = _ --- lower e = do --- _ <- runCodeGen (lower' e \r -> _) --- _ +lower :: GenSym :> es => QBE.Ident QBE.Label -> Exp -> Eff es QBE.Block +lower n e = buildBlock n <$> lower' e (pure . Exit . QBE.Ret . Just) + +wrapProgram :: Foldable1 t => t QBE.Block -> QBE.Program +wrapProgram bs = QBE.Program [] [] [main] where + main = QBE.FuncDef [QBE.Export] + (Just (QBE.AbiBaseTy QBE.Word)) + "main" Nothing [] QBE.NoVariadic (toNonEmpty bs) diff --git a/closure.scm b/closure.scm new file mode 100644 index 0000000..547a0eb --- /dev/null +++ b/closure.scm @@ -0,0 +1,15 @@ +(define (adder x) + (lambda (y) + (+ x y))) + +((adder 3) 4) + + + +(define (adder x) + (list (lambda (self y) + (+ (nth self 1) y)) + x)) + +(let ((closure (adder 3))) + ((nth closure 0) closure 4)) diff --git a/t.s b/t.s new file mode 100644 index 0000000..1eda806 --- /dev/null +++ b/t.s @@ -0,0 +1,70 @@ +.text +zerop: + pushq %rbp + movq %rsp, %rbp + cmpl $0, %edi + jnz .Lbb2 + movl $1, %eax + jmp .Lbb3 +.Lbb2: + movl $0, %eax +.Lbb3: + leave + ret +.type zerop, @function +.size zerop, .-zerop +/* end function zerop */ + +.text +factorial: + pushq %rbp + movq %rsp, %rbp + subq $8, %rsp + pushq %rbx + movq %rdi, %rbx + callq zerop + movq %rbx, %rdi + cmpl $0, %eax + jnz .Lbb6 + movq %rdi, %rbx + subq $1, %rdi + callq factorial + movq %rbx, %rdi + imulq %rdi, %rax + jmp .Lbb7 +.Lbb6: + movl $1, %eax +.Lbb7: + popq %rbx + leave + ret +.type factorial, @function +.size factorial, .-factorial +/* end function factorial */ + +.data +.balign 8 +fstr: + .ascii "fac 3 = %d\n" + .byte 0 +/* end data */ + +.text +.globl main +main: + pushq %rbp + movq %rsp, %rbp + movl $3, %edi + callq factorial + movq %rax, %rsi + leaq fstr(%rip), %rdi + movl $0, %eax + callq printf + movl $0, %eax + leave + ret +.type main, @function +.size main, .-main +/* end function main */ + +.section .note.GNU-stack,"",@progbits diff --git a/t.scm b/t.scm new file mode 100644 index 0000000..fb8a3c8 --- /dev/null +++ b/t.scm @@ -0,0 +1,16 @@ +(define (factorial n) + (if (zero? n) + 1 + (* n (factorial (- n 1))))) + + +;;; ANF + +(define (factorial n) + (let ((r₁ (zero? n))) + (if r₁ + 1 + (let ((r₂ (- n 1)) + (r₃ (factorial r₂)) + (r₄ (* n r₃))) + r₄)))) diff --git a/t.ssa b/t.ssa new file mode 100644 index 0000000..aa7270b --- /dev/null +++ b/t.ssa @@ -0,0 +1,30 @@ +function l $zerop (l %n) { +@start + jnz %n, @b1, @b2 +@b1 + ret 0 +@b2 + ret 1 +} + +function l $factorial (l %n) { +@start + %r1 =l call $zerop (l %n) + jnz %r1, @b1, @b2 +@b1 + ret 1 +@b2 + %r2 =l sub %n, 1 + %r3 =l call $factorial (l %r2) + %r4 =l mul %n, %r3 + ret %r4 +} + +data $fstr = { b "fac 3 = %d\n", b 0 } + +export function w $main () { +@start + %r =l call $factorial (l 3) + call $printf (l $fstr, ..., l %r) + ret 0 +} \ No newline at end of file