From c216d0fbbb607f1d8a3b6d909244eadf47d6a0ef Mon Sep 17 00:00:00 2001 From: julianb0 Date: Fri, 5 Jul 2019 14:06:14 +0200 Subject: [PATCH] vm --- ka/crt/fmt/doprnt.k | 2 +- ka/crt/fmt/ltostr.k | 5 ++--- ka/crt/fmt/strtol.k | 4 ++-- ka/crt/str/strlen.k | 5 ++--- ka/usr/cmd/dir.k | 3 +-- vm/in/LOGIC | 25 +++++++++++++++---------- vm/in/MOV | 2 +- 7 files changed, 24 insertions(+), 22 deletions(-) diff --git a/ka/crt/fmt/doprnt.k b/ka/crt/fmt/doprnt.k index 7006e75..7e28529 100644 --- a/ka/crt/fmt/doprnt.k +++ b/ka/crt/fmt/doprnt.k @@ -197,7 +197,7 @@ doprnt: call nx3 ; did putc fail? - cmp rax, 0 + test rax, rax xor.nz nx0, nx0 ; yes, so artificially set n=0 ret diff --git a/ka/crt/fmt/ltostr.k b/ka/crt/fmt/ltostr.k index e3961e3..8423aa4 100644 --- a/ka/crt/fmt/ltostr.k +++ b/ka/crt/fmt/ltostr.k @@ -12,7 +12,7 @@ itoa: ; void utoa(char *buf, int num, int base) ; utoa: - sub ax3, ax3 + xor ax3, ax3 jmp ltostr ; @@ -44,8 +44,7 @@ ltostr: .conv: b.e ax1, 0, .fini - mov r10, ax1 - rem r10, ax2 ; ax1 % base + rem r10, ax1, ax2 ; ax1 % base b.a r10, 9, .nondec ; r10 > 9 ? diff --git a/ka/crt/fmt/strtol.k b/ka/crt/fmt/strtol.k index d1e06a3..4cf1848 100644 --- a/ka/crt/fmt/strtol.k +++ b/ka/crt/fmt/strtol.k @@ -18,7 +18,7 @@ strtol: ; rdx = pointer to first invalid byte ; strtoul: - sub ax2, ax2 + xor ax2, ax2 jmp strtoq ; @@ -48,7 +48,7 @@ strtoq: ; signed? test ax2, ax2 - sub.z r10, r10 + xor.z r10, r10 jmp.z .unsigned ; parse '-' diff --git a/ka/crt/str/strlen.k b/ka/crt/str/strlen.k index b3af334..5e585ca 100644 --- a/ka/crt/str/strlen.k +++ b/ka/crt/str/strlen.k @@ -7,9 +7,8 @@ strnlen: mov rcx, ax1 scasb.rep.nz ax0, 0 - - mov rax, ax1 - sub rax, rcx + + sub rax, ax1, rcx ret ; diff --git a/ka/usr/cmd/dir.k b/ka/usr/cmd/dir.k index 3b09716..0220f25 100644 --- a/ka/usr/cmd/dir.k +++ b/ka/usr/cmd/dir.k @@ -79,8 +79,7 @@ CMD.builtins.dir: prn ' ' prn ' ' - mov rax, rdx - shr rax, 10 + shr rax, rdx, 10 and rdx, 1023 mov ax0, .bytesstr diff --git a/vm/in/LOGIC b/vm/in/LOGIC index 8e21d64..58b32eb 100644 --- a/vm/in/LOGIC +++ b/vm/in/LOGIC @@ -29,8 +29,7 @@ not r r # # $dest = $src1 OR $src2 # -# Clears OF and CF -# Sets ZF and SF according to the result +# Preserves all flags # or r ri or r r ri @@ -50,8 +49,7 @@ nor r r ri # # $dest = $src1 AND $src2 # -# Clears OF and CF -# Sets ZF and SF according to the result +# Preserves all flags # and r rim and r r rim @@ -71,8 +69,7 @@ nand r r ri # # $dest = $src1 XOR $src2 # -# Clears OF and CF -# Sets ZF and SF according to the result +# Preserves all flags # xor r rim xor r r rim @@ -89,15 +86,23 @@ xnor r r ri # To document -shl r rim +shl r ri +shl r r ri shl m ri +shl m r ri -shr r rim +shr r ri +shr r r ri shr m ri +shr m r ri -sal r rim +sal r ri +sal r r ri sal m ri +sal m r ri -sar r rim +sar r ri +sar r r ri sar m ri +sar m r ri diff --git a/vm/in/MOV b/vm/in/MOV index e0d3f00..882fd2e 100644 --- a/vm/in/MOV +++ b/vm/in/MOV @@ -88,7 +88,7 @@ rotl rm r r # Throws: # #ILL if $2 ≥ 16 # -ldarg r ri +ldarg r r # # Get code/data offset (GCO/GCD)