TITLE "mp3.a by Douglas Jones, alternative optimized" USE "hawk.h" USE "stdio.h" S MAIN INT MAIN ; activation record structure for MAIN ;RETAD = 0 ; the return address ARSIZE = 4 MAIN: ; uses R8 -- count, controls loop iteration ; R9 -- addcount, save addcount returned by tribonacci STORES R1,R2 ADDSI R2,ARSIZE ; -- receiving sequence LIS R8,0 ; count = 0 LOOP: ; for (;;) { -- loop exit is in mid loop MOVE R3,R8 ; -- parameter count JSR R1,TRIBONACCI ; [temp,temp1] = tribonacci( count ) MOVE R9,R4 ; addcount = temp1 ; -- parameter temp LIS R4,1 ; -- parameter width LIL R1,PUTDECU JSRS R1,R1 ; putdecu( temp, 1 ) LIS R3,':' ; -- parameter LIL R1,PUTCHAR JSRS R1,R1 ; putchar( ':' ) MOVE R3,R9 ; -- parameter addcount LIS R4,1 ; -- parameter width LIL R1,PUTDECU JSRS R1,R1 ; putdecu( addcount, 1 ) ADDSI R8,1 ; count = count + 1 CMPI R8,15 BGE QUIT ; if (count >= 15) break; LIS R3,',' ; -- parameter LIL R1,PUTCHAR JSRS R1,R1 ; putchar( ',' ) BR LOOP QUIT: ; } ADDSI R2,-ARSIZE LOADS PC,R2 ; return ; activation record format for the TRIBONACCI function ;RETAD = 0 ; the return address VAL = 4 ; the saved parameter i TRIB1 = 8 ; trib(i) from tribonacci(val-1) ADDC1 = 12 ; count from tribonacci(val-1) TRIB2 = 16 ; trib(i) from tribonacci(val-2) ADDC2 = 20 ; count from tribonacci(val-2) ARSIZE = 24 TRIBONACCI: ; expects R3 -- i, an unsigned integer ; returns R3 -- trib(i), the ith tribonacci number ; R4 -- count, number of additions to get trib(i) STORES R1,R2 ; -- save the return address ADDI R2,R2,ARSIZE ; -- optimized stack CMPI R3,2 ; -- note val = i is in R3 BGTU TRBELSE ; if (val <= 2) { -- basis case CLR R4 ; count = 0 TESTR R3 BEQ TRBENDF ; if (val != 0) { ADDSI R3,-1 ; val = val - 1 ; } BR TRBENDF ; -- note, val is in R3 TRBELSE: ; } else { -- recursive case STORE R3,R2,VAL-ARSIZE ; val = i ; -- note, value is in R3 ADDSI R3,-1 ; -- parameter value - 1 JSR R1,TRIBONACCI ; -- call tribonacci STORE R3,R2,TRIB1-ARSIZE STORE R4,R2,ADDC1-ARSIZE ; [trib1,addc1] = tribonacci(val-1) LOAD R3,R2,VAL-ARSIZE ADDSI R3,-2 ; -- parameter value - 2 JSR R1,TRIBONACCI ; -- call tribonacci STORE R3,R2,TRIB2-ARSIZE STORE R4,R2,ADDC2-ARSIZE ; [trib2,addc2] = tribonacci(val-2) LOAD R3,R2,VAL-ARSIZE ADDSI R3,-3 ; -- parameter value - 3 JSR R1,TRIBONACCI ; [trib3,addc3] = tribonacci(val-3) ; -- trib3,addc3 are in R3,R4 LOAD R5,R2,ADDC2-ARSIZE ADD R4,R4,R5 ; -- add addc2 + addc3 LOAD R5,R2,ADDC1-ARSIZE ADD R4,R4,R5 ADDSI R4,2 ; count = addc1 + (addc2 + addc3) +2 ; -- trib3 in R3 is unchanged LOAD R5,R2,TRIB2-ARSIZE ADD R3,R3,R5 ; -- add trib2 + trib3 LOAD R5,R2,TRIB1-ARSIZE ADD R3,R3,R5 ; value = trib1 + (trib2 + trib3) TRBENDF: ; } ; -- value,count already in R3,R4 ADDI R2,R2,-ARSIZE ; -- optimized stack LOADS PC,R2 ; return value,count END