Annotation of 43BSDTahoe/usr.lib/libF77/rand_.s.vax, revision 1.1

1.1     ! root        1: # Date: 4 Mar 1982 20:54:18-PST
        !             2: # From: cithep!citcsv!kingsley at Berkeley
        !             3: # To: cithep!ucbvax!4bsd-bugs@Berkeley
        !             4: # Subject: random number generation.
        !             5: 
        !             6: # I have done a little work with rand supplied with the system and I have
        !             7: # discovered that it is flawed.  The manual page claims that it has a
        !             8: # period of 2^32 and returns numbers from 0 to 2^31-1.  The code makes it
        !             9: # look like the author thought it was correct, but it is not.  Instead of
        !            10: # masking out the most significant (and also most random) bit, you should
        !            11: # do an unsigned shift to throw out the least significant (and least
        !            12: # random) bit.  I have also found a multiplier that passes Knuth's
        !            13: # spectral test very well.
        !            14: #       I have written a new rand, along with randint(n) which returns 0
        !            15: # to n-1, and flat() which returns 0.0 to <1.0.  I did it in assembler
        !            16: # (Mea Maxima Culpa!) to use the extended multiply and some bit fiddling.
        !            17: 
        !            18: # Yes, I realize that the bottom bits aren't random.  In fact, the bottom
        !            19: # n bits have a period of 2^n.  The rng delivered, though, throws out the
        !            20: # most significant bit to produce a 31 bit number, and claims that it has
        !            21: # a period of 2^32.
        !            22: 
        !            23: # The actual generator is the routine rand, the global routines just 
        !            24: # do range conversion.
        !            25: 
        !            26: # Chris Kingsley
        !            27: 
        !            28: # Adapted to f77 by David Wasley, U.C.Berkeley
        !            29: # April 1983
        !            30: #      @(#)rand_.s     1.1
        !            31: 
        !            32:        .data
        !            33:        .align  2
        !            34: _randx:        .long    1          # current value
        !            35: _nitval:.long    1         # seed
        !            36:        .text
        !            37:        .align      1
        !            38: 
        !            39:        .globl  _isrand_    # set the random seed
        !            40: _isrand_: .word   0         # isrand(seed) int seed;
        !            41:        movl    _nitval,r0  # return old seed
        !            42:        movl    *4(ap),_randx
        !            43:        movl    *4(ap),_nitval
        !            44:        ret
        !            45:        .align  1
        !            46: 
        !            47:        .globl  _irand_     # give a 31 bit random positive integer
        !            48: _irand_:.word   0           # integer rand(flag) int flag
        !            49:        tstl    *4(ap)      # 0 is normal
        !            50:        beql    ir1
        !            51:        cmpl    $1,*4(ap)    # if arg is 1, restart
        !            52:        bneq    ir0
        !            53:        movl    _nitval,_randx
        !            54:        jbr     ir1
        !            55: ir0:   movl    *4(ap),_randx # new seed
        !            56:        movl    *4(ap),_nitval # new seed
        !            57: ir1:   jsb     rand
        !            58:        bicl2   $1,r0
        !            59:        rotl    $-1,r0,r0
        !            60:        ret
        !            61: 
        !            62:        .globl  _irandn_    # give a random positive integer from 0 to n-1
        !            63: _irandn_:.word  0xc         # integer irandn(n) int n;
        !            64:        jsb     rand
        !            65:        emul    *4(ap),r0,$0,r2
        !            66:        tstl    r0
        !            67:        jgeq    irn1
        !            68:        addl3   *4(ap),r3,r0
        !            69:        jbr     irn2
        !            70: irn1:  movl    r3,r0
        !            71: irn2:  ret
        !            72:        .align  1
        !            73: 
        !            74: # compute the next 32 bit random number
        !            75: rand:   mull3   $505360173,_randx,r0
        !            76:        addl2   $907633385,r0
        !            77:        movl    r0,_randx
        !            78:        rsb
        !            79:        .align 1
        !            80: 
        !            81:        .globl  _drand_     # give a random double from 0. to <1.
        !            82: _drand_: .word   0xc        # double precision drand(flag)
        !            83: dr0:   tstl    *4(ap)      # 0 is normal
        !            84:        beql    dr2
        !            85:        cmpl    $1,*4(ap)    # if arg is 1, restart
        !            86:        bneq    dr1
        !            87:        movl    _nitval,_randx
        !            88:        jbr     dr2
        !            89: dr1:   movl    *4(ap),_randx # new seed
        !            90:        movl    *4(ap),_nitval # new seed
        !            91: dr2:   jsb     rand
        !            92:        movl    r0,r2
        !            93:        movf    $0f1.0,r0
        !            94:        extzv   $25,$7,r2,r3
        !            95:        insv    r3,$0,$7,r0
        !            96:        extzv   $9,$16,r2,r3
        !            97:        insv    r3,$16,$16,r0
        !            98:        extzv   $0,$9,r2,r1
        !            99:        subd2   $0d1.0,r0
        !           100:        ret
        !           101: 
        !           102:        .globl  _rand_      # fake entry for single precision rand
        !           103: _rand_:        .word   0xc
        !           104:        jbr     dr0

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.