commit 2507af22d83b05bb2c5048011d7401df9f964b5f
parent aedbff9a3a217447cd4c407b3521a3968d67b814
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Sun, 19 Mar 2023 14:57:07 -0400
halcc: add a bunch of binops
Diffstat:
4 files changed, 47 insertions(+), 7 deletions(-)
diff --git a/fs/comp/c/egen.fs b/fs/comp/c/egen.fs
@@ -44,7 +44,13 @@ UOPSCNT wordtbl _tbl ( res -- res )
\ 9. NULL
\ 10. sizeof()
: _ ( tok -- res ) case ( )
- '(' of isChar?^ abort" TODO" endof
+ '(' of isChar?^
+ \ can be an expression or a typecast
+ nextt dup parseType if ( tok type )
+ \ TODO: actually process the typecast
+ nip parseDeclarator drop read) nextt parseFactor
+ else ( tok ) parseExpression read) ( parsePostfixOp ) then
+ endof
'"' of isChar?^ MAXLITSZ _litarena :[
here 0 c, ['] ," with-stdin<
ccin dup '0' = if
@@ -68,12 +74,18 @@ current ' parseFactor realias
: swappable doer ' , does> @ ( left right w ) >r
dup Result :isW? if swap then over Result :>W Result :hal# r> execute ;
swappable _+, +, swappable _*, *,
+swappable _&, and, swappable _^, xor, swappable _|, or,
+
+: fixed doer ' , does> @ ( left right w ) >r
+ over Result :>W Result :hal# r> execute ;
+fixed _-, -, fixed _/, /, fixed _%, %,
+fixed _<<, <<, fixed _>>, >>,
: _=, ( left right ) Result :>W Result :hal# !, Result :W ;
BOPSCNT wordtbl _tbl ( -- )
-'w _+, 'w _err 'w _*, 'w _err 'w _err 'w _err 'w _err 'w _err
-'w _err 'w _err 'w _err 'w _err 'w _err 'w _err 'w _err 'w _err
+'w _+, 'w _-, 'w _*, 'w _/, 'w _%, 'w _<<, 'w _>>, 'w _err
+'w _err 'w _err 'w _err 'w _err 'w _err 'w _&, 'w _^, 'w _|,
'w _err 'w _err 'w _=, 'w _err 'w _err 'w _err 'w _err 'w _err
'w _err 'w _err 'w _err 'w _err 'w _err 'w _err 'w _err
diff --git a/fs/tests/comp/c/cc.fs b/fs/tests/comp/c/cc.fs
@@ -9,7 +9,6 @@ variables 82 #eq
negate -42 #eq
bwnot $ffffffd5 #eq
exprbinops 7 #eq
-testend \s
binopand 42 #eq
binopor 42 #eq
binopxor 42 #eq
@@ -17,6 +16,7 @@ binopshl 336 #eq
binopshr 10 #eq
binopdiv 14 #eq
binopmod 1 #eq
+testend \s
1 binopcondeval 42 #eq
0 binopcondeval 12 #eq
assignops 83 #eq
diff --git a/fs/tests/comp/c/test2.c b/fs/tests/comp/c/test2.c
@@ -24,3 +24,31 @@ int exprbinops() {
unsigned int a=1, b=2;
return a + b * 3 + NULL;
}
+int binopand() {
+ int a=$ff;
+ return (unsigned int)a & 42;
+}
+int binopor() {
+ int a=2;
+ return 40 | a;
+}
+int binopxor() {
+ int a=43;
+ return a ^ 1;
+}
+int binopshl() {
+ int a=42;
+ return a << 3;
+}
+int binopshr() {
+ int a=42;
+ return a >> 2;
+}
+int binopdiv() {
+ int a=42;
+ return a / 3;
+}
+int binopmod() {
+ int a=43;
+ return a % 3;
+}
diff --git a/posix/vm.c b/posix/vm.c
@@ -488,21 +488,21 @@ static void ACHECKZ() { vm.Z = !vm.A; }
static void WSUB() { vm.W -= gd(readop()); } // 0x68
static void WMUL() { vm.W *= gd(readop()); }
static void WDIV() { vm.W /= gd(readop()); }
-static void WMOD() { vm.W &= gd(readop()); }
+static void WMOD() { vm.W %= gd(readop()); }
static void WSHL() { vm.W <<= gd(readop()); }
static void WSHR() { vm.W >>= gd(readop()); }
static void WSUB16() { vm.W -= gw(readop()); } // 0x70
static void WMUL16() { vm.W *= gw(readop()); }
static void WDIV16() { vm.W /= gw(readop()); }
-static void WMOD16() { vm.W &= gw(readop()); }
+static void WMOD16() { vm.W %= gw(readop()); }
static void WSHL16() { vm.W <<= gw(readop()); }
static void WSHR16() { vm.W >>= gw(readop()); }
static void WSUB8() { vm.W -= gb(readop()); } // 0x78
static void WMUL8() { vm.W *= gb(readop()); }
static void WDIV8() { vm.W /= gb(readop()); }
-static void WMOD8() { vm.W &= gb(readop()); }
+static void WMOD8() { vm.W %= gb(readop()); }
static void WSHL8() { vm.W <<= gb(readop()); }
static void WSHR8() { vm.W >>= gb(readop()); }