#    /*        Fast GEMM routine for Alpha 21164/21264      */
#    /*         on  Linux, Digital UNIX                     */
#    /*        by Kazushige Goto <goto@statabo.rim.or.jp>   */

# If you have EV6(21264)
CPU	= -DEV6 # -DDEBUG

# If you want a SMP version
# DO_SMP	= -DSMP -DCPU_NUM=2

ALPHA	= 2.00
ALPHA_I	= 3.00
BETA	= 1.00
BETA_I	= 0.00

SIZE	= 1000
LEADING	= 1001

COMPARE	= 0

CC	= cc
CPP	= cc -E
LNS	= ln -fs

ifdef BLOCK_P
BLOCKSIZE = -DP=$(BLOCK_P) -DQ=$(BLOCK_Q) -DR=$(BLOCK_R)
endif

CFLAGS	= -O2 -I. $(CPU) $(DO_SMP) $(SIMPLE) $(BLOCKSIZE)

OBJS	   = xerbla.o dgemmf.o sgemmf.o zgemmf.o cgemmf.o

ifdef DO_SMP
LIBS       = -lpthread
endif

DGEMMOBJS  =  dgemm.o dgemm_nn.o dgemm_nt.o dgemm_tn.o dgemm_tt.o dgemm_beta.o

SGEMMOBJS  =  sgemm.o sgemm_nn.o sgemm_nt.o sgemm_tn.o sgemm_tt.o sgemm_beta.o

ZGEMMOBJS  = zgemm.o    zgemm_nn.o zgemm_cn.o zgemm_tn.o zgemm_nc.o \
	     zgemm_nt.o zgemm_cc.o zgemm_ct.o zgemm_tc.o zgemm_tt.o \
	     zgemm_nr.o zgemm_tr.o zgemm_cr.o zgemm_rn.o zgemm_rt.o \
	     zgemm_rc.o zgemm_rr.o zgemm_beta.o

CGEMMOBJS  = cgemm.o    cgemm_nn.o cgemm_cn.o cgemm_tn.o cgemm_nc.o \
	     cgemm_nt.o cgemm_cc.o cgemm_ct.o cgemm_tc.o cgemm_tt.o \
	     cgemm_nr.o cgemm_tr.o cgemm_cr.o cgemm_rn.o cgemm_rt.o \
	     cgemm_rc.o cgemm_rr.o cgemm_beta.o

LIBGEMM	   = libgemm.a

all: $(LIBGEMM)

check: bms bmd bmc bmz
	./bms $(SIZE) $(LEADING) $(COMPARE) $(ALPHA) $(BETA)
	./bmd $(SIZE) $(LEADING) $(COMPARE) $(ALPHA) $(BETA)
	./bmc $(SIZE) $(LEADING) $(COMPARE) $(ALPHA) $(ALPHA_I) $(BETA) $(BETA_I)
	./bmz $(SIZE) $(LEADING) $(COMPARE) $(ALPHA) $(ALPHA_I) $(BETA) $(BETA_I)

param : params paramd paramc paramz
	./params 100 2.00 -3.00
	./paramd 100 2.00 -3.00
	./paramc 100 2.00 -3.00 4.00 -5.00
	./paramz 100 2.00 -3.00 4.00 -5.00

dgemm.o : gemm.c common.h version.h
	$(CC) -c $(CFLAGS) -DDGEMM -o dgemm.o gemm.c

sgemm.o : gemm.c common.h version.h
	$(CC) -c $(CFLAGS) -UDGEMM -o sgemm.o gemm.c

zgemm.o : zgemm.c common.h version.h
	$(CC) $(CFLAGS) -DDGEMM -c zgemm.c -o zgemm.o

cgemm.o : zgemm.c common.h version.h
	$(CC) $(CFLAGS) -UDGEMM -c zgemm.c -o cgemm.o

dgemm_beta.o : gemm_beta.S common.h version.h
	$(CC) $(CFLAGS) -DDGEMM -c gemm_beta.S -o dgemm_beta.o

sgemm_beta.o : gemm_beta.S common.h version.h
	$(CC) $(CFLAGS) -UDGEMM -c gemm_beta.S -o sgemm_beta.o

zgemm_beta.o : zgemm_beta.S common.h version.h
	$(CC) $(CFLAGS) -DDGEMM -c zgemm_beta.S -o zgemm_beta.o

