#!/bin/sh -e

runs=8
top=`pwd`


# =====

X=djbsort
url=https://sorting.cr.yp.to
version='installed version'
echo "[1;34m===== $X ($url) version: $version [0m"

[ -f $top/$X/skiprebuild ] || (
  cd $top
  rm -rf $X
  mkdir $X
  cd $X
  # assume djbsort installed already, so nothing to build here
  touch skiprebuild
)

for bits in 32 64
do
  cd $top/$X
  cp $top/bench${bits}-$X.cc .
  clang++ \
  -no-pie -O3 -march=native \
  -o bench${bits}-$X bench${bits}-$X.cc \
  -ldjbsort -lcpucycles -lm

  for run in `seq 1 $runs`
  do
    echo bench $X $bits $run `date -u` >&2
    ./bench${bits}-$X
  done > bench${bits}-$X.out
done


# =====

X=aspas
url=https://github.com/vtsynergy/aspas_sort
version=738ec7a1c051f6005ecb0cfec159eff9387b5f9d # 2018-02-17, latest as of 2026-01-22
echo "[1;34m===== $X ($url) version: $version [0m"

[ -f $top/$X/skiprebuild ] || (
  cd $top
  rm -rf $X
  git clone https://github.com/vtsynergy/aspas_sort $X
  cd $X
  git checkout $version
  touch skiprebuild
)

for bits in 32
do
  cd $top/$X
  cp $top/bench${bits}-$X.cc .
  clang++ \
  -no-pie -O3 -march=native \
  -o bench${bits}-$X bench${bits}-$X.cc \
  -I include -lcpucycles -lm

  for run in `seq 1 $runs`
  do
    echo bench $X $bits $run `date -u` >&2
    ./bench${bits}-$X
  done > bench${bits}-$X.out
done


# =====

X=far
url=https://github.com/simd-sorting/fast-and-robust
version=054f2e2e9f7c00be4dc8d69567f92ddf9832a8f3 # 2021-08-20, latest as of 2026-01-22
echo "[1;34m===== $X ($url) version: $version [0m"

[ -f $top/$X/skiprebuild ] || (
  cd $top
  rm -rf $X
  git clone https://github.com/simd-sorting/fast-and-robust $X
  cd $X
  git checkout $version
  touch skiprebuild
)

for bits in 32
do
  cd $top/$X
  cp $top/bench${bits}-$X.cc .
  clang++ \
  -no-pie -O3 -march=native \
  -o bench${bits}-$X bench${bits}-$X.cc \
  -I avx2_sort_demo -lcpucycles -lm

  for run in `seq 1 $runs`
  do
    echo bench $X $bits $run `date -u` >&2
    ./bench${bits}-$X
  done > bench${bits}-far.out
done


# =====

X=herf
url='based on https://stereopsis.com/radix.html but simplified for int32'
version='version included in sortbench'
echo "[1;34m===== $X ($url) version: $version [0m"

[ -f $top/$X/skiprebuild ] || (
  cd $top
  rm -rf $X
  mkdir $X
  cp $X.h $X.c $X
  cd $X
  touch skiprebuild
)

for bits in 32
do
  cd $top/$X
  cp $top/bench${bits}-$X.cc .
  clang++ \
  -no-pie -O3 -march=native \
  -o bench${bits}-$X bench${bits}-$X.cc \
  $X.c -lcpucycles -lm

  for run in `seq 1 $runs`
  do
    echo bench $X $bits $run `date -u` >&2
    ./bench${bits}-$X
  done > bench${bits}-$X.out
done


# =====

X=vxsort
url=https://github.com/damageboy/vxsort-cpp
version=2c7f79ba539a5c1ad2acf1c2e3c0fa828da25635 # 2023-05-10, latest as of 2026-01-22
echo "[1;34m===== $X ($url) version: $version [0m"

[ -f $top/$X/skiprebuild ] || (
  cd $top
  rm -rf $X
  git clone https://github.com/damageboy/vxsort-cpp $X
  cd $X
  git checkout $version

  sed -i 's/^cmake_minimum_required(.*)$/cmake_minimum_required(VERSION 3.15)/' CMakeLists.txt
  sed -i 's/include(ConfigGBench)/# include(ConfigGBench)/' CMakeLists.txt
  sed -i 's/include(ConfigGTest)/# include(ConfigGTest)/' CMakeLists.txt
  sed -i 's!add_subdirectory(${PROJECT_SOURCE_DIR}/bench/)!# add_subdirectory(${PROJECT_SOURCE_DIR}/bench/)!' CMakeLists.txt
  sed -i 's!add_subdirectory(${PROJECT_SOURCE_DIR}/tests/)!# add_subdirectory(${PROJECT_SOURCE_DIR}/tests/)!' CMakeLists.txt

  ( mkdir build-release
    cd build-release
    export CC=clang
    export CXX=clang++
    cmake ..
    make -j 4
  )

  touch skiprebuild
)

