From: Andrew Woloszyn Date: Fri, 23 Oct 2015 13:53:58 +0000 (-0400) Subject: Added set_bits<> to bitutils. X-Git-Tag: upstream/2018.6~1508 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f731cbf6c4112a9f5a4328e8469ff3a0867ce56b;p=platform%2Fupstream%2FSPIRV-Tools.git Added set_bits<> to bitutils. This allows us to get a constant with the given bits set at compile-time. This is needed for a future patch for HexFloat. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index afab15d..83bd8d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,7 +102,7 @@ include_directories( set(SPIRV_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/include/libspirv/libspirv.h - ${CMAKE_CURRENT_SOURCE_DIR}/include/util/bitwisecast.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/util/bitutils.h ${CMAKE_CURRENT_SOURCE_DIR}/source/binary.h ${CMAKE_CURRENT_SOURCE_DIR}/source/diagnostic.h ${CMAKE_CURRENT_SOURCE_DIR}/source/ext_inst.h diff --git a/include/util/bitutils.h b/include/util/bitutils.h new file mode 100644 index 0000000..177467b --- /dev/null +++ b/include/util/bitutils.h @@ -0,0 +1,89 @@ +// Copyright (c) 2015 The Khronos Group Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and/or associated documentation files (the +// "Materials"), to deal in the Materials without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Materials, and to +// permit persons to whom the Materials are furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Materials. +// +// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS +// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS +// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT +// https://www.khronos.org/registry/ +// +// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + +#ifndef _LIBSPIRV_UTIL_BITUTILS_H_ +#define _LIBSPIRV_UTIL_BITUTILS_H_ + +#include + +namespace spvutils { + +// Performs a bitwise copy of source to the destination type Dest. +template +Dest BitwiseCast(Src source) { + Dest dest; + static_assert(sizeof(source) == sizeof(dest), + "BitwiseCast: Source and destination must have the same size"); + std::memcpy(&dest, &source, sizeof(dest)); + return dest; +} + +// SetBits returns an integer of type with the bits +// between First and Last inclusive set and all other bits 0. This is indexed +// from left to right So SetBits would have the leftmost +// two bits set. +template +struct SetBits { + static_assert(First < Last, "The first bit must be before the last bit"); + const static T get = (T(1) << ((sizeof(T) * 8) - First - 1)) | + SetBits::get; +}; + +template +struct SetBits { + const static T get = T(1) << ((sizeof(T) * 8) - Last - 1); +}; + +// This is all compile-time so we can put our tests right here. +static_assert(SetBits::get == uint32_t(0x80000000), + "SetBits failed"); +static_assert(SetBits::get == uint32_t(0xc0000000), + "SetBits failed"); +static_assert(SetBits::get == uint32_t(0x60000000), + "SetBits failed"); +static_assert(SetBits::get == uint32_t(0x00000001), + "SetBits failed"); +static_assert(SetBits::get == uint32_t(0x00000001), + "SetBits failed"); +static_assert(SetBits::get == uint32_t(0x00000003), + "SetBits failed"); +static_assert(SetBits::get == uint32_t(0xFFFFFFFF), + "SetBits failed"); +static_assert(SetBits::get == uint32_t(0x0000FFFF), + "SetBits failed"); + +static_assert(SetBits::get == uint64_t(0x8000000000000000LL), + "SetBits failed"); +static_assert(SetBits::get == uint64_t(0xc000000000000000LL), + "SetBits failed"); +static_assert(SetBits::get == uint64_t(0x0000000080000000LL), + "SetBits failed"); +static_assert(SetBits::get == uint64_t(0x0000FFFF00000000LL), + "SetBits failed"); + +} // namespace spvutils + +#endif diff --git a/include/util/bitwisecast.h b/include/util/bitwisecast.h deleted file mode 100644 index 8ab0249..0000000 --- a/include/util/bitwisecast.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2015 The Khronos Group Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and/or associated documentation files (the -// "Materials"), to deal in the Materials without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Materials, and to -// permit persons to whom the Materials are furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Materials. -// -// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS -// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS -// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT -// https://www.khronos.org/registry/ -// -// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. - -#ifndef _LIBSPIRV_UTIL_BITWISECAST_H_ -#define _LIBSPIRV_UTIL_BITWISECAST_H_ - -#include - -namespace spvutils { - -// Performs a bitwise copy of source to the destination type Dest. -template -Dest BitwiseCast(Src source) { - Dest dest; - static_assert(sizeof(source) == sizeof(dest), - "BitwiseCast: Source and destination must have the same size"); - std::memcpy(&dest, &source, sizeof(dest)); - return dest; -} - -} // namespace spvutils - -#endif diff --git a/source/text.cpp b/source/text.cpp index 3e09200..388ebdb 100644 --- a/source/text.cpp +++ b/source/text.cpp @@ -46,7 +46,7 @@ #include "opcode.h" #include "operand.h" #include "text_handler.h" -#include "util/bitwisecast.h" +#include "util/bitutils.h" bool spvIsValidIDCharacter(const char value) { return value == '_' || 0 != ::isalnum(value); diff --git a/source/text_handler.cpp b/source/text_handler.cpp index c5ce633..88f7827 100644 --- a/source/text_handler.cpp +++ b/source/text_handler.cpp @@ -37,7 +37,7 @@ #include "instruction.h" #include "opcode.h" #include "text.h" -#include "util/bitwisecast.h" +#include "util/bitutils.h" namespace { diff --git a/test/ImmediateInt.cpp b/test/ImmediateInt.cpp index 71840f3..670c4b2 100644 --- a/test/ImmediateInt.cpp +++ b/test/ImmediateInt.cpp @@ -31,7 +31,7 @@ #include #include "TestFixture.h" -#include "util/bitwisecast.h" +#include "util/bitutils.h" namespace { diff --git a/test/TextToBinary.cpp b/test/TextToBinary.cpp index c8827aa..a5702bc 100644 --- a/test/TextToBinary.cpp +++ b/test/TextToBinary.cpp @@ -26,6 +26,8 @@ #include "TestFixture.h" #include "UnitSPIRV.h" +#include "util/bitutils.h" + #include #include #include diff --git a/test/UnitSPIRV.h b/test/UnitSPIRV.h index 59f40cf..d0c6757 100644 --- a/test/UnitSPIRV.h +++ b/test/UnitSPIRV.h @@ -60,7 +60,7 @@ enum { }; // TODO(dneto): Using a union this way relies on undefined behaviour. -// Replace this with uses of BitwiseCast from source/bitwisecast.h +// Replace this with uses of BitwiseCast from util/bitutils.h static const union { unsigned char bytes[4]; uint32_t value;