@@ -2665,7 +2665,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
2665
2665
lsc_data_size DS = lsc_data_size::default_size,
2666
2666
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
2667
2667
typename Toffset>
2668
- __ESIMD_API __ESIMD_NS::simd<T, N>
2668
+ __ESIMD_API std::enable_if_t <
2669
+ __ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 0 ,
2670
+ __ESIMD_NS::simd<T, N>>
2669
2671
lsc_atomic_update (T *p, __ESIMD_NS::simd<Toffset, N> offsets,
2670
2672
__ESIMD_NS::simd_mask<N> pred) {
2671
2673
static_assert (std::is_integral_v<Toffset>, " Unsupported offset type" );
@@ -2697,7 +2699,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
2697
2699
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
2698
2700
typename Toffset,
2699
2701
typename RegionTy = __ESIMD_NS::region1d_t <Toffset, N, 1 >>
2700
- __ESIMD_API __ESIMD_NS::simd<T, N>
2702
+ __ESIMD_API std::enable_if_t <
2703
+ __ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 0 ,
2704
+ __ESIMD_NS::simd<T, N>>
2701
2705
lsc_atomic_update (T *p, __ESIMD_NS::simd_view<Toffset, RegionTy> offsets,
2702
2706
__ESIMD_NS::simd_mask<N> pred = 1 ) {
2703
2707
using Ty = typename __ESIMD_NS::simd_view<Toffset, RegionTy>::element_type;
@@ -2709,8 +2713,10 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
2709
2713
lsc_data_size DS = lsc_data_size::default_size,
2710
2714
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
2711
2715
typename Toffset>
2712
- __ESIMD_API
2713
- std::enable_if_t <std::is_integral_v<Toffset>, __ESIMD_NS::simd<T, N>>
2716
+ __ESIMD_API std::enable_if_t <
2717
+ std::is_integral_v<Toffset> &&
2718
+ __ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 0 ,
2719
+ __ESIMD_NS::simd<T, N>>
2714
2720
lsc_atomic_update (T *p, Toffset offset, __ESIMD_NS::simd_mask<N> pred = 1 ) {
2715
2721
return lsc_atomic_update<Op, T, N, DS, L1H, L3H>(
2716
2722
p, __ESIMD_NS::simd<Toffset, N>(offset), pred);
@@ -2735,7 +2741,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
2735
2741
lsc_data_size DS = lsc_data_size::default_size,
2736
2742
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
2737
2743
typename Toffset>
2738
- __ESIMD_API __ESIMD_NS::simd<T, N>
2744
+ __ESIMD_API std::enable_if_t <
2745
+ __ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 1 ,
2746
+ __ESIMD_NS::simd<T, N>>
2739
2747
lsc_atomic_update (T *p, __ESIMD_NS::simd<Toffset, N> offsets,
2740
2748
__ESIMD_NS::simd<T, N> src0, __ESIMD_NS::simd_mask<N> pred) {
2741
2749
static_assert (std::is_integral_v<Toffset>, " Unsupported offset type" );
@@ -2768,7 +2776,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
2768
2776
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
2769
2777
typename Toffset,
2770
2778
typename RegionTy = __ESIMD_NS::region1d_t <Toffset, N, 1 >>
2771
- __ESIMD_API __ESIMD_NS::simd<T, N>
2779
+ __ESIMD_API std::enable_if_t <
2780
+ __ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 1 ,
2781
+ __ESIMD_NS::simd<T, N>>
2772
2782
lsc_atomic_update (T *p, __ESIMD_NS::simd_view<Toffset, RegionTy> offsets,
2773
2783
__ESIMD_NS::simd<T, N> src0,
2774
2784
__ESIMD_NS::simd_mask<N> pred = 1 ) {
@@ -2781,11 +2791,13 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
2781
2791
lsc_data_size DS = lsc_data_size::default_size,
2782
2792
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
2783
2793
typename Toffset>
2784
- __ESIMD_API std::enable_if_t <std::is_integral_v<Toffset> &&
2785
- ((Op != __ESIMD_NS::atomic_op::store &&
2786
- Op != __ESIMD_NS::atomic_op::xchg) ||
2787
- N == 1 ),
2788
- __ESIMD_NS::simd<T, N>>
2794
+ __ESIMD_API std::enable_if_t <
2795
+ std::is_integral_v<Toffset> &&
2796
+ __ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 1 &&
2797
+ ((Op != __ESIMD_NS::atomic_op::store &&
2798
+ Op != __ESIMD_NS::atomic_op::xchg) ||
2799
+ N == 1 ),
2800
+ __ESIMD_NS::simd<T, N>>
2789
2801
lsc_atomic_update (T *p, Toffset offset, __ESIMD_NS::simd<T, N> src0,
2790
2802
__ESIMD_NS::simd_mask<N> pred = 1 ) {
2791
2803
return lsc_atomic_update<Op, T, N, DS, L1H, L3H>(
@@ -2811,7 +2823,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
2811
2823
lsc_data_size DS = lsc_data_size::default_size,
2812
2824
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
2813
2825
typename Toffset>
2814
- __ESIMD_API __ESIMD_NS::simd<T, N>
2826
+ __ESIMD_API std::enable_if_t <
2827
+ __ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 2 ,
2828
+ __ESIMD_NS::simd<T, N>>
2815
2829
lsc_atomic_update (T *p, __ESIMD_NS::simd<Toffset, N> offsets,
2816
2830
__ESIMD_NS::simd<T, N> src0, __ESIMD_NS::simd<T, N> src1,
2817
2831
__ESIMD_NS::simd_mask<N> pred) {
@@ -2846,7 +2860,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
2846
2860
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
2847
2861
typename Toffset,
2848
2862
typename RegionTy = __ESIMD_NS::region1d_t <Toffset, N, 1 >>
2849
- __ESIMD_API __ESIMD_NS::simd<T, N>
2863
+ __ESIMD_API std::enable_if_t <
2864
+ __ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 2 ,
2865
+ __ESIMD_NS::simd<T, N>>
2850
2866
lsc_atomic_update (T *p, __ESIMD_NS::simd_view<Toffset, RegionTy> offsets,
2851
2867
__ESIMD_NS::simd<T, N> src0, __ESIMD_NS::simd<T, N> src1,
2852
2868
__ESIMD_NS::simd_mask<N> pred = 1 ) {
@@ -2859,8 +2875,10 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
2859
2875
lsc_data_size DS = lsc_data_size::default_size,
2860
2876
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
2861
2877
typename Toffset>
2862
- __ESIMD_API
2863
- std::enable_if_t <std::is_integral_v<Toffset>, __ESIMD_NS::simd<T, N>>
2878
+ __ESIMD_API std::enable_if_t <
2879
+ std::is_integral_v<Toffset> &&
2880
+ __ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 2 ,
2881
+ __ESIMD_NS::simd<T, N>>
2864
2882
lsc_atomic_update (T *p, Toffset offset, __ESIMD_NS::simd<T, N> src0,
2865
2883
__ESIMD_NS::simd<T, N> src1,
2866
2884
__ESIMD_NS::simd_mask<N> pred = 1 ) {
@@ -3082,58 +3100,64 @@ namespace esimd {
3082
3100
// / <tt>native::lsc::atomic_op</tt> instead of <tt>atomic_op</tt> as atomic
3083
3101
// / operation template argument.
3084
3102
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3085
- __ESIMD_API simd<T, N> atomic_update (T *p , simd<Toffset , N> offset,
3086
- simd_mask<N> mask) {
3103
+ __ESIMD_API std:: enable_if_t <__ESIMD_DNS::get_num_args<Op>() == 0 , simd<T , N>>
3104
+ atomic_update (T *p, simd<Toffset, N> offset, simd_mask<N> mask) {
3087
3105
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
3088
3106
p, offset, mask);
3089
3107
}
3090
3108
3091
3109
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset,
3092
3110
typename RegionTy = __ESIMD_NS::region1d_t <Toffset, N, 1 >>
3093
- __ESIMD_API simd<T, N> atomic_update (T *p, simd_view<Toffset, RegionTy> offsets,
3094
- simd_mask<N> mask = 1 ) {
3111
+ __ESIMD_API std::enable_if_t <__ESIMD_DNS::get_num_args<Op>() == 0 , simd<T, N>>
3112
+ atomic_update (T *p, simd_view<Toffset, RegionTy> offsets,
3113
+ simd_mask<N> mask = 1 ) {
3095
3114
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
3096
3115
p, offsets, mask);
3097
3116
}
3098
3117
3099
3118
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3100
- __ESIMD_API
3101
- std::enable_if_t <std::is_integral_v<Toffset>, __ESIMD_NS::simd<T, N>>
3102
- atomic_update (T *p, Toffset offset, simd_mask<N> mask = 1 ) {
3119
+ __ESIMD_API std::enable_if_t <std::is_integral_v<Toffset> &&
3120
+ __ESIMD_DNS::get_num_args<Op>() == 0 ,
3121
+ simd<T, N>>
3122
+ atomic_update (T *p, Toffset offset, simd_mask<N> mask = 1 ) {
3103
3123
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
3104
3124
p, offset, mask);
3105
3125
}
3106
3126
3107
3127
// / LSC version of the single-argument atomic update.
3108
3128
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3109
- __ESIMD_API simd<T, N> atomic_update (T *p, simd<Toffset, N> offset,
3110
- simd<T, N> src0, simd_mask<N> mask) {
3129
+ __ESIMD_API __ESIMD_API
3130
+ std::enable_if_t <__ESIMD_DNS::get_num_args<Op>() == 1 , simd<T, N>>
3131
+ atomic_update (T *p, simd<Toffset, N> offset, simd<T, N> src0,
3132
+ simd_mask<N> mask) {
3111
3133
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
3112
3134
p, offset, src0, mask);
3113
3135
}
3114
3136
3115
3137
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset,
3116
3138
typename RegionTy = __ESIMD_NS::region1d_t <Toffset, N, 1 >>
3117
- __ESIMD_API simd<T, N> atomic_update (T *p, simd_view<Toffset, RegionTy> offsets,
3118
- simd<T, N> src0, simd_mask<N> mask = 1 ) {
3139
+ __ESIMD_API __ESIMD_API
3140
+ std::enable_if_t <__ESIMD_DNS::get_num_args<Op>() == 1 , simd<T, N>>
3141
+ atomic_update (T *p, simd_view<Toffset, RegionTy> offsets, simd<T, N> src0,
3142
+ simd_mask<N> mask = 1 ) {
3119
3143
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
3120
3144
p, offsets, src0, mask);
3121
3145
}
3122
3146
3123
3147
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3124
- __ESIMD_API
3125
- std:: enable_if_t <std::is_integral_v<Toffset>, __ESIMD_NS::simd<T, N>>
3126
- atomic_update (T *p, Toffset offset, simd<T, N> src0,
3127
- simd_mask<N> mask = 1 ) {
3148
+ __ESIMD_API std:: enable_if_t <std::is_integral_v<Toffset> &&
3149
+ __ESIMD_DNS::get_num_args<Op>() == 1 ,
3150
+ simd<T, N>>
3151
+ atomic_update (T *p, Toffset offset, simd<T, N> src0, simd_mask<N> mask = 1 ) {
3128
3152
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
3129
3153
p, offset, src0, mask);
3130
3154
}
3131
3155
3132
3156
// / LSC version of the two-argument atomic update.
3133
3157
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3134
- __ESIMD_API simd<T, N> atomic_update (T *p , simd<Toffset , N> offset,
3135
- simd<T, N> src0, simd<T, N> src1,
3136
- simd_mask<N> mask) {
3158
+ __ESIMD_API std:: enable_if_t <__ESIMD_DNS::get_num_args<Op>() == 2 , simd<T , N>>
3159
+ atomic_update (T *p, simd<Toffset, N> offset, simd<T, N> src0, simd<T, N> src1,
3160
+ simd_mask<N> mask) {
3137
3161
// 2-argument lsc_atomic_update arguments order matches the standard one -
3138
3162
// expected value first, then new value. But atomic_update uses reverse
3139
3163
// order, hence the src1/src0 swap.
@@ -3143,18 +3167,19 @@ __ESIMD_API simd<T, N> atomic_update(T *p, simd<Toffset, N> offset,
3143
3167
3144
3168
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset,
3145
3169
typename RegionTy = __ESIMD_NS::region1d_t <Toffset, N, 1 >>
3146
- __ESIMD_API simd<T, N> atomic_update (T *p, simd_view<Toffset, RegionTy> offsets,
3147
- simd<T, N> src0 , simd<T, N> src1 ,
3148
- simd_mask<N> mask = 1 ) {
3170
+ __ESIMD_API std:: enable_if_t <__ESIMD_DNS::get_num_args<Op>() == 2 , simd<T, N>>
3171
+ atomic_update (T *p, simd_view<Toffset, RegionTy> offsets , simd<T, N> src0 ,
3172
+ simd<T, N> src1, simd_mask<N> mask = 1 ) {
3149
3173
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
3150
3174
p, offsets, src1, src0, mask);
3151
3175
}
3152
3176
3153
3177
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3154
- __ESIMD_API
3155
- std::enable_if_t <std::is_integral_v<Toffset>, __ESIMD_NS::simd<T, N>>
3156
- atomic_update (T *p, Toffset offset, simd<T, N> src0, simd<T, N> src1,
3157
- simd_mask<N> mask = 1 ) {
3178
+ __ESIMD_API std::enable_if_t <std::is_integral_v<Toffset> &&
3179
+ __ESIMD_DNS::get_num_args<Op>() == 2 ,
3180
+ __ESIMD_NS::simd<T, N>>
3181
+ atomic_update (T *p, Toffset offset, simd<T, N> src0, simd<T, N> src1,
3182
+ simd_mask<N> mask = 1 ) {
3158
3183
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
3159
3184
p, offset, src1, src0, mask);
3160
3185
}
0 commit comments