AVX_CC=icc
PHI_CC=icc
CFLAGS=-O3 -Wall
CLIBS=-lpthread -lrt -lm
PHI_CFLAGS=-mmic -no-vec
AVX_CFLAGS=-march=core-avx2

all:	avx phi

avx:	avx_selection_scan avx_probe_bloom avx_range_function \
	avx_probe_linear avx_probe_double avx_probe_cuckoo \

phi:	phi_selection_scan phi_probe_bloom phi_range_function \
	phi_probe_linear phi_probe_double phi_probe_cuckoo \
	phi_build_probe_linear_01 phi_build_probe_double_01 phi_build_probe_cuckoo_01 \
	phi_build_probe_linear_0N phi_build_probe_double_0N \
	phi_partition_hash phi_partition_radix \
	phi_radixsort_key_scalar phi_radixsort_key_val_scalar \
	phi_radixsort_key_vector phi_radixsort_key_val_vector \
	phi_hash_join_no_part_scalar phi_hash_join_min_part_scalar phi_hash_join_max_part_scalar \
	phi_hash_join_no_part_vector phi_hash_join_min_part_vector phi_hash_join_max_part_vector

avx_selection_scan:	avx_phi_selection_scan.c rand.c rand.h
	$(AVX_CC) $(CFLAGS) $(AVX_CFLAGS) -o avx_selection_scan avx_phi_selection_scan.c rand.c $(CLIBS)
phi_selection_scan:	avx_phi_selection_scan.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_selection_scan avx_phi_selection_scan.c rand.c $(CLIBS)

avx_probe_linear:	avx_phi_probe_linear.c inner_outer.c inner_outer.h rand.c rand.h
	$(AVX_CC) $(CFLAGS) $(AVX_CFLAGS) -o avx_probe_linear avx_phi_probe_linear.c inner_outer.c rand.c $(CLIBS)
avx_probe_double:	avx_phi_probe_double.c inner_outer.c inner_outer.h rand.c rand.h
	$(AVX_CC) $(CFLAGS) $(AVX_CFLAGS) -o avx_probe_double avx_phi_probe_double.c inner_outer.c rand.c $(CLIBS)
avx_probe_cuckoo:	avx_phi_probe_cuckoo.c inner_outer.c inner_outer.h rand.c rand.h
	$(AVX_CC) $(CFLAGS) $(AVX_CFLAGS) -o avx_probe_cuckoo avx_phi_probe_cuckoo.c inner_outer.c rand.c $(CLIBS)

phi_probe_linear:	avx_phi_probe_linear.c inner_outer.c inner_outer.h rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_probe_linear avx_phi_probe_linear.c inner_outer.c rand.c $(CLIBS)
phi_probe_double:	avx_phi_probe_double.c inner_outer.c inner_outer.h rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_probe_double avx_phi_probe_double.c inner_outer.c rand.c $(CLIBS)
phi_probe_cuckoo:	avx_phi_probe_cuckoo.c inner_outer.c inner_outer.h rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_probe_cuckoo avx_phi_probe_cuckoo.c inner_outer.c rand.c $(CLIBS)

phi_build_probe_linear_01:	phi_build_probe_linear.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_build_probe_linear_01 phi_build_probe_linear.c rand.c $(CLIBS) -D_UNIQUE
phi_build_probe_double_01:	phi_build_probe_double.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_build_probe_double_01 phi_build_probe_double.c rand.c $(CLIBS) -D_UNIQUE
phi_build_probe_cuckoo_01:	phi_build_probe_cuckoo.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_build_probe_cuckoo_01 phi_build_probe_cuckoo.c rand.c $(CLIBS)
phi_build_probe_linear_0N:	phi_build_probe_linear.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_build_probe_linear_0N phi_build_probe_linear.c rand.c $(CLIBS)
phi_build_probe_double_0N:	phi_build_probe_double.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_build_probe_double_0N phi_build_probe_double.c rand.c $(CLIBS)

