Home | History | Annotate | Download | only in crosstest
      1 //===- subzero/crosstest/test_bitmanip_main.cpp - Driver 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 // Driver for cross testing bit manipulation intrinsics.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 /* crosstest.py --test=test_bitmanip.cpp --test=test_bitmanip_intrin.ll \
     15    --driver=test_bitmanip_main.cpp --prefix=Subzero_ --output=test_bitmanip */
     16 
     17 #include <stdint.h>
     18 
     19 #include <climits>
     20 #include <iostream>
     21 
     22 // Include test_bitmanip.h twice - once normally, and once within the
     23 // Subzero_ namespace, corresponding to the llc and Subzero translated
     24 // object files, respectively.
     25 #include "test_bitmanip.h"
     26 #include "xdefs.h"
     27 
     28 namespace Subzero_ {
     29 #include "test_bitmanip.h"
     30 }
     31 
     32 volatile uint64 Values[] = {
     33     0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff, 0x8000, 0x8001,
     34     0xfffe, 0xffff, 0xc0de, 0xabcd, 0xdcba, 0x007fffff /*Max subnormal + */,
     35     0x00800000 /*Min+ */, 0x7f7fffff /*Max+ */, 0x7f800000 /*+Inf*/,
     36     0xff800000 /*-Inf*/, 0x7fa00000 /*SNaN*/, 0x7fc00000 /*QNaN*/, 0x7ffffffe,
     37     0x7fffffff, 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff, 0x12345678,
     38     0xabcd1234, 0x1234dcba, 0x100000000ll, 0x100000001ll, 0x123456789abcdef1ll,
     39     0x987654321ab1fedcll, 0x000fffffffffffffll /*Max subnormal + */,
     40     0x0010000000000000ll /*Min+ */, 0x7fefffffffffffffll /*Max+ */,
     41     0x7ff0000000000000ll /*+Inf*/, 0xfff0000000000000ll /*-Inf*/,
     42     0x7ff0000000000001ll /*SNaN*/, 0x7ff8000000000000ll /*QNaN*/,
     43     0x7ffffffffffffffell, 0x7fffffffffffffffll, 0x8000000000000000ll,
     44     0x8000000000000001ll, 0xfffffffffffffffell, 0xffffffffffffffffll};
     45 
     46 const static size_t NumValues = sizeof(Values) / sizeof(*Values);
     47 
     48 template <typename Type>
     49 void testBitManip(size_t &TotalTests, size_t &Passes, size_t &Failures) {
     50   typedef Type (*FuncType)(Type);
     51   static struct {
     52     const char *Name;
     53     FuncType FuncLlc;
     54     FuncType FuncSz;
     55   } Funcs[] = {
     56 #define X(inst)                                                                \
     57   { STR(inst), test_##inst, Subzero_::test_##inst }                            \
     58   , {STR(inst) "_alloca", test_alloca_##inst, Subzero_::test_alloca_##inst},   \
     59       {STR(inst) "_const", test_const_##inst, Subzero_::test_const_##inst},
     60       BMI_OPS
     61 #undef X
     62   };
     63   const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs);
     64 
     65   for (size_t f = 0; f < NumFuncs; ++f) {
     66     for (size_t i = 0; i < NumValues; ++i) {
     67       Type Value = static_cast<Type>(Values[i]);
     68       ++TotalTests;
     69       Type ResultSz = Funcs[f].FuncSz(Value);
     70       Type ResultLlc = Funcs[f].FuncLlc(Value);
     71       if (ResultSz == ResultLlc) {
     72         ++Passes;
     73       } else {
     74         ++Failures;
     75         std::cout << "test_" << Funcs[f].Name << (CHAR_BIT * sizeof(Type))
     76                   << "(" << static_cast<uint64>(Value)
     77                   << "): sz=" << static_cast<uint64>(ResultSz)
     78                   << " llc=" << static_cast<uint64>(ResultLlc) << "\n";
     79       }
     80     }
     81   }
     82 }
     83 
     84 template <typename Type>
     85 void testByteSwap(size_t &TotalTests, size_t &Passes, size_t &Failures) {
     86   typedef Type (*FuncType)(Type);
     87   static struct {
     88     const char *Name;
     89     FuncType FuncLlc;
     90     FuncType FuncSz;
     91   } Funcs[] = {
     92       {"bswap", test_bswap, Subzero_::test_bswap},
     93       {"bswap_alloca", test_bswap_alloca, Subzero_::test_bswap_alloca}};
     94   const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs);
     95   for (size_t f = 0; f < NumFuncs; ++f) {
     96     for (size_t i = 0; i < NumValues; ++i) {
     97       Type Value = static_cast<Type>(Values[i]);
     98       ++TotalTests;
     99       Type ResultSz = Funcs[f].FuncSz(Value);
    100       Type ResultLlc = Funcs[f].FuncLlc(Value);
    101       if (ResultSz == ResultLlc) {
    102         ++Passes;
    103       } else {
    104         ++Failures;
    105         std::cout << "test_" << Funcs[f].Name << (CHAR_BIT * sizeof(Type))
    106                   << "(" << static_cast<uint64>(Value)
    107                   << "): sz=" << static_cast<uint64>(ResultSz)
    108                   << " llc=" << static_cast<uint64>(ResultLlc) << "\n";
    109       }
    110     }
    111   }
    112 }
    113 
    114 int main(int argc, char *argv[]) {
    115   size_t TotalTests = 0;
    116   size_t Passes = 0;
    117   size_t Failures = 0;
    118 
    119   testBitManip<uint32_t>(TotalTests, Passes, Failures);
    120   testBitManip<uint64>(TotalTests, Passes, Failures);
    121   testByteSwap<uint16_t>(TotalTests, Passes, Failures);
    122   testByteSwap<uint32_t>(TotalTests, Passes, Failures);
    123   testByteSwap<uint64>(TotalTests, Passes, Failures);
    124 
    125   std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes
    126             << " Failures=" << Failures << "\n";
    127   return Failures;
    128 }
    129