#include "benchmark_kernels.hpp"

// Every kernel reads and writes distinct arrays in this benchmark. Ordinary
// pointers leave alias checks and vectorization decisions to the compiler.
extern "C" void runtime_divide(const std::int32_t* input,
                                std::int32_t* output, std::size_t count,
                                std::int32_t denominator, const Divide&) {
    for (std::size_t i = 0; i < count; ++i) {
        output[i] = input[i] / denominator;
    }
}

extern "C" void constant_divide(const std::int32_t* input,
                                 std::int32_t* output, std::size_t count,
                                 std::int32_t, const Divide&) {
    for (std::size_t i = 0; i < count; ++i) {
        output[i] = input[i] / 3;
    }
}

extern "C" void precomputed_divide(const std::int32_t* input,
                                    std::int32_t* output, std::size_t count,
                                    std::int32_t, const Divide& divide) {
    for (std::size_t i = 0; i < count; ++i) {
        output[i] = divide(input[i]);
    }
}

extern "C" void construct_and_divide(const std::int32_t* input,
                                      std::int32_t* output, std::size_t count,
                                      std::int32_t denominator, const Divide&) {
    const Divide divide(denominator);
    for (std::size_t i = 0; i < count; ++i) {
        output[i] = divide(input[i]);
    }
}
