about summary refs log tree commit diff stats
path: root/apps
Commit message (Collapse)AuthorAgeFilesLines
* 5999Kartik Agaram2020-02-0911-1/+1
| | | | | Fix CI. apps/survey was running out of space in the trace segment when translating apps/mu.subx
* 5998 - redo code-generation for 'break'Kartik Agaram2020-02-092-77/+130
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I've been saying that we can convert this: { var x: int break-if-= ... } ..into this: { 68/push 0/imm32 { 0f 84/jump-if-= break/disp32 ... } 81 0/subop/add %esp 4/imm32 } All subsequent instructions go into a nested block, so that they can be easily skipped without skipping the stack cleanup. However, I've been growing aware that this is a special case. Most of the time we can't use this trick: for loops for non-local breaks for non-local loops In most cases we need to figure out all the intervening variables on the stack and emit code to clean them up. And now it turns out even for local breaks like above, the trick doesn't work. Consider what happens when there's a loop later in the block: { var x: int break-if-= ... } If we emitted a nested block for the break, the local loop would become non-local. So we replace one kind of state with another. Easiest course of action is to just emit the exact same cleanup code for all conditional branches.
* 5997 - clean up after unconditional loopsKartik Agaram2020-02-092-34/+122
| | | | | | | Turns out we can't handle them like conditional loops. This function to emit cleanup code for jumps is getting quite terrible. I don't yet know what subsidiary abstractions it needs.
* 5996Kartik Agaram2020-02-091-0/+12
|
* 5993 - support for unlabeled loop instructionsKartik Agaram2020-02-082-3/+213
| | | | | Now that we have the infrastructure for emitting cleanup blocks, the labeled variants should be easy as well.
* 5992Kartik Agaram2020-02-072-12/+43
|
* 5991Kartik Agaram2020-02-072-1/+4
|
* 5990Kartik Agaram2020-02-061-1/+1
|
* 5989Kartik Agaram2020-02-062-17/+28
| | | | | | Start pushing dummy vars for labels on the stack as we encounter them. This won't affect cleanup code, but will make it easy to ensure that jumps are well-structured.
* 5988Kartik Agaram2020-02-062-41/+17
| | | | | | | Clean up data structures and eliminate the notion of named blocks. Named blocks still exist in the Mu language. But they get parsed into a uniform block data structure, same as unamed blocks.
* 5987Kartik Agaram2020-02-062-7/+7
|
* 5986Kartik Agaram2020-02-062-43/+1
|
* 5985Kartik Agaram2020-02-062-40/+30
| | | | | Standardize on a single block name. This simplifies some code and will also help in the next couple of steps.
* 5984 - start labeling all blocksKartik Agaram2020-02-052-165/+289
| | | | | | | | This will come in handy for the remaining cases where we need to clean up locals on the stack: loop after var non-local break with vars in intervening blocks non-local loop with vars in intervening blocks
* 5982 - start putting block labels on the var stackKartik Agaram2020-02-052-26/+41
| | | | | | | | | | | | | | | | | | | | | Before: we detected labels using a '$' at the start of an arg, and turned them into literals. After: we put labels on the var stack and let the regular lookup of the var stack handle labels. This adds complexity in one place and removes it from another. The crucial benefit is that it allows us to store a block depth for each label. That will come in handy later. All this works only because of a salubrious coincidence: Mu labels are always at the start of a block, and jumps always refer to the name at the start of a block, even when the jump is in the forwards direction. So we never see label uses before definitions. Note on CI: this currently only works natively, not emulated.
* 5981 - decompose block cleanup into two traversalsKartik Agaram2020-02-022-35/+113
| | | | | Momentarily less efficient, but we will soon need the ability to emit cleanup code without losing all our state.
* 5980Kartik Agaram2020-02-021-3/+3
|
* 5979Kartik Agaram2020-02-021-2/+3
| | | | | | | Continuing to think about how to translate vars in a block when they're followed by early exits. To clean up everything between a statement and a target label, we need to know somehow the depth the target is defined at.
* 5978Kartik Agaram2020-02-021-1/+4
|
* 5977Kartik Agaram2020-02-022-4/+5
|
* 5974 - support for simple early exitsKartik Agaram2020-02-022-1/+84
| | | | | | | | | | | | | | | So far we only handle unlabeled break instructions correctly. That part is elegance itself. But the rest will need more work: a) For labeled breaks we need to insert code to unwind all intervening blocks. b) For unlabeled loops we need to insert code to unwind the current block and then loop. c) For labeled loops we need to insert code to unwind all intervening blocks and then loop. Is this even worth doing? I think so. It's pretty common for a conditional block inside a loop to 'continue'. That requires looping to somewhere non-local.
* 5973Kartik Agaram2020-02-021-369/+1
|
* 5971 - emit code with indentationKartik Agaram2020-02-012-256/+309
| | | | This is easy now that we're tracking block depths everywhere.
* 5970 - support block-scoped variablesKartik Agaram2020-02-012-6/+186
|
* 5966 - document all supported Mu instructionsKartik Agaram2020-01-312-9/+9
|
* 5962 - string literalsKartik Agaram2020-01-302-6/+43
|
* 5961Kartik Agaram2020-01-302-3/+2
|
* 5954 - 'factorial' working!Kartik Agaram2020-01-291-0/+19
|
* 5953 - 'multiply' instructionKartik Agaram2020-01-292-0/+13
|
* 5951 - 'compare' instructionsKartik Agaram2020-01-292-9/+376
|
* 5948 - branching to named blocksKartik Agaram2020-01-2915-13/+415
|
* 5947 - add a new field to primitivesKartik Agaram2020-01-292-4/+92
| | | | For supporting branches with a target.
* 5946Kartik Agaram2020-01-292-6/+6
|
* 5945 - branchesKartik Agaram2020-01-282-0/+285
|
* 5943 - initial support for named blocksKartik Agaram2020-01-282-132/+245
|
* 5942 - initial support for blocksKartik Agaram2020-01-282-8/+77
| | | | This was too easy. But there are dragons ahead.
* 5940 - local vars in registers starting to workKartik Agaram2020-01-272-31/+151
|
* 5939Kartik Agaram2020-01-271-3/+0
|
* 5938Kartik Agaram2020-01-271-0/+1
|
* 5936 - permit commas everywhereKartik Agaram2020-01-273-12/+52
|
* 5933Kartik Agaram2020-01-2710-2/+2
| | | | Expand some buffer sizes to continue building mu.subx natively.
* 5932Kartik Agaram2020-01-271-0/+10
|
* 5931Kartik Agaram2020-01-271-1/+1
|
* 5929 - local variables kinda workingKartik Agaram2020-01-272-6/+171
|
* 5928Kartik Agaram2020-01-272-4/+2
|
* 5927Kartik Agaram2020-01-271-15/+15
|
* 5926Kartik Agaram2020-01-271-12/+12
|
* 5924Kartik Agaram2020-01-2723-518/+518
|
* 5923 - start work on code-generation for 'var'Kartik Agaram2020-01-272-3/+45
|
* 5921Kartik Agaram2020-01-262-5/+130
|