diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-11-06 22:47:57 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-11-06 22:47:57 -0800 |
commit | bf3783ada071aeaee8f22bfc944fee8503768539 (patch) | |
tree | 6aec9398a30af43f03a5d8ca66bb1b907dc1c713 | |
parent | 88e53f56289a77c00caeeab2a4e1bc44539c43a0 (diff) | |
download | mu-bf3783ada071aeaee8f22bfc944fee8503768539.tar.gz |
7203
-rw-r--r-- | html/mu_instructions.html | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/html/mu_instructions.html b/html/mu_instructions.html index 858e9d27..2403bdff 100644 --- a/html/mu_instructions.html +++ b/html/mu_instructions.html @@ -239,6 +239,22 @@ Comparisons must always start with a register: compare var1/xreg1, var2/xreg2 => <span class="Constant">"0f 2f/compare %"</span> xreg2 <span class="Constant">" "</span> xreg1 <span class="Constant">"/x32"</span> compare var1/xreg1, var2 => <span class="Constant">"0f 2f/compare *(ebp+"</span> var2.stack-offset <span class="Constant">") "</span> xreg1 <span class="Constant">"/x32"</span> +<span class="muComment">## Blocks</span> + +In themselves, blocks generate no instructions. However, if a block contains +variable declarations, they must be cleaned up when the block ends. + +Clean up var on the stack => <span class="Constant">"81 0/subop/add %esp "</span> size-of(var) <span class="Constant">"/imm32"</span> +Clean up var/reg => <span class="Constant">"8f 0/subop/pop %"</span> reg + +Clean up var/xreg => <span class="Constant">"f3 0f 10/-> *esp "</span> xreg <span class="Constant">"/x32"</span> + <span class="Constant">"81 0/subop/add %esp 4/imm32"</span> + +<span class="muComment">## Jumps</span> + +Besides having to clean up any variable declarations (see above) between +themselves and their target, jumps translate like this: + <span class="PreProc">break</span> => <span class="Constant">"e9/jump break/disp32"</span> <span class="PreProc">break</span> label => <span class="Constant">"e9/jump "</span> label <span class="Constant">":break/disp32"</span> <span class="PreProc">loop</span> => <span class="Constant">"e9/jump loop/disp32"</span> @@ -298,6 +314,17 @@ Similar float variants like `<span class="PreProc">break-if-float<`</span> ar `addr` equivalents. The x86 instruction set stupidly has floating-point operations only update a subset of flags. +<span class="muComment">## Returns</span> + +The `<span class="PreProc">return</span>` instruction cleans up variable declarations just like an unconditional +`<span class="PreProc">jump</span>` to end of function, but also emits a series of copies before the final +`<span class="PreProc">jump</span>`, copying each argument of `<span class="PreProc">return</span>` to the register appropriate to the +respective function output. This doesn't work if a function output register +contains a later `<span class="PreProc">return</span>` argument (e.g. if the registers for two outputs are +swapped in `<span class="PreProc">return</span>`), so you can't do that. + +<span class="PreProc">return</span> => <span class="Constant">"c3/return"</span> + --- In the following instructions types are provided for clarity even if they must |