about summary refs log tree commit diff stats
path: root/apps/desugar.subx
diff options
context:
space:
mode:
Diffstat (limited to 'apps/desugar.subx')
-rw-r--r--apps/desugar.subx16
1 files changed, 12 insertions, 4 deletions
diff --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