Commit 2543097f authored by psf's avatar psf
Browse files

Tweak instruction set to accelerate some common tasks

parent ca8ced94
......@@ -78,7 +78,7 @@ enum Op {
RET = 0xffe0, TOR = 0xffe2, RTO = 0xffe4, LD = 0xffe6,
ST = 0xffe8, DUP = 0xffea, SWP = 0xffec, DRP = 0xffee,
Q = 0xfff0, ADD = 0xfff2, SFT = 0xfff4, OR = 0xfff6,
INV = 0xfff8, ULT = 0xfffa, IO = 0xfffc, NOP = 0xfffe,
AND = 0xfff8, INV = 0xfffa, GEQ = 0xfffc, IO = 0xfffe,
}
const PRIMITIVES: [Primitive; 16] = [
......@@ -135,14 +135,19 @@ const PRIMITIVES: [Primitive; 16] = [
let v2 = x.dstack.pop();
x.dstack.push(v1 | v2);
},
| x | { // and
let v1 = x.dstack.pop();
let v2 = x.dstack.pop();
x.dstack.push(v1 & v2);
},
| x | { // inv
let v1 = x.dstack.pop();
x.dstack.push(!v1);
},
| x | { // ult
| x | { // geq (unsigned)
let v1 = x.dstack.pop();
let v2 = x.dstack.pop();
x.dstack.push(if v1 < v2 { 0xffff } else { 0 });
x.dstack.push(if v1 >= v2 { 0xffff } else { 0 });
},
| x | { // io
let port = x.dstack.pop();
......@@ -163,8 +168,7 @@ const PRIMITIVES: [Primitive; 16] = [
}
_ => {}
}
},
| _x | { /* nop */ }
}
];
/* --- The memory map ---
......@@ -247,10 +251,6 @@ fn build_dictionary(c: &mut Core) {
d.entry(); d.name(1, *b"- "); let sub = d.here;
forth!(INV, Literal(1), ADD, ADD, RET);
// and ( a b -- a&b )
d.entry(); d.name(3, *b"and"); let and = d.here;
forth!(INV, SWP, INV, OR, INV, RET);
let zero = d.here;
forth!(Literal(0), RTO, DRP, RET);
......@@ -260,7 +260,7 @@ fn build_dictionary(c: &mut Core) {
// >= ( a b -- a>=b ) // note: signed comparison
d.entry(); d.name(2, *b">= "); let geq = d.here;
forth!(sub, Literal(0x4000), DUP, ADD, and, zero_eq, RET);
forth!(sub, Literal(0x4000), DUP, ADD, AND, zero_eq, RET);
// = ( a b -- a=b )
d.entry(); d.name(1, *b"= "); let eq = d.here;
......@@ -291,11 +291,11 @@ fn build_dictionary(c: &mut Core) {
// c@ ( a -- n )
d.entry(); d.name(2, *b"c@ "); let cld = d.here;
forth!(LD, Literal(0xff), and, RET);
forth!(LD, Literal(0xff), AND, RET);
// c! ( n a -- )
d.entry(); d.name(2, *b"c! "); let cst = d.here;
forth!(DUP, LD, Literal(0xff), INV, and, SWP, TOR, OR, RTO, ST, RET);
forth!(DUP, LD, Literal(0xff), INV, AND, SWP, TOR, OR, RTO, ST, RET);
// Load 1 letter into buffer.
let stchar = d.here;
......@@ -328,8 +328,8 @@ fn build_dictionary(c: &mut Core) {
forth!(Literal(2), ADD, TOR,
Literal(word_buf), DUP, Literal(2), ADD, LD, SWP, LD,
RTO, DUP, TOR,
LD, Literal(0x0080), INV, and, eq,
SWP, RTO, Literal(2), ADD, LD, eq, and, RET);
LD, Literal(0x0080), INV, AND, eq,
SWP, RTO, Literal(2), ADD, LD, eq, AND, RET);
let matched = d.here;
forth!(Literal(6), ADD, RTO, DRP, RET);
......@@ -382,7 +382,7 @@ fn build_dictionary(c: &mut Core) {
// unsmudge ( -- )
d.entry(); d.name(8 | 0x80, *b"uns"); let unsmudge = d.here;
forth!(word_addr, DUP, LD, Literal(0x0040), INV, and, SWP, ST, RET);
forth!(word_addr, DUP, LD, Literal(0x0040), INV, AND, SWP, ST, RET);
// [ ( -- )
d.entry(); d.name(1 | 0x80, *b"[ "); let lbracket = d.here;
......@@ -398,7 +398,7 @@ fn build_dictionary(c: &mut Core) {
here, LD, Literal(2), ADD, here, ST, RET);
let compile_call = d.here;
forth!(DUP, Literal(4), sub, LD, Literal(0x0080), and, state, LD, OR, Q, RET,
forth!(DUP, Literal(4), sub, LD, Literal(0x0080), AND, state, LD, OR, Q, RET,
comma, RTO, DRP, RET);
let compile_lit = d.here;
......@@ -473,13 +473,12 @@ fn build_dictionary(c: &mut Core) {
d.entry(); d.name(1, *b"+ "); forth!(ADD, RET);
d.entry(); d.name(5, *b"shi"); forth!(SFT, RET);
d.entry(); d.name(2, *b"or "); forth!(OR, RET);
d.entry(); d.name(6, *b"inv"); forth!(INV, RET);
d.entry(); d.name(2, *b"u< "); forth!(ULT, RET);
d.entry(); d.name(2, *b"io "); forth!(IO, RET);
d.entry(); d.name(3, *b"nop"); let nop = d.here; forth!(NOP, RET);
d.entry(); d.name(3, *b"and"); forth!(AND, RET);
d.entry(); d.name(3, *b"inv"); forth!(INV, RET);
d.entry(); d.name(3, *b"geq"); forth!(GEQ, RET);
d.entry(); d.name(2, *b"io "); let io = d.here; forth!(IO, RET);
d.c.store(latest_ptr, nop-6);
d.c.store(latest_ptr, io-6);
d.c.store(here_ptr, d.here);
d.c.store(state_ptr, 0xffff);
d.c.store(0, quit);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment