about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-03-11 18:11:27 -0700
committerKartik Agaram <vc@akkartik.com>2020-03-11 18:16:56 -0700
commit15655a12461c0a46c0a50af7e6143cd4258c89af (patch)
treeb3f32e62d3e540db0cc4739581b4ac013e2a1a2a
parent39eb1e4963731816e28ffa910098e2de622d8de0 (diff)
downloadmu-15655a12461c0a46c0a50af7e6143cd4258c89af.tar.gz
6126 - support 8-byte register names
Using these is quite unsafe. But what isn't, here?
-rw-r--r--090register-names.subx14
-rwxr-xr-xapps/bracesbin42546 -> 42658 bytes
-rwxr-xr-xapps/callsbin47207 -> 47319 bytes
-rwxr-xr-xapps/mubin187308 -> 187420 bytes
-rw-r--r--apps/mu.subx6
-rwxr-xr-xapps/sigilsbin54931 -> 55043 bytes
-rw-r--r--subx_opcodes21
7 files changed, 26 insertions, 15 deletions
diff --git a/090register-names.subx b/090register-names.subx
index 712bbfb4..59f1e701 100644
--- a/090register-names.subx
+++ b/090register-names.subx
@@ -1,9 +1,9 @@
 == data
 Registers:  # (table string int)
   # a table is a stream
-  0x40/imm32/write
+  0x80/imm32/write
   0/imm32/read
-  0x40/imm32/length
+  0x80/imm32/length
   # data
   "eax"/imm32  0/imm32
   "ecx"/imm32  1/imm32
@@ -13,3 +13,13 @@ Registers:  # (table string int)
   "ebp"/imm32  5/imm32
   "esi"/imm32  6/imm32
   "edi"/imm32  7/imm32
+  # for 8-byte registers
+  # we don't actually check if these are used when they should be; be careful
+  "al"/imm32   0/imm32
+  "cl"/imm32   1/imm32
+  "dl"/imm32   2/imm32
+  "bl"/imm32   3/imm32
+  "ah"/imm32   4/imm32
+  "ch"/imm32   5/imm32
+  "dh"/imm32   6/imm32
+  "bh"/imm32   7/imm32
diff --git a/apps/braces b/apps/braces
index 1c4f8596..0de3adb7 100755
--- a/apps/braces
+++ b/apps/braces
Binary files differdiff --git a/apps/calls b/apps/calls
index f22a1b2c..4015ed83 100755
--- a/apps/calls
+++ b/apps/calls
Binary files differdiff --git a/apps/mu b/apps/mu
index 53ad29ff..29ec9329 100755
--- a/apps/mu
+++ b/apps/mu
Binary files differdiff --git a/apps/mu.subx b/apps/mu.subx
index 138ff94e..4aac8ada 100644
--- a/apps/mu.subx
+++ b/apps/mu.subx
@@ -7523,7 +7523,7 @@ power-of-2?:  # n: int -> result/eax: boolean
     0b/and-> *(ebp+8) 0/r32/eax
     # return (tmp2 == 0)
     3d/compare-eax-and 0/imm32
-    0f 94/set-if-= %eax
+    0f 94/set-byte-if-= %al
     81 4/subop/and %eax 0xff/imm32
 $power-of-2?:end:
     # . epilogue
@@ -9714,7 +9714,7 @@ subx-type-equal?:  # a: (handle tree type-id), b: (handle tree type-id) -> resul
     (is-simple-mu-type? *(ebp+0xc) 0)  # => eax
     # return alit == blit
     39/compare %eax 1/r32/ecx
-    0f 94/set-if-= %eax
+    0f 94/set-byte-if-= %al
     81 4/subop/and %eax 0xff/imm32
 $subx-type-equal?:end:
     # . restore registers
@@ -9735,7 +9735,7 @@ is-simple-mu-type?:  # a: (handle tree type-id), n: type-id -> result/eax: boole
     # return (a->value == n)
     8b/-> *(ebp+8) 0/r32/eax
     39/compare *eax 1/r32/ecx  # Atom-type
-    0f 94/set-if-= %eax
+    0f 94/set-byte-if-= %al
     81 4/subop/and %eax 0xff/imm32
 $is-simple-mu-type?:end:
     # . restore registers
