; ------------------------------------ ; naive RAM and stack-based program: ; ; (z-z)+(z=(2+(7-5))+x*(x=READ))+63*(y=READ)-(2+3*(8-4)) ; ; total instruction count = 224 ; ------------------------------------ ; ------------------------------------ ; prologue: set up stack pointer in R9 ; ------------------------------------ DATA xFF COPY DR,R9 ; ------------------------------------ ; main body of expression ; (with some hand-made peephole optimizations) ; ------------------------------------ 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 ; ------------------------------------ ; epilogue: final stack pop, write, halt ; and literal and variable storage ; ------------------------------------ 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 ; ------------------------------------ ; 3FF 9E9 3D9 A8E B89 498 3DC A8E B89 A89 490 A79 778 B89 498 3D8 ; A8E B89 498 140 490 A09 490 A19 902 913 524 525 534 535 732 327 ; 9ED 323 9EC 231 813 E3B 604 508 510 E1E 330 9ED E2B 130 743 934 ; B49 498 3D7 A8E B89 A89 490 A79 678 B89 498 C80 B89 498 3DF 490 ; A89 B8E 498 3DD A8E B89 498 140 490 A09 490 A19 902 913 524 525 ; 534 535 732 518 510 35D 9ED 359 9EC 231 813 E3B 604 508 510 E1E ; 366 9ED E2B 130 743 934 B49 498 C80 B89 498 3DE 490 A89 B8E 498 ; 3DE A8E B89 498 140 490 A09 490 A19 902 913 524 525 534 535 732 ; 508 500 518 510 38C 9ED 388 9EC 231 813 E3B 604 508 510 E1E 395 ; 9ED E2B 130 743 934 B49 498 3DA A8E B89 498 3DB A8E B89 A89 490 ; A79 778 B89 498 3D7 A8E B89 A89 490 A79 678 B89 498 3E0 490 A89 ; B8E A89 490 A79 678 B89 498 3E0 A8E B89 498 3E0 A8E B89 A89 490 ; A79 778 B89 A89 490 A79 678 B89 A89 490 A79 678 B89 A89 490 A79 ; 778 B89 498 490 A09 D00 000 002 003 004 005 007 008 03F 000 000 ; 000 ; ------------------------------------ ; ------------------------------------ ; a much shorter version, with algebraic optimization: ; ; READ^2 + 63*READ - 10 ; ; total instruction count = 25 ; ------------------------------------ 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 SHIFT R0,-1 ; squaring R0 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 ; ------------------------------------ ; ------------------------------------ ; relative timings for inputs: ; ; 5, 7: 245 vs. 39 ; 17, 31: 271 vs. 53 ; -8, -15: 260 vs. 46 ; ------------------------------------