Add example benchmark file
This commit is contained in:
parent
5a486b59c2
commit
ac03e6346f
2 changed files with 185 additions and 0 deletions
BIN
examples/bench.mima
Normal file
BIN
examples/bench.mima
Normal file
Binary file not shown.
185
examples/bench.mimasm
Normal file
185
examples/bench.mimasm
Normal file
|
|
@ -0,0 +1,185 @@
|
|||
; The same as fib.mimasm, but with an increased number of fibonacci numbers to
|
||||
; calculate. This file takes 11877318 steps to execute.
|
||||
|
||||
IAR = main
|
||||
SP = 0xfffff
|
||||
FP = 0xfffff
|
||||
|
||||
zero: LIT 0 ; Constant value for use with EQL
|
||||
one: LIT 1 ; Constant value for use with EQL
|
||||
|
||||
tmp1: LIT 0
|
||||
|
||||
; Variables for main
|
||||
max-number: LIT 24
|
||||
current-number: LIT 0
|
||||
ptr: LDC number-array
|
||||
|
||||
main:
|
||||
; Calls fib for every n from current-number to max-number and stores
|
||||
; the resulting numbers in memory, starting at memory location 300
|
||||
; (at label number-array).
|
||||
|
||||
; Since we're the main program, we don't need to do all the special
|
||||
; stack initialization that functions must do. We can just use the
|
||||
; empty stack as shared stack frame.
|
||||
LDSP
|
||||
ADC -1
|
||||
STSP
|
||||
|
||||
main-loop:
|
||||
; while (current-number != max-number) {
|
||||
LDV current-number
|
||||
EQL max-number
|
||||
JMN main-loop-end
|
||||
|
||||
; *ptr = fib(current-number);
|
||||
LDV current-number
|
||||
STRS 1
|
||||
CALL fib
|
||||
LDV tmp1
|
||||
STIV ptr
|
||||
|
||||
; current-number++;
|
||||
LDV current-number
|
||||
ADC 1
|
||||
STV current-number
|
||||
|
||||
; ptr++;
|
||||
LDV ptr
|
||||
ADC 1
|
||||
STV ptr
|
||||
|
||||
; }
|
||||
JMP main-loop
|
||||
main-loop-end:
|
||||
|
||||
HALT
|
||||
|
||||
; This function recursively calculates the n-th fibonacci number. It
|
||||
; accepts one argument (n) passed via a shared stack frame, and
|
||||
; returns its only result via the tmp1 variable.
|
||||
fib:
|
||||
;; Initialization
|
||||
; Create a new stack frame of size 5 with the following layout:
|
||||
; FP offset | Value
|
||||
; 0 | RA
|
||||
; -1 | n-1
|
||||
; -2 | n-2
|
||||
; -3 | fib(n-1)
|
||||
; -4 | fib(n-2)
|
||||
LDFP
|
||||
STRS 0
|
||||
LDSP
|
||||
ADC -1
|
||||
STFP
|
||||
ADC -5
|
||||
STSP
|
||||
; And write RA to the corresponding place
|
||||
LDRA
|
||||
STRF 0
|
||||
|
||||
; Check if we even need to do any recursive calls
|
||||
LDRF 2
|
||||
EQL zero
|
||||
JMN fib-ret-0
|
||||
LDRF 2
|
||||
EQL one
|
||||
JMN fib-ret-1
|
||||
JMP fib-continue
|
||||
fib-ret-0:
|
||||
LDC 0
|
||||
STV tmp1
|
||||
JMP fib-cleanup
|
||||
fib-ret-1:
|
||||
LDC 1
|
||||
STV tmp1
|
||||
JMP fib-cleanup
|
||||
fib-continue:
|
||||
|
||||
; Calculate n-1 and n-2 and store on stack
|
||||
LDRF 2
|
||||
ADC -1
|
||||
STRF -1
|
||||
LDRF 2
|
||||
ADC -2
|
||||
STRF -2
|
||||
|
||||
;; Recursive call for n-1
|
||||
; Remember function argument in tmp1
|
||||
LDRF -1
|
||||
STV tmp1
|
||||
; Create shared stack frame of size 1
|
||||
LDFP
|
||||
STRS 0
|
||||
LDSP
|
||||
ADC -1
|
||||
STFP
|
||||
ADC -1
|
||||
STSP
|
||||
; And fill in the first argument
|
||||
LDV tmp1
|
||||
STRF 0
|
||||
; Now, we can call fib
|
||||
CALL fib
|
||||
; Restore this function's stack frame
|
||||
LDFP
|
||||
ADC 1
|
||||
STSP
|
||||
LDRF 1
|
||||
STFP
|
||||
; Store the result of the call on the stack
|
||||
LDV tmp1
|
||||
STRF -3
|
||||
|
||||
;; Recursive call for n-2
|
||||
; Remember function argument in tmp1
|
||||
LDRF -2
|
||||
STV tmp1
|
||||
; Create shared stack frame of size 1
|
||||
LDFP
|
||||
STRS 0
|
||||
LDSP
|
||||
ADC -1
|
||||
STFP
|
||||
ADC -1
|
||||
STSP
|
||||
; And fill in the first argument
|
||||
LDV tmp1
|
||||
STRF 0
|
||||
; Now, we can call fib
|
||||
CALL fib
|
||||
; Restore this function's stack frame
|
||||
LDFP
|
||||
ADC 1
|
||||
STSP
|
||||
LDRF 1
|
||||
STFP
|
||||
; Store the result of the call on the stack
|
||||
LDV tmp1
|
||||
STRF -4
|
||||
|
||||
; Add the return values and write the result to tmp1
|
||||
LDRF -3
|
||||
STV tmp1
|
||||
LDRF -4
|
||||
ADD tmp1
|
||||
STV tmp1
|
||||
|
||||
;; Deinitialization
|
||||
fib-cleanup:
|
||||
; Restore RA
|
||||
LDRF 0
|
||||
STRA
|
||||
; Restore previous stack frame
|
||||
LDFP
|
||||
ADC 1
|
||||
STSP
|
||||
LDRF 1
|
||||
STFP
|
||||
|
||||
RET
|
||||
|
||||
; Fibonacci numbers will be written here
|
||||
300:
|
||||
number-array: LIT 0
|
||||
Loading…
Add table
Add a link
Reference in a new issue