diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-02-01 12:14:12 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-02-01 12:14:20 -0800 |
commit | 924ed08aca2fe78cc4d1dd1a0538434f0846e717 (patch) | |
tree | 82ef65c61ef037b82b85766f2f41478c828226fa /mu_instructions | |
parent | 9977cfe53cc95df50f5fb813de327ca0887c5176 (diff) | |
download | mu-924ed08aca2fe78cc4d1dd1a0538434f0846e717.tar.gz |
5968
Diffstat (limited to 'mu_instructions')
-rw-r--r-- | mu_instructions | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/mu_instructions b/mu_instructions index 3fd3a64e..398a21e6 100644 --- a/mu_instructions +++ b/mu_instructions @@ -127,16 +127,22 @@ compare var, n {.name="compare", .inouts=[var, n], var/reg <- multiply var2 {.name="multiply", .inouts=[var2], .outputs=[reg], .subx-name="0f af/multiply", .rm32="*(ebp+" inouts[0].stack-offset ")", .r32=outputs[0]} Jumps have a slightly simpler format. Most of the time they take no inouts or -outputs. Occasionally you give them a label for a block to jump to the start -or end of. +outputs. Occasionally you give them a label for a containing block to jump to +the start or end of. break-if-= {.name="break-if-=", .subx-name="0f 84/jump-if-= break/disp32"} break-if-= label {.name="break-if-=", .inouts=[label], .subx-name="0f 84/jump-if-=", .disp32=inouts[0] ":break"} break-if-!= {.name="break-if-!=", .subx-name="0f 85/jump-if-!= break/disp32"} break-if-!= label {.name="break-if-!=", .inouts=[label], .subx-name="0f 85/jump-if-!=", .disp32=inouts[0] ":break"} -Inequalities are similar, but have unsigned and signed variants. We assume -unsigned variants are only ever used to compare addresses. +break-if-< {.name="break-if-<", .subx-name="0f 8c/jump-if-< break/disp32"} +break-if-< label {.name="break-if-<", .inouts=[label], .subx-name="0f 8c/jump-if-<", .disp32=inouts[0] ":break"} +break-if-> {.name="break-if->", .subx-name="0f 8f/jump-if-> break/disp32"} +break-if-> label {.name="break-if->", .inouts=[label], .subx-name="0f 8f/jump-if->", .disp32=inouts[0] ":break"} +break-if-<= {.name="break-if-<=", .subx-name="0f 8e/jump-if-<= break/disp32"} +break-if-<= label {.name="break-if-<=", .inouts=[label], .subx-name="0f 8e/jump-if-<=", .disp32=inouts[0] ":break"} +break-if->= {.name="break-if->=", .subx-name="0f 8d/jump-if->= break/disp32"} +break-if->= label {.name="break-if->=", .inouts=[label], .subx-name="0f 8d/jump-if->=", .disp32=inouts[0] ":break"} break-if-addr< {.name="break-if-addr<", .subx-name="0f 82/jump-if-addr< break/disp32"} break-if-addr< label {.name="break-if-addr<", .inouts=[label], .subx-name="0f 82/jump-if-addr<", .disp32=inouts[0] ":break"} @@ -147,15 +153,6 @@ break-if-addr<= label {.name="break-if-addr<=", .inouts=[label], break-if-addr>= {.name="break-if-addr>=", .subx-name="0f 83/jump-if-addr>= break/disp32"} break-if-addr>= label {.name="break-if-addr>=", .inouts=[label], .subx-name="0f 83/jump-if-addr>=", .disp32=inouts[0] ":break"} -break-if-< {.name="break-if-<", .subx-name="0f 8c/jump-if-< break/disp32"} -break-if-< label {.name="break-if-<", .inouts=[label], .subx-name="0f 8c/jump-if-<", .disp32=inouts[0] ":break"} -break-if-> {.name="break-if->", .subx-name="0f 8f/jump-if-> break/disp32"} -break-if-> label {.name="break-if->", .inouts=[label], .subx-name="0f 8f/jump-if->", .disp32=inouts[0] ":break"} -break-if-<= {.name="break-if-<=", .subx-name="0f 8e/jump-if-<= break/disp32"} -break-if-<= label {.name="break-if-<=", .inouts=[label], .subx-name="0f 8e/jump-if-<=", .disp32=inouts[0] ":break"} -break-if->= {.name="break-if->=", .subx-name="0f 8d/jump-if->= break/disp32"} -break-if->= label {.name="break-if->=", .inouts=[label], .subx-name="0f 8d/jump-if->=", .disp32=inouts[0] ":break"} - Finally, we repeat all the 'break' variants almost identically for 'loop' instructions. This works because the compiler inserts ':loop' labels at the start of such named blocks, and ':break' labels at the end. @@ -165,15 +162,6 @@ loop-if-= label {.name="loop-if-=", .inouts=[label], loop-if-!= {.name="loop-if-!=", .subx-name="0f 85/jump-if-!= loop/disp32"} loop-if-!= label {.name="loop-if-!=", .inouts=[label], .subx-name="0f 85/jump-if-!=", .disp32=inouts[0] ":loop"} -loop-if-addr< {.name="loop-if-addr<", .subx-name="0f 82/jump-if-addr< loop/disp32"} -loop-if-addr< label {.name="loop-if-addr<", .inouts=[label], .subx-name="0f 82/jump-if-addr<", .disp32=inouts[0] ":loop"} -loop-if-addr> {.name="loop-if-addr>", .subx-name="0f 87/jump-if-addr> loop/disp32"} -loop-if-addr> label {.name="loop-if-addr>", .inouts=[label], .subx-name="0f 87/jump-if-addr>", .disp32=inouts[0] ":loop"} -loop-if-addr<= {.name="loop-if-addr<=", .subx-name="0f 86/jump-if-addr<= loop/disp32"} -loop-if-addr<= label {.name="loop-if-addr<=", .inouts=[label], .subx-name="0f 86/jump-if-addr<=", .disp32=inouts[0] ":loop"} -loop-if-addr>= {.name="loop-if-addr>=", .subx-name="0f 83/jump-if-addr>= loop/disp32"} -loop-if-addr>= label {.name="loop-if-addr>=", .inouts=[label], .subx-name="0f 83/jump-if-addr>=", .disp32=inouts[0] ":loop"} - loop-if-< {.name="loop-if-<", .subx-name="0f 8c/jump-if-< loop/disp32"} loop-if-< label {.name="loop-if-<", .inouts=[label], .subx-name="0f 8c/jump-if-<", .disp32=inouts[0] ":loop"} loop-if-> {.name="loop-if->", .subx-name="0f 8f/jump-if-> loop/disp32"} @@ -183,10 +171,20 @@ loop-if-<= label {.name="loop-if-<=", .inouts=[label], loop-if->= {.name="loop-if->=", .subx-name="0f 8d/jump-if->= loop/disp32"} loop-if->= label {.name="loop-if->=", .inouts=[label], .subx-name="0f 8d/jump-if->=", .disp32=inouts[0] ":loop"} -There are also unconditional loop instructions. So far it doesn't seem like -unconditional breaks have much use. +loop-if-addr< {.name="loop-if-addr<", .subx-name="0f 82/jump-if-addr< loop/disp32"} +loop-if-addr< label {.name="loop-if-addr<", .inouts=[label], .subx-name="0f 82/jump-if-addr<", .disp32=inouts[0] ":loop"} +loop-if-addr> {.name="loop-if-addr>", .subx-name="0f 87/jump-if-addr> loop/disp32"} +loop-if-addr> label {.name="loop-if-addr>", .inouts=[label], .subx-name="0f 87/jump-if-addr>", .disp32=inouts[0] ":loop"} +loop-if-addr<= {.name="loop-if-addr<=", .subx-name="0f 86/jump-if-addr<= loop/disp32"} +loop-if-addr<= label {.name="loop-if-addr<=", .inouts=[label], .subx-name="0f 86/jump-if-addr<=", .disp32=inouts[0] ":loop"} +loop-if-addr>= {.name="loop-if-addr>=", .subx-name="0f 83/jump-if-addr>= loop/disp32"} +loop-if-addr>= label {.name="loop-if-addr>=", .inouts=[label], .subx-name="0f 83/jump-if-addr>=", .disp32=inouts[0] ":loop"} + +Finally, unconditional jumps: loop {.name="loop", .subx-name="e9/jump loop/disp32"} loop label {.name="loop", .inouts=[label], .subx-name="e9/jump", .disp32=inouts[0] ":loop"} +(So far it doesn't seem like unconditional breaks have much use.) + vim:ft=c:nowrap |