commit f97be3fe255702eaaecff865fc5d7cfa5d5237fb
parent 9321c6237597b156433238fc40917a83e1fdc729
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Thu, 9 Mar 2023 21:36:16 -0500
hal: add flag guarantees to a few ops
Diffstat:
3 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/fs/doc/hal.txt b/fs/doc/hal.txt
@@ -21,8 +21,8 @@ Compiler words:
ps+, n --
rs+, n --
-W+n, n --
-A+n, n --
+W+n, n -- *Z*
+A+n, n -- *Z*
W>A, --
A>W, --
W<>A, --
@@ -32,10 +32,10 @@ Width-aware compiler words:
@, op --
!, op --
@!, op --
-+, op --
++, op -- *Z*
[@], op --
[!], op --
-[+n], n op --
+[+n], n op -- *Z*
lea, op -- (width aware, but has the same behavior in all widths)
Conditions
diff --git a/fs/xcomp/bootlo.fs b/fs/xcomp/bootlo.fs
@@ -265,8 +265,7 @@ code []= ( a1 a2 u -- f )
PSP) @!, W>A, begin \ P+4=a1 P+0=u A=a2
PSP) 4 +) 8b [@], A) 8b cmp, 0 Z) branchC,
8 ps+, 0 LIT>W, exit, then
- 1 A+n, 1 PSP) 4 +) [+n], -1 PSP) [+n],
- PSP) @, =0>Z, NZ) branchC, drop
+ 1 A+n, 1 PSP) 4 +) [+n], -1 PSP) [+n], NZ) branchC, drop
8 ps+, 1 LIT>W, exit,
: s= ( s1 s2 -- f ) over c@ 1+ []= ;
: [if] not if S" [then]" begin word over s= until drop then ;
diff --git a/posix/vm.c b/posix/vm.c
@@ -180,8 +180,8 @@ static void PSADD() { vm.PSP += gpc(); } // 0x08
static void RSADD() { vm.RSP += gpc(); }
static void WLIT() { vm.W = gpc(); }
static void ALIT() { vm.A = gpc(); }
-static void WADDN() { vm.W += gpc(); }
-static void AADDN() { vm.A += gpc(); }
+static void WADDN() { vm.W += gpc(); vm.Z = vm.W == 0;}
+static void AADDN() { vm.A += gpc(); vm.Z = vm.A == 0;}
static void W2A() { vm.A = vm.W; }
static void WSWAPA() { dword n = vm.A; vm.A = vm.W; vm.W = n; }
@@ -202,29 +202,29 @@ static dword readop() {
static void WFETCH() { vm.W = gd(readop()); } // 0x10
static void WSTORE() { sd(readop(), vm.W); }
static void WSWAP() { dword a, n; a = readop(); n = gd(a); sd(a, vm.W); vm.W = n; }
-static void MADDN() { dword a = readop(); dword n=gpc(); sd(a, gd(a)+n); }
+static void MADDN() { dword a = readop(); dword n=gpc(); n += gd(a); sd(a, n); vm.Z = n == 0; }
static void WCMP() { vm.Z = gd(readop()) == vm.W; }
static void WIFETCH() { vm.W = gd(gd(readop())); }
static void WISTORE() { sd(gd(readop()), vm.W); }
-static void WADD() { vm.W += gd(readop()); }
+static void WADD() { vm.W += gd(readop()); vm.Z = vm.W == 0; }
static void WFETCH16() { vm.W = gw(readop()); } // 0x18
static void WSTORE16() { sw(readop(), vm.W); }
static void WSWAP16() { dword a, n; a = readop(); n = gw(a); sw(a, vm.W); vm.W = n; }
-static void MADDN16() { dword a = readop(); dword n=gpc(); sw(a, gw(a)+(word)n); }
+static void MADDN16() { dword a = readop(); dword n=gpc(); n += gw(a); sw(a, n); vm.Z = (n&0xffff) == 0; }
static void WCMP16() { vm.Z = gw(readop()) == (vm.W & 0xffff); }
static void WIFETCH16() { vm.W = gw(gd(readop())); }
static void WISTORE16() { sw(gd(readop()), vm.W); }
-static void WADD16() { vm.W += gw(readop()); }
+static void WADD16() { vm.W += gw(readop()); vm.Z = vm.W == 0; }
static void WFETCH8() { vm.W = gb(readop()); } // 0x20
static void WSTORE8() { sb(readop(), vm.W); }
static void WSWAP8() { dword a, n; a = readop(); n = gb(a); sb(a, vm.W); vm.W = n; }
-static void MADDN8() { dword a = readop(); dword n=gpc(); sb(a, gb(a)+(byte)n); }
+static void MADDN8() { dword a = readop(); dword n=gpc(); n += gb(a); sb(a, n); vm.Z = (n&0xff) == 0; }
static void WCMP8() { vm.Z = gb(readop()) == (vm.W & 0xff); }
static void WIFETCH8() { vm.W = gb(gd(readop())); }
static void WISTORE8() { sb(gd(readop()), vm.W); }
-static void WADD8() { vm.W += gb(readop()); }
+static void WADD8() { vm.W += gb(readop()); vm.Z = vm.W == 0; }
static void WLEA() { vm.W = readop(); } // 0x28
static void BOOTRD() { ppush(fgetc(fp)); }