diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-02-21 10:05:04 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-02-21 10:09:59 -0800 |
commit | fee1bbd8b4681acca7daba1b3b70ce6d26e52fb4 (patch) | |
tree | ceae46b4b130d02eac6de7cc2379ebcd61bf9564 /mu_instructions | |
parent | 1837f6117632c80214f45ed94a0d3406810e431f (diff) | |
download | mu-fee1bbd8b4681acca7daba1b3b70ce6d26e52fb4.tar.gz |
6041 - array indexing starting to work
And we're using it now in factorial.mu! In the process I had to fix a couple of bugs in pointer dereferencing. There are still some limitations: a) Indexing by a literal doesn't work yet. b) Only arrays of ints supported so far. Looking ahead, I'm not sure how I can support indexing arrays by non-literals (variables in registers) unless the element size is a power of 2.
Diffstat (limited to 'mu_instructions')
-rw-r--r-- | mu_instructions | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/mu_instructions b/mu_instructions index 35f9e141..017527b9 100644 --- a/mu_instructions +++ b/mu_instructions @@ -205,4 +205,14 @@ loop label {.name="loop", .inouts=[label], break {.name="break", .subx-name="e9/jump break/disp32"} break label {.name="break", .inouts=[label], .subx-name="e9/jump", .disp32=inouts[0] ":break"} +Array operations + +var/reg <- length var2/reg2: (addr array T) + {.name="length", .inouts=[reg2], .outputs=[reg1], .subx-name="8b/copy-from", .rm32="*" inouts[0], .r32=outputs[0]} +var/reg <- index arr/rega: (addr array T), idx/regi: int + {.name="index", .inouts=[rega, regi], .outputs=[reg], .subx-name="8d/copy-address", .rm32="*(" inouts[0] "+" inouts[1] "<<2)", .r32=outputs[0]} +var/reg <- index arr/rega: (addr array T), n +compare var, n {.name="compare", .inouts=[var, n], .subx-name="81 7/subop/compare", .rm32="*(ebp+" inouts[0].stack-offset ")", .imm32=inouts[1]} + {.name="index", .inouts=[rega, n], .outputs=[reg], .subx-name="8d/copy-address", .rm32="*(" inouts[0] "+" inouts[1] "<<2)", .r32=outputs[0]} + vim:ft=c:nowrap |