Drop um/mod in favor of u/mod

This commit is contained in:
Brad Nelson
2021-01-10 09:31:04 -08:00
parent 45f49434f3
commit 517e8f5a7b
5 changed files with 4 additions and 14 deletions

View File

@ -137,7 +137,7 @@ defer bye
variable hld variable hld
: pad ( -- a ) here 80 + ; : pad ( -- a ) here 80 + ;
: digit ( u -- c ) 9 over < 7 and + 48 + ; : digit ( u -- c ) 9 over < 7 and + 48 + ;
: extract ( n base -- n c ) 0 swap um/mod swap digit ; : extract ( n base -- n c ) u/mod swap digit ;
: <# ( -- ) pad hld ! ; : <# ( -- ) pad hld ! ;
: hold ( c -- ) hld @ 1 - dup hld ! c! ; : hold ( c -- ) hld @ 1 - dup hld ! c! ;
: # ( u -- u ) base @ extract hold ; : # ( u -- u ) base @ extract hold ;

View File

@ -19,10 +19,7 @@ typedef uint64_t udcell_t;
#define COMMA(n) *g_sys.heap++ = (n) #define COMMA(n) *g_sys.heap++ = (n)
#define IMMEDIATE() g_sys.last[-1] |= 1 #define IMMEDIATE() g_sys.last[-1] |= 1
#define DOES(ip) *g_sys.last = (cell_t) && OP_DODOES; g_sys.last[1] = (cell_t) ip #define DOES(ip) *g_sys.last = (cell_t) && OP_DODOES; g_sys.last[1] = (cell_t) ip
#ifndef UMSMOD_FUNC #ifndef SSMOD_FUNC
#define UMSMOD_FUNC udcell_t ud = *(udcell_t *) &sp[-1]; \
--sp; *sp = (cell_t) (ud % tos); \
tos = (cell_t) (ud / tos)
#define SSMOD_FUNC dcell_t d = (dcell_t) *sp * (dcell_t) sp[-1]; \ #define SSMOD_FUNC dcell_t d = (dcell_t) *sp * (dcell_t) sp[-1]; \
--sp; *sp = (cell_t) (((udcell_t) d) % tos); \ --sp; *sp = (cell_t) (((udcell_t) d) % tos); \
tos = (cell_t) (d < 0 ? ~(~d / tos) : d / tos) tos = (cell_t) (d < 0 ? ~(~d / tos) : d / tos)
@ -33,7 +30,8 @@ typedef uint64_t udcell_t;
X("0=", ZEQUAL, tos = !tos ? -1 : 0) \ X("0=", ZEQUAL, tos = !tos ? -1 : 0) \
X("0<", ZLESS, tos = (tos|0) < 0 ? -1 : 0) \ X("0<", ZLESS, tos = (tos|0) < 0 ? -1 : 0) \
X("+", PLUS, tos = (tos + *sp) | 0; --sp) \ X("+", PLUS, tos = (tos + *sp) | 0; --sp) \
X("UM/MOD", UMSMOD, UMSMOD_FUNC) \ X("U/MOD", USMOD, w = *sp; *sp = (uintptr_t) w % (uintptr_t) tos; \
tos = (uintptr_t) w / tos) \
X("*/MOD", SSMOD, SSMOD_FUNC) \ X("*/MOD", SSMOD, SSMOD_FUNC) \
X("AND", AND, tos = tos & *sp; --sp) \ X("AND", AND, tos = tos & *sp; --sp) \
X("OR", OR, tos = tos | *sp; --sp) \ X("OR", OR, tos = tos | *sp; --sp) \

View File

@ -43,7 +43,6 @@ cases = ReplaceAll(cases, '&g_sys', 'g_sys');
cases = ReplaceAll(cases, '&& OP_DOCOLON', '0'); cases = ReplaceAll(cases, '&& OP_DOCOLON', '0');
cases = ReplaceAll(cases, '&& OP_DOCREATE', '1'); cases = ReplaceAll(cases, '&& OP_DOCREATE', '1');
cases = ReplaceAll(cases, 'goto **(void **) w', 'break decode'); cases = ReplaceAll(cases, 'goto **(void **) w', 'break decode');
cases = ReplaceAll(cases, 'UMSMOD', '');
cases = ReplaceAll(cases, 'SSMOD', ''); cases = ReplaceAll(cases, 'SSMOD', '');
code = code.replace('{{boot}}', function() { return boot; }); code = code.replace('{{boot}}', function() { return boot; });

View File

@ -42,7 +42,6 @@ function VM(stdlib, foreign, heap) {
var imul = stdlib.Math.imul; var imul = stdlib.Math.imul;
var UMSMOD = foreign.UMSMOD;
var SSMOD = foreign.SSMOD; var SSMOD = foreign.SSMOD;
var Call = foreign.Call; var Call = foreign.Call;
var COMMA = foreign.COMMA; var COMMA = foreign.COMMA;
@ -102,7 +101,6 @@ var ffi = {
create: function() {}, create: function() {},
parse: function() {}, parse: function() {},
COMMA: function() {}, COMMA: function() {},
UMSMOD: function() {},
SSMOD: function() {}, SSMOD: function() {},
DOES: function() {}, DOES: function() {},
IMMEDIATE: function() {}, IMMEDIATE: function() {},

View File

@ -2,11 +2,6 @@
#define CALLTYPE WINAPI #define CALLTYPE WINAPI
# define UMSMOD_FUNC \
asm("div %2" \
: "=a" (tos), "=d" (sp[-1]) \
: "r" (tos), "a" (sp[-1]), "d" (*sp)); --sp
# define SSMOD_FUNC \ # define SSMOD_FUNC \
w = tos; asm("imul %4\n\t" \ w = tos; asm("imul %4\n\t" \
"idiv %2" \ "idiv %2" \