|  | // Copyright 2022 Google LLC | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | // Print() function | 
|  |  | 
|  | #include "third_party/highway/hwy/highway.h" | 
|  | #include "third_party/highway/hwy/print.h" | 
|  |  | 
|  | // Per-target include guard | 
|  | #if defined(HIGHWAY_HWY_PRINT_INL_H_) == defined(HWY_TARGET_TOGGLE) | 
|  | #ifdef HIGHWAY_HWY_PRINT_INL_H_ | 
|  | #undef HIGHWAY_HWY_PRINT_INL_H_ | 
|  | #else | 
|  | #define HIGHWAY_HWY_PRINT_INL_H_ | 
|  | #endif | 
|  |  | 
|  | #if HWY_TARGET == HWY_RVV | 
|  | #include "third_party/highway/hwy/aligned_allocator.h" | 
|  | #endif | 
|  |  | 
|  | HWY_BEFORE_NAMESPACE(); | 
|  | namespace hwy { | 
|  | namespace HWY_NAMESPACE { | 
|  |  | 
|  | // Prints lanes around `lane`, in memory order. | 
|  | template <class D, class V = VFromD<D>> | 
|  | HWY_API void Print(const D d, const char* caption, V v, size_t lane_u = 0, | 
|  | size_t max_lanes = 7) { | 
|  | const size_t N = Lanes(d); | 
|  | using T = TFromD<D>; | 
|  | #if HWY_TARGET == HWY_RVV | 
|  | auto storage = AllocateAligned<T>(N); | 
|  | T* HWY_RESTRICT lanes = storage.get(); | 
|  | #else | 
|  | // This works around an SVE compile error on GCC 11 and 12. Calling | 
|  | // AllocateAligned here would seem to require it be marked with HWY_ATTR. | 
|  | HWY_ALIGN T lanes[MaxLanes(d)]; | 
|  | #endif | 
|  | Store(v, d, lanes); | 
|  |  | 
|  | const auto info = hwy::detail::MakeTypeInfo<T>(); | 
|  | hwy::detail::PrintArray(info, caption, lanes, N, lane_u, max_lanes); | 
|  | } | 
|  |  | 
|  | // NOLINTNEXTLINE(google-readability-namespace-comments) | 
|  | }  // namespace HWY_NAMESPACE | 
|  | }  // namespace hwy | 
|  | HWY_AFTER_NAMESPACE(); | 
|  |  | 
|  | #endif  // per-target include guard |