CXXFLAGS=-O3 -Wall -Wextra -pedantic -march=native -g3 -DNDEBUG -std=c++17
CXX=g++
OBJDUMP=objdump
OBJDUMPFLAGS=-d -S --no-show-raw-insn
RM=rm -rf

SOURCES=main.cpp solver.cpp
OBJECTS=$(SOURCES:.cpp=.o)

.PHONY: perf check clean

nq: $(OBJECTS)
	$(CXX) $(CXXFLAGS) -o $@ $^
	$(OBJDUMP) $(OBJDUMPFLAGS) $@ > $@.S 2>/dev/null

clean:
	$(RM) $(OBJECTS) nq

perf: nq
	perf stat -e cycles -e instructions -e branch-instructions -e branch-misses -e L1-dcache-load-misses -e LLC-load-misses ./nq 15

check: nq
	./nq 0 | grep -Fxq "0"
	./nq 1 | grep -Fxq "1"
	./nq 2 | grep -Fxq "0"
	./nq 3 | grep -Fxq "0"
	./nq 4 | grep -Fxq "2"
	./nq 5 | grep -Fxq "10"
	./nq 6 | grep -Fxq "4"
	./nq 7 | grep -Fxq "40"
	./nq 8 | grep -Fxq "92"
	./nq 9 | grep -Fxq "352"
	./nq 10 | grep -Fxq "724"
	./nq 11 | grep -Fxq "2680"
	./nq 12 | grep -Fxq "14200"
	./nq 13 | grep -Fxq "73712"

%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c -o $@ $^
	$(OBJDUMP) $(OBJDUMPFLAGS) $@ > $@.S 2>/dev/null