avx_probe_bloom:	avx_phi_probe_bloom.c rand.c rand.h
	$(AVX_CC) $(CFLAGS) $(AVX_CFLAGS) -o avx_probe_bloom avx_phi_probe_bloom.c rand.c $(CLIBS)
phi_probe_bloom:	avx_phi_probe_bloom.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_probe_bloom avx_phi_probe_bloom.c rand.c $(CLIBS)

phi_partition_radix:	phi_partition_radix.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_partition_radix phi_partition_radix.c rand.c $(CLIBS)
phi_partition_hash:		phi_partition_hash.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_partition_hash  phi_partition_hash.c  rand.c $(CLIBS)

avx_range_function:	avx_phi_range_function.c rand.c rand.h
	$(AVX_CC) $(CFLAGS) $(AVX_CFLAGS) -o avx_range_function avx_phi_range_function.c rand.c $(CLIBS)
phi_range_function: avx_phi_range_function.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_range_function avx_phi_range_function.c rand.c $(CLIBS)

phi_radixsort_key_scalar:		phi_radixsort_key.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_radixsort_key_scalar     phi_radixsort_key.c     rand.c $(CLIBS) -D_NO_VECTOR
phi_radixsort_key_val_scalar:	phi_radixsort_key_val.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_radixsort_key_val_scalar phi_radixsort_key_val.c rand.c $(CLIBS) -D_NO_VECTOR
phi_radixsort_key_vector:		phi_radixsort_key.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_radixsort_key_vector     phi_radixsort_key.c     rand.c $(CLIBS)
phi_radixsort_key_val_vector:	phi_radixsort_key_val.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_radixsort_key_val_vector phi_radixsort_key_val.c rand.c $(CLIBS)

phi_hash_join_no_part_scalar:	phi_hash_join_no_part.c  rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_hash_join_no_part_scalar  phi_hash_join_no_part.c  rand.c $(CLIBS) -D_NO_VECTOR
phi_hash_join_min_part_scalar:	phi_hash_join_min_part.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_hash_join_min_part_scalar phi_hash_join_min_part.c rand.c $(CLIBS) -D_NO_VECTOR
phi_hash_join_max_part_scalar:	phi_hash_join_max_part.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_hash_join_max_part_scalar phi_hash_join_max_part.c rand.c $(CLIBS) -D_NO_VECTOR
phi_hash_join_no_part_vector:	phi_hash_join_no_part.c  rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_hash_join_no_part_vector  phi_hash_join_no_part.c  rand.c $(CLIBS)
phi_hash_join_min_part_vector:	phi_hash_join_min_part.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_hash_join_min_part_vector phi_hash_join_min_part.c rand.c $(CLIBS)
phi_hash_join_max_part_vector:	phi_hash_join_max_part.c rand.c rand.h
	$(PHI_CC) $(CFLAGS) $(PHI_CFLAGS) -o phi_hash_join_max_part_vector phi_hash_join_max_part.c rand.c $(CLIBS)

clean:
	rm -f \
	avx_selection_scan phi_selection_scan \
	avx_probe_linear avx_probe_double avx_probe_cuckoo \
	phi_probe_linear phi_probe_double phi_probe_cuckoo \
	phi_build_probe_linear_01 phi_build_probe_double_01 phi_build_probe_cuckoo_01 \
	phi_build_probe_linear_0N phi_build_probe_double_0N \
	avx_probe_bloom phi_probe_bloom \
	phi_partition_hash phi_partition_radix \
	avx_range_function phi_range_function \
	phi_radixsort_key_scalar phi_radixsort_key_val_scalar \
	phi_radixsort_key_vector phi_radixsort_key_val_vector \
	phi_hash_join_no_part_scalar phi_hash_join_min_part_scalar phi_hash_join_max_part_scalar \
	phi_hash_join_no_part_vector phi_hash_join_min_part_vector phi_hash_join_max_part_vector
