diff options
author | Kartik Agaram <vc@akkartik.com> | 2019-12-26 00:11:25 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2019-12-26 00:16:36 -0800 |
commit | c74e5009e0c2605b868d4c84aed09aa422009ce8 (patch) | |
tree | 617faa924e95bc6b1d7b2ac31733479ca69c80f3 | |
parent | 4ca4e94dce9a2913702cd0ef540646eee1a24911 (diff) | |
download | mu-c74e5009e0c2605b868d4c84aed09aa422009ce8.tar.gz |
5824 - code-generation for all inc/dec opcodes
-rwxr-xr-x | apps/mu | bin | 65962 -> 67129 bytes | |||
-rw-r--r-- | apps/mu.subx | 201 |
2 files changed, 199 insertions, 2 deletions
diff --git a/apps/mu b/apps/mu index 9eff4b90..2e2174d9 100755 --- a/apps/mu +++ b/apps/mu Binary files differdiff --git a/apps/mu.subx b/apps/mu.subx index 74be1b27..e57ff2c7 100644 --- a/apps/mu.subx +++ b/apps/mu.subx @@ -2789,6 +2789,117 @@ $emit-subx-statement:abort: # Primitives supported == data Primitives: +# - hardcoded registers (must come first) +_Primitive-inc-eax: + "increment"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-eax/imm32/outputs + "40/increment-eax"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-inc-ecx/imm32/next +_Primitive-inc-ecx: + "increment"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-ecx/imm32/outputs + "41/increment-ecx"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-inc-edx/imm32/next +_Primitive-inc-edx: + "increment"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-edx/imm32/outputs + "42/increment-edx"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-inc-ebx/imm32/next +_Primitive-inc-ebx: + "increment"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-ebx/imm32/outputs + "43/increment-ebx"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-inc-esi/imm32/next +_Primitive-inc-esi: + "increment"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-esi/imm32/outputs + "46/increment-esi"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-inc-edi/imm32/next +_Primitive-inc-edi: + "increment"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-edi/imm32/outputs + "47/increment-edi"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-dec-eax/imm32/next +_Primitive-dec-eax: + "decrement"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-eax/imm32/outputs + "48/decrement-eax"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-dec-ecx/imm32/next +_Primitive-dec-ecx: + "decrement"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-ecx/imm32/outputs + "49/decrement-ecx"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-dec-edx/imm32/next +_Primitive-dec-edx: + "decrement"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-edx/imm32/outputs + "4a/decrement-edx"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-dec-ebx/imm32/next +_Primitive-dec-ebx: + "decrement"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-ebx/imm32/outputs + "4b/decrement-ebx"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-dec-esi/imm32/next +_Primitive-dec-esi: + "decrement"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-esi/imm32/outputs + "4e/decrement-esi"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-dec-edi/imm32/next +_Primitive-dec-edi: + "decrement"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-edi/imm32/outputs + "4f/decrement-edi"/imm32/subx-name + 0/imm32/no-rm32 + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-inc-mem/imm32/next +# - flexible registers +_Primitive-inc-mem: # increment var => ff 0/subop/increment *(ebp+__) "increment"/imm32/name Single-int-var-on-stack/imm32/inouts @@ -2807,6 +2918,26 @@ _Primitive-inc-reg: 3/imm32/rm32-is-first-output 0/imm32/no-r32 0/imm32/no-imm32 + _Primitive-dec-mem/imm32/next +_Primitive-dec-mem: + # decrement var => ff 1/subop/decrement *(ebp+__) + "decrement"/imm32/name + Single-int-var-on-stack/imm32/inouts + 0/imm32/no-outputs + "ff 1/subop/decrement"/imm32/subx-name + 1/imm32/rm32-is-first-inout + 0/imm32/no-r32 + 0/imm32/no-imm32 + _Primitive-dec-reg/imm32/next +_Primitive-dec-reg: + # var/reg <- decrement => ff 1/subop/decrement %__ + "decrement"/imm32/name + 0/imm32/no-inouts + Single-int-var-in-some-register/imm32/outputs + "ff 1/subop/decrement"/imm32/subx-name + 3/imm32/rm32-is-first-output + 0/imm32/no-r32 + 0/imm32/no-imm32 _Primitive-add-reg-to-reg/imm32/next _Primitive-add-reg-to-reg: # var1/reg <- add var2/reg => 01 var1/rm32 var2/r32 @@ -2889,6 +3020,72 @@ Int-var-in-some-register: 0/imm32/no-stack-offset "*"/imm32/register +Single-int-var-in-eax: + Int-var-in-eax/imm32 + 0/imm32/next + +Int-var-in-eax: + "arg1"/imm32/name + 1/imm32/type-int + 1/imm32/some-block-depth + 0/imm32/no-stack-offset + "eax"/imm32/register + +Single-int-var-in-ecx: + Int-var-in-ecx/imm32 + 0/imm32/next + +Int-var-in-ecx: + "arg1"/imm32/name + 1/imm32/type-int + 1/imm32/some-block-depth + 0/imm32/no-stack-offset + "ecx"/imm32/register + +Single-int-var-in-edx: + Int-var-in-edx/imm32 + 0/imm32/next + +Int-var-in-edx: + "arg1"/imm32/name + 1/imm32/type-int + 1/imm32/some-block-depth + 0/imm32/no-stack-offset + "edx"/imm32/register + +Single-int-var-in-ebx: + Int-var-in-ebx/imm32 + 0/imm32/next + +Int-var-in-ebx: + "arg1"/imm32/name + 1/imm32/type-int + 1/imm32/some-block-depth + 0/imm32/no-stack-offset + "ebx"/imm32/register + +Single-int-var-in-esi: + Int-var-in-esi/imm32 + 0/imm32/next + +Int-var-in-esi: + "arg1"/imm32/name + 1/imm32/type-int + 1/imm32/some-block-depth + 0/imm32/no-stack-offset + "esi"/imm32/register + +Single-int-var-in-edi: + Int-var-in-edi/imm32 + 0/imm32/next + +Int-var-in-edi: + "arg1"/imm32/name + 1/imm32/type-int + 1/imm32/some-block-depth + 0/imm32/no-stack-offset + "edi"/imm32/register + Single-lit-var: Lit-var/imm32 0/imm32/next @@ -3751,7 +3948,7 @@ test-increment-register: # Select the right primitive between overloads. # foo <- increment # => - # ff 0/subop/increment %eax # sub-optimal, but should suffice + # 50/increment-eax # # There's a variable on the var stack as follows: # name: 'foo' @@ -3796,7 +3993,7 @@ test-increment-register: #? (rewind-stream _test-output-stream) #? # }}} # check output - (check-next-stream-line-equal _test-output-stream "ff 0/subop/increment %eax" "F - test-increment-register") + (check-next-stream-line-equal _test-output-stream "40/increment-eax" "F - test-increment-register") # . epilogue 89/<- %esp 5/r32/ebp 5d/pop-to-ebp |