name: CI

on:
  push:
    branches-ignore:
      - 'ci/**'
      - '!ci/gha**'
      - 'dependabot/**'
  pull_request:
    branches:
      - 'master'

concurrency:
  group: build-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  checkinstall:
    runs-on: ubuntu-22.04
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 2
    - name: Install APT Dependencies
      run: |
        sudo apt-get install -y ninja-build ninja-build pipx
        pipx install meson==0.55.0
    - run: |
        meson setup build --prefix $PWD/install -Dtests=false
        meson install -C build --quiet
        diff <(find simde/ -type f -name "*.h")  <(cd install/include/; find simde -type f -name "*.h" )

  formatting:
    runs-on: ubuntu-22.04
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 2
    - name: Install pcre2grep
      run: sudo apt-get update && sudo apt-get install -y pcre2-utils
    # Check for trailing whitespace
    - name: Trailing whitespace
      run: find simde/ \( -name '*.c' -o -name '*.h' \) -exec grep -nP '\s+$' {} + && exit 1 || exit 0
    # We use spaces, not tabs.  I don't want to start a holy war here;
    # I don't actually have a strong preference between the two, but I
    # do have a strong preference for consistency, so don't @ me.
    - name: Tabs
      run: find simde/ \( -name '*.c' -o -name '*.h' \) -exec grep -nP '\t' {} + && exit 1 || exit 0
    # s/8/16/ will result in this if the input is x86.
    - name: Bad substitutions
      run: git grep -i 'x''1''6''6' && exit 1 || exit 0
    - name: Incorrect assertions in test/
      run: grep -PR '(?<=[^a-zA-Z0-9_])simde_assert_u?int(8|16|32|64)(?>[^a-zA-Z0-9_])' test/ && exit 1 || exit 0
    # Check to make sure no source files have the executable bit set
    - name: Executable sources
      run: find \( -name '*.c' -o -name '*.h' \) -executable | grep -q '.' && exit 1 || exit 0
    # Make sure neon.h includes all the NEON headers.
    - name: Missing NEON includes
      run: for f in simde/arm/neon/*.h; do grep -q "include \"neon/$(basename "$f")\"" simde/arm/neon.h || (echo "Missing $f" && exit 1); done
    # Make sure sve.h includes all the SVE headers.
    - name: Missing SVE includes
      run: for f in simde/arm/sve/*.h; do grep -q "include \"sve/$(basename "$f")\"" simde/arm/sve.h || (echo "Missing $f" && exit 1); done
    # Make sure msa.h includes all the MSA headers.
    - name: Missing MSA includes
      run: for f in simde/mips/msa/*.h; do grep -q "include \"msa/$(basename "$f")\"" simde/mips/msa.h || (echo "Missing $f" && exit 1); done
    # Make sure we can find the expected header guards.  It's easy to miss this when doing C&P
    - name: Header guards
      run: for file in $(find simde/*/ -name '*.h'); do grep -q "$(echo "$file" | tr '[:lower:]' '[:upper:]' | tr '[:punct:]' '_')" "$file" || (echo "Missing or incorrect header guard in $file" && exit 1); done
    # There should be an empty line at the end of every file
    - name: Newline at EOF
      run: for file in $(find simde -name '*.h'); do if [ -n "$(tail -c 1 "$file")" ]; then echo "No newline at end of $file" && exit 1; fi; done
    # Don't #ifndef ; use !defined(...) instead.  ifndef leads to annoying inconsistencies
    - name: ifndef
      run: for file in $(find simde -name '*.h'); do grep -qP '^ *# *ifndef ' "${file}" && exit 1 || exit 0; done
    # List of headers we want Meson to install
    - name: Meson install headers
      run: for file in $(find simde -name '*.h'); do grep -qF "$(basename "${file}" .h)" meson.build || (echo "${file} missing from top-level meson.build" && exit 1); done
    # Make sure we don't accidentally use `vector ...` instead of SIMDE_POWER_ALTIVEC_VECTOR(...)
    - name: AltiVec raw vector keyword
      run: find simde/ \( -name '*.c' -o -name '*.h' \) -exec grep -nP 'vector( +)((bool|signed|unsigned) +)?(double|float|long long|long|int|short|char)' {} + && exit 1 || exit 0
    # Check indentation of preprocessor directives.
    - name: Preprocessor directive indentation
      run: find simde/*/ -name 'avx*.h' -exec pcre2grep -M '{\n#' {} + && exit 1 || exit 0
    - name: Stray `&& 0`
      run: git grep ' && 0' simde/ test/ && exit 1 || exit 0

  x86:
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        isax:
        - -DSIMDE_NATURAL_VECTOR_SIZE=256 -march=x86-64-v3 -mavx512bw -mavx512vl
        # https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels
        - -march=x86-64 -maes -mpclmul  # the x86-64 baseline is CMOV, CX8, FPU, FXSR, MMX, OSFXSR, SCE, SSE, SSE2
        - -march=x86-64-v2  # CMPXCHG16B, LAHF-SAHF, POPCNT, SSE3, SSE4_1, SSE4_2, SSSE3
        - -march=x86-64-v3  # AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, OSXSAVE
        - -march=x86-64-v4  # AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL a.k.a. skylake+ (including zen4)
        include:
          - target: tgl
          - isax: -march=x86-64-v4 -mcx16 -mxsave -mpclmul -mfsgsbase -mrdrnd -mhle -mrdseed -maes -mclflushopt -mxsavec -mxsaves -msgx -mpku -msha -mrdpid -mavx512vpopcntdq -mavx512ifma -mavx512vbmi -mavx512vnni -mavx512vbmi2 -mavx512bitalg -mvpclmulqdq -mgfni -mvaes  # icelake
            target: icl
          - isax: -march=x86-64-v4 -mcx16 -mxsave -mpclmul -mfsgsbase -mrdrnd -mhle -mrdseed -maes -mclflushopt -mxsavec -mxsaves -msgx -mpku -msha -mrdpid -mavx512vpopcntdq -mavx512ifma -mavx512vbmi -mavx512vnni -mavx512vbmi2 -mavx512bitalg -mvpclmulqdq -mgfni -mvaes -mpconfig -mwbnoinvd -mclwb -mmovdiri -mmovdir64b -menqcmd -mcldemote -mptwrite -mwaitpkg -mserialize -mtsxldtrk -muintr -mavxvnni -mavx512fp16  # sapphire rapids without bf16
            # See https://github.com/simd-everywhere/simde/issues/1095
            target: spr
    env:
      CFLAGS: -Wall -Wextra -Werror ${{ matrix.isax }}
      CXXFLAGS: -Wall -Wextra -Werror ${{ matrix.isax }}
      INTEL_TARGET: ${{ matrix.target }}
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    - name: CPU Information
      run: cat /proc/cpuinfo
    - run: sudo apt-get update
    - name: ccache
      uses: hendrikmuhs/ccache-action@v1.2
      with:
        key: ${{ github.job }}-${{ matrix.isax }}
    - name: Install APT Dependencies
      run: |
        sudo apt-get install -y ninja-build ninja-build python3-pip parallel gcovr g++-12 gcc-12
        sudo apt-get purge -y gcc g++
        sudo ln -s /usr/bin/gcc-12 /usr/bin/gcc
        sudo ln -s /usr/bin/g++-12 /usr/bin/g++
        sudo python3 -m pip install meson==0.55.0
    - name: add ccache to the build path
      run: |
        export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
    - name: Configure
      run: meson setup build -Db_coverage=true || (cat build/meson-logs/meson-log.txt ; false)
    - name: Test run native?
      run: |
        test/check-flags.sh query && echo Tests with $CFLAGS will be run natively
        test/check-flags.sh query || echo Tests with $CFLAGS will be run using SDE
    - name: Build
      run: ninja -C build -v
    - name: Test
      run: meson test -C build --print-errorlogs --wrapper "${GITHUB_WORKSPACE}/test/check-flags.sh sde" $(meson test -C build --list | grep -v emul)
    - name: Coverage Report
      run: ninja -C build -v coverage-xml
    - name: CodeCov.io
      uses: codecov/codecov-action@v4
      with:
        file: ./build/meson-logs/coverage.xml
      env:
        CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  x86-xop:
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
    env:
      CFLAGS: -Wall -Wextra -Werror -march=bdver2
      CXXFLAGS: -Wall -Wextra -Werror -march=bdver2
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: ccache
      uses: hendrikmuhs/ccache-action@v1.2
      with:
        key: ${{ github.job }}-
    - name: Install APT Dependencies
      run: |
        #sudo add-apt-repository ppa:aschultz/backports
        sudo apt-get update
        sudo apt-get install -y ninja-build ninja-build python3-pip parallel gcovr g++-12 gcc-12 qemu-user-static
        sudo apt-get purge -y gcc g++
        sudo ln -s /usr/bin/gcc-12 /usr/bin/gcc
        sudo ln -s /usr/bin/g++-12 /usr/bin/g++
        sudo python3 -m pip install meson==0.55.0
    - name: add ccache to the build path
      run: |
        export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
    - name: Configure
      run: meson setup build -Db_coverage=true || (cat build/meson-logs/meson-log.txt ; false)
    - name: Build
      run: ninja -C build -v
    # can't test until we find a combination of `gcc -march=` and `qemu -cpu` that both enable XOP and allows qemu to test it
    # - name: Test
    #   run: meson test -C build --print-errorlogs --wrapper "qemu-amd64-static -cpu Opteron_G5-v1"
    # - name: Coverage Report
    #   run: ninja -C build -v coverage-xml
    # - name: CodeCov.io
    #   uses: codecov/codecov-action@v4
    #   with:
    #     file: ./build/meson-logs/coverage.xml
    #   env:
    #     CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  emscripten:
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        variant:
          - "32"
          - "64"
          - "32-relaxed"
          - "64-relaxed"
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: Install APT Dependencies
      run: |
        sudo apt-get update && \
        sudo apt-get install -y ninja-build ninja-build python3-pip parallel gcovr &&\
        sudo python3 -m pip install meson==0.55.0
    - name: Install emscripten
      run: |
        git clone https://github.com/emscripten-core/emsdk.git /opt/emsdk
        cd /opt/emsdk
        ./emsdk install tot
        ./emsdk activate tot
        source emsdk_env.sh
    - name: Install v8
      run: |
        sudo npm install jsvu -g
        jsvu --os=linux64 --engines=v8
        sudo ln -s "$HOME/.jsvu/bin/v8" /usr/bin/v8
        ls -l /usr/bin/v8
        ls -l ~/.jsvu || true
        /usr/bin/v8 --help
    - name: Configure
      run: meson setup build --optimization 2 --cross-file docker/cross-files/emscripten${{ matrix.variant }}.cross
    - name: Build
      run: meson compile -C build --verbose
    - name: Test
      run: meson test -C build --print-errorlogs

  native-aliases:
    runs-on: ubuntu-22.04
    env:
      CFLAGS: -DSIMDE_ENABLE_NATIVE_ALIASES -DSIMDE_NATIVE_ALIASES_TESTING -Wall -Wextra -Werror
      CXXFLAGS: -DSIMDE_ENABLE_NATIVE_ALIASES -DSIMDE_NATIVE_ALIASES_TESTING -Wall -Wextra -Werror
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: Install APT Dependencies
      run: |
        sudo apt-get update && \
        sudo apt-get -yq install libxml2-utils ninja-build parallel gcovr && \
        sudo python3 -m pip install meson==0.55.0
    - name: Convert
      run: ./test/native-aliases.sh
    - name: Configure
      run: meson setup build -Db_coverage=true
    - name: Build
      run: ninja -C build -v
    - name: Test
      run: ninja -C build -v test
    - name: Coverage Report
      run: ninja -C build -v coverage-xml
    - name: CodeCov.io
      uses: codecov/codecov-action@v4
      with:
        file: ./build/meson-logs/coverage.xml
      env:
        CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  sleef:
    runs-on: ubuntu-22.04
    env:
      CFLAGS: -march=native -Wall -Wextra -Werror
      CXXFLAGS: -march=native -Wall -Wextra -Werror
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    - run: sudo apt-get update
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: Install APT Dependencies
      run: |
        sudo apt-get install -y ninja-build ninja-build parallel gcovr libsleef-dev
        sudo python3 -m pip install meson==0.55.0
    - name: Configure
      run: meson setup build -Dsleef=enabled -Db_coverage=true
    - name: Build
      run: ninja -C build -v
    - name: Test
      run: meson test -C build --print-errorlogs $(meson test -C build --list | grep -v emul)
    - name: Coverage Report
      run: ninja -C build -v coverage-xml
    - name: CodeCov.io
      uses: codecov/codecov-action@v4
      with:
        file: ./build/meson-logs/coverage.xml
      env:
        CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  gcc:
    strategy:
      fail-fast: false
      matrix:
        include:
        - version: 9
          distro: ubuntu-20.04
          arch_flags: -march=native
        - version: 10
          distro: ubuntu-20.04
          arch_flags: -march=native
        - version: 10
          distro: ubuntu-20.04
          arch_flags: -ffast-math
          ccache: 'true'
        - version: 11
          distro: ubuntu-22.04
          arch_flags: -march=native
        - version: 11
          distro: ubuntu-22.04
          arch_flags: -ffast-math
          ccache: 'true'
        - version: 12
          distro: ubuntu-22.04
          arch_flags: -march=native
        - version: 12
          distro: ubuntu-22.04
          arch_flags: -ffast-math
          ccache: 'true'
        - version: 13
          distro: ubuntu-22.04
          arch_flags: -march=native
        - version: 13
          distro: ubuntu-22.04
          arch_flags: -ffast-math
          ccache: 'true'
    runs-on: ${{ matrix.distro }}
    env:
      CFLAGS: ${{ matrix.arch_flags }} -Wall -Wextra -Werror
      CXXFLAGS: ${{ matrix.arch_flags }} -Wall -Wextra -Werror
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: Install APT Dependencies
      run: |
        sudo add-apt-repository ppa:ubuntu-toolchain-r/test
        sudo apt-get update
        sudo apt-get -yq install gcovr python3-pip ninja-build parallel gcc-${{ matrix.version }} g++-${{ matrix.version }}
        sudo apt-get -y purge g++ gcc
        sudo python3 -m pip install meson==0.55.0
    - name: ccache
      uses: hendrikmuhs/ccache-action@v1.2
      if: ${{ matrix.ccache == 'true' }}
      with:
        key: ${{ github.job }}-${{ matrix.version }}-${{ matrix.distro }}-${{ matrix.arch_flags }}
    - name: add ccache to the build path
      run: |
        export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
        sudo ln -s /usr/bin/gcc-${{ matrix.version }} /usr/bin/gcc
        sudo ln -s /usr/bin/g++-${{ matrix.version }} /usr/bin/g++
    - name: Configure
      run: meson setup build
    - name: Build
      run: meson compile -C build --verbose
    - name: Test
      run: meson test -C build --print-errorlogs $(meson test -C build --list | grep -v emul)

  gcc-qemu:
    strategy:
      fail-fast: false
      matrix:
        include:
        - version: 12
          cross: armel
          arch_gnu_abi: eabi
          arch_deb: armel
          arch_gnu: arm
          distro: ubuntu-22.04
        - version: 12
          cross: armv7
          arch_gnu: arm
          arch_gnu_abi: eabihf
          arch_deb: armhf
          distro: ubuntu-22.04
        - version: 12
          cross: aarch64
          arch_gnu: aarch64
          arch_deb: arm64
          distro: ubuntu-22.04
        - extra: -32bit
          version: 12
          cross: armv8
          arch_gnu: arm
          arch_gnu_abi: eabihf
          arch_deb: armhf
          distro: ubuntu-22.04
        - version: 12
          cross: riscv64
          arch_gnu: riscv64
          arch_deb: riscv64
          distro: ubuntu-22.04
        - extra: -O3
          version: 12
          cross: riscv64
          arch_gnu: riscv64
          arch_deb: riscv64
          distro: ubuntu-22.04
        - version: 12
          cross: s390x
          arch_gnu: s390x
          arch_deb: s390x
          distro: ubuntu-22.04
        - version: 12
          cross: power9
          arch_gnu: powerpc64le
          arch_deb: ppc64el
          distro: ubuntu-22.04
       # - version: 12  # needs newer Ubuntu version (23.04+)
       #   cross: mips64el
       #   arch_gnu: mips64el
       #   arch_gnu_abi: abi64
       #   arch_deb: mips64el
       #   distro: ubuntu-22.04
    runs-on: ${{ matrix.distro }}
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    - run: sudo apt-get update
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: Install APT Dependencies
      run: |
        sudo add-apt-repository ppa:savoury1/virtualisation
        sudo apt-get update -y
        sudo apt-get -yq install ninja-build parallel \
          gcc-${{ matrix.version }}-${{ matrix.arch_gnu }}-linux-gnu${{ matrix.arch_gnu_abi }} \
          g++-${{ matrix.version }}-${{ matrix.arch_gnu }}-linux-gnu${{ matrix.arch_gnu_abi }} binfmt-support \
          qemu-user-static python3-pip libc6-${{ matrix.arch_deb }}-cross libstdc++-${{ matrix.version }}-dev-${{ matrix.arch_deb }}-cross
        sudo python3 -m pip install meson==0.55.0
    - name: ccache
      uses: hendrikmuhs/ccache-action@v1.2
      with:
        key: ${{ github.job }}-${{ matrix.distro }}-${{ matrix.cross }}
    - name: add ccache to the build path
      run: |
        export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
    - name: Configure
      run: meson setup --cross-file=docker/cross-files/${{ matrix.cross }}-gcc-${{ matrix.version }}${{ matrix.extra}}-ccache.cross build
    - name: Build
      run: ninja -C build -v
    - name: Test
      run: meson test -C build --print-errorlogs --print-errorlogs $(meson test -C build --list | grep -v emul)

  clang-qemu-rvv:
    strategy:
      fail-fast: false
      matrix:
        include:
        - version: 17
          cross: riscv64+rvv_vlen128_elen64
          arch_gnu: riscv64
          arch_deb: riscv64
          distro: ubuntu-22.04
        - version: 17
          cross: riscv64+rvv_vlen256_elen64
          arch_gnu: riscv64
          arch_deb: riscv64
          distro: ubuntu-22.04
        - version: 17
          cross: riscv64+rvv_vlen512_elen64
          arch_gnu: riscv64
          arch_deb: riscv64
          distro: ubuntu-22.04
        - version: 17
          cross: riscv64+rvv_vlen128_elen64_zvfh
          arch_gnu: riscv64
          arch_deb: riscv64
          distro: ubuntu-22.04
        - version: 17
          cross: riscv64+rvv_vlen256_elen64_zvfh
          arch_gnu: riscv64
          arch_deb: riscv64
          distro: ubuntu-22.04
        - version: 17
          cross: riscv64+rvv_vlen512_elen64_zvfh
          arch_gnu: riscv64
          arch_deb: riscv64
          distro: ubuntu-22.04
    runs-on: ${{ matrix.distro }}
    container:
      image: amd64/ubuntu:23.10
    steps:
    - run: apt-get update
    - name: Install git
      run: |
        apt-get install -y git
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: Install APT Dependencies
      run: |
        apt-get install -y python3 python3-pip git ninja-build pkg-config libglib2.0-dev \
          lsb-release wget software-properties-common gnupg qemu-user pipx
        apt-get install -y clang-${{ matrix.version }} lldb-${{ matrix.version }} lld-${{ matrix.version }}
        #add-apt-repository ppa:savoury1/virtualisation
        #add-apt-repository ppa:savoury1/display
        apt-get update -y
        apt-get -yq install ninja-build parallel \
          binfmt-support libc6-${{ matrix.arch_deb }}-cross \
          libstdc++-12-dev-${{ matrix.arch_deb }}-cross binutils-${{ matrix.arch_gnu }}-linux-gnu
        apt install meson
    - name: ccache
      uses: hendrikmuhs/ccache-action@v1.2
      with:
        key: ${{ github.job }}-${{ matrix.distro }}-${{ matrix.cross }}
    - name: add ccache to the build path
      run: |
        export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
    - name: Configure
      run: |
        meson setup --cross-file=docker/cross-files/${{ matrix.cross }}-clang-${{ matrix.version }}-ccache.cross build \
          || (cat build/meson-logs/meson-log.txt ; false)
    - name: Build
      run: ninja -C build -v
    - name: Test
      run: meson test -C build --print-errorlogs --print-errorlogs $(meson test -C build --list | grep -v emul)

  clang-qemu:
    strategy:
      fail-fast: false
      matrix:
        include:
        - version: 17
          cross: armv7
          arch_deb: armhf
          arch_gnu_abi: eabihf
          arch_gnu: arm
          distro: ubuntu-22.04
        - version: 17
          cross: aarch64
          arch_gnu: aarch64
          arch_deb: arm64
          distro: ubuntu-22.04
        - version: 17
          cross: armel
          arch_gnu_abi: eabi
          arch_deb: armel
          arch_gnu: arm
          distro: ubuntu-22.04
        - version: 17
          cross: riscv64
          arch_gnu: riscv64
          arch_deb: riscv64
          distro: ubuntu-22.04
        # - version: 17
        #   cross: s390x
        #   arch_gnu: s390x
        #   arch_deb: s390x
        #   distro: ubuntu-22.04
        - version: 17
          cross: ppc64el
          arch_deb: ppc64el
          arch_gnu: powerpc64le
          distro: ubuntu-22.04
        # - version: 17
        #   cross: mips64el  # needs newer Ubuntu (23.04+)
        #   arch_deb: mips64el
        #   arch_gnu: mips64el
        #   arch_gnu_abi: abi64
        #   distro: ubuntu-22.04
    runs-on: ${{ matrix.distro }}
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    - run: sudo apt-get update
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: Install APT Dependencies
      run: |
        sudo add-apt-repository ppa:savoury1/virtualisation
        sudo add-apt-repository ppa:savoury1/build-tools
        sudo add-apt-repository ppa:savoury1/display
        sudo apt-get update -y
        sudo apt-get -yq install ninja-build parallel \
          binfmt-support clang-${{ matrix.version }} clang++-${{ matrix.version }} \
          qemu-user-static python3-pip libc6-${{ matrix.arch_deb }}-cross libstdc++-12-dev-${{ matrix.arch_deb }}-cross \
          binutils-${{ matrix.arch_gnu }}-linux-gnu${{ matrix.arch_gnu_abi }}
        sudo python3 -m pip install meson==0.55.0
    - name: ccache
      uses: hendrikmuhs/ccache-action@v1.2
      with:
        key: ${{ github.job }}-${{ matrix.distro }}-${{ matrix.cross }}
    - name: add ccache to the build path
      run: |
        export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
    - name: Configure
      run: |
        meson setup --cross-file=docker/cross-files/${{ matrix.cross }}-clang-${{ matrix.version }}-ccache.cross build \
          || (cat build/meson-logs/meson-log.txt ; false)
    - name: Build
      run: ninja -C build -v
    - name: Test
      run: meson test -C build --print-errorlogs --print-errorlogs $(meson test -C build --list | grep -v emul)

  clang:
    strategy:
      fail-fast: false
      matrix:
        include:
        - version: "7"
          distro: ubuntu-20.04
          arch_flags: -march=native
        # clang-8 is tested on Semaphore-CI https://nemequ.semaphoreci.com/projects/simde
        - version: "9"
          distro: ubuntu-20.04
          arch_flags: -march=native
        # clang-10 is tested on Semaphore-CI https://nemequ.semaphoreci.com/projects/simde
        - version: "11"
          distro: ubuntu-22.04
          arch_flags: -march=native
        - version: "12"
          distro: ubuntu-20.04
          arch_flags: -march=native
        - version: "12"
          distro: ubuntu-20.04
          arch_flags: -ffast-math
          ccache: 'true'
        - version: "13"
          distro: ubuntu-22.04
          arch_flags: -march=native
        - version: "13"
          distro: ubuntu-22.04
          arch_flags: -ffast-math
          ccache: 'true'
        - version: "14"
          distro: ubuntu-22.04
          arch_flags: -march=native
        - version: "14"
          distro: ubuntu-22.04
          arch_flags: -ffast-math
          ccache: 'true'
        - version: "15"
          distro: ubuntu-22.04
          arch_flags: -march=native
        - version: "15"
          distro: ubuntu-22.04
          arch_flags: -ffast-math
          ccache: 'true'
        - version: "16"
          distro: ubuntu-22.04
          arch_flags: -march=native -Wno-unsafe-buffer-usage
        - version: "16"
          distro: ubuntu-22.04
          arch_flags: -ffast-math -Wno-unsafe-buffer-usage
          ccache: 'true'
        - version: "17"
          distro: ubuntu-22.04
          arch_flags: -march=native -Wno-unsafe-buffer-usage
        - version: "17"
          distro: ubuntu-22.04
          arch_flags: -ffast-math -Wno-unsafe-buffer-usage
          ccache: 'true'
        - version: "17"
          distro: ubuntu-22.04
          arch_flags: -march=native -Wno-unsafe-buffer-usage -O2
    runs-on: ${{ matrix.distro }}
    env:
      CFLAGS: ${{ matrix.arch_flags }} -Wall -Weverything -Werror -fno-lax-vector-conversions
      CXXFLAGS: ${{ matrix.arch_flags }} -Wall -Weverything -Werror -fno-lax-vector-conversions
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: Install APT Dependencies
      run: |
        sudo add-apt-repository ppa:ubuntu-toolchain-r/test
        sudo add-apt-repository ppa:savoury1/build-tools
        sudo add-apt-repository ppa:savoury1/display
        sudo add-apt-repository ppa:savoury1/llvm-defaults-16
        sudo apt-get update
        sudo apt-get -yq install gcovr ninja-build python3-pip clang-${{ matrix.version }}
        sudo python3 -m pip install meson==0.55.0
        sudo rm /usr/bin/gcc /usr/bin/g++ /usr/bin/cc /usr/bin/c++
        sudo ln -s $(command -v clang-${{ matrix.version }}) /usr/bin/cc
        sudo ln -s $(command -v clang-${{ matrix.version }}) /usr/bin/c++
    - name: ccache
      uses: hendrikmuhs/ccache-action@v1.2
      if: ${{ matrix.ccache == 'true' }}
      with:
        key: ${{ github.job }}-${{ matrix.version }}-${{ matrix.distro }}-${{ matrix.arch_flags }}
    - name: add ccache to the build path
      if: ${{ matrix.ccache == 'true' }}
      run: |
        export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
    - name: Configure
      run: meson setup build
    - name: Build
      run: meson compile -C build --verbose
    - name: Test
      run: meson test -C build --print-errorlogs $(meson test -C build --list | grep -v emul)

  macos:
    strategy:
      fail-fast: false
      matrix:
        # https://www.jessesquires.com/blog/2020/01/06/selecting-an-xcode-version-on-github-ci/
        # https://github.com/actions/runner-images/blob/main/images/macos/macos-11-Readme.md#xcode
        # https://github.com/actions/runner-images/blob/main/images/macos/macos-12-Readme.md#xcode
        # https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md#xcode
        # https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md
        # https://trac.macports.org/wiki/XcodeVersionInfo
        include:
          - xcode: "11.7"
            os: macos-11
            arch_flags: -Wno-complex-component-init
          - xcode: "12.4"
            os: macos-11
            arch_flags: -Wno-poison-system-directories  # due to meson test
          - xcode: "12.5.1"
            os: macos-11
            arch_flags: -Wno-poison-system-directories  # due to meson test
          - xcode: "13.1"
            os: macos-12
            arch_flags: -Wno-poison-system-directories  # due to meson test
          - xcode: "13.3.1"
            os: macos-12
            arch_flags: -Wno-poison-system-directories  # due to meson test
          - xcode: "13.4.1"
            os: macos-12
            arch_flags: -Wno-poison-system-directories  # due to meson test
          - xcode: "14.2"
            os: macos-13
            arch_flags: -Wno-poison-system-directories  # due to meson test
          - xcode: "14.3.1"
            os: macos-14  # arm64
            arch_flags: -march=native -Wno-poison-system-directories
              # "-Wno-poison-system-directories": due to meson test
              # "-march=native": without, or with -mcpu=apple-m1 then unavailable __ARM_FEATURE_s get enabled
          - xcode: "15.2"
            os: macos-14  # arm64
            arch_flags: -march=native -Wno-poison-system-directories
              # "-Wno-poison-system-directories": due to meson test
              # "-march=native": without, or with -mcpu=apple-m1 then unavailable __ARM_FEATURE_s get enabled
    runs-on: ${{ matrix.os }}
    env:
      DEVELOPER_DIR:  /Applications/Xcode_${{ matrix.xcode }}.app
      CFLAGS: ${{ matrix.arch_flags }} -Wall -Weverything -Werror -Wno-complex-component-init
      CXXFLAGS: ${{ matrix.arch_flags }} -Wall -Weverything -Werror -Wno-complex-component-init
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: recursive
    # - name: System Information
    #   run: system_profiler
    - name: Compiler version
      run: cc --version
    - name: ccache
      uses: hendrikmuhs/ccache-action@v1.2
      with:
        key: ${{ github.job }}-${{ matrix.xcode }}
    - name: Python install bug workaround # https://github.com/actions/setup-python/issues/577
      run: |
          find /usr/local/bin -type l -exec sh -c 'readlink -f "$1" \
          | grep -q ^/Library/Frameworks/Python.framework/Versions/' _ {} \; -exec rm -v {} \;
    - name: Install Homebrew Dependencies
      run: brew install meson ninja # gcovr
    - name: Configure
      run: meson setup build || (cat build/meson-logs/meson-log.txt ; false) # -Db_coverage=true
    - name: Build
      run: ninja -C build -v
    - name: Test
      run: meson test -C build --print-errorlogs $(meson test -C build --list | grep -v emul)
    # - name: Coverage Report
    #   run: ninja -C build -v coverage-xml
    # - name: CodeCov.io
    #   uses: codecov/codecov-action@v4
    #   with:
    #     file: ./build/meson-logs/coverage.xml
    #   env:
    #     CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  icc:
    runs-on: ubuntu-22.04
    env:
      CC: /home/runner/.local/bin/icx
      CXX: /home/runner/.local/bin/icpx
      CFLAGS: -Wall -Werror -march=native -fp-model precise
      CXXFLAGS: -Wall -Werror -march=native -fp-model precise
    steps:
    - uses: actions/checkout@v4
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: Install APT Dependencies
      run: sudo apt-get install -y ninja-build python3-pip && sudo pip install meson==0.64
    - name: Install ICC
      run: |
        # download the key to system keyring
        wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
        | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null
        # add signed entry to apt sources and configure the APT client to use Intel repository:
        echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
        sudo apt-get update
        sudo apt-get install -y intel-oneapi-compiler-dpcpp-cpp
        mkdir -p ~/.local/bin/ || true
        for exe in icx icpx; do
          printf '#!/bin/bash\nARGS="$@"\nsource /opt/intel/oneapi/compiler/latest/env/vars.sh >/dev/null\n%s ${ARGS}\n' "${exe}" > ~/.local/bin/"${exe}"
          chmod 0755 ~/.local/bin/"${exe}";
        done
    - name: Configure
      run: meson setup build
    - name: Build
      run: ninja -C build -v
    - name: Test
      run: meson test -C build --print-errorlogs $(meson test -C build --list | grep -v emul)

  msvc-arm64:
    name: Windows MSVC-AArch64
    runs-on: [windows-latest]
    env:
      CFLAGS: /WX /Z7
      CXXFLAGS: /WX /Z7
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          submodules: recursive
      - name: Install Meson, Ninja and coverage
        run: |
          python3 -m pip install --upgrade ninja meson
          choco install opencppcoverage codecov
      - name: Use ARM64 Developer Command Prompt
        uses: ilammy/msvc-dev-cmd@v1
        with:
          arch: amd64_arm64
      - name: Configure and Build
        run: |
          meson --backend=ninja build --cross-file test/arm64cl.txt
          ninja -C build test

  linux-gcc-loongarch64:
    runs-on: ubuntu-22.04
    steps:
    - uses: actions/checkout@v4
    - name: CPU Information
      run: cat /proc/cpuinfo
    - name: Install APT Dependencies
      run: |
        sudo add-apt-repository ppa:savoury1/virtualisation
        sudo apt-get install -y ninja-build ninja-build meson qemu-user-static
    - name: Download and install loongarch64-toolchain
      run: |
        wget https://github.com/loongson/build-tools/releases/download/2022.09.06/loongarch64-clfs-7.3-cross-tools-gcc-glibc.tar.xz
        tar -xf loongarch64-clfs-7.3-cross-tools-gcc-glibc.tar.xz -C /opt
    - name: ccache
      uses: hendrikmuhs/ccache-action@v1.2
      with:
        key: ${{ github.job }}-loongarch64-gcc-13
    - name: set env
      run: |
        echo "LD_LIBRARY_PATH=/opt/cross-tools/target/usr/lib64:/opt/cross-tools/loongarch64-unknown-linux-gnu/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV
        echo "PATH=$GITHUB_WORKSPACE:/opt/cross-tools/bin:$PATH" >> $GITHUB_ENV
    - name: Disable SVML tests
      run: |
        sed -i "/svml/d" test/x86/meson.build
        rm test/x86/svml.c
        echo "Due to the qemu versions 7.2 through 8.0 causing timeouts in four sets of test cases,"
        echo "the SVML tests have been temporarily disabled."
    - name: Disable RND*X tests
      run: |
        sed -i "/rndx/d" meson.build
        sed -i "/rnd..x/d" meson.build
        rm test/arm/neon/rndx.c test/arm/neon/rnd32x.c test/arm/neon/rnd64x.c
        echo "Due to the qemu versions 7.2 through 8.0 causing timeouts in four sets of test cases,"
        echo "the RNDX, RND32X, and RND64X tests have been temporarily disabled."
    - name: Configure
      run: meson setup build --cross-file=docker/cross-files/loongarch64-gcc-13-ccache.cross
    - name: Build
      run: meson compile -C build -v
    - name: Test
      run: meson test -C build --print-errorlogs
