Home | History | Annotate | Line # | Download | only in sparc
random.S revision 1.3.14.1
      1  1.3.14.1     yamt /*	$NetBSD: random.S,v 1.3.14.1 2014/05/22 11:41:04 yamt Exp $	*/
      2       1.1  mycroft 
      3       1.1  mycroft /*
      4       1.1  mycroft  * Copyright (c) 1990,1993 The Regents of the University of California.
      5       1.1  mycroft  * All rights reserved.
      6       1.1  mycroft  *
      7       1.1  mycroft  * Redistribution and use in source and binary forms, with or without
      8       1.1  mycroft  * modification, are permitted provided that: (1) source code distributions
      9       1.1  mycroft  * retain the above copyright notice and this paragraph in its entirety, (2)
     10       1.1  mycroft  * distributions including binary code include the above copyright notice and
     11       1.1  mycroft  * this paragraph in its entirety in the documentation or other materials
     12       1.1  mycroft  * provided with the distribution, and (3) all advertising materials mentioning
     13       1.1  mycroft  * features or use of this software display the following acknowledgement:
     14       1.1  mycroft  * ``This product includes software developed by the University of California,
     15       1.1  mycroft  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
     16       1.1  mycroft  * the University nor the names of its contributors may be used to endorse
     17       1.1  mycroft  * or promote products derived from this software without specific prior
     18       1.1  mycroft  * written permission.
     19       1.1  mycroft  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
     20       1.1  mycroft  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
     21       1.1  mycroft  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
     22       1.1  mycroft  *
     23       1.1  mycroft  * Here is a very good random number generator.  This implementation is
     24       1.1  mycroft  * based on ``Two Fast Implementations of the "Minimal Standard" Random
     25       1.1  mycroft  * Number Generator'', David G. Carta, Communications of the ACM, Jan 1990,
     26       1.1  mycroft  * Vol 33 No 1.  Do NOT modify this code unless you have a very thorough
     27       1.1  mycroft  * understanding of the algorithm.  It's trickier than you think.  If
     28       1.1  mycroft  * you do change it, make sure that its 10,000'th invocation returns
     29       1.1  mycroft  * 1043618065.
     30       1.1  mycroft  *
     31       1.1  mycroft  * Here is easier-to-decipher pseudocode:
     32       1.1  mycroft  *
     33       1.1  mycroft  * p = (16807*seed)<30:0>	# e.g., the low 31 bits of the product
     34       1.1  mycroft  * q = (16807*seed)<62:31>	# e.g., the high 31 bits starting at bit 32
     35       1.1  mycroft  * if (p + q < 2^31)
     36       1.1  mycroft  * 	seed = p + q
     37       1.1  mycroft  * else
     38       1.1  mycroft  *	seed = ((p + q) & (2^31 - 1)) + 1
     39       1.1  mycroft  * return (seed);
     40       1.1  mycroft  *
     41       1.1  mycroft  * The result is in (0,2^31), e.g., it's always positive.
     42       1.1  mycroft  */
     43       1.1  mycroft #include <machine/asm.h>
     44       1.1  mycroft 
     45       1.1  mycroft 	.data
     46  1.3.14.1     yamt 	.align	4
     47       1.1  mycroft randseed:
     48       1.1  mycroft 	.long	1
     49       1.3    pooka 
     50       1.1  mycroft 	.text
     51       1.1  mycroft ENTRY(random)
     52       1.1  mycroft 	sethi	%hi(16807), %o1
     53       1.1  mycroft 	wr	%o1, %lo(16807), %y
     54  1.3.14.1     yamt #ifdef __PIC__
     55       1.3    pooka 	PIC_PROLOGUE(%o5, %o2)
     56       1.3    pooka 	set	randseed, %g1
     57       1.3    pooka 	ld	[%o5 + %g1], %g1
     58       1.3    pooka 	ld	[%g1], %o0
     59       1.2    pooka #else
     60       1.2    pooka 	sethi	%hi(randseed), %g1
     61       1.2    pooka 	ld	[%g1 + %lo(randseed)], %o0
     62       1.2    pooka #endif
     63       1.2    pooka 	andcc	%g0, 0, %o2
     64       1.1  mycroft 	mulscc  %o2, %o0, %o2
     65       1.1  mycroft 	mulscc  %o2, %o0, %o2
     66       1.1  mycroft 	mulscc  %o2, %o0, %o2
     67       1.1  mycroft 	mulscc  %o2, %o0, %o2
     68       1.1  mycroft 	mulscc  %o2, %o0, %o2
     69       1.1  mycroft 	mulscc  %o2, %o0, %o2
     70       1.1  mycroft 	mulscc  %o2, %o0, %o2
     71       1.1  mycroft 	mulscc  %o2, %o0, %o2
     72       1.1  mycroft 	mulscc  %o2, %o0, %o2
     73       1.1  mycroft 	mulscc  %o2, %o0, %o2
     74       1.1  mycroft 	mulscc  %o2, %o0, %o2
     75       1.1  mycroft 	mulscc  %o2, %o0, %o2
     76       1.1  mycroft 	mulscc  %o2, %o0, %o2
     77       1.1  mycroft 	mulscc  %o2, %o0, %o2
     78       1.1  mycroft 	mulscc  %o2, %o0, %o2
     79       1.1  mycroft 	mulscc  %o2, %g0, %o2
     80       1.1  mycroft 	rd	%y, %o3
     81       1.1  mycroft 	srl	%o2, 16, %o1
     82       1.1  mycroft 	set	0xffff, %o4
     83       1.1  mycroft 	and	%o4, %o2, %o0
     84       1.1  mycroft 	sll	%o0, 15, %o0
     85       1.1  mycroft 	srl	%o3, 17, %o3
     86       1.1  mycroft 	or	%o3, %o0, %o0
     87       1.1  mycroft 	addcc	%o0, %o1, %o0
     88       1.1  mycroft 	bneg	1f
     89       1.2    pooka 	sethi	%hi(0x7fffffff), %o1
     90       1.1  mycroft 	retl
     91  1.3.14.1     yamt #ifdef __PIC__
     92       1.3    pooka 	st	%o0, [%g1]
     93       1.2    pooka #else
     94       1.2    pooka 	st	%o0, [%g1 + %lo(randseed)]
     95       1.2    pooka #endif
     96       1.1  mycroft 1:
     97       1.1  mycroft 	or	%o1, %lo(0x7fffffff), %o1
     98       1.1  mycroft 	add	%o0, 1, %o0
     99       1.1  mycroft 	and	%o1, %o0, %o0
    100       1.1  mycroft 	retl
    101  1.3.14.1     yamt #ifdef __PIC__
    102       1.3    pooka 	st	%o0, [%g1]
    103       1.2    pooka #else
    104       1.2    pooka 	st	%o0, [%g1 + %lo(randseed)]
    105       1.2    pooka #endif
    106