diff --git a/common/helpers/bit_helpers.h b/common/helpers/bit_helpers.h new file mode 100644 index 0000000000..c8a9560d14 --- /dev/null +++ b/common/helpers/bit_helpers.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2019 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#pragma once +#include +#include +#include + +namespace OCLRT { + +constexpr bool isBitSet(uint64_t field, uint64_t bitPosition) { + assert(bitPosition < std::numeric_limits::digits); // undefined behavior + return (field & (1ull << bitPosition)); +} + +constexpr bool isValSet(uint64_t field, uint64_t value) { + assert(value != 0); + return ((field & value) == value); +} + +} // namespace OCLRT diff --git a/runtime/mem_obj/mem_obj_helper.cpp b/runtime/mem_obj/mem_obj_helper.cpp index 986389abe8..e1eb993555 100644 --- a/runtime/mem_obj/mem_obj_helper.cpp +++ b/runtime/mem_obj/mem_obj_helper.cpp @@ -5,6 +5,7 @@ * */ +#include "common/helpers/bit_helpers.h" #include "runtime/mem_obj/mem_obj_helper.h" namespace OCLRT { @@ -31,7 +32,7 @@ bool MemObjHelper::parseMemoryProperties(const cl_mem_properties_intel *properti AllocationProperties MemObjHelper::getAllocationProperties(cl_mem_flags_intel flags, bool allocateMemory, size_t size, GraphicsAllocation::AllocationType type) { AllocationProperties allocationProperties(allocateMemory, size, type); - allocationProperties.flags.uncacheable = !!(flags & CL_MEM_LOCALLY_UNCACHED_RESOURCE); + allocationProperties.flags.uncacheable = isValSet(flags, CL_MEM_LOCALLY_UNCACHED_RESOURCE); return allocationProperties; } diff --git a/unit_tests/helpers/CMakeLists.txt b/unit_tests/helpers/CMakeLists.txt index 86c32d8519..dbf5a9aef7 100644 --- a/unit_tests/helpers/CMakeLists.txt +++ b/unit_tests/helpers/CMakeLists.txt @@ -11,6 +11,7 @@ set(IGDRCL_SRCS_tests_helpers ${CMAKE_CURRENT_SOURCE_DIR}/base_object_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/base_object_tests_mt.cpp ${CMAKE_CURRENT_SOURCE_DIR}/basic_math_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/bit_helpers_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/cl_helper_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/debug_helpers_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/debug_manager_state_restore.h diff --git a/unit_tests/helpers/bit_helpers_tests.cpp b/unit_tests/helpers/bit_helpers_tests.cpp new file mode 100644 index 0000000000..210811bf1e --- /dev/null +++ b/unit_tests/helpers/bit_helpers_tests.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2019 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "common/helpers/bit_helpers.h" +#include "gtest/gtest.h" + +using namespace OCLRT; + +TEST(IsBitSetTests, givenDifferentValuesWhenTestingIsBitSetThenCorrectValueIsReturned) { + size_t field1 = 0; + size_t field2 = 0b1; + size_t field3 = 0b1000; + size_t field4 = 0b1010; + + EXPECT_FALSE(isBitSet(field1, 0)); + EXPECT_FALSE(isBitSet(field1, 1)); + EXPECT_FALSE(isBitSet(field1, 2)); + EXPECT_FALSE(isBitSet(field1, 3)); + + EXPECT_TRUE(isBitSet(field2, 0)); + EXPECT_FALSE(isBitSet(field2, 1)); + EXPECT_FALSE(isBitSet(field2, 2)); + EXPECT_FALSE(isBitSet(field2, 3)); + + EXPECT_FALSE(isBitSet(field3, 0)); + EXPECT_FALSE(isBitSet(field3, 1)); + EXPECT_FALSE(isBitSet(field3, 2)); + EXPECT_TRUE(isBitSet(field3, 3)); + + EXPECT_FALSE(isBitSet(field4, 0)); + EXPECT_TRUE(isBitSet(field4, 1)); + EXPECT_FALSE(isBitSet(field4, 2)); + EXPECT_TRUE(isBitSet(field4, 3)); +} + +TEST(IsValSetTests, givenDifferentValuesWhenTestingIsValSetThenCorrectValueIsReturned) { + size_t field1 = 0; + size_t field2 = 0b1; + size_t field3 = 0b10; + size_t field4 = 0b1000; + size_t field5 = 0b1010; + size_t field6 = 0b1111; + + EXPECT_FALSE(isValSet(field1, field2)); + EXPECT_FALSE(isValSet(field1, field3)); + EXPECT_FALSE(isValSet(field1, field4)); + EXPECT_FALSE(isValSet(field1, field5)); + EXPECT_FALSE(isValSet(field1, field6)); + + EXPECT_TRUE(isValSet(field2, field2)); + EXPECT_FALSE(isValSet(field2, field3)); + EXPECT_FALSE(isValSet(field2, field4)); + EXPECT_FALSE(isValSet(field2, field5)); + EXPECT_FALSE(isValSet(field2, field6)); + + EXPECT_FALSE(isValSet(field3, field2)); + EXPECT_TRUE(isValSet(field3, field3)); + EXPECT_FALSE(isValSet(field3, field4)); + EXPECT_FALSE(isValSet(field3, field5)); + EXPECT_FALSE(isValSet(field3, field6)); + + EXPECT_FALSE(isValSet(field4, field2)); + EXPECT_FALSE(isValSet(field4, field3)); + EXPECT_TRUE(isValSet(field4, field4)); + EXPECT_FALSE(isValSet(field4, field5)); + EXPECT_FALSE(isValSet(field4, field6)); + + EXPECT_FALSE(isValSet(field5, field2)); + EXPECT_TRUE(isValSet(field5, field3)); + EXPECT_TRUE(isValSet(field5, field4)); + EXPECT_TRUE(isValSet(field5, field5)); + EXPECT_FALSE(isValSet(field5, field6)); + + EXPECT_TRUE(isValSet(field6, field2)); + EXPECT_TRUE(isValSet(field6, field3)); + EXPECT_TRUE(isValSet(field6, field4)); + EXPECT_TRUE(isValSet(field6, field5)); + EXPECT_TRUE(isValSet(field6, field6)); +}