*  Date: Tue 14 Oct 86 11:32:24-PDT
*  From: Oscar Buneman <BUNEMAN@Sierra.Stanford.EDU>
*  vectorised random number generator
      ident random
      entry random
*----------Fortran call:   call random(array,length)
*----------generates powers of o'100000003 modulo 2**48
*----------starts with the 23rd power as seed on first call
seed  con o'4046005227564113
c000  con o'3037347100000000
d000  con o'3753640100000000
random a7 2,a6    length address
      a1 0
      a2 64
      vl a2
      s1 seed,
      s2 s1+s1
      a7 ,a7  length value
      s2 s2+s1
      s1 s1<24
      s1 s1+s2
      s6 <48    mask
      s1 s6&s1
*-----------scalar loop for first 64:
loop  v1,a1   s1
      s2 s1+s1
      s2 s2+s1
      s1 s1<24
      s1 s1+s2
      s1 s6&s1
      a1 a1+a0
      a0 a1-a2
      jam loop
*---------------
      s5 c000,   top half of o'100000003**64
      s7 <24
      s7 s7<24
      s3 d000,   bottom half of o'100000003**64 moved up
      a1 0
      a3 a7-1       length-1
      s2 >58
      s1 +a3
      s1 s1&s2
      a3 s1      length-1 with bottom six bits missing
      s4 sb
      s4 s4>1       exponent for floating
      a5 1,a6
      a6 a7-a3
      a6 a6-1       index of last element used
      v0 v1           copy
      j test
*---------------vector loop using integer multiplication of
*---------------24 top bits of mantissas and:
*---------------(A*2**24+B)*(C*2**24+D)=(AD+BC)*2**24+BD mod 2**48
vloop v6 s4+v0    4AB      include exponent for floating
      v5 s7&v6    0A0
      v2 s3*fv5   0AD
      a4 24
      v4 v1<a4    AB0
*---next chain:
      s1 v0,a6    save for seed
      s0 v2,a0    stall
      v7 s0+fv6  normalise
      v3 s7&v4    0B0
      v1 s5*fv3   0BC
      v0 v1+v2    AD+BC
      v5 v0<a4    AD+BC 0
      a0 a5+a1
      a1 a1+a2
*---next chain:
      s0 v5,a0     stall
      ,a0,a0 v7   store
      v4 s3*fv3   0BD
      v6 v4+v5   (AD+BC)<24+BD
      v0 s6&v6    0A'B'
      a4 0
      v1 v0<a4    copy
test  a0 a1-a3
      jam vloop
      vl a7         shorten vector
      jaz vloop
*---------------------
      seed, s1     seed to be used in next call
      j b0
      end
-------