cgemm_beta.o : zgemm_beta.S common.h version.h
	$(CC) $(CFLAGS) -UDGEMM -c zgemm_beta.S -o cgemm_beta.o

dgemm_nn.o : gemm_k.S gemm_EV5_k.S gemm_EV6_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DNN  gemm_k.S > temp.s
	$(CC)  -c temp.s -o dgemm_nn.o
	rm -f temp.s

dgemm_nt.o : gemm_k.S gemm_EV5_k.S gemm_EV6_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DNT  gemm_k.S > temp.s
	$(CC)  -c temp.s -o dgemm_nt.o
	rm -f temp.s

dgemm_tn.o : gemm_k.S gemm_EV5_k.S gemm_EV6_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DTN  gemm_k.S > temp.s
	$(CC)  -c temp.s -o dgemm_tn.o
	rm -f temp.s

dgemm_tt.o : gemm_k.S gemm_EV5_k.S gemm_EV6_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DTT  gemm_k.S > temp.s
	$(CC)  -c temp.s -o dgemm_tt.o
	rm -f temp.s

sgemm_nn.o : gemm_k.S gemm_EV5_k.S gemm_EV6_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DNN  gemm_k.S > temp.s
	$(CC)  -c temp.s -o sgemm_nn.o
	rm -f temp.s

sgemm_nt.o : gemm_k.S gemm_EV5_k.S gemm_EV6_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DNT  gemm_k.S > temp.s
	$(CC)  -c temp.s -o sgemm_nt.o
	rm -f temp.s

sgemm_tn.o : gemm_k.S gemm_EV5_k.S gemm_EV6_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DTN  gemm_k.S > temp.s
	$(CC)  -c temp.s -o sgemm_tn.o
	rm -f temp.s

sgemm_tt.o : gemm_k.S gemm_EV5_k.S gemm_EV6_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DTT  gemm_k.S > temp.s
	$(CC)  -c temp.s -o sgemm_tt.o
	rm -f temp.s

zgemm_nn.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DNN  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_nn.o
	rm -f temp.s

zgemm_cn.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DCN  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_cn.o
	rm -f temp.s

zgemm_tn.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DTN  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_tn.o
	rm -f temp.s

zgemm_nc.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DNC  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_nc.o
	rm -f temp.s

zgemm_nt.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DNT  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_nt.o
	rm -f temp.s

zgemm_cc.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DCC  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_cc.o
	rm -f temp.s

zgemm_ct.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DCT  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_ct.o
	rm -f temp.s

zgemm_tc.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DTC  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_tc.o
	rm -f temp.s

zgemm_tt.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DTT  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_tt.o
	rm -f temp.s

zgemm_nr.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DNR  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_nr.o
	rm -f temp.s

zgemm_tr.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DTR  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_tr.o
	rm -f temp.s

zgemm_cr.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DCR  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_cr.o
	rm -f temp.s

zgemm_rn.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DRN  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_rn.o
	rm -f temp.s

zgemm_rt.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DRT  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_rt.o
	rm -f temp.s

zgemm_rc.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DRC  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_rc.o
	rm -f temp.s

zgemm_rr.o : zgemm_k.S
	$(CPP) $(CFLAGS) -DDGEMM -DRR  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o zgemm_rr.o
	rm -f temp.s

cgemm_nn.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DNN  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_nn.o
	rm -f temp.s
				   
cgemm_cn.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DCN  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_cn.o
	rm -f temp.s

cgemm_tn.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DTN  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_tn.o
	rm -f temp.s

cgemm_nc.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DNC  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_nc.o
	rm -f temp.s

cgemm_nt.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DNT  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_nt.o
	rm -f temp.s

cgemm_cc.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DCC  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_cc.o
	rm -f temp.s

cgemm_ct.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DCT  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_ct.o
	rm -f temp.s

cgemm_tc.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DTC  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_tc.o
	rm -f temp.s

cgemm_tt.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DTT  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_tt.o
	rm -f temp.s

cgemm_nr.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DNR  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_nr.o
	rm -f temp.s

cgemm_tr.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DTR  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_tr.o
	rm -f temp.s

cgemm_cr.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DCR  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_cr.o
	rm -f temp.s

cgemm_rn.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DRN  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_rn.o
	rm -f temp.s

cgemm_rt.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DRT  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_rt.o
	rm -f temp.s

