@@ -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 )
0 commit comments