about summary refs log tree commit diff stats
path: root/apps
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2019-08-23 14:23:25 -0700
committerKartik Agaram <vc@akkartik.com>2019-08-23 14:23:25 -0700
commit88469e78aeff2d3e81279a23084d0abd06ec6206 (patch)
tree33a62ebe0aa93ff58ed5738a39867d3ad39ceae1 /apps
parent4b296ceef993d2a668d2ff4e86ff6715be5e6bcd (diff)
downloadmu-88469e78aeff2d3e81279a23084d0abd06ec6206.tar.gz
.
Some reorg as I realize I may have painted myself into a corner in this
function. I have no registers left for the actual parsing.
Diffstat (limited to 'apps')
-rwxr-xr-xapps/desugarbin39788 -> 40139 bytes
-rw-r--r--apps/desugar.subx16
2 files changed, 12 insertions, 4 deletions
diff --git a/apps/desugar b/apps/desugar
index 5a4ddfc3..7244b529 100755
--- a/apps/desugar
+++ b/apps/desugar
Binary files differdiff --git a/apps/desugar.subx b/apps/desugar.subx
index c1b84688..ede6dbbc 100644
--- a/apps/desugar.subx
+++ b/apps/desugar.subx
@@ -1052,17 +1052,22 @@ parse-effective-address:  # word : (address slice) -> base/EAX, index/ECX, scale
     89/copy                         3/mod/direct    5/rm32/EBP    .           .             .           4/r32/ESP   .               .                 # copy ESP to EBP
     # . save registers
     56/push-ESI
+    57/push-EDI
     # ESI = word
     8b/copy                         1/mod/*+disp8   5/rm32/EBP    .           .             .           6/r32/ESI   8/disp8         .                 # copy *(EBP+8) to ESI
-    # skip '*'
+    # ++word->start to skip '*'
     ff          0/subop/increment   0/mod/indirect  6/rm32/ESI    .           .             .           .           .               .                 # increment *ESI
     # initialize defaults
-    b8/copy-to-EAX  0/imm32
+    # base is in EDI; we'll move it to EAX just before we return
+    bf/copy-to-EDI  0/imm32
     b9/copy-to-ECX  4/imm32/no-index
     ba/copy-to-EDX  0/imm32/.scale
     bb/copy-to-EBX  0/imm32/disp
     # if (*word->start == '(') goto next check
-    81          7/subop/compare     0/mod/indirect  6/rm32/ESI    .           .             .           .           .               0x28/imm32/open-paren  # compare *ESI
+    8b/copy                         0/mod/indirect  6/rm32/ESI    .           .             .           0/r32/EAX   .               .                 # copy *ESI to EAX
+    8a/copy-byte                    0/mod/indirect  0/rm32/EAX    .           .             .           0/r32/AL    .               .                 # copy byte at *EAX to AL
+    81          4/subop/and         3/mod/direct    0/rm32/EAX    .           .             .           .           .               0xff/imm32        # bitwise and of EAX
+    3d/compare-EAX-and  0x28/imm32/open-paren
     74/jump-if-equal  $parse-effective-address:compound-expression/disp8
 #?     ff          0/subop/increment   0/mod/indirect  6/rm32/ESI    .           .             .           .           .               .                 # increment *ESI
 $parse-effective-address:simple-register:
@@ -1078,12 +1083,15 @@ $parse-effective-address:simple-register:
     # . . discard args
     81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               0x10/imm32        # add to ESP
     # . base = *EAX
-    8b/copy                         0/mod/indirect  0/rm32/EAX    .           .             .           0/r32/EAX   .               .                 # copy *EAX to EAX
+    8b/copy                         0/mod/indirect  0/rm32/EAX    .           .             .           7/r32/EDI   .               .                 # copy *EAX to EDI
     # return
     eb/jump  $parse-effective-address:end/disp8
 $parse-effective-address:compound-expression:
 $parse-effective-address:end:
+    # return base in EAX
+    89/copy                         3/mod/direct    0/rm32/EAX    .           .             .           7/r32/EDI   .               .                 # copy EDI to EAX
     # . restore registers
+    5f/pop-to-EDI
     5e/pop-to-ESI
     # . epilog
     89/copy                         3/mod/direct    4/rm32/ESP    .           .             .           5/r32/EBP   .               .                 # copy EBP to ESP