@@ -16,49 +16,74 @@ inline namespace _V1 {
16
16
namespace ext {
17
17
namespace oneapi {
18
18
namespace 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;
19
24
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>
23
27
static_address_cast (ElementType *Ptr) {
28
+ using ret_ty = multi_ptr<ElementType, Space, access::decorated::no>;
24
29
#ifdef __SYCL_DEVICE_ONLY__
25
30
// TODO: Remove this restriction.
26
31
static_assert (std::is_same_v<ElementType, remove_decoration_t <ElementType>>,
27
32
" The extension expect undecorated raw pointers only!" );
28
- if constexpr (Space == access::address_space:: generic_space) {
33
+ if constexpr (Space == generic_space) {
29
34
// Undecorated raw pointer is in generic AS already, no extra casts needed.
30
35
// Note for future, for `OpPtrCastToGeneric`, `Pointer` must point to one of
31
36
// `Storage Classes` that doesn't include `Generic`, so this will have to
32
37
// remain a special case even if the restriction above is lifted.
33
- return multi_ptr<ElementType, Space, DecorateAddress> (Ptr);
38
+ return ret_ty (Ptr);
34
39
} else {
35
40
auto CastPtr = sycl::detail::spirv::GenericCastToPtr<Space>(Ptr);
36
- return multi_ptr<ElementType, Space, DecorateAddress> (CastPtr);
41
+ return ret_ty (CastPtr);
37
42
}
38
43
#else
39
- return multi_ptr<ElementType, Space, DecorateAddress> (Ptr);
44
+ return ret_ty (Ptr);
40
45
#endif
41
46
}
42
47
43
48
template <access::address_space Space, access::decorated DecorateAddress,
44
49
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>
46
60
dynamic_address_cast (ElementType *Ptr) {
61
+ using ret_ty = multi_ptr<ElementType, Space, access::decorated::no>;
47
62
#ifdef __SYCL_DEVICE_ONLY__
48
63
// TODO: Remove this restriction.
49
64
static_assert (std::is_same_v<ElementType, remove_decoration_t <ElementType>>,
50
65
" 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);
53
68
} else {
54
69
auto CastPtr = sycl::detail::spirv::GenericCastToPtrExplicit<Space>(Ptr);
55
- return multi_ptr<ElementType, Space, DecorateAddress> (CastPtr);
70
+ return ret_ty (CastPtr);
56
71
}
57
72
#else
58
- return multi_ptr<ElementType, Space, DecorateAddress> (Ptr);
73
+ return ret_ty (Ptr);
59
74
#endif
60
75
}
61
76
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
+
62
87
} // namespace experimental
63
88
} // namespace oneapi
64
89
} // namespace ext
0 commit comments