duskos

dusk os fork
git clone git://git.alexwennerberg.com/duskos
Log | Files | Refs | README | LICENSE

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:
Mfs/comp/c/egen.fs | 18+++++++++++++++---
Mfs/tests/comp/c/cc.fs | 2+-
Mfs/tests/comp/c/test2.c | 28++++++++++++++++++++++++++++
Mposix/vm.c | 6+++---
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()); }