diff --git a/projects/clr/hipamd/include/hip/amd_detail/amd_hip_vector_types.h b/projects/clr/hipamd/include/hip/amd_detail/amd_hip_vector_types.h index 27d33561b9..38d4e92db2 100644 --- a/projects/clr/hipamd/include/hip/amd_detail/amd_hip_vector_types.h +++ b/projects/clr/hipamd/include/hip/amd_detail/amd_hip_vector_types.h @@ -51,31 +51,45 @@ THE SOFTWARE. #include #endif // defined(__HIPCC_RTC__) - namespace hip_impl { - inline - constexpr - unsigned int next_pot(unsigned int x) { - // Precondition: x > 1. - return 1u << (32u - __builtin_clz(x - 1u)); - } - } // Namespace hip_impl. +template struct HIP_vector_base; +template struct HIP_vector_type; - template struct HIP_vector_base; - template struct HIP_vector_type; +namespace hip_impl { +inline constexpr unsigned int next_pot(unsigned int x) { + // Precondition: x > 1. + return 1u << (32u - __builtin_clz(x - 1u)); +} + +template +__attribute__((always_inline)) __HOST_DEVICE__ typename HIP_vector_base::Native_vec_* +get_native_pointer(HIP_vector_base& base_vec) { + static_assert(sizeof(base_vec) == sizeof(typename HIP_vector_base::Native_vec_)); + static_assert(std::alignment_of>::value == + std::alignment_of::Native_vec_>::value); + return reinterpret_cast::Native_vec_*>(&base_vec.x); +}; + +template +__attribute__((always_inline)) __HOST_DEVICE__ const typename HIP_vector_base::Native_vec_* +get_native_pointer(const HIP_vector_base& base_vec) { + static_assert(sizeof(base_vec) == sizeof(typename HIP_vector_base::Native_vec_)); + static_assert(std::alignment_of>::value == + std::alignment_of::Native_vec_>::value); + return reinterpret_cast::Native_vec_*>(&base_vec.x); +}; +} // Namespace hip_impl. template __attribute__((always_inline)) __HOST_DEVICE__ typename HIP_vector_base::Native_vec_& get_native_vector(HIP_vector_base& base_vec) { - static_assert(sizeof(base_vec) == sizeof(typename HIP_vector_base::Native_vec_)); - return *reinterpret_cast::Native_vec_*>(&base_vec.x); + return *hip_impl::get_native_pointer(base_vec); }; template __attribute__(( always_inline)) __HOST_DEVICE__ const typename HIP_vector_base::Native_vec_& get_native_vector(const HIP_vector_base& base_vec) { - static_assert(sizeof(base_vec) == sizeof(typename HIP_vector_base::Native_vec_)); - return *reinterpret_cast::Native_vec_*>(&base_vec.x); + return *hip_impl::get_native_pointer(base_vec); }; template @@ -349,6 +363,13 @@ THE SOFTWARE. HIP_vector_type& operator=(HIP_vector_type&&) = default; // Operators + __HOST_DEVICE__ + T& operator[](size_t idx) noexcept { return (*hip_impl::get_native_pointer(*this))[idx]; } + __HOST_DEVICE__ + const T& operator[](size_t idx) const noexcept { + return (*hip_impl::get_native_pointer(*this))[idx]; + } + __HOST_DEVICE__ HIP_vector_type& operator++() noexcept { HIP_vector_type unity = make_vector_type(1);