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