ICCAVAILABLE := $(shell command -v icc 2> /dev/null)
ARCH := $(shell uname -p)

all :
ifndef BUILDDIR
	@echo
	@echo Please set the build directory to BUILDDIR environment variable and run make once again.
	@echo e.g. export BUILDDIR='`pwd`'/../../build
	@echo
else
	@echo
	@echo You can start measurement by "'"make measure"'".
ifdef ICCAVAILABLE
	@echo You can start measurement with SVML by "'"make measureSVML"'".
endif
	@echo Then, you can plot the results of measurement by "'"make plot"'".
	@echo	
	@echo You have to install java and gnuplot to do plotting.
	@echo Stop all tasks on the computer before starting measurement.
	@echo
endif

benchsvml128_10.o : benchsvml128.c bench.h
	-command -v icc >/dev/null 2>&1 && icc benchsvml128.c -Wall -I.. -DSVMLULP=1 -fimf-max-error=1.0 -fimf-domain-exclusion=0 -march=core-avx2 -O0 -lm -c -o benchsvml128_10.o

benchsvml128_40.o : benchsvml128.c bench.h
	-command -v icc >/dev/null 2>&1 && icc benchsvml128.c -Wall -I.. -DSVMLULP=4 -fimf-max-error=4.0 -fimf-domain-exclusion=0 -march=core-avx2 -O0 -lm -c -o benchsvml128_40.o

benchsvml256_10.o : benchsvml256.c bench.h
	-command -v icc >/dev/null 2>&1 && icc benchsvml256.c -Wall -I.. -DSVMLULP=1 -fimf-max-error=1.0 -fimf-domain-exclusion=0 -march=core-avx2 -O0 -lm -c -o benchsvml256_10.o

benchsvml256_40.o : benchsvml256.c bench.h
	-command -v icc >/dev/null 2>&1 && icc benchsvml256.c -Wall -I.. -DSVMLULP=4 -fimf-max-error=4.0 -fimf-domain-exclusion=0 -march=core-avx2 -O0 -lm -c -o benchsvml256_40.o

benchsvml512_10.o : benchsvml512.c bench.h
	-command -v icc >/dev/null 2>&1 && icc benchsvml512.c -Wall -I.. -DSVMLULP=1 -fimf-max-error=1.0 -fimf-domain-exclusion=0 -xCOMMON-AVX512 -O0 -lm -c -o benchsvml512_10.o

benchsvml512_40.o : benchsvml512.c bench.h
	-command -v icc >/dev/null 2>&1 && icc benchsvml512.c -Wall -I.. -DSVMLULP=4 -fimf-max-error=4.0 -fimf-domain-exclusion=0 -xCOMMON-AVX512 -O0 -lm -c -o benchsvml512_40.o


benchsvml_10 : benchsvml.c benchsvml128_10.o benchsvml256_10.o benchsvml512_10.o bench.h
	-command -v icc >/dev/null 2>&1 && icc benchsvml.c benchsvml128_10.o benchsvml256_10.o benchsvml512_10.o -Wall -I.. -DSVMLULP=1 -fimf-max-error=1.0 -fimf-domain-exclusion=0 -O0 -march=native -lm -o benchsvml_10

benchsvml_40 : benchsvml.c benchsvml128_40.o benchsvml256_40.o benchsvml512_40.o bench.h
	-command -v icc >/dev/null 2>&1 && icc benchsvml.c benchsvml128_40.o benchsvml256_40.o benchsvml512_40.o -Wall -I.. -DSVMLULP=4 -fimf-max-error=4.0 -fimf-domain-exclusion=0 -O0 -march=native -lm -o benchsvml_40

#

ifeq ($(ARCH),aarch64)

benchsleef : benchsleef.c benchsleef128.o bench.h
	$(CC) benchsleef.c benchsleef128.o -Wall -O0 -g -I$(BUILDDIR)/include -L$(BUILDDIR)/lib -Wno-attributes -lsleef -lm -o benchsleef

benchsleef128.o : benchsleef128.c bench.h
	$(CC) benchsleef128.c -Wall -march=native -O0 -g -I$(BUILDDIR)/include -L$(BUILDDIR)/lib -Wno-attributes -c

else

benchsleef : benchsleef.c benchsleef128.o benchsleef256.o benchsleef512.o bench.h
	$(CC) benchsleef.c benchsleef128.o benchsleef256.o benchsleef512.o -Wall -O0 -g -I$(BUILDDIR)/include -L$(BUILDDIR)/lib -Wno-attributes -lsleef -lm -o benchsleef

benchsleef128.o : benchsleef128.c bench.h
	$(CC) benchsleef128.c -Wall -march=native -O0 -g -I$(BUILDDIR)/include -L$(BUILDDIR)/lib -Wno-attributes -c

benchsleef256.o : benchsleef256.c bench.h
	$(CC) benchsleef256.c -Wall -march=native -O0 -g -I$(BUILDDIR)/include -L$(BUILDDIR)/lib -Wno-attributes -c

benchsleef512.o : benchsleef512.c bench.h
	$(CC) benchsleef512.c -Wall -mavx512f -O0 -g -I$(BUILDDIR)/include -L$(BUILDDIR)/lib -Wno-attributes -c

endif

#

ProcessData.class : ProcessData.java
	javac ProcessData.java

#

ifndef BUILDDIR
measure :
	@echo
	@echo Please set the build directory to BUILDDIR environment variable and run make once again.
	@echo e.g. export BUILDDIR='`pwd`'/../../build
	@echo
else
measure : benchsleef
	chmod +x ./measure.sh
	LD_LIBRARY_PATH=$(BUILDDIR)/lib ./measure.sh ./benchsleef
	@echo
	@echo Now, you can plot the results of measurement by "'"make plot"'".
	@echo You can do another measurement by "'"make measure"'".
ifdef ICCAVAILABLE
	@echo You can start another measurement with SVML by "'"make measureSVML"'".
endif
	@echo You can start over by "'"make restart"'".
	@echo
endif

measureSVML : all benchsvml_10 benchsvml_40
	chmod +x ./measure.sh
	./measure.sh ./benchsvml_10 ./benchsvml_40
	@echo
	@echo Now, you can plot the results of measurement by "'"make plot"'".
	@echo You can do another measurement by "'"make measure"'".
ifdef ICCAVAILABLE
	@echo You can start another measurement with SVML by "'"make measureSVML"'".
endif
	@echo You can start over by "'"make restart"'".
	@echo

plot : ProcessData.class counter.txt
	java ProcessData *dptrig*.out
	gnuplot script.out
	mv output.png trigdp.png
	java ProcessData *dpnontrig*.out
	gnuplot script.out
	mv output.png nontrigdp.png
	java ProcessData *sptrig*.out
	gnuplot script.out
	mv output.png trigsp.png
	java ProcessData *spnontrig*.out
	gnuplot script.out
	mv output.png nontrigsp.png
	@echo
	@echo Plotted results are in trigdp.png, nontrigdp.png, trigsp.png and nontrigsp.png.
	@echo

clean :
	rm -f *~ a.out *.so *.so.* *.a *.s *.o
	rm -rf *.dSYM *.dylib
	rm -f *.obj *.lib *.dll *.exp *.exe *.stackdump
	rm -f *.class *.png benchsleef benchsvml_10 benchsvml_40 *.out counter.txt

restart :
	rm -f *.out counter.txt
