@@ -16,49 +16,74 @@ inline namespace _V1 {
1616namespace ext {
1717namespace oneapi {
1818namespace experimental {
19+ // Shorthands for address space names
20+ constexpr inline access::address_space global_space = access::address_space::global_space;
21+ constexpr inline access::address_space local_space = access::address_space::local_space;
22+ constexpr inline access::address_space private_space = access::address_space::private_space;
23+ constexpr inline access::address_space generic_space = access::address_space::generic_space;
1924
20- template <access::address_space Space, access::decorated DecorateAddress,
21- typename ElementType>
22- multi_ptr<ElementType, Space, DecorateAddress>
25+ template <access::address_space Space, typename ElementType>
26+ multi_ptr<ElementType, Space, access::decorated::no>
2327static_address_cast (ElementType *Ptr) {
28+ using ret_ty = multi_ptr<ElementType, Space, access::decorated::no>;
2429#ifdef __SYCL_DEVICE_ONLY__
2530 // TODO: Remove this restriction.
2631 static_assert (std::is_same_v<ElementType, remove_decoration_t <ElementType>>,
2732 " The extension expect undecorated raw pointers only!" );
28- if constexpr (Space == access::address_space:: generic_space) {
33+ if constexpr (Space == generic_space) {
2934 // Undecorated raw pointer is in generic AS already, no extra casts needed.
3035 // Note for future, for `OpPtrCastToGeneric`, `Pointer` must point to one of
3136 // `Storage Classes` that doesn't include `Generic`, so this will have to
3237 // remain a special case even if the restriction above is lifted.
33- return multi_ptr<ElementType, Space, DecorateAddress> (Ptr);
38+ return ret_ty (Ptr);
3439 } else {
3540 auto CastPtr = sycl::detail::spirv::GenericCastToPtr<Space>(Ptr);
36- return multi_ptr<ElementType, Space, DecorateAddress> (CastPtr);
41+ return ret_ty (CastPtr);
3742 }
3843#else
39- return multi_ptr<ElementType, Space, DecorateAddress> (Ptr);
44+ return ret_ty (Ptr);
4045#endif
4146}
4247
4348template <access::address_space Space, access::decorated DecorateAddress,
4449 typename ElementType>
45- multi_ptr<ElementType, Space, DecorateAddress>
50+ multi_ptr<ElementType, Space, DecorateAddress> static_address_cast (
51+ multi_ptr<ElementType, generic_space, DecorateAddress> Ptr) {
52+ if constexpr (Space == generic_space)
53+ return Ptr;
54+ else
55+ return {static_address_cast<Space>(Ptr.get_raw ())};
56+ }
57+
58+ template <access::address_space Space, typename ElementType>
59+ multi_ptr<ElementType, Space, access::decorated::no>
4660dynamic_address_cast (ElementType *Ptr) {
61+ using ret_ty = multi_ptr<ElementType, Space, access::decorated::no>;
4762#ifdef __SYCL_DEVICE_ONLY__
4863 // TODO: Remove this restriction.
4964 static_assert (std::is_same_v<ElementType, remove_decoration_t <ElementType>>,
5065 " The extension expect undecorated raw pointers only!" );
51- if constexpr (Space == access::address_space:: generic_space) {
52- return multi_ptr<ElementType, Space, DecorateAddress> (Ptr);
66+ if constexpr (Space == generic_space) {
67+ return ret_ty (Ptr);
5368 } else {
5469 auto CastPtr = sycl::detail::spirv::GenericCastToPtrExplicit<Space>(Ptr);
55- return multi_ptr<ElementType, Space, DecorateAddress> (CastPtr);
70+ return ret_ty (CastPtr);
5671 }
5772#else
58- return multi_ptr<ElementType, Space, DecorateAddress> (Ptr);
73+ return ret_ty (Ptr);
5974#endif
6075}
6176
77+ template <access::address_space Space, access::decorated DecorateAddress,
78+ typename ElementType>
79+ multi_ptr<ElementType, Space, DecorateAddress> dynamic_address_cast (
80+ multi_ptr<ElementType, generic_space, DecorateAddress> Ptr) {
81+ if constexpr (Space == generic_space)
82+ return Ptr;
83+ else
84+ return {dynamic_address_cast<Space>(Ptr.get_raw ())};
85+ }
86+
6287} // namespace experimental
6388} // namespace oneapi
6489} // namespace ext
0 commit comments