OpenCores
URL https://opencores.org/ocsvn/eco32/eco32/trunk

Subversion Repositories eco32

[/] [eco32/] [trunk/] [fp/] [implementation/] [mmix/] [permu-heap.mms] - Rev 15

Compare with Previous | Blame | View Log

* Permutation generator a la Heap
N  IS   5               $n$ (3, 4, 5, or 6)
t  IS   $255
j  IS   $0              $8j$
k  IS   $1              $8k$
ak IS   $2
aj IS   $3

   LOC  Data_Segment
a  GREG @               Base address for $a_0\ldots a_{n-1}$
A0 IS   @
A1 IS   @+8
A2 IS   @+16
*  LOC  @+8*N           Space for $a_0\ldots a_{n-1}$
   BYTE "11111111","22222222","33333333"
   BYTE "44444444","55555555","66666666"
   BYTE #a,0
   LOC  (@+7)&-8        (align to octabyte)
c  GREG @-8*3           Location of $c_0$
   LOC  @-8*3+8*N       $8c_3\ldots 8c_{n-1}$, initially zero
   OCTA -1              $c_n=-1$, a convenient sentinel
u  GREG 0               Contents of $a_0$, except in inner loop
v  GREG 0               Contents of $a_1$, except in inner loop
w  GREG 0               Contents of $a_2$, except in inner loop

   LOC  #100
1H STCO 0,c,k           $c_k\gets 0$.
   INCL k,8             $k\gets k+1$.
0H LDO  j,c,k           $j\gets c_k$.
   CMP  t,j,k
   BZ   t,1B            Loop if $c_k=k$.
   BN   j,Done          Terminate if $c_k<0$ ($k=n$).
   LDO  ak,a,k          Fetch $a_k$.
   ADD  t,j,8
   STO  t,c,k           $c_k\gets j+1$.          
   AND  t,k,#8         
   CSZ  j,t,0           Set $j\gets 0$ if $k$ is even.
   LDO  aj,a,j          Fetch $a_j$.
   STO  ak,a,j          Replace it by $a_k$.
   CSZ  u,j,ak          Set $u\gets a_k$ if $j=0$.
   SUB  j,j,8           $j\gets j-1$.
   CSZ  v,j,ak          Set $v\gets a_k$ if $j=0$.
   SUB  j,j,8           $j\gets j-1$.
   CSZ  w,j,ak          Set $w\gets a_k$ if $j=0$.
   STO  aj,a,k          Replace $a_k$ by what was $a_j$.
In PUSHJ 0,Visit
   STO   v,A0           $a_0\gets v$.
   STO   u,A1           $a_1\gets u$.
   PUSHJ 0,Visit 
   STO   w,A0           $a_0\gets w$.
   STO   v,A2           $a_2\gets v$.
   PUSHJ 0,Visit 
   STO   u,A0           $a_0\gets u$.
   STO   w,A1           $a_1\gets w$.
   PUSHJ 0,Visit 
   STO   v,A0           $a_0\gets v$.
   STO   u,A2           $a_2\gets u$.
   PUSHJ 0,Visit 
   STO   w,A0           $a_0\gets w$.
   STO   v,A1           $a_1\gets v$.
   PUSHJ 0,Visit 
   SET   t,u            Swap $u\leftrightarrow w$.
   SET   u,w
   SET   w,t
   SET   k,8*3          $k\gets3$.
   JMP   0B

Visit LDA  t,A0
      TRAP 0,Fputs,StdOut
      POP
Main  LDO  u,A0
      LDO  v,A1
      LDO  w,A2
      JMP  In
Done  TRAP 0,Halt,0

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.