#!/usr/bin/env bash
# Copyright 2009 The Go Authors.  All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

set -e

eval $(gomake --no-print-directory -f ../../src/Make.inc go-env)
PATH=.:$PATH

mode=run
case X"$1" in
X-test)
	mode=test
	shift
esac

gc() {
	$GC $1.go; $LD $1.$O
}

gc_B() {
	$GC -B $1.go; $LD $1.$O
}

runonly() {
	if [ $mode = run ]
	then
		"$@"
	fi
}



run() {
	if [ $mode = test ]
	then
		if echo $1 | grep -q '^gc '
		then
			$1	# compile the program
			program=$(echo $1 | sed 's/gc //')
			shift
			echo $program
			$1 <fasta-1000.out > /tmp/$$
			case $program in
			chameneosredux)
				# exact numbers may vary but non-numbers should match
				grep -v '[0-9]' /tmp/$$ > /tmp/$$x
				grep -v '[0-9]' chameneosredux.txt > /tmp/$$y
				cmp /tmp/$$x /tmp/$$y
				rm -f /tmp/$$ /tmp/$$x /tmp/$$y
				;;
			*)
				cmp /tmp/$$ $program.txt
				rm -f /tmp/$$
			esac
		fi
		return
	fi
	echo -n '	'$1'	'
	$1
	shift
	
	echo $((time -p $* >/dev/null) 2>&1) | awk '{print $4 "u " $6 "s " $2 "r"}'
}

fasta() {
	runonly echo 'fasta -n 25000000'
	run 'gcc -O2 fasta.c' a.out 25000000
	run 'gccgo -O2 fasta.go' a.out -n 25000000	#commented out until WriteString is in bufio
	run 'gc fasta' $O.out -n 25000000
	run 'gc_B fasta' $O.out -n 25000000
}

revcomp() {
	runonly gcc -O2 fasta.c
	runonly a.out 25000000 > x
	runonly echo 'reverse-complement < output-of-fasta-25000000'
	run 'gcc -O2 reverse-complement.c' a.out < x
	run 'gccgo -O2 reverse-complement.go' a.out < x
	run 'gc reverse-complement' $O.out < x
	run 'gc_B reverse-complement' $O.out < x
	rm x
}

nbody() {
	runonly echo 'nbody -n 50000000'
	run 'gcc -O2 nbody.c' a.out 50000000
	run 'gccgo -O2 nbody.go' a.out -n 50000000
	run 'gc nbody' $O.out -n 50000000
	run 'gc_B nbody' $O.out -n 50000000
}

binarytree() {
	runonly echo 'binary-tree 15 # too slow to use 20'
	run 'gcc -O2 binary-tree.c -lm' a.out 15
	run 'gccgo -O2 binary-tree.go' a.out -n 15
	run 'gccgo -O2 binary-tree-freelist.go' $O.out -n 15
	run 'gc binary-tree' $O.out -n 15
	run 'gc binary-tree-freelist' $O.out -n 15
}

fannkuch() {
	runonly echo 'fannkuch 12'
	run 'gcc -O2 fannkuch.c' a.out 12
	run 'gccgo -O2 fannkuch.go' a.out -n 12
	run 'gccgo -O2 fannkuch-parallel.go' a.out -n 12
	run 'gc fannkuch' $O.out -n 12
	run 'gc fannkuch-parallel' $O.out -n 12
	run 'gc_B fannkuch' $O.out -n 12
}

regexdna() {
	runonly gcc -O2 fasta.c
	runonly a.out 100000 > x
	runonly echo 'regex-dna 100000'
	run 'gcc -O2 regex-dna.c -lpcre' a.out <x
#	run 'gccgo -O2 regex-dna.go' a.out <x	# restore after regexp.FindIndex is in library
	run 'gc regex-dna' $O.out <x
	run 'gc regex-dna-parallel' $O.out <x
	run 'gc_B regex-dna' $O.out <x
	rm x
}

spectralnorm() {
	runonly echo 'spectral-norm 5500'
	run 'gcc -O2 spectral-norm.c -lm' a.out 5500
	run 'gccgo -O2 spectral-norm.go' a.out -n 5500
	run 'gc spectral-norm' $O.out -n 5500
	run 'gc_B spectral-norm' $O.out -n 5500
}

knucleotide() {
	runonly gcc -O2 fasta.c
	runonly a.out 1000000 > x  # should be using 25000000
	runonly echo 'k-nucleotide 1000000'
	run 'gcc -O2 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include k-nucleotide.c -lglib-2.0' a.out <x
	run 'gccgo -O2 k-nucleotide.go' a.out <x
	run 'gccgo -O2 k-nucleotide-parallel.go' a.out <x
	run 'gc k-nucleotide' $O.out <x
	run 'gc k-nucleotide-parallel' $O.out <x
	run 'gc_B k-nucleotide' $O.out <x
	rm x
}

mandelbrot() {
	runonly echo 'mandelbrot 16000'
	run 'gcc -O2 mandelbrot.c' a.out 16000
	run 'gccgo -O2 mandelbrot.go' a.out -n 16000
	run 'gc mandelbrot' $O.out -n 16000
	run 'gc_B mandelbrot' $O.out -n 16000
}

meteor() {
	runonly echo 'meteor 16000'
	run 'gcc -O2 meteor-contest.c' a.out
	run 'gccgo -O2 meteor-contest.go' a.out
	run 'gc meteor-contest' $O.out
	run 'gc_B  meteor-contest' $O.out
}

pidigits() {
	runonly echo 'pidigits 10000'
	run 'gcc -O2 pidigits.c -lgmp' a.out 10000
	run 'gccgo -O2 pidigits.go' a.out -n 10000
	run 'gc pidigits' $O.out -n 10000
	run 'gc_B  pidigits' $O.out -n 10000
}

threadring() {
	runonly echo 'threadring 50000000'
	run 'gcc -O2 threadring.c -lpthread' a.out 50000000
	run 'gccgo -O2 threadring.go' a.out -n 50000000
	run 'gc threadring' $O.out -n 50000000
}

chameneos() {
	runonly echo 'chameneos 6000000'
	run 'gcc -O2 chameneosredux.c -lpthread' a.out 6000000
	run 'gccgo -O2 chameneosredux.go' a.out 6000000
	run 'gc chameneosredux' $O.out 6000000
}

case $# in
0)
	run="fasta revcomp nbody binarytree fannkuch regexdna spectralnorm knucleotide mandelbrot meteor pidigits threadring chameneos"
	;;
*)
	run=$*
esac

for i in $run
do
	$i
	runonly echo
done
