1 //===- subzero/crosstest/test_bitmanip.cpp - Implementation for tests. ----===// 2 // 3 // The Subzero Code Generator 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This aims to test that all the bit manipulation intrinsics work, via 11 // cross-testing. This calls wrappers (my_{ctlz,cttz,ctpop} around the 12 // intrinsics (llvm.{ctlz,cttz,ctpop}.*). 13 //===----------------------------------------------------------------------===// 14 15 #include <stdint.h> 16 17 #include <cstdlib> 18 19 #include "test_bitmanip.h" 20 21 #define X(inst, type) \ 22 type test_##inst(type a) { return my_##inst(a); } \ 23 type test_alloca_##inst(type a) { \ 24 const size_t buf_size = 8; \ 25 type buf[buf_size]; \ 26 for (size_t i = 0; i < buf_size; ++i) { \ 27 buf[i] = my_##inst(a); \ 28 } \ 29 type sum = 0; \ 30 for (size_t i = 0; i < buf_size; ++i) { \ 31 sum += buf[i]; \ 32 } \ 33 return sum; \ 34 } \ 35 type test_const_##inst(type ignored) { \ 36 return my_##inst(static_cast<type>(0x12340)); \ 37 } 38 39 FOR_ALL_BMI_OP_TYPES(X) 40 #undef X 41 42 #define X(type, builtin_name) \ 43 type test_bswap(type a) { return builtin_name(a); } \ 44 type test_bswap_alloca(type a) { \ 45 const size_t buf_size = 8; \ 46 type buf[buf_size]; \ 47 for (size_t i = 0; i < buf_size; ++i) { \ 48 buf[i] = builtin_name(a * i) + builtin_name(a + i); \ 49 } \ 50 type sum = 0; \ 51 for (size_t i = 0; i < buf_size; ++i) { \ 52 sum += buf[i]; \ 53 } \ 54 return sum; \ 55 } 56 BSWAP_TABLE 57 #undef X 58