From 466e2a38a970425496097d90216d152d4c72e0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Sat, 16 May 2026 01:17:14 -0600 Subject: [PATCH] 4 + 2 = 6 --- app/Gyehoek/ANF/Syntax.hs | 97 ++++++++++++++++++++++++++++---------- flake.nix | 2 +- play/a.c | 23 +++++++++ play/a.out | Bin 0 -> 15856 bytes play/t | Bin 15896 -> 15936 bytes play/t.anf | 2 +- play/t.s | 6 ++- play/t.scm | 4 +- play/t.ssa | 12 +++-- runtime/gyehoek.c | 2 +- 10 files changed, 113 insertions(+), 35 deletions(-) create mode 100644 play/a.c create mode 100755 play/a.out diff --git a/app/Gyehoek/ANF/Syntax.hs b/app/Gyehoek/ANF/Syntax.hs index ca95842..21fe1e4 100644 --- a/app/Gyehoek/ANF/Syntax.hs +++ b/app/Gyehoek/ANF/Syntax.hs @@ -167,6 +167,8 @@ toANF' (Lam.ExpBegin xs) k = ExpBegin <$> traverse anf xs where anf x = toANF' x (pure . ExpVal) +toANF' (Lam.ExpLet xs e) k = _ + toANF' e k = _ toANF e = toANF' e (pure . ExpVal) @@ -265,9 +267,12 @@ buildBlock n bb = QBE.Block n [] (is ^.. each) j lowerName :: Name -> QBE.Ident t lowerName = fromString . T.unpack +lowerInt' = QBE.ValConst . QBE.CInt . fromIntegral + lowerInt = QBE.ValConst . QBE.CInt . (Data.Bits..|. 2) - . (Data.Bits..<<. 2) . fromIntegral + . (Data.Bits..<<. 2) + . fromIntegral lowerVal :: forall es. (GenSym :> es) @@ -298,7 +303,7 @@ lowerArithmetic r p = QBE.BinaryOp r bop x y PrimMul a b -> (QBE.Mul,a,b) _ -> _ -sizeofScm = 16 +sizeofScm = 8 lowerCons :: (GenSym :> es) @@ -315,7 +320,7 @@ lowerCons r car cdr e k = do Nothing [ QBE.Arg (QBE.AbiBaseTy QBE.Long) - (QBE.ValConst (QBE.CInt sizeofScm)) ] + (QBE.ValConst (QBE.CInt (sizeofScm * 2))) ] [] ] initialise r1 = @@ -325,32 +330,53 @@ lowerCons r car cdr e k = do , QBE.Store (QBE.BaseTy QBE.Long) cdr (QBE.ValTemporary r1) ] +smallIntHelper' + :: GenSym :> es + => QBE.Ident 'QBE.Temporary + -> QBE.BinaryOp + -> QBE.Val -> QBE.Val + -> (QBE.Val -> Eff es BlockBuilder) + -> Eff es BlockBuilder +smallIntHelper' r bop v1 v2 k = do + Emit [ QBE.BinaryOp (r QBE.:= QBE.Long) + bop v1 v2 ] + <$> k (QBE.ValTemporary r) + smallIntHelper :: GenSym :> es - => _ - -> QBE.Val -> (QBE.Val -> Eff es BlockBuilder) + => QBE.BinaryOp + -> QBE.Val -> QBE.Val + -> (QBE.Val -> Eff es BlockBuilder) -> Eff es BlockBuilder -smallIntHelper bop v k = do +smallIntHelper bop a b k = do r <- gensym - Emit [ QBE.BinaryOp (r QBE.:= QBE.Long) - bop v (QBE.ValConst (QBE.CInt 2)) ] - <$> k (QBE.ValTemporary r) + smallIntHelper' r bop a b k + +makeSmallInt' + :: forall es. (GenSym :> es) + => QBE.Ident 'QBE.Temporary + -> QBE.Val + -> (QBE.Val -> Eff es BlockBuilder) + -> Eff es BlockBuilder +makeSmallInt' r n k = + smallIntHelper QBE.Shl n (lowerInt' 2) \n' -> + smallIntHelper' r QBE.Add n' (lowerInt' 2) k makeSmallInt :: forall es. (GenSym :> es) => QBE.Val -> (QBE.Val -> Eff es BlockBuilder) -> Eff es BlockBuilder -makeSmallInt n k = - smallIntHelper QBE.Shl n \n' -> - smallIntHelper QBE.And n' k +makeSmallInt n k = do + r <- gensym + makeSmallInt' r n k getSmallInt :: forall es. (GenSym :> es) => QBE.Val -> (QBE.Val -> Eff es BlockBuilder) -> Eff es BlockBuilder -getSmallInt = smallIntHelper QBE.Shr +getSmallInt n = smallIntHelper QBE.Shr n (lowerInt' 2) lowerWrite :: forall es. (GenSym :> es) @@ -365,6 +391,31 @@ lowerWrite r x e k = ] <$> k (QBE.ValTemporary (lowerName r)) +smallIntMask :: Integer +smallIntMask = 2 ^ (sizeofScm * 8) - 2 + +lowerCar + :: GenSym :> es + => Name -> QBE.Val -> _ + -> (QBE.Val -> Eff es BlockBuilder) -> Eff es BlockBuilder +lowerCar r x e k = do + Emit [ QBE.Load (lowerName r QBE.:= QBE.Long) QBE.Long x + ] + <$> lower' e k + +lowerCdr + :: GenSym :> es + => Name -> QBE.Val -> Exp + -> (QBE.Val -> Eff es BlockBuilder) -> Eff es BlockBuilder +lowerCdr r x e k = do + x1 <- gensym + Emit [ QBE.BinaryOp (x1 QBE.:= QBE.Long) + QBE.Add x (lowerInt' (sizeofScm `quot` 2)) + , QBE.Load (lowerName r QBE.:= QBE.Long) QBE.Long + (QBE.ValTemporary x1) + ] + <$> lower' e k + lowerPrim :: forall es. (GenSym :> es) => Name -> Prim Val -> Exp @@ -372,19 +423,15 @@ lowerPrim -> Eff es BlockBuilder lowerPrim r p e k = telescope (lowerVal <$> p) \case - (preview binaryPrim -> Just (bop,a,b)) -> do - r1 <- gensym - r2 <- gensym - Emit [ QBE.BinaryOp (r1 QBE.:= QBE.Long) bop a b - , QBE.BinaryOp (r2 QBE.:= QBE.Long) QBE.And - (QBE.ValTemporary r1) - (QBE.ValConst (QBE.CInt 0xffff_ffff_ffff_fffd)) - , QBE.BinaryOp (lowerName r QBE.:= QBE.Long) QBE.Or - (QBE.ValTemporary r2) - (QBE.ValConst (QBE.CInt 0b10)) - ] - <$> lower' e k + (preview binaryPrim -> Just (bop,a,b)) -> + getSmallInt a \a' -> + getSmallInt b \b' -> + smallIntHelper bop a' b' \c -> + makeSmallInt' (lowerName r) c \_ -> + lower' e k PrimCons x y -> lowerCons r x y e k + PrimCar x -> lowerCar r x e k + PrimCdr x -> lowerCdr r x e k PrimWrite x -> lowerWrite r x e k lower' diff --git a/flake.nix b/flake.nix index 6afd30b..6d4039c 100644 --- a/flake.nix +++ b/flake.nix @@ -43,9 +43,9 @@ gcc qbe haskellPackages.cabal-fmt - schemat bdwgc pkg-config + guile ]; }; }; diff --git a/play/a.c b/play/a.c new file mode 100644 index 0000000..bd75ffa --- /dev/null +++ b/play/a.c @@ -0,0 +1,23 @@ +#include +#include + +#define BLAH (-1 >> 2 == -1) && (-4 >> 2 == -1) && (-5 >> 2 == -2) && (-8 >> 2 == -2) + +#if BLAH +# define SCM_SRS(x, y) ((x) >> (y)) +#else +# define SCM_SRS(x, y) \ + ((x) < 0 \ + ? -1 - (scm_t_signed_bits) (~(scm_t_bits)(x) >> (y)) \ + : ((x) >> (y))) +#endif + +int main () { + unsigned long mask = 0xfffffffffffffffe; + unsigned long x = (4 << 2) + 2; + unsigned long y = (2 << 2) + 2; + unsigned long z = ((x + y) >> 2) + 2; + printf ("BLAH: %d\n", BLAH); + printf ("%ld\n", sizeof(long)); + printf ("%lx\n", (long) z >> 2); +} diff --git a/play/a.out b/play/a.out new file mode 100755 index 0000000000000000000000000000000000000000..114fc129dc0d166200ca8f5e7dab6212c3f251a2 GIT binary patch literal 15856 zcmb<-^>JfjWMqH=W(GS35O0A1M8p9?F%+0V84L^z4h$9yybKNuatyKzYzzzxEMPH+ zJWM@|zQF_$htV7mE(0@Ep9F}(z`%e`2Se4tXpoygLLeGsABc?&|6qrR!e|DlKS26e zK~hjYOdLkf1Sw!(V1UsuagZ?BJ_V3w1_lN++5w~h zfYLC1ATCH>22@`LR3D5E04ZQ#V1UuE@C3OLgdafNhfc%d14g6kQ&5Ds4}*pX!@Ui% z10)puv?K+@Mz;sXhuH(8VfF<;^+`b8iB9W)3};|qfYBg3Kth2}OHx4L0%8+`VbL4} zwGUT3tbm3mjD|&{eqLsUesM{DQL27cZn1e)MOChOxnX%ma#eX=rD?8ldUkqBR(eKm zrcse@dQN6ivaXSyiIJ|Up?*$gl73E#Zcb)iX@zcug_*9IiC%HOo)N^=pyUn;3y?ja z^oY$*AT^+5400OG{~$IACrN@x>*H zMJ4g^4Dp^JzVRukMXBkT#U-glA->Kz`FW`!iAg!B5IO8J@dZVhc_nG_$r;%U@$sPe zftr|`n3=~AAD>*27@wAzmza}TmCBHlnUr3dnUkt(tY-j?Q^QPy^1|#C zOH0$@oJ4b7gzF8#=?__RMTJpfVx@64LGeq64;iB)7U^Y)^4a+sZ=H>0|PU|F(|)862xa> zxCBwo04ujac@`wpAP6EE7!si6GECe7D$W5-&oFTq|Asw8A1J?q@*;%C!0-S`9F*^2 z;xCZIVPybF?gNrI$SjZ;2>(D52bC)zF%Z506$h0OpfUs`Hi}0>U^E0qLtr!nMnhmU z1V(lUeCC(?<iq4F6T<=rb_z%R4aq zR|WAiKyoi1{Qv*|zv?P|28Of=AOR2#-34mhc=Vbs=VxFrJg^_s=J4oz`r^p{|NnP^ z8buzxrqd8oFV=v>K@Ay?UejhI@hSiR|2I4kdl=+C!?&KD7vnrSA9*xC`4AA|YIwl# zq(`sqM3D8O#`+8lU()pW==|Vu@SVNK!5_>XjK@4K{wopj=w{suHGt#)gEW457X}8H zevtbbY>((Gar58*|1VPh|NnoCb*>%*17qxA zet8uAFU$Y`|Ifg{05S_47x2&rxpWkdhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kgRfe?TnvoT%+{c}KG56)$A|y_6Brm6G(P_c-|M!48K?F)ORs}IIRtPXk^RRPFU}RtbiOWFssDaeDu!E)+8B`b; z7)%%#7#6(${~tV`$S2^&C*j40_Lfv!uFgz{nQ*`%R-SYJsB%7?9M1NE;!LNIwyKM2Gx0Cj#C7#P0(`=1Zu zuYmGF{VNcE0#qSrN*Bbx0F{UJmmEM7!VC-y+#pHNx^E~g3Z-EbR2#z%==wFNHUJ>Ve1s#ot>=|G~E3{H5DK$ zD+%ZY`JaX1BWU^>MI|VF85x8b;OohuvclkX|Cs7Q@rTVEWd;TYCI()H3uyjQg^Dvk z(>K(31`DV-EZ@Pz{lIxhl0g8vJ`?0_kX#g4Tok^Z6C?)0pw-nNdtvz)BnHC0VD%#K zb)g_J5C-K-Z0-lGb7o`^WVitytK7u;rRh3{uV4Q z#( z23Yw5lTrcO3*#YZ&^`%427ZvEz=F_Xg25k$`bm6b>-WNc4TMI4?s0G~I&7s2CU+ zo`A%exImsmQq91?5S(08VyKtT5FekIlo?-=n9h)>m&}k{RFagMo|zY{m(PG$1s`9M z8=nkX2Vcw(AD@yRpPrMSl$aBrQj%X(9G_TP!H}GvTac4llA5AtfL#S>@q1=`Vo_0I zWqfL0Nl_(3T2W$dYJ5s*Zf+$*d^{2_J~J<~1Vw3bQAuiE3dl+E@oqtmzOM1EelDQ3 z`tk05q4BOBP(cruAclB%AAcuDpLl;aw_w+h_z*`YAJ=$>c$Y{&M_*582K2@LNXzye z;LGXtOc=n4ErXRHKKRy*?BIY&&xN*iN43KRHppax>&?~OYElEsb z&?_z}g3uW-R%TvFYEc1$UV2`sUPfYZ27_KoWnOV*E`%;Ag2=oix~8Z zQgaeP8lbF#oDv2-u$6iRIVF1O`6Uc`C8-r940>sqd6^7)MfqTN>!oHuqdOy|hyl)H z(96p&Nd>#4peVl}wWy>LD&*+osS8SXn46i*pa(HOskoRyFF8Lq zH#HB|`awYbdj>{>#-u^&VdWFJ z@(0&hAW;SeP<{06|NnfLepvelMr%Nnf%n9Lm@xeyHVA{Zb%EMGF#WLh5sZelPeAP{ zklSJUVeJ%C2GDK=P@M=eje!By-h$Dv_7y}Hv>O7(g3zFC3!t_O+iOF9rq%P+JJbhqZ@bG_-mJkGCVcA7VQLLnJgTVftb1GZ+o?KYIAX{GSZf?*ugv z*4~5BFm)jPpf&}1_~nA@O9t@1MX(Vt4?}5C`T~nX36MEZCYS=Pd<6Lm8f**-Pr606V6j?v4odcsmb51b5AR68Nc~JMm?Dv4$ z3!|riG$CPFxWR;0FfcHHx&$!&u>FcK8kT-x>e2Os_6;HHhqrHG`zK)M*Cs9<4$c2+y&y%24)6E1{Ma8OF--?3=9m=sADLV z%H#z3WHD5%L=wbjW>^p9Z<#oa4dj>IAh&~J3>pU@AAp1$1VJPNLj{^R15}*DfnoA) zwm?Rf$-M01lWo{}RDak*bb!JH6c!L31H%cZI7p0nvMswfBkSfwc4Ll70!oIH^cfib zt4`5pVBnW`VEC^J;%9&~zI^ci|NsB0UHS|R86fYyya47en(Qo~=M}8a!0;tak6*q8 zq?Ey<*S1ohfx)AfwFpF6{wNXk=w>wov0D$6aQ=V5FW&%Cco<51^xArYBzsMrChr!I zVPu_rLqJZGRiA-@p;SB6quKV69s>h|N9WTL9*=I@XL<|_FEs!E|NkQ8|NsBTSnp1j z7nH9TU|?W)ar58*{~pH~gg~l~J8*C@Ffi-~abAFAPaa0N5ahW~kIrAs&)Go6s(2iH z#pKazn#;$)upgA13=h1R`|tmM!vnE~mkhrd{y)qw&*0H(8jmDjiz2^yuAnjBBn1^q zg9=pxL$jO;J1zzWMrmei9cc3X@c#e*1O^5Mg%AJ#cQ7z87<~Bu--CgHA>iZx{|i8Y zF*#I0S@yyE|NqrMJQsG5lNnSP7#K_#7#KR<|Nn0=d8&f4!bWfqL?cuO}Dk=?iXvrYKO*fs`6d-l!)pxB`^G7#J9!6vKA z2f?6lU}E59U=W;q$Uu*=V)91=aY?v;A!-;v{$gYhVJMiaXz0%PWpbvWz9g(PgDPRT z3}y&07);)1D9*TH@<~H`#)!$BMkbRtG6{RSF)}a+G4V0L{0>&kz`)=G5@+CLXn=-^ zFH|Co5tPRz7#LuMGgLfz@<&5)$s$Gu20n;0KYE;JTr{I|K&IG7Pp z*loUT@|SV)0VcM|H_Q?kEhbx<*E8OjywhA?bOosR1tl>k{Th_0CO0yRPZqHd5u5@l zUKkh{V6@O=OACF@6;RO?lM5}(IbT3|FD7raFo&lLSo$!S{L`YI!vN~$$%>ZZlc!q> zPJUr2FnNci0le~q1xD`VpO*TZu;{rk+0e?JQGar!l|Cn;df8}Y&Y1wp8Vn2!36nos znR6m4FGFi{PDG_uXl>33uM{V5v^Jl-!rEZ6gpI)D7uEukEo=4C9{3A8pkE>Z^>I delta 1787 zcmX?5GoxmLgkXRG0~k1fNd|@)6E&A}Ca^B*f;@rt=+IP1_ovZ1_o9J1_qE%Aht3vK)nd& zfutAyg_~i2^k22NCt)m zH1Q8m3pgfAvIjFVPtIi**9CmLp_>pKj|?rFnDx6E#dL#w*98Z!0riOZS{%U^C2GXYDaqtzBN3ZEzJ_d&Up!hdD@M7=3|NjjS#2Q{Q{AT$7 zFuy#5N3Ur=lKkAw2Lv7XCO=>|n53X$sG3t@$Hl{{MGjU|>-B`2YW$$*~H`j5j7XDu}aAc>n*u!sNLM%8VV84=RW=Hf+AB zFr8=e0VV-YSRBIQ43ri@AyWb(K-NL&dMFK(2c;vBkSvH`U|`rYd8e+t-~wohkc5g> zOn#{=&)6`TQ_r4p!emc9dB%m4GxhWZcR*tr6cQk%5|dZz$qRab51)COpJ1DOQECg42A%kV*9 z@*x8~#)ios4a6m39t9}?;ZCsUL>MY2D;l~pzL}h9s4odCP(bn^d>KSA2r%eO-e@S! zxMT83LwiQQ$(%+eI!t^FFu#J;FfcGUF)}a+G4L`3K*PWnD&aG^(MX&za`Hz*amI|v z8;!&zOBop$1R3}l7@*}1s7wGUZkhbhNL(@qW)9R>Y9J{F28Pbbg2v*KQ=zh!P+Opi z7-mg&G!~cK3^JKXf!y^+GsS=YF zE$b(2o5A?5tsdEtdTsL-Fx$Ra#>gSEnB0ULu!HUgZmQmSFHq>VWzEUG&u zN7|Uf)8h_MjtAxR$qQ}%GgeGqXlu^7z!(yUza}eM$WOA9;GAU&5%@P*(Oez?zu-@> diff --git a/play/t.anf b/play/t.anf index 831ceda..d275bf7 100644 --- a/play/t.anf +++ b/play/t.anf @@ -1,4 +1,4 @@ ;;; -*- mode:scheme -*- -(let ((x0 (prim:+ 2 4)) (x1 (prim:write x0))) x1) +(let ((x0 (prim:cons 4 2)) (x2 (prim:write x1)) (x1 (prim:car x0))) x2) diff --git a/play/t.s b/play/t.s index f8824c4..0f05087 100644 --- a/play/t.s +++ b/play/t.s @@ -3,7 +3,11 @@ main: pushq %rbp movq %rsp, %rbp - movl $30, %edi + movl $16, %edi + callq GC_malloc + movq $18, (%rax) + movq $10, 8(%rax) + movl $18, %edi callq scm_write leave ret diff --git a/play/t.scm b/play/t.scm index 8895d2c..0ff09ce 100644 --- a/play/t.scm +++ b/play/t.scm @@ -1 +1,3 @@ -(prim:write (prim:+ 2 4)) +(let ((pair (prim:cons 4 2))) + (begin (prim:write (prim:car pair)) + (prim:write (prim:cdr pair)))) diff --git a/play/t.ssa b/play/t.ssa index 9b6d236..0d209a1 100644 --- a/play/t.ssa +++ b/play/t.ssa @@ -1,9 +1,11 @@ export function w $main () { @start - %.2 =l add 10, 18 - %.3 =l and %.2, 18446744073709551613 - %x0 =l or %.3, 2 - %x1 =l call $scm_write (l %x0) - ret %x1 + %x0 =l call $GC_malloc (l 16) + %.3 =l add %x0, 8 + storel 18, %x0 + storel 10, %.3 + %x1 =l loadl %x0 + %x2 =l call $scm_write (l %x1) + ret %x2 } \ No newline at end of file diff --git a/runtime/gyehoek.c b/runtime/gyehoek.c index 6643a11..14049ed 100644 --- a/runtime/gyehoek.c +++ b/runtime/gyehoek.c @@ -5,7 +5,7 @@ SCM scm_write (SCM x) { if (SCM_IMP (x)) { printf ("#\n", SCM_UNPACK (x) >> 2); } else { - printf ("#\n", SCM_UNPACK(x)); + printf ("#\n", SCM_UNPACK (x)); } return SCM_PACK(NULL); }