diff --git a/apps/sigils b/apps/sigils
index 10877010..c738b004 100755
--- a/apps/sigils
+++ b/apps/sigils
Binary files differdiff --git a/subx_opcodes b/subx_opcodes
index 688a6e26..6706a695 100644
--- a/subx_opcodes
+++ b/subx_opcodes
@@ -50,6 +50,7 @@ Opcodes currently supported by SubX:
   5e: pop top of stack to ESI (pop)
   5f: pop top of stack to EDI (pop)
   68: push imm32 to stack (push)
+  69: multiply rm32 by imm32 and store result in r32
   72: jump disp8 bytes away if lesser (unsigned), if CF is set (jcc/jb/jnae)
   73: jump disp8 bytes away if greater or equal (unsigned), if CF is unset (jcc/jae/jnb)
   74: jump disp8 bytes away if equal, if ZF is set (jcc/jz/je)
@@ -99,16 +100,16 @@ Opcodes currently supported by SubX:
   0f 8d: jump disp32 bytes away if greater or equal (signed), if SF == OF (jcc/jge/jnl)
   0f 8e: jump disp32 bytes away if lesser or equal (signed), if ZF is set or SF != OF (jcc/jle/jng)
   0f 8f: jump disp32 bytes away if greater (signed), if ZF is unset and SF == OF (jcc/jg/jnle)
-  0f 92: set rm32 to 1 if lesser (unsigned), if CF is set, 0 otherwise (setcc/setb/setnae)
-  0f 93: set rm32 to 1 if greater or equal (unsigned), if CF is unset, 0 otherwise (setcc/setae/setnb)
-  0f 94: set rm32 to 1 if equal, if ZF is set, 0 otherwise (setcc/setz/sete)
-  0f 95: set rm32 to 1 if not equal, if ZF is not set, 0 otherwise (setcc/setnz/setne)
-  0f 96: set rm32 to 1 if lesser or equal (unsigned), if ZF is set or CF is set, 0 otherwise (setcc/setbe/setna)
-  0f 97: set rm32 to 1 if greater (unsigned), if ZF is unset and CF is unset, 0 otherwise (setcc/seta/setnbe)
-  0f 9c: set rm32 to 1 if lesser (signed), if SF != OF, 0 otherwise (setcc/setl/setnge)
-  0f 9d: set rm32 to 1 if greater or equal (signed), if SF == OF, 0 otherwise (setcc/setge/setnl)
-  0f 9e: set rm32 to 1 if lesser or equal (signed), if ZF is set or SF != OF, 0 otherwise (setcc/setle/setng)
-  0f 9f: set rm32 to 1 if greater (signed), if ZF is unset and SF == OF, 0 otherwise (setcc/setg/setnle)
+  0f 92: set r8/m8-at-rm32 to 1 if lesser (unsigned), if CF is set, 0 otherwise (setcc/setb/setnae)
+  0f 93: set r8/m8-at-rm32 to 1 if greater or equal (unsigned), if CF is unset, 0 otherwise (setcc/setae/setnb)
+  0f 94: set r8/m8-at-rm32 to 1 if equal, if ZF is set, 0 otherwise (setcc/setz/sete)
+  0f 95: set r8/m8-at-rm32 to 1 if not equal, if ZF is not set, 0 otherwise (setcc/setnz/setne)
+  0f 96: set r8/m8-at-rm32 to 1 if lesser or equal (unsigned), if ZF is set or CF is set, 0 otherwise (setcc/setbe/setna)
+  0f 97: set r8/m8-at-rm32 to 1 if greater (unsigned), if ZF is unset and CF is unset, 0 otherwise (setcc/seta/setnbe)
+  0f 9c: set r8/m8-at-rm32 to 1 if lesser (signed), if SF != OF, 0 otherwise (setcc/setl/setnge)
+  0f 9d: set r8/m8-at-rm32 to 1 if greater or equal (signed), if SF == OF, 0 otherwise (setcc/setge/setnl)
+  0f 9e: set r8/m8-at-rm32 to 1 if lesser or equal (signed), if ZF is set or SF != OF, 0 otherwise (setcc/setle/setng)
+  0f 9f: set r8/m8-at-rm32 to 1 if greater (signed), if ZF is unset and SF == OF, 0 otherwise (setcc/setg/setnle)
   0f af: multiply rm32 into r32 (imul)
 Run `bootstrap help instructions` for details on words like 'r32' and 'disp8'.
 For complete details on these instructions, consult the IA-32 manual (volume 2).