| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // Copyright Contributors to the OpenVDB Project | ||
| 2 | // SPDX-License-Identifier: MPL-2.0 | ||
| 3 | |||
| 4 | #include "util.h" | ||
| 5 | |||
| 6 | #include <openvdb_ax/codegen/Types.h> | ||
| 7 | #include <openvdb_ax/codegen/Codecs.h> | ||
| 8 | |||
| 9 | #include <openvdb/points/AttributeArray.h> // for native codec types | ||
| 10 | |||
| 11 | #include <cppunit/extensions/HelperMacros.h> | ||
| 12 | |||
| 13 | #include <limits> | ||
| 14 | |||
| 15 | using namespace openvdb; | ||
| 16 | using namespace openvdb::ax; | ||
| 17 | using namespace openvdb::ax::codegen; | ||
| 18 | using namespace openvdb::points; | ||
| 19 | using HalfTy = openvdb::math::half; | ||
| 20 | |||
| 21 | struct UFxpt8 { static const bool OneByte = true; using type = FixedPointCodec<OneByte, UnitRange>; }; | ||
| 22 | struct UFxpt16 { static const bool OneByte = false; using type = FixedPointCodec<OneByte, UnitRange>; }; | ||
| 23 | struct PRFxpt8 { static const bool OneByte = true; using type = FixedPointCodec<OneByte, PositionRange>; }; | ||
| 24 | struct PRFxpt16 { static const bool OneByte = false; using type = FixedPointCodec<OneByte, PositionRange>; }; | ||
| 25 | |||
| 26 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
|
6 | class TestCodecs : public CppUnit::TestCase |
| 27 | { | ||
| 28 | public: | ||
| 29 |
3/6✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
4 | CPPUNIT_TEST_SUITE(TestCodecs); |
| 30 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
6 | CPPUNIT_TEST(testRegisteredCodecs); |
| 31 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
6 | CPPUNIT_TEST(testTruncateCodec); |
| 32 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
6 | CPPUNIT_TEST(testFxptCodec<UFxpt8>); |
| 33 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
6 | CPPUNIT_TEST(testFxptCodec<UFxpt16>); |
| 34 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
6 | CPPUNIT_TEST(testFxptCodec<PRFxpt8>); |
| 35 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
6 | CPPUNIT_TEST(testFxptCodec<PRFxpt16>); |
| 36 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
4 | CPPUNIT_TEST_SUITE_END(); |
| 37 | |||
| 38 | void testRegisteredCodecs(); | ||
| 39 | void testTruncateCodec(); | ||
| 40 | template <typename FxptCodecT> | ||
| 41 | void testFxptCodec(); | ||
| 42 | }; | ||
| 43 | |||
| 44 | CPPUNIT_TEST_SUITE_REGISTRATION(TestCodecs); | ||
| 45 | |||
| 46 | inline const Codec* | ||
| 47 | 5 | getCodecByCodecName(const std::string& name) | |
| 48 | { | ||
| 49 | std::vector<const Codec*> codecs; | ||
| 50 | 5 | const auto& map = getCodecTypeMap(); | |
| 51 |
1/2✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
|
7 | for (const auto& typemap : map) { |
| 52 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 2 times.
|
17 | for (const auto& nameToCodec : typemap.second) { |
| 53 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
|
15 | if (nameToCodec.first == name) { |
| 54 | 5 | return nameToCodec.second; | |
| 55 | } | ||
| 56 | } | ||
| 57 | } | ||
| 58 | ✗ | return nullptr; | |
| 59 | } | ||
| 60 | |||
| 61 | 1 | void TestCodecs::testRegisteredCodecs() | |
| 62 | { | ||
| 63 | // For each codec, verify the way its been setup. Really this should be | ||
| 64 | // enforced as part of the API but the majority of the setup code is internal. | ||
| 65 | |||
| 66 | 2 | llvm::LLVMContext C; | |
| 67 | |||
| 68 | // Get all unique registered codecs | ||
| 69 | std::set<const Codec*> codecs; | ||
| 70 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto& map = getCodecTypeMap(); |
| 71 | |||
| 72 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | for (const auto& typemap : map) { |
| 73 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
|
10 | for (const auto& nameToCodec : typemap.second) { |
| 74 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | codecs.insert(nameToCodec.second); |
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | // currently only 5 codecs are registered by default | ||
| 79 |
4/8✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
|
1 | CPPUNIT_ASSERT_EQUAL(codecs.size(), size_t(5)); |
| 80 | |||
| 81 | // for each codec, check: | ||
| 82 | // make sure the codecs flags are unique | ||
| 83 | // make sure the encoder/decoder functions have unique signatures | ||
| 84 | |||
| 85 | std::set<uint32_t> flags; | ||
| 86 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (const Codec* codec : codecs) { |
| 87 |
7/14✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 25 taken 5 times.
✗ Branch 26 not taken.
|
10 | CPPUNIT_ASSERT(!flags.count(codec->flag())); |
| 88 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | flags.insert(codec->flag()); |
| 89 | } | ||
| 90 | |||
| 91 | // | ||
| 92 | |||
| 93 |
3/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
|
6 | for (const Codec* codec : codecs) { |
| 94 | const codegen::FunctionGroup* encoder = codec->encoder(); | ||
| 95 | const codegen::FunctionGroup* decoder = codec->decoder(); | ||
| 96 |
6/12✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
|
5 | CPPUNIT_ASSERT(encoder); |
| 97 |
6/12✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
|
5 | CPPUNIT_ASSERT(decoder); |
| 98 |
6/12✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
|
5 | CPPUNIT_ASSERT(!encoder->list().empty()); |
| 99 |
6/12✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
|
5 | CPPUNIT_ASSERT(!decoder->list().empty()); |
| 100 | |||
| 101 | std::set<std::vector<llvm::Type*>> decoderSignatures, encoderSignatures; | ||
| 102 | |||
| 103 |
2/2✓ Branch 0 taken 16 times.
✓ Branch 1 taken 5 times.
|
21 | for (const auto& F : decoder->list()) { |
| 104 | // check the function takes 2 arguments (in/out) | ||
| 105 | // @note This could change in the future e.g. a value is returned | ||
| 106 |
5/10✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 17 not taken.
|
16 | CPPUNIT_ASSERT_EQUAL(F->size(), size_t(2)); // input/output |
| 107 | std::vector<llvm::Type*> types; | ||
| 108 |
1/2✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
|
16 | llvm::Type* ret = F->types(types, C); |
| 109 | // currently expect codecs to ret void | ||
| 110 |
4/8✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 11 not taken.
|
32 | CPPUNIT_ASSERT_EQUAL(ret, codegen::LLVMType<void>::get(C)); |
| 111 | // signature should be unqiue | ||
| 112 |
7/14✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 17 not taken.
✓ Branch 24 taken 16 times.
✗ Branch 25 not taken.
|
32 | CPPUNIT_ASSERT(!decoderSignatures.count(types)); |
| 113 | decoderSignatures.insert(types); | ||
| 114 | } | ||
| 115 | |||
| 116 |
2/2✓ Branch 0 taken 16 times.
✓ Branch 1 taken 5 times.
|
21 | for (const auto& F : encoder->list()) { |
| 117 | // check the function takes 2 arguments (in/out) | ||
| 118 | // @note This could change in the future e.g. a value is returned | ||
| 119 |
5/10✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 17 not taken.
|
16 | CPPUNIT_ASSERT_EQUAL(F->size(), size_t(2)); // input/output |
| 120 | std::vector<llvm::Type*> types; | ||
| 121 |
1/2✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
|
16 | llvm::Type* ret = F->types(types, C); |
| 122 | // currently expect codecs to ret void | ||
| 123 |
4/8✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 11 not taken.
|
32 | CPPUNIT_ASSERT_EQUAL(ret, codegen::LLVMType<void>::get(C)); |
| 124 | // signature should be unqiue | ||
| 125 |
7/14✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 17 not taken.
✓ Branch 24 taken 16 times.
✗ Branch 25 not taken.
|
32 | CPPUNIT_ASSERT(!encoderSignatures.count(types)); |
| 126 | encoderSignatures.insert(types); | ||
| 127 | } | ||
| 128 | |||
| 129 |
6/12✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
|
5 | CPPUNIT_ASSERT(!encoderSignatures.empty()); |
| 130 |
6/12✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
|
5 | CPPUNIT_ASSERT(!decoderSignatures.empty()); |
| 131 |
5/10✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
|
5 | CPPUNIT_ASSERT_EQUAL(decoderSignatures.size(), encoderSignatures.size()); |
| 132 | |||
| 133 | // check signatures have unique input/output types | ||
| 134 | // @note This is necessary so that the IR knows what type to expect for a given input | ||
| 135 | |||
| 136 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
10 | std::vector<std::vector<llvm::Type*>> copy(decoderSignatures.size()); |
| 137 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | std::copy(decoderSignatures.begin(), decoderSignatures.end(), copy.begin()); |
| 138 | |||
| 139 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 5 times.
|
13 | for (size_t i = 0; i < copy.size(); ++i) { |
| 140 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | const auto types = copy.back(); |
| 141 | 8 | const llvm::Type* first = types[0]; | |
| 142 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | const llvm::Type* second = types[1]; |
| 143 | copy.pop_back(); | ||
| 144 |
2/2✓ Branch 0 taken 26 times.
✓ Branch 1 taken 8 times.
|
34 | for (const auto& remaining : copy) { |
| 145 |
6/12✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 26 times.
✗ Branch 17 not taken.
|
26 | CPPUNIT_ASSERT(first != remaining[0]); |
| 146 |
6/12✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 26 times.
✗ Branch 17 not taken.
|
26 | CPPUNIT_ASSERT(second != remaining[1]); |
| 147 | } | ||
| 148 | } | ||
| 149 | |||
| 150 | // check signatures have unique input/output types | ||
| 151 | // @note This is necessary so that the IR knows what type to expect for a given input | ||
| 152 | |||
| 153 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | copy.resize(decoderSignatures.size()); |
| 154 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | std::copy(encoderSignatures.begin(), encoderSignatures.end(), copy.begin()); |
| 155 | |||
| 156 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 5 times.
|
13 | for (size_t i = 0; i < copy.size(); ++i) { |
| 157 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | const auto types = copy.back(); |
| 158 | 8 | const llvm::Type* first = types[0]; | |
| 159 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | const llvm::Type* second = types[1]; |
| 160 | copy.pop_back(); | ||
| 161 |
2/2✓ Branch 0 taken 26 times.
✓ Branch 1 taken 8 times.
|
34 | for (const auto& remaining : copy) { |
| 162 |
6/12✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 26 times.
✗ Branch 17 not taken.
|
26 | CPPUNIT_ASSERT(first != remaining[0]); |
| 163 |
6/12✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 26 times.
✗ Branch 17 not taken.
|
26 | CPPUNIT_ASSERT(second != remaining[1]); |
| 164 | } | ||
| 165 | } | ||
| 166 | |||
| 167 | // Check that every decoder has a matching encoder signature | ||
| 168 | |||
| 169 |
2/2✓ Branch 0 taken 16 times.
✓ Branch 1 taken 5 times.
|
21 | for (const auto& types : decoderSignatures) { |
| 170 |
1/2✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
|
16 | std::vector<llvm::Type*> rev = types; |
| 171 | 16 | std::reverse(rev.begin(), rev.end()); | |
| 172 |
7/14✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 17 not taken.
✓ Branch 23 taken 16 times.
✗ Branch 24 not taken.
|
32 | CPPUNIT_ASSERT(encoderSignatures.find(rev) != encoderSignatures.end()); |
| 173 | } | ||
| 174 | } | ||
| 175 | 1 | } | |
| 176 | |||
| 177 | 1 | void TestCodecs::testTruncateCodec() | |
| 178 | { | ||
| 179 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
2 | unittest_util::LLVMState state; |
| 180 | llvm::LLVMContext& C = state.context(); | ||
| 181 | llvm::Module& M = state.module(); | ||
| 182 | |||
| 183 | const Codec* const codec = | ||
| 184 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | getCodecByCodecName(TruncateCodec::name()); |
| 185 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
|
1 | CPPUNIT_ASSERT(codec); |
| 186 | |||
| 187 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | llvm::Type* floatty = codegen::LLVMType<float>::get(C); |
| 188 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | llvm::Type* vfloatty = codegen::LLVMType<math::Vec3<float>>::get(C); |
| 189 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | llvm::Type* halfty = codegen::LLVMType<HalfTy>::get(C); |
| 190 | 1 | llvm::Type* vhalfty = codegen::LLVMType<math::Vec3<HalfTy>>::get(C); | |
| 191 | |||
| 192 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
1 | CPPUNIT_ASSERT_EQUAL(halfty, codec->decodedToEncoded(ast::tokens::CoreType::FLOAT, C)); |
| 193 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
1 | CPPUNIT_ASSERT_EQUAL(vhalfty, codec->decodedToEncoded(ast::tokens::CoreType::VEC3F, C)); |
| 194 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
1 | CPPUNIT_ASSERT_EQUAL(floatty, codec->encodedToDecoded(halfty)); |
| 195 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
|
1 | CPPUNIT_ASSERT_EQUAL(vfloatty, codec->encodedToDecoded(vhalfty)); |
| 196 | |||
| 197 | // JIT the codec and test the IR | ||
| 198 | |||
| 199 | const codegen::FunctionGroup* encoder = codec->encoder(); | ||
| 200 | const codegen::FunctionGroup* decoder = codec->decoder(); | ||
| 201 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | CPPUNIT_ASSERT(encoder); |
| 202 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | CPPUNIT_ASSERT(decoder); |
| 203 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | CPPUNIT_ASSERT(!encoder->list().empty()); |
| 204 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | CPPUNIT_ASSERT(!decoder->list().empty()); |
| 205 | |||
| 206 |
8/14✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 8 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 8 times.
✗ Branch 19 not taken.
|
9 | for (auto& F : encoder->list()) CPPUNIT_ASSERT(F->create(M)); |
| 207 |
8/14✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 8 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 8 times.
✗ Branch 19 not taken.
|
9 | for (auto& F : decoder->list()) CPPUNIT_ASSERT(F->create(M)); |
| 208 | |||
| 209 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | auto EE = state.EE(); |
| 210 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | CPPUNIT_ASSERT(EE); |
| 211 | |||
| 212 | // test truncate encoders | ||
| 213 | |||
| 214 | using FloatToHalf = void(HalfTy*, float*); | ||
| 215 | using VFloatToHalf = void(math::Vec3<HalfTy>*, math::Vec3<float>*); | ||
| 216 | |||
| 217 | const std::vector<float> floatInputs { | ||
| 218 | 1.0f, 0.0f, -1.0f, | ||
| 219 | 0.5f, 0.13454f, -0.98781f, | ||
| 220 | 1.0431e-6f, 1.0431e+6f, std::numeric_limits<float>::max(), | ||
| 221 | 313.33f, std::numeric_limits<float>::min(), std::numeric_limits<float>::lowest() | ||
| 222 |
2/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
1 | }; |
| 223 | |||
| 224 | const std::vector<math::Vec3<float>> vfloatInputs { | ||
| 225 | math::Vec3<float>(floatInputs.data() + 0), | ||
| 226 | math::Vec3<float>(floatInputs.data() + 3), | ||
| 227 | math::Vec3<float>(floatInputs.data() + 6), | ||
| 228 | math::Vec3<float>(floatInputs.data() + 9) | ||
| 229 |
2/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
1 | }; |
| 230 | |||
| 231 | { | ||
| 232 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | const int64_t address = EE->getFunctionAddress(encoder->list()[0]->symbol()); |
| 233 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | CPPUNIT_ASSERT(address); |
| 234 | 1 | const auto truncEncodeFloatToHalf = reinterpret_cast<std::add_pointer<FloatToHalf>::type>(address); | |
| 235 | |||
| 236 | HalfTy result1, result2; | ||
| 237 | |||
| 238 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
|
13 | for (float input : floatInputs) |
| 239 | { | ||
| 240 | 12 | const float tmp = input; | |
| 241 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | truncEncodeFloatToHalf(&result1, &input); |
| 242 |
5/10✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 17 not taken.
|
12 | CPPUNIT_ASSERT_EQUAL(input, tmp); // doesn't change |
| 243 | TruncateCodec::encode<HalfTy, float>(input, result2); | ||
| 244 |
4/8✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
|
12 | CPPUNIT_ASSERT_EQUAL(result2, result1); |
| 245 | } | ||
| 246 | } | ||
| 247 | |||
| 248 | { | ||
| 249 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | const int64_t address = EE->getFunctionAddress(encoder->list()[5]->symbol()); |
| 250 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | CPPUNIT_ASSERT(address); |
| 251 | 1 | const auto truncEncodeVecFloatToHalf = reinterpret_cast<std::add_pointer<VFloatToHalf>::type>(address); | |
| 252 | |||
| 253 | math::Vec3<HalfTy> result1, result2; | ||
| 254 | |||
| 255 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for (math::Vec3<float> input : vfloatInputs) |
| 256 | { | ||
| 257 | 4 | const math::Vec3<float> tmp(input); | |
| 258 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | truncEncodeVecFloatToHalf(&result1, &input); |
| 259 |
5/10✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
4 | CPPUNIT_ASSERT_EQUAL(input, tmp); // doesn't change |
| 260 | TruncateCodec::encode<math::Vec3<HalfTy>, math::Vec3<float>>(input, result2); | ||
| 261 |
4/8✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
|
4 | CPPUNIT_ASSERT_EQUAL(result2, result1); |
| 262 | } | ||
| 263 | } | ||
| 264 | |||
| 265 | // test truncate decoders | ||
| 266 | |||
| 267 | using HalfToFloat = void(float*, HalfTy*); | ||
| 268 | using VHalfToFloat = void(math::Vec3<float>*, math::Vec3<HalfTy>*); | ||
| 269 | |||
| 270 | const std::vector<HalfTy> halfInputs { | ||
| 271 | 1.0f, 0.0f, -1.0f, | ||
| 272 | 0.5f, 0.13454f, -0.98781f, | ||
| 273 | 1.0431e-6f, 1.0431e+6f, std::numeric_limits<HalfTy>::max(), | ||
| 274 | 313.33f, std::numeric_limits<HalfTy>::min(), std::numeric_limits<HalfTy>::lowest() | ||
| 275 |
3/8✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
2 | }; |
| 276 | |||
| 277 | const std::vector<math::Vec3<HalfTy>> vhalfInputs { | ||
| 278 | math::Vec3<HalfTy>(halfInputs.data() + 0), | ||
| 279 | math::Vec3<HalfTy>(halfInputs.data() + 3), | ||
| 280 | math::Vec3<HalfTy>(halfInputs.data() + 6), | ||
| 281 | math::Vec3<HalfTy>(halfInputs.data() + 9) | ||
| 282 |
2/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
1 | }; |
| 283 | |||
| 284 | { | ||
| 285 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | const int64_t address = EE->getFunctionAddress(decoder->list()[0]->symbol()); |
| 286 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | CPPUNIT_ASSERT(address); |
| 287 | 1 | const auto truncDecodeHalfToFloat = reinterpret_cast<std::add_pointer<HalfToFloat>::type>(address); | |
| 288 | |||
| 289 | float result1, result2; | ||
| 290 | |||
| 291 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
|
13 | for (HalfTy input : halfInputs) |
| 292 | { | ||
| 293 | 12 | const HalfTy tmp = input; | |
| 294 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | truncDecodeHalfToFloat(&result1, &input); |
| 295 |
5/10✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 17 not taken.
|
12 | CPPUNIT_ASSERT_EQUAL(input, tmp); // doesn't change |
| 296 | TruncateCodec::encode<float, HalfTy>(input, result2); | ||
| 297 |
4/8✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
|
12 | CPPUNIT_ASSERT_EQUAL(result2, result1); |
| 298 | } | ||
| 299 | } | ||
| 300 | |||
| 301 | { | ||
| 302 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | const int64_t address = EE->getFunctionAddress(decoder->list()[5]->symbol()); |
| 303 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | CPPUNIT_ASSERT(address); |
| 304 | 1 | const auto truncDecodeVecHalfToFloat = reinterpret_cast<std::add_pointer<VHalfToFloat>::type>(address); | |
| 305 | |||
| 306 | math::Vec3<float> result1, result2; | ||
| 307 | |||
| 308 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for (math::Vec3<HalfTy> input : vhalfInputs) |
| 309 | { | ||
| 310 | 4 | const math::Vec3<HalfTy> tmp(input); | |
| 311 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | truncDecodeVecHalfToFloat(&result1, &input); |
| 312 |
4/8✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
|
4 | CPPUNIT_ASSERT_EQUAL(input, tmp); // doesn't change |
| 313 | TruncateCodec::encode<math::Vec3<float>, math::Vec3<HalfTy>>(input, result2); | ||
| 314 |
4/8✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
|
4 | CPPUNIT_ASSERT_EQUAL(result2, result1); |
| 315 | } | ||
| 316 | } | ||
| 317 | 1 | } | |
| 318 | |||
| 319 | template <typename FxptCodecT> | ||
| 320 | 8 | void TestCodecs::testFxptCodec() | |
| 321 | { | ||
| 322 | static const bool OneByte = FxptCodecT::OneByte; | ||
| 323 | using IntT = typename std::conditional<OneByte, uint8_t, uint16_t>::type; | ||
| 324 | using FixedPointCodecType = typename FxptCodecT::type; | ||
| 325 | |||
| 326 |
3/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
|
16 | unittest_util::LLVMState state; |
| 327 | llvm::LLVMContext& C = state.context(); | ||
| 328 | llvm::Module& M = state.module(); | ||
| 329 | |||
| 330 |
3/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
|
8 | const Codec* const codec = getCodecByCodecName(FixedPointCodecType::name()); |
| 331 |
7/14✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
✓ Branch 24 taken 4 times.
✗ Branch 25 not taken.
|
8 | CPPUNIT_ASSERT(codec); |
| 332 | |||
| 333 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
8 | llvm::Type* uintty = OneByte ? codegen::LLVMType<uint8_t>::get(C) : codegen::LLVMType<uint16_t>::get(C); |
| 334 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
8 | llvm::Type* vuintty = OneByte ? codegen::LLVMType<math::Vec3<uint8_t>>::get(C) : codegen::LLVMType<math::Vec3<uint16_t>>::get(C); |
| 335 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
8 | llvm::Type* floatty = codegen::LLVMType<float>::get(C); |
| 336 | 8 | llvm::Type* vfloatty = codegen::LLVMType<math::Vec3<float>>::get(C); | |
| 337 | |||
| 338 |
7/14✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 20 not taken.
|
8 | CPPUNIT_ASSERT(nullptr == codec->decodedToEncoded(ast::tokens::CoreType::INT32, C)); |
| 339 |
7/14✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 20 not taken.
|
8 | CPPUNIT_ASSERT(nullptr == codec->decodedToEncoded(ast::tokens::CoreType::VEC2F, C)); |
| 340 |
7/14✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 20 not taken.
|
8 | CPPUNIT_ASSERT(nullptr == codec->decodedToEncoded(ast::tokens::CoreType::STRING, C)); |
| 341 |
5/10✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
|
8 | CPPUNIT_ASSERT_EQUAL(uintty, codec->decodedToEncoded(ast::tokens::CoreType::FLOAT, C)); |
| 342 |
5/10✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
|
8 | CPPUNIT_ASSERT_EQUAL(vuintty, codec->decodedToEncoded(ast::tokens::CoreType::VEC3F, C)); |
| 343 |
5/10✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
|
8 | CPPUNIT_ASSERT_EQUAL(floatty, codec->encodedToDecoded(uintty)); |
| 344 |
6/12✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 20 not taken.
|
8 | CPPUNIT_ASSERT_EQUAL(vfloatty, codec->encodedToDecoded(vuintty)); |
| 345 | |||
| 346 | // JIT the codec and test the IR | ||
| 347 | |||
| 348 | const codegen::FunctionGroup* encoder = codec->encoder(); | ||
| 349 | const codegen::FunctionGroup* decoder = codec->decoder(); | ||
| 350 |
6/12✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
8 | CPPUNIT_ASSERT(encoder); |
| 351 |
6/12✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
8 | CPPUNIT_ASSERT(decoder); |
| 352 |
6/12✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
8 | CPPUNIT_ASSERT(!encoder->list().empty()); |
| 353 |
6/12✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
8 | CPPUNIT_ASSERT(!decoder->list().empty()); |
| 354 |
4/8✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
|
8 | CPPUNIT_ASSERT_EQUAL(encoder->list().size(), size_t(2)); |
| 355 |
4/8✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
|
8 | CPPUNIT_ASSERT_EQUAL(decoder->list().size(), size_t(2)); |
| 356 | |||
| 357 |
8/14✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 8 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 8 times.
✗ Branch 19 not taken.
|
24 | for (auto& F : encoder->list()) CPPUNIT_ASSERT(F->create(M)); |
| 358 |
8/14✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 8 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 8 times.
✗ Branch 19 not taken.
|
24 | for (auto& F : decoder->list()) CPPUNIT_ASSERT(F->create(M)); |
| 359 | |||
| 360 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
8 | auto EE = state.EE(); |
| 361 |
6/12✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
8 | CPPUNIT_ASSERT(EE); |
| 362 | |||
| 363 | // test truncate encoders | ||
| 364 | |||
| 365 | using FloatToFxpt = void(IntT*, float*); | ||
| 366 | using VFloatToFxpt = void(math::Vec3<IntT>*, math::Vec3<float>*); | ||
| 367 | |||
| 368 |
2/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
8 | const std::vector<float> floatInputs { |
| 369 | 1.0f, 0.0f, -1.0f, | ||
| 370 | 0.5f, 0.20024414435034715f, -0.98781f, | ||
| 371 | 1e-3f, 0.2f, 0.6f, | ||
| 372 | 0.8f, 1.5f, -1.5f, | ||
| 373 | 100.0f, std::numeric_limits<float>::lowest(), -100.0f | ||
| 374 | }; | ||
| 375 | |||
| 376 |
2/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
8 | const std::vector<math::Vec3<float>> vfloatInputs { |
| 377 | math::Vec3<float>(floatInputs.data() + 0), | ||
| 378 | math::Vec3<float>(floatInputs.data() + 3), | ||
| 379 | math::Vec3<float>(floatInputs.data() + 6), | ||
| 380 | math::Vec3<float>(floatInputs.data() + 9), | ||
| 381 | math::Vec3<float>(floatInputs.data() + 12) | ||
| 382 | }; | ||
| 383 | |||
| 384 | { | ||
| 385 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
8 | const int64_t address = EE->getFunctionAddress(encoder->list()[0]->symbol()); |
| 386 |
6/12✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
8 | CPPUNIT_ASSERT(address); |
| 387 | 8 | const auto fxptEncodeFloat = reinterpret_cast<typename std::add_pointer<FloatToFxpt>::type>(address); | |
| 388 | |||
| 389 | IntT result1, result2; | ||
| 390 | |||
| 391 |
2/2✓ Branch 0 taken 60 times.
✓ Branch 1 taken 4 times.
|
128 | for (float input : floatInputs) |
| 392 | { | ||
| 393 | 120 | const float tmp = input; | |
| 394 |
1/2✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
|
120 | fxptEncodeFloat(&result1, &input); |
| 395 |
6/10✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 60 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 60 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 60 times.
✗ Branch 11 not taken.
✓ Branch 15 taken 40 times.
✓ Branch 16 taken 20 times.
|
120 | CPPUNIT_ASSERT_EQUAL(input, tmp); // doesn't change |
| 396 | FixedPointCodecType::template encode<IntT, float>(input, result2); | ||
| 397 |
4/8✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 60 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 60 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 60 times.
✗ Branch 11 not taken.
|
120 | CPPUNIT_ASSERT_EQUAL(result2, result1); |
| 398 | } | ||
| 399 | } | ||
| 400 | |||
| 401 | { | ||
| 402 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
8 | const int64_t address = EE->getFunctionAddress(encoder->list()[1]->symbol()); |
| 403 |
6/12✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
8 | CPPUNIT_ASSERT(address); |
| 404 | 8 | const auto fxptEncodeVFloat = reinterpret_cast<typename std::add_pointer<VFloatToFxpt>::type>(address); | |
| 405 | |||
| 406 | math::Vec3<IntT> result1, result2; | ||
| 407 | |||
| 408 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 4 times.
|
48 | for (math::Vec3<float> input : vfloatInputs) |
| 409 | { | ||
| 410 | 40 | const math::Vec3<float> tmp(input); | |
| 411 |
1/2✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
|
40 | fxptEncodeVFloat(&result1, &input); |
| 412 |
4/8✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
|
40 | CPPUNIT_ASSERT_EQUAL(input, tmp); // doesn't change |
| 413 | 20 | FixedPointCodecType::template encode<math::Vec3<IntT>, math::Vec3<float>>(input, result2); | |
| 414 |
4/8✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
|
40 | CPPUNIT_ASSERT_EQUAL(result2, result1); |
| 415 | } | ||
| 416 | } | ||
| 417 | |||
| 418 | // test truncate decoders | ||
| 419 | |||
| 420 | using FxptToFloat = void(float*, IntT*); | ||
| 421 | using VFxptToFloat = void(math::Vec3<float>*, math::Vec3<IntT>*); | ||
| 422 | |||
| 423 |
1/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
8 | std::vector<IntT> uintInputs = { |
| 424 | 0, 1, 2, | ||
| 425 | 100, 200, 212, | ||
| 426 | 10, 215, 94, | ||
| 427 | 54, std::numeric_limits<IntT>::max(), 199 | ||
| 428 | }; | ||
| 429 | |||
| 430 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | if (OneByte) uintInputs.insert(uintInputs.end(), { IntT(13132), IntT(31334), IntT(60000) }); |
| 431 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | else uintInputs.insert(uintInputs.end(), { 111, 222, 18 }); |
| 432 | |||
| 433 |
2/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
8 | const std::vector<math::Vec3<IntT>> vuintInputs { |
| 434 | math::Vec3<IntT>(uintInputs.data() + 0), | ||
| 435 | math::Vec3<IntT>(uintInputs.data() + 3), | ||
| 436 | math::Vec3<IntT>(uintInputs.data() + 6), | ||
| 437 | math::Vec3<IntT>(uintInputs.data() + 9), | ||
| 438 | math::Vec3<IntT>(uintInputs.data() + 12) | ||
| 439 | }; | ||
| 440 | |||
| 441 | { | ||
| 442 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
8 | const int64_t address = EE->getFunctionAddress(decoder->list()[0]->symbol()); |
| 443 |
6/12✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
8 | CPPUNIT_ASSERT(address); |
| 444 | 8 | const auto fxptDecodeUint8 = reinterpret_cast<typename std::add_pointer<FxptToFloat>::type>(address); | |
| 445 | |||
| 446 | float result1, result2; | ||
| 447 | |||
| 448 |
2/2✓ Branch 0 taken 60 times.
✓ Branch 1 taken 4 times.
|
128 | for (IntT input : uintInputs) |
| 449 | { | ||
| 450 | 120 | const IntT tmp = input; | |
| 451 |
1/2✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
|
120 | fxptDecodeUint8(&result1, &input); |
| 452 |
5/10✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 60 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 60 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 60 times.
✗ Branch 11 not taken.
✓ Branch 16 taken 60 times.
✗ Branch 17 not taken.
|
120 | CPPUNIT_ASSERT_EQUAL(input, tmp); // doesn't change |
| 453 | FixedPointCodecType::template decode<IntT, float>(input, result2); | ||
| 454 |
4/8✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 60 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 60 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 60 times.
✗ Branch 11 not taken.
|
120 | CPPUNIT_ASSERT_EQUAL(result2, result1); |
| 455 | } | ||
| 456 | } | ||
| 457 | |||
| 458 | { | ||
| 459 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
8 | const int64_t address = EE->getFunctionAddress(decoder->list()[1]->symbol()); |
| 460 |
6/12✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
8 | CPPUNIT_ASSERT(address); |
| 461 | 8 | const auto fxptDecodeVuint8 = reinterpret_cast<typename std::add_pointer<VFxptToFloat>::type>(address); | |
| 462 | |||
| 463 | math::Vec3<float> result1, result2; | ||
| 464 | |||
| 465 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 4 times.
|
48 | for (math::Vec3<IntT> input : vuintInputs) |
| 466 | { | ||
| 467 | 40 | const math::Vec3<IntT> tmp(input); | |
| 468 |
1/2✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
|
40 | fxptDecodeVuint8(&result1, &input); |
| 469 |
4/8✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
|
40 | CPPUNIT_ASSERT_EQUAL(input, tmp); // doesn't change |
| 470 | 40 | FixedPointCodecType::template decode<math::Vec3<IntT>, math::Vec3<float>>(input, result2); | |
| 471 |
4/8✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
|
40 | CPPUNIT_ASSERT_EQUAL(result2, result1); |
| 472 | } | ||
| 473 | } | ||
| 474 | 8 | } | |
| 475 |