# Choose your word size
WSIZE = 64
# WSIZE = 32
CC = gcc
GFLAGS = -pg 
INC = ../include
CFLAGS = -Wall -O2 -I. -I$(INC) -m$(WSIZE) -msse3
LIB = ../lib
LIBCSAPP = $(LIB)/libcsapp$(WSIZE).a
GETASM = ../class/getasmfun
BXTR = ./bxtr.pl
VXTR = ./vxtr.pl
# Choose your machine
MACHINE = p4
# MACHINE = athlon
MACHINE=machine
RESULTS=results

PROGS = fact\
	isbench\
	ipbench\
	fsbench\
	fpbench\
	dsbench\
	dpbench\
	max\
	div\
	branch\
	mem

all: $(PROGS)

bench: isbench ipbench fsbench fpbench

fact: fact.o   $(LIBCSAPP)
	$(CC) $(CFLAGS)  fact.o   $(LIBCSAPP) -o fact
	$(CC) $(CFLAGS) -I$(INC) -S fact.c
	./fact > $(RESULTS)/fact-$(MACHINE)-$(WSIZE).txt

isbench:   vec.h combine.h combine.c benchmark.c \
	vec.c $(LIBCSAPP)
	$(CC) $(CFLAGS) -DSUM -DINT -o isbench benchmark.c combine.c vec.c \
	  $(LIBCSAPP)
	#
	$(CC) $(CFLAGS) -DSUM -DINT -S combine.c -o isb.s
	$(GETASM) < isb.s > isb-s.txt
	./isbench > $(RESULTS)/isb-$(MACHINE)-$(WSIZE).txt
	$(BXTR) < $(RESULTS)/isb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/isb-$(MACHINE)-$(WSIZE).tab
	$(VXTR) < $(RESULTS)/isb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/isb-$(MACHINE)-$(WSIZE).vtab

ipbench: $(LIBCSAPP)   vec.h combine.h combine.c benchmark.c vec.c
	$(CC) $(CFLAGS) -DPROD -DINT -o ipbench benchmark.c combine.c vec.c \
	 $(LIBCSAPP) 
	$(CC) $(CFLAGS) -DPROD -DINT -S combine.c -o ipb.s
	./ipbench > $(RESULTS)/ipb-$(MACHINE)-$(WSIZE).txt
	$(BXTR) < $(RESULTS)/ipb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/ipb-$(MACHINE)-$(WSIZE).tab
	$(VXTR) < $(RESULTS)/ipb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/ipb-$(MACHINE)-$(WSIZE).vtab

fsbench:   vec.h combine.h combine.c benchmark.c \
	vec.c $(LIBCSAPP)
	$(CC) $(CFLAGS) -DSUM -DFLOAT -o fsbench benchmark.c combine.c vec.c \
	  $(LIBCSAPP)
	#
	$(CC) $(CFLAGS) -DSUM -DFLOAT -S combine.c -o fsb.s
	./fsbench > $(RESULTS)/fsb-$(MACHINE)-$(WSIZE).txt
	$(BXTR) < $(RESULTS)/fsb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/fsb-$(MACHINE)-$(WSIZE).tab
	$(VXTR) < $(RESULTS)/fsb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/fsb-$(MACHINE)-$(WSIZE).vtab

fpbench: $(LIBCSAPP)   vec.h combine.h combine.c benchmark.c vec.c
	$(CC) $(CFLAGS) -DPROD -DFLOAT -o fpbench benchmark.c combine.c vec.c \
	 $(LIBCSAPP) 
	#
	$(CC) $(CFLAGS) -DPROD -DFLOAT -S combine.c -o fpb.s
	./fpbench > $(RESULTS)/fpb-$(MACHINE)-$(WSIZE).txt
	$(BXTR) < $(RESULTS)/fpb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/fpb-$(MACHINE)-$(WSIZE).tab
	$(VXTR) < $(RESULTS)/fpb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/fpb-$(MACHINE)-$(WSIZE).vtab

dsbench:   vec.h combine.h combine.c benchmark.c \
	vec.c $(LIBCSAPP)
	$(CC) $(CFLAGS) -DSUM -DDOUBLE -o dsbench benchmark.c combine.c vec.c \
	  $(LIBCSAPP)
	#
	$(CC) $(CFLAGS) -DSUM -DDOUBLE -S combine.c -o dsb.s
	./dsbench > $(RESULTS)/dsb-$(MACHINE)-$(WSIZE).txt
	$(BXTR) < $(RESULTS)/dsb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/dsb-$(MACHINE)-$(WSIZE).tab
	$(VXTR) < $(RESULTS)/dsb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/dsb-$(MACHINE)-$(WSIZE).vtab

dpbench: $(LIBCSAPP)   vec.h combine.h combine.c benchmark.c vec.c
	$(CC) $(CFLAGS) -DPROD -DDOUBLE -o dpbench benchmark.c combine.c vec.c \
	 $(LIBCSAPP) 
	#
	$(CC) $(CFLAGS) -DPROD -DDOUBLE -S combine.c -o dpb.s
	./dpbench > $(RESULTS)/dpb-$(MACHINE)-$(WSIZE).txt
	$(BXTR) < $(RESULTS)/dpb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/dpb-$(MACHINE)-$(WSIZE).tab
	$(VXTR) < $(RESULTS)/dpb-$(MACHINE)-$(WSIZE).txt > $(RESULTS)/dpb-$(MACHINE)-$(WSIZE).vtab

max: max.c
	$(CC) $(CFLAGS) -I$(INC) max.c $(LIBCSAPP) -o max
	$(CC) $(CFLAGS) -I$(INC) -S max.c
	./max > $(RESULTS)/max-$(MACHINE)-$(WSIZE).txt

div: div.c
	$(CC) $(CFLAGS) -I$(INC) div.c $(LIBCSAPP) -o div
	$(CC) $(CFLAGS) -I$(INC) -S div.c
	./div > $(RESULTS)/div-$(MACHINE)-$(WSIZE).txt

mem: mem.c
	$(CC) $(CFLAGS) -I$(INC) mem.c $(LIBCSAPP) -o mem
	$(CC) $(CFLAGS) -I$(INC) -S mem.c
	./mem > $(RESULTS)/mem-$(MACHINE)-$(WSIZE).txt

branch: branch.c
	$(CC) $(CFLAGS) -I$(INC) branch.c $(LIBCSAPP) -o branch
	$(CC) $(CFLAGS) -I$(INC) -S branch.c
	./branch > $(RESULTS)/branch-$(MACHINE)-$(WSIZE).txt

branch.$(WSIZE)s: branch.c
	$(CC) -S $(CFLAGS) -I$(INC) branch.c -o branch.$(WSIZE)s

clean:
	rm -f $(PROGS) *.o *~ *.s *.exe



