Factorial on SubX
Ok, I think I understand calling conventions now.
Also coming face to face with the pain of debugging machine code 😀
More adventures with machine code
SubX now has a test harness, and support for string literals.
Current (increasingly silly) factorial program to compare with the parent toot: http://akkartik.name/images/20180923-subx-factorial.html
Two new features:
a) Autogenerated `run_tests` (line 26) which calls all functions starting with 'test_'.
b) String literals (line 31). They get transparently moved to the data segment and replaced with their address.
@akkartik @email@example.com @haitch @freakazoid Honestly, my advice here is to read two books: "Programming a Problem Oriented Language" teaches you how to write your own Forth compiler from scratch (bare metal on up). There are no assembly listings in the book, because it's pure guidance, but it was instrumental in me getting DX-Forth working at all.
Second, if you're willing to tackle the more sophisticated compiler techniques needed to have a proper infix compiler, I would then recommend reading Compiler Construction, by Niklaus Wirth (see http://www.ethoberon.ethz.ch/WirthPubl/CBEAll.pdf).
You don't need fancy register allocation to get a working compiler that meets 80% of your performance goals. Don't let that slow you down.
@akkartik @firstname.lastname@example.org @haitch @freakazoid
Next, I would strongly recommend reading https://www.cs.indiana.edu/~dyb/pubs/nano-jfp.pdf . This was instrumental in getting my BSPL compiler prototype to work, and I'll be revisiting this again when I revise BSPL once more to port VertigOS to the #Kestrel3.
@akkartik @email@example.com @haitch @freakazoid There seems to be this great fear of passes in compiler design. It's a one-pass compiler, or a two-pass compiler. Hogwash; do 56 passes if you must; all that matters is the final output. Register allocation can be one (or maybe a few) of those passes towards the end.
@vertigo That being said, if performance is a primary goal, I'd suggest considering whether simpler heuristics are applicable
@haitch @akkartik @firstname.lastname@example.org @freakazoid Nice thing about not shying away from passes in compiler implementation is that passes are often plug-and-play relative to each other. That allows you to follow Butler Lampson's philosophy: "Make it work, make it right, make it fast."
A lot of what goes into making a compiler produce the fastest possible code is an act of diminishing returns, and frequently has to be redone every processor generation. Ergo, the more you can modularize it, the better.
@vertigo Anyway, routines that juggle more than 32 variables at amy given time are possibly not very well thought out. And routines that use more than that shou;d probably be penalised and split into other functions. This is less of a problem for processors with many registers, but ai ser how it can be a concern for @akkartik who's specifically targetting IA32.
@akkartik @email@example.com @freakazoid
@AceNovo @akkartik @firstname.lastname@example.org I mention it in my follow-up toot, https://mastodon.social/@vertigo/100781598805099246 .
Server run by the main developers of the project It is not focused on any particular niche interest - everyone is welcome as long as you follow our code of conduct!