Home | History | Annotate | Download | only in crosstest
      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