for bits in 32 64
do
  cd $top/$X
  cp $top/bench${bits}-$X.cc .
  clang++ -std=c++17 \
  -no-pie -O3 -march=native \
  -o bench${bits}-$X bench${bits}-$X.cc \
  -I vxsort \
  -I vxsort/vector_machine \
  -I build-release/_deps/cpu_features-src/include \
  -L build-release/vxsort \
  -L build-release/_deps/cpu_features-build \
  -lvxsort \
  -lcpu_features -lcpucycles -lm

  for run in `seq 1 $runs`
  do
    echo bench $X $bits $run `date -u` >&2
    ./bench${bits}-$X
  done > bench${bits}-$X.out
done


# =====

X=x86simdsort
url=https://github.com/intel/x86-simd-sort.git
version=6a7a01da4b0dfde108aa626a2364c954e2c50fe1 # 2025-09-11, latest as of 2026-01-22
echo "[1;34m===== $X ($url) version: $version [0m"

[ -f $top/$X/skiprebuild ] || (
  cd $top
  rm -rf $X
  git clone https://github.com/intel/x86-simd-sort.git $X
  cd $X
  git checkout $version

  ( meson setup --buildtype release builddir && cd builddir
    meson compile
  )

  touch skiprebuild
)

for bits in 32 64
do
  cd $top/$X
  cp $top/bench${bits}-$X.cc .
  clang++ -std=c++20 -O3 -march=native -o bench${bits}-$X bench${bits}-$X.cc \
  -I lib -L builddir -L builddir/lib \
  -lx86simdsortcpp -lcpucycles -lm

  for run in `seq 1 $runs`
  do
    echo bench $X $bits $run `date -u` >&2
    env LD_LIBRARY_PATH=$top/$X/builddir${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH \
    ./bench${bits}-$X
  done > bench${bits}-$X.out
done


# =====

X=vqsort
url=https://github.com/google/highway
version=271a9a0ed9de1232d9117f1572c3fe28f8542ec1 # 2026-01-20
echo "[1;34m===== $X ($url) version: $version [0m"

[ -f $top/$X/skiprebuild ] || (
  cd $top
  rm -rf $X
  git clone https://github.com/google/highway $X
  cd $X

  ( git checkout $version
    mkdir -p build && cd build
    cmake ..
    make -j 4
  )

  touch skiprebuild
)

for bits in 32 64
do
  cd $top/$X
  cp $top/bench${bits}-$X.cc .
  clang++ -O3 -march=native -o bench${bits}-$X bench${bits}-$X.cc \
  -I . -I build/googletest-src/googletest/include -L build -L build/lib \
  -lhwy_contrib -lhwy -lgtest -pthread -lcpucycles -lm

  for run in `seq 1 $runs`
  do
    echo bench $X $bits $run `date -u` >&2
    ./bench${bits}-$X
  done > bench${bits}-$X.out
done


# =====

X=stdsort
url='std::sort'
version='installed version'
echo "[1;34m===== $X ($url) version: $version [0m"

[ -f $top/$X/skiprebuild ] || (
  cd $top
  rm -rf $X
  mkdir $X
  cd $X
  # will use whichever version comes with OS, so nothing to build here
  touch skiprebuild
)

for bits in 32 64
do
  cd $top/$X
  cp $top/bench${bits}-$X.cc .
  clang -O3 -march=native -o bench${bits}-$X bench${bits}-$X.cc -lcpucycles -lm

  for run in `seq 1 $runs`
  do
    echo bench $X $bits $run `date -u` >&2
    ./bench${bits}-$X
  done > bench${bits}-$X.out
done


# =====

echo '[1;34m===== create plot32.pdf, plot64.pdf [0m'

cd $top
for bits in 32 64
do
  ./plot $bits \
  stdsort black \
  herf slategray \
  aspas darkcyan \
  vqsort red \
  vxsort darkviolet \
  x86simdsort darkgreen \
  far sienna \
  djbsort blue
done
