; Example of expression compilation with optimizations ; At one end of the spectrum, we use RAM for everything, ; employ a strict, naive stack approach, do no optimizations ; for multiplication, perform no algebraic optimizations, ; no static computation, no right-biasing, etc. (z-z)+(z=(2+3*(7-5))+x*(x=READ))+63*(y=READ)-(2+3*(8-4)) 8 + READ^2 + 63*READ - 14 [5,7] => 8 + 49 + 315 - 14 => 358 [7,5] => 8 + 25 + 441 - 14 => Bop Diff (Bop Plus (Bop Plus (Bop Diff (Var 'z') (Var 'z')) (Bop Plus (Set 'z' (Bop Plus (Lit 2) (Bop Mult (Lit 3) (Bop Diff (Lit 7) (Lit 5))))) (Bop Mult (Var 'x') (Set 'x' READ)))) (Bop Mult (Lit 63) (Set 'y' READ))) (Bop Plus (Lit 2) (Bop Mult (Lit 3) (Bop Diff (Lit 8) (Lit 4)))) Push 4 Push 8 DoOp Diff Push 3 DoOp Mult Push 2 DoOp Plus Push 0 Put 'y' Push 63 DoOp Mult Push 0 Put 'x' Get 'x' DoOp Mult Push 5 Push 7 DoOp Diff Push 3 DoOp Mult Push 2 DoOp Plus Put 'z' DoOp Plus Get 'z' Get 'z' DoOp Diff DoOp Plus DoOp Plus DoOp Diff -- Try again with shorter expression! (z-z)+(z=(2+(7-5))+x*(x=READ))+63*(y=READ)-(2+3*(8-4)) 4 + READ^2 + 63*READ - 14 [5,7] => 8 + 49 + 315 - 14 => 358 [7,5] => 8 + 25 + 441 - 14 => Bop Diff (Bop Plus (Bop Plus (Bop Diff (Var 'z') (Var 'z')) (Bop Plus (Set 'z' (Bop Plus (Lit 2) (Bop Diff (Lit 7) (Lit 5)))) (Bop Mult (Var 'x') (Set 'x' READ)))) (Bop Mult (Lit 63) (Set 'y' READ))) (Bop Plus (Lit 2) (Bop Mult (Lit 3) (Bop Diff (Lit 8) (Lit 4)))) Relative to current SP: Push k ==> DATA #LITk; LOAD R8,DR; STORE R8,R9; INC R9,-1; Get x ==> DATA #VARx; LOAD R8,DR; STORE R8,R9; INC R9,-1; Put x ==> DATA #VARx; LOAD R8,R9; STORE R8,DR; Pop ==> INC R9,1; DoOp + ==> INC R9,1; LOAD R8,R9; INC R9,1; LOAD R7,R9; ADD R8,R7; STORE R8,R9; INC R9,-1 Input ==> READ R8,DD; STORE R8,R9; INC R9,-1; READ^2+63*READ-10 ; 25 instructions vs. 224 ; ; test: (5,7) => 362 (#39) => 354 (#245) ; test: (17,31) => 2022 (#53) => 2022 (#271) ; test: (-8,-15) => -289 (#46) => -289 (#260) READ R0,DD ; 1st input in R0 COPY R0,R1 ADD R1,R1 ; 2 * R1 ADD R1,R1 ; 4 * R1 ADD R1,R1 ; 8 * R1 ADD R1,R1 ; 16 * R1 ADD R1,R1 ; 32 * R1 ADD R1,R1 ; 64 * R1 SUB R0,R1 ; 63 * R1 INC R1,-5 ; -5 twice INC R1,-5 READ R0,DD ; 2nd input in R0 ; --------- ; squaring R0 SHIFT R0,-1 SHIFT R0,1 ; abs R0 COPY R0,R2 ; R2 = R0 COPY PC,J0 ; loop back in J0 SET R3, 1 ; mask in R3 AND R2,R3 ; get low bit R2 ADD R0,R1 ; SPECULATIVE ADD directly to R1 ADD R3,PC ; jump over SUB if we had 1 bit SUB R0,R1 ; when 0 bit, compensatory SUB SHIFT R2, 1 SHIFT R0,-1 JPIF R2,NZ,J0 WRITE R1,DD HALT C00 901 611 611 611 611 611 611 701 419 C00 508 500 902 9FA 231 823 601 63F 701 520 508 E2C D10 000 if x>0: (x<<6)-x if x<0: COPY R0,R1 COPY R0,R2 ; get sign in R2 SHIFT R2, 5 SHIFT R2, 6 SHIFT R1,-6 ; R1 = R0 * 64 SUB R0,R1 ; R1 = R0 * 63 ADD R2,PC SUB R1,R3 ------- DATA xFF COPY DR,R9 DATA #LITB ; Pushing 1 LOAD R8,DR STORE R8,R9 INC R9,-1 DATA #LITC ; Pushing 2 LOAD R8,DR STORE R8,R9 INC R9,-1 DATA #VARX ; Putting x INC R9,1 LOAD R8,R9 STORE R8,DR INC R9,-1 INC R9,1 ; Doing - LOAD R8,R9 INC R9,1 LOAD R7,R9 SUB R7,R8 STORE R8,R9 INC R9,-1 DATA #LITD ; Pushing 3 LOAD R8,DR STORE R8,R9 INC R9,-1 DATA #VARX ; Getting x LOAD R8,DR STORE R8,R9 INC R9,-1 INC R9,1 ; Doing + LOAD R8,R9 INC R9,1 LOAD R7,R9 ADD R7,R8 STORE R8,R9 INC R9,-1 INC R9,1 ; Doing - LOAD R8,R9 INC R9,1 LOAD R7,R9 SUB R7,R8 STORE R8,R9 INC R9,-1 *Main> dump samp DATA #LITE ; Pushing 4 LOAD R8,DR STORE R8,R9 INC R9,-1 DATA #LITI ; Pushing 8 LOAD R8,DR STORE R8,R9 INC R9,-1 INC R9,1 ; Doing - LOAD R8,R9 INC R9,1 LOAD R7,R9 SUB R7,R8 STORE R8,R9 INC R9,-1 DATA #LITD ; Pushing 3 LOAD R8,DR STORE R8,R9 INC R9,-1 ZERO R4 ; Doing * INC R9,1 LOAD R0,R9 INC R9,1 LOAD R1,R9 COPY R0,R2 COPY R1,R3 SHIFT R2, 5 SHIFT R2, 6 SHIFT R3, 5 SHIFT R3, 6 SUB R3,R2 SHIFT R0,-1 SHIFT R0, 1 SHIFT R1,-1 SHIFT R1, 1 DATA #SKIPA COPY DR,J3 DATA #LOOPA COPY DR,J2 #LOOPA SET R3, 1 AND R1,R3 JPIF R3,EZ,J3 ADD R0,R4 #SKIPA SHIFT R0,-1 SHIFT R1, 1 JPIF R1,NZ,J2 DATA #DONEA COPY DR,J3 JPIF R2,EZ,J3 ZERO R3 SUB R4,R3 COPY R3,R4 #DONEA STORE R4,R9 INC R9,-1 DATA #LITC ; Pushing 2 LOAD R8,DR STORE R8,R9 INC R9,-1 INC R9,1 ; Doing + LOAD R8,R9 INC R9,1 LOAD R7,R9 ADD R7,R8 STORE R8,R9 INC R9,-1 READ R8,DD ; Reading input STORE R8,R9 INC R9,-1 DATA #VARY ; Putting y INC R9,1 LOAD R8,R9 STORE R8,DR INC R9,-1 DATA #LITL ; Pushing 63 LOAD R8,DR STORE R8,R9 INC R9,-1 ZERO R4 ; Doing * INC R9,1 LOAD R0,R9 INC R9,1 LOAD R1,R9 COPY R0,R2 COPY R1,R3 SHIFT R2, 5 SHIFT R2, 6 SHIFT R3, 5 SHIFT R3, 6 SUB R3,R2 SHIFT R0,-1 SHIFT R0, 1 SHIFT R1,-1 SHIFT R1, 1 DATA #SKIPB COPY DR,J3 DATA #LOOPB COPY DR,J2 #LOOPB SET R3, 1 AND R1,R3 JPIF R3,EZ,J3 ADD R0,R4 #SKIPB SHIFT R0,-1 SHIFT R1, 1 JPIF R1,NZ,J2 DATA #DONEB COPY DR,J3 JPIF R2,EZ,J3 ZERO R3 SUB R4,R3 COPY R3,R4 #DONEB STORE R4,R9 INC R9,-1 READ R8,DD ; Reading input STORE R8,R9 INC R9,-1 DATA #VARX ; Putting x INC R9,1 LOAD R8,R9 STORE R8,DR INC R9,-1 DATA #VARX ; Getting x LOAD R8,DR STORE R8,R9 INC R9,-1 ZERO R4 ; Doing * INC R9,1 LOAD R0,R9 INC R9,1 LOAD R1,R9 COPY R0,R2 COPY R1,R3 SHIFT R2, 5 SHIFT R2, 6 SHIFT R3, 5 SHIFT R3, 6 SUB R3,R2 SHIFT R0,-1 SHIFT R0, 1 SHIFT R1,-1 SHIFT R1, 1 DATA #SKIPC COPY DR,J3 DATA #LOOPC COPY DR,J2 #LOOPC SET R3, 1 AND R1,R3 JPIF R3,EZ,J3 ADD R0,R4 #SKIPC SHIFT R0,-1 SHIFT R1, 1 JPIF R1,NZ,J2 DATA #DONEC COPY DR,J3 JPIF R2,EZ,J3 ZERO R3 SUB R4,R3 COPY R3,R4 #DONEC STORE R4,R9 INC R9,-1 DATA #LITF ; Pushing 5 LOAD R8,DR STORE R8,R9 INC R9,-1 DATA #LITH ; Pushing 7 LOAD R8,DR STORE R8,R9 INC R9,-1 INC R9,1 ; Doing - LOAD R8,R9 INC R9,1 LOAD R7,R9 SUB R7,R8 STORE R8,R9 INC R9,-1 DATA #LITC ; Pushing 2 LOAD R8,DR STORE R8,R9 INC R9,-1 INC R9,1 ; Doing + LOAD R8,R9 INC R9,1 LOAD R7,R9 ADD R7,R8 STORE R8,R9 INC R9,-1 DATA #VARZ ; Putting z INC R9,1 LOAD R8,R9 STORE R8,DR INC R9,-1 INC R9,1 ; Doing + LOAD R8,R9 INC R9,1 LOAD R7,R9 ADD R7,R8 STORE R8,R9 INC R9,-1 DATA #VARZ ; Getting z LOAD R8,DR STORE R8,R9 INC R9,-1 DATA #VARZ ; Getting z LOAD R8,DR STORE R8,R9 INC R9,-1 INC R9,1 ; Doing - LOAD R8,R9 INC R9,1 LOAD R7,R9 SUB R7,R8 STORE R8,R9 INC R9,-1 INC R9,1 ; Doing + LOAD R8,R9 INC R9,1 LOAD R7,R9 ADD R7,R8 STORE R8,R9 INC R9,-1 INC R9,1 ; Doing + LOAD R8,R9 INC R9,1 LOAD R7,R9 ADD R7,R8 STORE R8,R9 INC R9,-1 INC R9,1 ; Doing - LOAD R8,R9 INC R9,1 LOAD R7,R9 SUB R7,R8 STORE R8,R9 INC R9,-1 INC R9,1 LOAD R0,R9 WRITE R0,DD HALT #LITC CONST 2 #LITD CONST 3 #LITE CONST 4 #LITF CONST 5 #LITH CONST 7 #LITI CONST 8 #LITL CONST 63 #VARX CONST 0 #VARY CONST 0 #VARZ CONST 0