about summary refs log tree commit diff stats
path: root/subx/apps
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2019-05-22 21:52:45 -0700
committerKartik Agaram <vc@akkartik.com>2019-05-22 21:54:30 -0700
commit912dc904eb3bb69f25a8b78977fa9137b6602163 (patch)
tree29fe197d74c7008d5c4c78c3224cdecef711a6dc /subx/apps
parent3a0446237e255e56202a4f1f9662da64b59a80ab (diff)
downloadmu-912dc904eb3bb69f25a8b78977fa9137b6602163.tar.gz
5219
After fixing bugs, checking alloc_ids now requires 9 instructions rather
than 6.
Diffstat (limited to 'subx/apps')
-rwxr-xr-xsubx/apps/handlebin19426 -> 19478 bytes
-rw-r--r--subx/apps/handle.subx36
2 files changed, 26 insertions, 10 deletions
diff --git a/subx/apps/handle b/subx/apps/handle
index 5b1156a6..3d355737 100755
--- a/subx/apps/handle
+++ b/subx/apps/handle
Binary files differdiff --git a/subx/apps/handle.subx b/subx/apps/handle.subx
index f64d8ee1..60b4021a 100644
--- a/subx/apps/handle.subx
+++ b/subx/apps/handle.subx
@@ -15,10 +15,11 @@
 # To run (from the subx directory):
 #   $ ./subx translate *.subx apps/handle.subx -o apps/handle
 #   $ ./subx run apps/handle
-# Expected result is a hard abort:
-#   ........lookup failed
-# (This file is a prototype, so the tests in this file aren't real tests. Don't
-# expect to run anything in the same process after they've completed.)
+# Expected result is a successful lookup followed by a hard abort:
+#   lookup succeeded
+#   lookup failed
+# (This file is a prototype. The 'tests' in it aren't real; failures are
+# expected.)
 
 == code
 #   instruction                     effective address                                                   register    displacement    immediate
@@ -212,15 +213,22 @@ lookup:  # h : (handle T) -> EAX : (address T)
     # EAX = handle
     8b/copy                         1/mod/*+disp8   5/rm32/EBP    .           .             .           0/r32/EAX   8/disp8         .                 # copy *(EBP+8) to EAX
     # - inline {
+    # push handle->alloc_id
+    ff          6/subop/push        0/mod/indirect  0/rm32/EAX    .           .             .           .           .               .                 # push *EAX
+    # EAX = handle->address (payload)
+    8b/copy                         1/mod/*+disp8   0/rm32/EAX    .           .             .           .           4/disp8         .                 # copy *(EAX+4) to EAX
     # push handle->address
-    ff          6/subop/push        1/mod/*+disp8   0/rm32/EAX    .           .             .           .           4/disp8         .                 # push *(EAX+4)
-    # EAX = handle->alloc_id
-    8b/copy                         0/mod/indirect  0/rm32/EAX    .           .             .           0/r32/EAX   .               .                 # copy *EAX to EAX
-    # if (EAX != *ESP) abort
-    39/compare                      0/mod/indirect  4/rm32/sib    4/base/ESP  4/index/none  .           0/r32/EAX   .               .                 # compare *ESP and EAX
+    50/push-EAX
+    # EAX = payload->alloc_id
+    8b/copy                         0/mod/indirect  0/rm32/EAX    .           .             .           .           .               .                 # copy *EAX to EAX
+    # if (EAX != handle->alloc_id) abort
+    39/compare                      1/mod/*+disp8   4/rm32/sib    4/base/ESP  4/index/none  .           0/r32/EAX   4/disp8         .                 # compare *(ESP+4) and EAX
     75/jump-if-not-equal  $lookup:abort/disp8
-    # return ESP+4
+    # EAX = pop handle->address
     58/pop-to-EAX
+    # discard handle->alloc_id
+    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               4/imm32           # add to ESP
+    # add 4
     05/add-to-EAX  4/imm32
     # - }
     # . epilog
@@ -295,6 +303,14 @@ test-lookup-success:
     # clean up
     # . *Next-alloc-id = 1
     c7          0/subop/copy        0/mod/indirect  5/rm32/.disp32            .             .           .     Next-alloc-id/disp32  1/imm32           # copy to *Next-alloc-id
+    # write(2/stderr, "lookup succeeded\n")
+    # . . push args
+    68/push  "lookup succeeded\n"/imm32
+    68/push  2/imm32/stderr
+    # . . call
+    e8/call  write/disp32
+    # . . discard args
+    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
     # . restore registers
     5a/pop-to-EDX
     59/pop-to-ECX