
GCC=gcc
CLANG=clang-20

.PHONY: all test clean des popcnt crc32c test-des test-popcnt test-crc

all: des popcnt crc32c

test: all test-des test-popcnt test-crc

test-des:
	./des-gcc-sw
	./des-gcc-hw
	./des-clang-o1-sw
	./des-clang-o1-hw
	./des-clang-o2-sw
	./des-clang-o2-hw

test-popcnt:
	./popcnt-gcc-o2-sw
	./popcnt-gcc-o2-hw
	./popcnt-clang-o2-sw
	./popcnt-clang-o2-hw

test-crc:
	./crc32c-gcc-o2-sw
	./crc32c-gcc-o2-hw
	./crc32c-clang-o2-sw
	./crc32c-clang-o2-hw

clean:
	rm des-gcc-sw des-gcc-hw des-clang-o1-sw des-clang-o1-hw des-clang-o2-sw des-clang-o2-hw
	rm popcnt-gcc-o2-sw popcnt-gcc-o2-hw popcnt-clang-o2-sw popcnt-clang-o2-hw
	rm crc32c-gcc-o2-sw crc32c-gcc-o2-hw crc32c-clang-o2-sw crc32c-clang-o2-hw

# DES targets
des-gcc-sw: riscv-des.c
	$(GCC) -O2 riscv-des.c -o des-gcc-sw

des-gcc-hw: riscv-des.c
	$(GCC) -O2 riscv-des.c -march=rv64gcv -o des-gcc-hw

des-clang-o1-sw: riscv-des.c
	$(CLANG) -O1 riscv-des.c -o des-clang-o1-sw

des-clang-o1-hw: riscv-des.c
	$(CLANG) -O1 -march=rv64gcv riscv-des.c -o des-clang-o1-hw

des-clang-o2-sw: riscv-des.c
	$(CLANG) -O2 riscv-des.c -o des-clang-o2-sw

des-clang-o2-hw: riscv-des.c
	$(CLANG) -O2 -march=rv64gcv riscv-des.c -o des-clang-o2-hw

des: des-gcc-sw des-gcc-hw des-clang-o1-sw des-clang-o1-hw des-clang-o2-sw des-clang-o2-hw

# Popcount targets
popcnt-gcc-o2-sw: riscv-popcnt.c
	$(GCC) -O2 -o popcnt-gcc-o2-sw riscv-popcnt.c

popcnt-gcc-o2-hw: riscv-popcnt.c
	$(GCC) -O2 -march=rv64gc_zbb -o popcnt-gcc-o2-hw riscv-popcnt.c

popcnt-clang-o2-sw: riscv-popcnt.c
	$(CLANG) -O2 -o popcnt-clang-o2-sw riscv-popcnt.c

popcnt-clang-o2-hw: riscv-popcnt.c
	$(CLANG) -O2 -march=rv64gc_zbb -o popcnt-clang-o2-hw riscv-popcnt.c

popcnt: popcnt-gcc-o2-sw popcnt-gcc-o2-hw popcnt-clang-o2-sw popcnt-clang-o2-hw

# CRC32C targets
crc32c-gcc-o2-sw: riscv-crc32c.c
	$(GCC) -O2 -o crc32c-gcc-o2-sw riscv-crc32c.c

crc32c-gcc-o2-hw: riscv-crc32c.c
	$(GCC) -O2 -march=rv64gc_zbc -o crc32c-gcc-o2-hw riscv-crc32c.c

crc32c-clang-o2-sw: riscv-crc32c.c
	$(CLANG) -O2 -o crc32c-clang-o2-sw riscv-crc32c.c

crc32c-clang-o2-hw: riscv-crc32c.c
	$(CLANG) -O2 -march=rv64gc_zbc -o crc32c-clang-o2-hw riscv-crc32c.c

crc32c: crc32c-gcc-o2-sw crc32c-gcc-o2-hw crc32c-clang-o2-sw crc32c-clang-o2-hw
