================ @@ -0,0 +1,88 @@ +//===-------------------- Bitcastbuffer.cpp ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#include "BitcastBuffer.h" + +using namespace clang; +using namespace clang::interp; + +void BitcastBuffer::pushData(const std::byte *In, size_t BitOffset, + size_t BitWidth, Endian TargetEndianness) { + for (unsigned It = 0; It != BitWidth; ++It) { + bool BitValue = bitof(In, It); + if (!BitValue) + continue; + + unsigned DstBit; + if (TargetEndianness == Endian::Little) + DstBit = BitOffset + It; + else + DstBit = size() - BitOffset - BitWidth + It; + + unsigned DstByte = (DstBit / 8); + Data[DstByte] |= std::byte{1} << (DstBit % 8); + } +} + +std::unique_ptr<std::byte[]> +BitcastBuffer::copyBits(unsigned BitOffset, unsigned BitWidth, + unsigned FullBitWidth, Endian TargetEndianness) const { + assert(BitWidth <= FullBitWidth); + assert(fullByte(FullBitWidth)); + auto Out = std::make_unique<std::byte[]>(FullBitWidth / 8); + + for (unsigned It = 0; It != BitWidth; ++It) { + unsigned BitIndex; + if (TargetEndianness == Endian::Little) + BitIndex = BitOffset + It; + else + BitIndex = size() - BitWidth - BitOffset + It; + + bool BitValue = bitof(Data.get(), BitIndex); + if (!BitValue) + continue; + unsigned DstBit = It; + unsigned DstByte = (DstBit / 8); + Out[DstByte] |= std::byte{1} << (DstBit % 8); + } + + return Out; +} + +#if 0 ---------------- AaronBallman wrote:
Remove dead code? https://github.com/llvm/llvm-project/pull/116843 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits