Skip to content

Commit 62ccefe

Browse files
committed
Add D+ with test.
1 parent e2346ef commit 62ccefe

File tree

3 files changed

+107
-4
lines changed

3 files changed

+107
-4
lines changed

pkg/forth/primitive.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2119,6 +2119,77 @@ func PrimitiveSetup(vm *VirtualMachine) error {
21192119
},
21202120
},
21212121
},
2122+
{
2123+
name: "D+", // ( xlow xhigh ylow yhigh -- zlow zhigh )
2124+
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
2125+
yHigh, err := vm.Stack.PopNumber()
2126+
if err != nil {
2127+
return PopError(err, entry)
2128+
}
2129+
yLow, err := vm.Stack.PopNumber()
2130+
if err != nil {
2131+
return PopError(err, entry)
2132+
}
2133+
xHigh, err := vm.Stack.PopNumber()
2134+
if err != nil {
2135+
return PopError(err, entry)
2136+
}
2137+
xLow, err := vm.Stack.PopNumber()
2138+
if err != nil {
2139+
return PopError(err, entry)
2140+
}
2141+
2142+
y := (uint32(yHigh) << 16) | uint32(yLow)
2143+
x := (uint32(xHigh) << 16) | uint32(xLow)
2144+
z := x + y
2145+
zLow := uint16(z)
2146+
zHigh := uint16(z >> 16)
2147+
err = vm.Stack.Push(CellNumber{zLow})
2148+
if err != nil {
2149+
return PushError(err, entry)
2150+
}
2151+
err = vm.Stack.Push(CellNumber{zHigh})
2152+
if err != nil {
2153+
return PushError(err, entry)
2154+
}
2155+
return nil
2156+
},
2157+
ulpAsm: PrimitiveUlp{
2158+
"ld r0, r3, 3", // xlow
2159+
"ld r1, r3, 1", // ylow
2160+
"add r0, r0, r1", // add low
2161+
"st r0, r3, 3", // store zlow
2162+
"ld r0, r3, 2", // load xhigh
2163+
"ld r1, r3, 0", // load yhigh
2164+
"jump __d_minus.0, ov",
2165+
"jump __d_minus.1",
2166+
"__d_minus.0:",
2167+
"add r0, r0, 1", // overload, add the carry bit
2168+
"__d_minus.1:",
2169+
"add r0, r0, r1", // add high
2170+
"add r3, r3, 2", // decrement stack
2171+
"st r0, r3, 0", // store zhigh
2172+
"jump __next_skip_r2",
2173+
},
2174+
ulpAsmSrt: PrimitiveUlpSrt{
2175+
Asm: []string{
2176+
"ld r0, r3, 3", // xlow
2177+
"ld r1, r3, 1", // ylow
2178+
"add r0, r0, r1", // add low
2179+
"st r0, r3, 3", // store zlow
2180+
"ld r0, r3, 2", // load xhigh
2181+
"ld r1, r3, 0", // load yhigh
2182+
"jump __d_minus.0, ov",
2183+
"jump __d_minus.1",
2184+
"__d_minus.0:",
2185+
"add r0, r0, 1", // overload, add the carry bit
2186+
"__d_minus.1:",
2187+
"add r0, r0, r1", // subtract high
2188+
"add r3, r3, 2", // decrement stack
2189+
"st r0, r3, 0", // store zhigh
2190+
},
2191+
},
2192+
},
21222193
}
21232194
for _, p := range prims {
21242195
err := primitiveAdd(vm, p.name, p.goFunc, p.ulpAsm, p.ulpAsmSrt, p.flag)

pkg/forth/suite_test.go

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,7 +1362,7 @@ func TestSuite(t *testing.T) {
13621362
T{ HI-2INT lo-2INT D- -> max-2INT }T
13631363
// T{ LO-2INT hi-2INT D- -> min-2INT 1. D+ }T
13641364
T{ MIN-2INT min-2INT D- -> 0. }T
1365-
// T{ MIN-2INT lo-2INT D- -> lo-2INT }T \ TODO fixme
1365+
T{ MIN-2INT lo-2INT D- -> lo-2INT }T \ TODO fixme
13661366
`,
13671367
},
13681368
{
@@ -1375,7 +1375,37 @@ func TestSuite(t *testing.T) {
13751375
T{ min-2int SWAP 1+ SWAP DNEGATE -> max-2int }T
13761376
`,
13771377
},
1378-
// D+
1378+
{
1379+
name: "D+",
1380+
code: `
1381+
T{ 0. 5. D+ -> 5. }T \ small integers
1382+
T{ -5. 0. D+ -> -5. }T
1383+
T{ 1. 2. D+ -> 3. }T
1384+
T{ 1. -2. D+ -> -1. }T
1385+
T{ -1. 2. D+ -> 1. }T
1386+
T{ -1. -2. D+ -> -3. }T
1387+
T{ -1. 1. D+ -> 0. }T
1388+
T{ 0 0 0 5 D+ -> 0 5 }T \ mid range integers
1389+
T{ -1 5 0 0 D+ -> -1 5 }T
1390+
T{ 0 0 0 -5 D+ -> 0 -5 }T
1391+
T{ 0 -5 -1 0 D+ -> -1 -5 }T
1392+
T{ 0 1 0 2 D+ -> 0 3 }T
1393+
T{ -1 1 0 -2 D+ -> -1 -1 }T
1394+
T{ 0 -1 0 2 D+ -> 0 1 }T
1395+
T{ 0 -1 -1 -2 D+ -> -1 -3 }T
1396+
T{ -1 -1 0 1 D+ -> -1 0 }T
1397+
1398+
T{ MIN-INT 0 2DUP D+ -> 0 1 }T
1399+
T{ MIN-INT S>D MIN-INT 0 D+ -> 0 0 }T
1400+
1401+
T{ HI-2INT 1. D+ -> 0 HI-INT 1+ }T \ large double integers
1402+
T{ HI-2INT 2DUP D+ -> 1S 1- MAX-INT }T
1403+
T{ MAX-2INT MIN-2INT D+ -> -1. }T
1404+
T{ MAX-2INT LO-2INT D+ -> HI-2INT }T
1405+
T{ LO-2INT 2DUP D+ -> MIN-2INT }T
1406+
T{ HI-2INT MIN-2INT D+ 1. D+ -> LO-2INT }T
1407+
`,
1408+
},
13791409
// D2/
13801410
// D2*
13811411
{

pkg/forth/test/suite_test.f

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@
9494
0x7FFF CONSTANT MAX-INT
9595
0 CONSTANT MIN-UINT
9696
0x8000 CONSTANT MIN-INT
97+
MAX-INT 2/ CONSTANT HI-INT
98+
MIN-INT 2/ CONSTANT LO-INT
9799
0x7FFF CONSTANT MID-UINT
98100
0x8000 CONSTANT MID-UINT+1
99101
0 CONSTANT 0S
@@ -103,8 +105,8 @@
103105
0x7FFFFFFF. 2CONSTANT MAX-2INT
104106
0. 2CONSTANT MIN-2UINT
105107
0x80000000. 2CONSTANT MIN-2INT
106-
0x1FFFFFFF. 2CONSTANT HI-2INT
107-
0xA0000000. 2CONSTANT LO-2INT
108+
MAX-2INT 2/ 2CONSTANT HI-2INT
109+
MIN-2INT 2/ 2CONSTANT LO-2INT
108110

109111
HEX \ the test suite runs in hex mode
110112

0 commit comments

Comments
 (0)