rtforth 0.6.8

Forth implemented in Rust for realtime application
Documentation
\ This is an adaption of the matrix multiplication benchmark for using
\ run-time code generation (inspired by lee&leone96)

\ @InProceedings{lee&leone96,
\   author = 	 {Peter Lee and Mark Leone},
\   title = 	 {Optimizing ML with Run-Time Code Generation},
\   crossref =	 {sigplan96},
\   pages =	 {137--148}
\ }
\ @Proceedings{sigplan96,
\   booktitle = 	 "SIGPLAN '96 Conference on Programming Language
\ 		  Design and Implementation",
\   title = 	 "SIGPLAN '96 Conference on Programming Language
\ 		  Design and Implementation",
\   year = 	 "1996",
\   key = 	 "PLDI '96"
\ }

\ The original version is in comments.
\ The results with Gforth on a Nekotech Mach2 (300MHz 21064a) are very nice:
\ original program:		 6.2s user time
\ with run-time code generation: 3.9s user time
\ NOTE: This version needs 160,000+ cells data space
\	and a lot of code space, too.

\ A classical benchmark of an O(n**3) algorithm; Matrix Multiplication
\
\ Part of the programs gathered by John Hennessy for the MIPS
\ RISC project at Stanford. Translated to forth by  Marty Fraeman,
\ Johns Hopkins University/Applied Physics Laboratory.

\ MM forth2c doesn't have it !
: mybounds  over + swap ;
: under+ ( a x b -- a+b x )
   rot + swap ;

1 cells constant cell

variable seed

: initiate-seed ( -- )  74755 seed ! ;
: random  ( -- n )  seed @ 1309 * 13849 + 65535 and dup seed ! ;

200 constant row-size
row-size cells constant row-byte-size

row-size row-size * constant mat-size
mat-size cells constant mat-byte-size

align create ima mat-byte-size allot
align create imb mat-byte-size allot
align create imr mat-byte-size allot

: initiate-matrix ( m[row-size][row-size] -- )
  mat-byte-size mybounds do
    random dup 120 / 120 * - 60 - i !
  cell +loop
;

: gen-innerproduct ( a[row][*] -- xt )
\ xt is of type ( b[*][column] -- n )
\ this would be a candidate for using ]] ... [[
 >r :noname r>
 0 POSTPONE literal POSTPONE SWAP
 row-size 0 do
   POSTPONE dup POSTPONE @
   dup @ POSTPONE literal POSTPONE * POSTPONE under+
   POSTPONE cell+ row-byte-size +
  loop
  drop
 POSTPONE drop POSTPONE ;
;

\ : innerproduct ( a[row][*] b[*][column] -- int)
\   0 row-size 0 do ( a b int )
\     >r over @ over @ * r> + >r
\     cell+ swap row-byte-size + swap
\     r>
\   loop
\   >r 2drop r>
\ ;

: main  ( -- )
  initiate-seed
  ima initiate-matrix
  imb initiate-matrix 
  imr ima mat-byte-size mybounds do
   i gen-innerproduct swap
    imb row-byte-size mybounds do ( r xt )
      i 2 pick execute over ! cell+
    cell +loop
    nip \ !! forget the xt
  row-size cells +loop
  drop
;

\ : main  ( -- )
\   initiate-seed
\   ima initiate-matrix
\   imb initiate-matrix 
\   imr ima mat-byte-size mybounds do
\     imb row-byte-size mybounds do
\       j i innerproduct over ! cell+ 
\     cell +loop
\   row-size cells +loop
\   drop
\ ;