random.S revision 1.1
11.1Sfvdl/*	$NetBSD: random.S,v 1.1 2001/06/19 00:22:46 fvdl Exp $	*/
21.1Sfvdl
31.1Sfvdl/*-
41.1Sfvdl * Copyright (c) 1998 The NetBSD Foundation, Inc.
51.1Sfvdl * All rights reserved.
61.1Sfvdl *
71.1Sfvdl * This code is derived from software contributed to The NetBSD Foundation
81.1Sfvdl * by Charles M. Hannum.
91.1Sfvdl *
101.1Sfvdl * Redistribution and use in source and binary forms, with or without
111.1Sfvdl * modification, are permitted provided that the following conditions
121.1Sfvdl * are met:
131.1Sfvdl * 1. Redistributions of source code must retain the above copyright
141.1Sfvdl *    notice, this list of conditions and the following disclaimer.
151.1Sfvdl * 2. Redistributions in binary form must reproduce the above copyright
161.1Sfvdl *    notice, this list of conditions and the following disclaimer in the
171.1Sfvdl *    documentation and/or other materials provided with the distribution.
181.1Sfvdl * 3. All advertising materials mentioning features or use of this software
191.1Sfvdl *    must display the following acknowledgement:
201.1Sfvdl *        This product includes software developed by the NetBSD
211.1Sfvdl *        Foundation, Inc. and its contributors.
221.1Sfvdl * 4. Neither the name of The NetBSD Foundation nor the names of its
231.1Sfvdl *    contributors may be used to endorse or promote products derived
241.1Sfvdl *    from this software without specific prior written permission.
251.1Sfvdl *
261.1Sfvdl * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
271.1Sfvdl * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
281.1Sfvdl * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
291.1Sfvdl * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
301.1Sfvdl * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
311.1Sfvdl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
321.1Sfvdl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
331.1Sfvdl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
341.1Sfvdl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
351.1Sfvdl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
361.1Sfvdl * POSSIBILITY OF SUCH DAMAGE.
371.1Sfvdl */
381.1Sfvdl
391.1Sfvdl/*
401.1Sfvdl * Copyright (c) 1990,1993 The Regents of the University of California.
411.1Sfvdl * All rights reserved.
421.1Sfvdl *
431.1Sfvdl * Redistribution and use in source and binary forms, with or without
441.1Sfvdl * modification, are permitted provided that: (1) source code distributions
451.1Sfvdl * retain the above copyright notice and this paragraph in its entirety, (2)
461.1Sfvdl * distributions including binary code include the above copyright notice and
471.1Sfvdl * this paragraph in its entirety in the documentation or other materials
481.1Sfvdl * provided with the distribution, and (3) all advertising materials mentioning
491.1Sfvdl * features or use of this software display the following acknowledgement:
501.1Sfvdl * ``This product includes software developed by the University of California,
511.1Sfvdl * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
521.1Sfvdl * the University nor the names of its contributors may be used to endorse
531.1Sfvdl * or promote products derived from this software without specific prior
541.1Sfvdl * written permission.
551.1Sfvdl * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
561.1Sfvdl * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
571.1Sfvdl * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
581.1Sfvdl *
591.1Sfvdl * Here is a very good random number generator.  This implementation is
601.1Sfvdl * based on ``Two Fast Implementations of the "Minimal Standard" Random
611.1Sfvdl * Number Generator'', David G. Carta, Communications of the ACM, Jan 1990,
621.1Sfvdl * Vol 33 No 1.  Do NOT modify this code unless you have a very thorough
631.1Sfvdl * understanding of the algorithm.  It's trickier than you think.  If
641.1Sfvdl * you do change it, make sure that its 10,000'th invocation returns
651.1Sfvdl * 1043618065.
661.1Sfvdl *
671.1Sfvdl * Here is easier-to-decipher pseudocode:
681.1Sfvdl *
691.1Sfvdl * p = (16807*seed)<30:0>	# e.g., the low 31 bits of the product
701.1Sfvdl * q = (16807*seed)<62:31>	# e.g., the high 31 bits starting at bit 32
711.1Sfvdl * if (p + q < 2^31)
721.1Sfvdl * 	seed = p + q
731.1Sfvdl * else
741.1Sfvdl *	seed = ((p + q) & (2^31 - 1)) + 1
751.1Sfvdl * return (seed);
761.1Sfvdl *
771.1Sfvdl * The result is in (0,2^31), e.g., it's always positive.
781.1Sfvdl */
791.1Sfvdl#include <machine/asm.h>
801.1Sfvdl
811.1Sfvdl	.data
821.1Sfvdlrandseed:
831.1Sfvdl	.long	1
841.1Sfvdl	.text
851.1SfvdlENTRY(random)
861.1Sfvdl	movl	$16807,%eax
871.1Sfvdl	imull	randseed(%rip)
881.1Sfvdl	shld	$1,%eax,%edx
891.1Sfvdl	andl	$0x7fffffff,%eax
901.1Sfvdl	addl	%edx,%eax
911.1Sfvdl	js	1f
921.1Sfvdl	movl	%eax,randseed(%rip)
931.1Sfvdl	ret
941.1Sfvdl1:
951.1Sfvdl	subl	$0x7fffffff,%eax
961.1Sfvdl	movl	%eax,randseed(%rip)
971.1Sfvdl	ret
98