* 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 -------