//===- 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