cgemm_rc.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DRC  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_rc.o
	rm -f temp.s

cgemm_rr.o : zgemm_k.S
	$(CPP) $(CFLAGS) -UDGEMM -DRR  zgemm_k.S > temp.s
	$(CC)  -c temp.s -o cgemm_rr.o
	rm -f temp.s

$(LIBGEMM):  $(DGEMMOBJS) $(SGEMMOBJS) $(CGEMMOBJS) $(ZGEMMOBJS)
	rm -f $(LIBGEMM)
	ar cq $(LIBGEMM) $(DGEMMOBJS) $(SGEMMOBJS) $(CGEMMOBJS) $(ZGEMMOBJS)
	ranlib $(LIBGEMM)

dgemmf.o : gemmf.c
	$(CC) -c $(CFLAGS) -DDGEMM -o dgemmf.o gemmf.c

sgemmf.o : gemmf.c
	$(CC) -c $(CFLAGS) -UDGEMM -o sgemmf.o gemmf.c

zgemmf.o : zgemmf.c
	$(CC) -c $(CFLAGS) -DDGEMM -o zgemmf.o zgemmf.c

cgemmf.o : zgemmf.c
	$(CC) -c $(CFLAGS) -UDGEMM -o cgemmf.o zgemmf.c

bms: bms.o $(OBJS) $(SGEMMOBJS)
	$(CC) -o bms $(CFLAGS) bms.o $(OBJS) $(SGEMMOBJS) $(LIBS)

bmd: bmd.o $(OBJS) $(DGEMMOBJS)
	$(CC) -o bmd $(CFLAGS) bmd.o $(OBJS) $(DGEMMOBJS) $(LIBS)

bmc: bmc.o $(OBJS) $(CGEMMOBJS)
	$(CC) -o bmc $(CFLAGS) bmc.o $(OBJS) $(CGEMMOBJS) $(LIBS)

bmz: bmz.o $(OBJS) $(ZGEMMOBJS)
	$(CC) -o bmz $(CFLAGS) bmz.o $(OBJS) $(ZGEMMOBJS) $(LIBS)

params: params.o $(OBJS) $(LIBGEMM)
	$(CC) -o params $(CFLAGS) params.o $(OBJS) $(LIBGEMM) $(LIBS)

paramd: paramd.o $(OBJS) $(LIBGEMM)
	$(CC) -o paramd $(CFLAGS) paramd.o $(OBJS) $(LIBGEMM) $(LIBS)

paramc: paramc.o $(OBJS) $(LIBGEMM)
	$(CC) -o paramc $(CFLAGS) paramc.o $(OBJS) $(LIBGEMM) $(LIBS)

paramz: paramz.o $(OBJS) $(LIBGEMM)
	$(CC) -o paramz $(CFLAGS) paramz.o $(OBJS) $(LIBGEMM) $(LIBS)

bms.o:bm.c bmcommon.h
	$(CC) $(CFLAGS) -UDGEMM -c bm.c -o bms.o

bmd.o:bm.c bmcommon.h
	$(CC) $(CFLAGS) -DDGEMM -c bm.c -o bmd.o

bmc.o:bmz.c bmcommon.h
	$(CC) $(CFLAGS) -UDGEMM -c bmz.c -o bmc.o

bmz.o:bmz.c bmcommon.h
	$(CC) $(CFLAGS) -DDGEMM -c bmz.c -o bmz.o

params.o: param.c
	$(CC) $(CFLAGS) -UDGEMM -c param.c -o params.o

paramd.o: param.c
	$(CC) $(CFLAGS) -DDGEMM -c param.c -o paramd.o

paramc.o: paramz.c
	$(CC) $(CFLAGS) -UDGEMM -c paramz.c -o paramc.o

paramz.o: paramz.c
	$(CC) $(CFLAGS) -DDGEMM -c paramz.c -o paramz.o

xerbla.c :
	echo "#include <stdio.h>"			>  xerbla.c
	echo "void xerbla_(char *message, int *info){"	>> xerbla.c
	echo "fprintf(stderr, \"Oops!! %s : %d\\n\","	>> xerbla.c
	echo "message, *info);}"			>> xerbla.c

clean:
	rm -rf $(LIBGEMM) temp.s *.o bms bmd bmc bmz xerbla.c \
	       params paramd paramc paramz
