diff --git a/include/hip/amd_detail/amd_hip_vector_types.h b/include/hip/amd_detail/amd_hip_vector_types.h index c183a734..5c7d4e4c 100644 --- a/include/hip/amd_detail/amd_hip_vector_types.h +++ b/include/hip/amd_detail/amd_hip_vector_types.h @@ -209,9 +209,15 @@ template struct is_scalar : public integral_constant(data)[idx]; + } __HOST_DEVICE__ - operator T() const volatile noexcept { return data[idx]; } + constexpr operator const volatile T&() const volatile noexcept { + return reinterpret_cast< + const volatile T (&)[sizeof(Vector) / sizeof(T)]>(data)[idx]; + } #ifdef __HIP_ENABLE_VECTOR_SCALAR_ACCESSORY_ENUM_CONVERSION__ // The conversions to enum are fairly ghastly, but unfortunately used in @@ -805,7 +811,12 @@ template struct is_scalar : public integral_constant struct is_scalar : public integral_constant struct is_scalar : public integral_constant struct is_scalar : public integral_constant struct is_scalar : public integral_constant struct is_scalar : public integral_constant struct is_scalar : public integral_constant struct is_scalar : public integral_constant struct is_scalar : public integral_constant struct is_scalar : public integral_constant struct is_scalar : public integral_constant>=(const HIP_vector_type& x) noexcept { - data >>= x.data; + #if __has_attribute(ext_vector_type) + data >>= x.data; + #else + for (auto i = 0u; i < rank; ++i) + data[i] >>= x.data[i]; + #endif return *this; } @@ -944,11 +1005,23 @@ template struct is_scalar : public integral_constant + template /* operator return value */> + using enable_if_convertible = typename + std::enable_if>::value, R>::type; + template __HOST_DEVICE__ inline @@ -962,7 +1035,7 @@ template struct is_scalar : public integral_constant operator+( + enable_if_convertible operator+( const HIP_vector_type& x, U y) noexcept { return HIP_vector_type{x} += HIP_vector_type{y}; @@ -971,7 +1044,7 @@ template struct is_scalar : public integral_constant operator+( + enable_if_convertible operator+( U x, const HIP_vector_type& y) noexcept { return HIP_vector_type{x} += y; @@ -990,7 +1063,7 @@ template struct is_scalar : public integral_constant operator-( + enable_if_convertible operator-( const HIP_vector_type& x, U y) noexcept { return HIP_vector_type{x} -= HIP_vector_type{y}; @@ -999,7 +1072,7 @@ template struct is_scalar : public integral_constant operator-( + enable_if_convertible operator-( U x, const HIP_vector_type& y) noexcept { return HIP_vector_type{x} -= y; @@ -1018,7 +1091,7 @@ template struct is_scalar : public integral_constant operator*( + enable_if_convertible operator*( const HIP_vector_type& x, U y) noexcept { return HIP_vector_type{x} *= HIP_vector_type{y}; @@ -1027,7 +1100,7 @@ template struct is_scalar : public integral_constant operator*( + enable_if_convertible operator*( U x, const HIP_vector_type& y) noexcept { return HIP_vector_type{x} *= y; @@ -1046,7 +1119,7 @@ template struct is_scalar : public integral_constant operator/( + enable_if_convertible operator/( const HIP_vector_type& x, U y) noexcept { return HIP_vector_type{x} /= HIP_vector_type{y}; @@ -1055,7 +1128,7 @@ template struct is_scalar : public integral_constant operator/( + enable_if_convertible operator/( U x, const HIP_vector_type& y) noexcept { return HIP_vector_type{x} /= y; @@ -1084,7 +1157,7 @@ template struct is_scalar : public integral_constant& x, U y) noexcept + enable_if_convertible operator==(const HIP_vector_type& x, U y) noexcept { return x == HIP_vector_type{y}; } @@ -1092,7 +1165,7 @@ template struct is_scalar : public integral_constant& y) noexcept + enable_if_convertible operator==(U x, const HIP_vector_type& y) noexcept { return HIP_vector_type{x} == y; } @@ -1110,7 +1183,7 @@ template struct is_scalar : public integral_constant& x, U y) noexcept + enable_if_convertible operator!=(const HIP_vector_type& x, U y) noexcept { return !(x == y); } @@ -1118,7 +1191,7 @@ template struct is_scalar : public integral_constant& y) noexcept + enable_if_convertible operator!=(U x, const HIP_vector_type& y) noexcept { return !(x == y); }