# Copyright (C) 2001-2003, Parrot Foundation.

=head1 NAME

examples/benchmarks/primes.pasm - Calculate prime numbers < 50000

=head1 SYNOPSIS

    % ./parrot examples/benchmarks/primes.pasm

=head1 DESCRIPTION

Calculates all the prime numbers up to 50000 and prints out the number
of primes, the last one found, and the time taken.

=cut

.pcc_sub :main main:

# I1 holds the number we're currently checking for primality
	set     I1, 1
	# I2 holds the highest number we want to check for primality
	set     I2, 10000
	set	I6, 0
	print   "N primes up to "
	print   I2
	print   " is: "
	time	N10
	# I1 counts up to I2
REDO:   # I3 counts from 2 up to I4 (I1/2)
	set     I3, 2
	div     I4, I1, 2
LOOP:   # Check if I3 is a factor of I1
.loadlib 'math_ops' # cmod is a dynop
	cmod    I5, I1, I3
	if      I5, OK
	# We've found a factor, so it can't be a prime and
	# we can skip right out of this loop and to the next
	# number
	branch  NEXT
OK:     inc     I3
	le      I3, I4, LOOP
	# We haven't found a factor so it must be a prime
	inc	I6
	set 	I7, I1
	# print I1
	# print "\n"	# to get them all
NEXT:   # Move on to the next number
	inc     I1
	le      I1, I2, REDO
	time	N11
	print	I6
	print	"\nlast is: "
	print   I7
	print   "\n"
	sub 	N11, N10
	print 	"Elapsed time: "
	print	N11
	print	"\n"
	end

=head1 SEE ALSO

F<examples/benchmarks/primes.c>,
F<examples/benchmarks/primes.pl>,
F<examples/benchmarks/primes2_p.pasm>,
F<examples/benchmarks/primes2.c>,
F<examples/benchmarks/primes2.pir>,
F<examples/benchmarks/primes2.py>.

=cut

# Local Variables:
#   mode: pir
#   fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir:
