//===- subzero/crosstest/test_bitmanip.cpp - Implementation for tests. ----===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This aims to test that all the bit manipulation intrinsics work, via
// cross-testing. This calls wrappers (my_{ctlz,cttz,ctpop} around the
// intrinsics (llvm.{ctlz,cttz,ctpop}.*).
//===----------------------------------------------------------------------===//

#include <stdint.h>

#include <cstdlib>

#include "test_bitmanip.h"

#define X(inst, type)                                                          \
  type test_##inst(type a) { return my_##inst(a); }                            \
  type test_alloca_##inst(type a) {                                            \
    const size_t buf_size = 8;                                                 \
    type buf[buf_size];                                                        \
    for (size_t i = 0; i < buf_size; ++i) {                                    \
      buf[i] = my_##inst(a);                                                   \
    }                                                                          \
    type sum = 0;                                                              \
    for (size_t i = 0; i < buf_size; ++i) {                                    \
      sum += buf[i];                                                           \
    }                                                                          \
    return sum;                                                                \
  }                                                                            \
  type test_const_##inst(type ignored) {                                       \
    return my_##inst(static_cast<type>(0x12340));                              \
  }

FOR_ALL_BMI_OP_TYPES(X)
#undef X

#define X(type, builtin_name)                                                  \
  type test_bswap(type a) { return builtin_name(a); }                          \
  type test_bswap_alloca(type a) {                                             \
    const size_t buf_size = 8;                                                 \
    type buf[buf_size];                                                        \
    for (size_t i = 0; i < buf_size; ++i) {                                    \
      buf[i] = builtin_name(a * i) + builtin_name(a + i);                      \
    }                                                                          \
    type sum = 0;                                                              \
    for (size_t i = 0; i < buf_size; ++i) {                                    \
      sum += buf[i];                                                           \
    }                                                                          \
    return sum;                                                                \
  }
BSWAP_TABLE
#undef X