@@ -180,13 +180,26 @@ template <typename BaseTy, typename RegionTy> class simd_view {
180
180
}
181
181
182
182
#define DEF_BINOP (BINOP, OPASSIGN ) \
183
- auto operator BINOP (const value_type &RHS) const { \
183
+ ESIMD_INLINE friend auto operator BINOP (const simd_view &X, \
184
+ const value_type &Y) { \
184
185
using ComputeTy = compute_type_t <value_type>; \
185
- auto V0 = convert<typename ComputeTy::vector_type>(read ().data ()); \
186
- auto V1 = convert<typename ComputeTy::vector_type>(RHS.data ()); \
186
+ auto V0 = convert<typename ComputeTy::vector_type>(X.read ().data ()); \
187
+ auto V1 = convert<typename ComputeTy::vector_type>(Y.data ()); \
188
+ auto V2 = V0 BINOP V1; \
189
+ return ComputeTy (V2); \
190
+ } \
191
+ ESIMD_INLINE friend auto operator BINOP (const value_type &X, \
192
+ const simd_view &Y) { \
193
+ using ComputeTy = compute_type_t <value_type>; \
194
+ auto V0 = convert<typename ComputeTy::vector_type>(X.data ()); \
195
+ auto V1 = convert<typename ComputeTy::vector_type>(Y.read ().data ()); \
187
196
auto V2 = V0 BINOP V1; \
188
197
return ComputeTy (V2); \
189
198
} \
199
+ ESIMD_INLINE friend auto operator BINOP (const simd_view &X, \
200
+ const simd_view &Y) { \
201
+ return (X BINOP Y.read ()); \
202
+ } \
190
203
simd_view &operator OPASSIGN (const value_type &RHS) { \
191
204
using ComputeTy = compute_type_t <value_type>; \
192
205
auto V0 = convert<typename ComputeTy::vector_type>(read ().data ()); \
@@ -195,6 +208,9 @@ template <typename BaseTy, typename RegionTy> class simd_view {
195
208
auto V3 = convert<vector_type>(V2); \
196
209
write (V3); \
197
210
return *this ; \
211
+ } \
212
+ simd_view &operator OPASSIGN (const simd_view &RHS) { \
213
+ return (*this OPASSIGN RHS.read ()); \
198
214
}
199
215
200
216
DEF_BINOP (+, +=)
@@ -205,10 +221,21 @@ template <typename BaseTy, typename RegionTy> class simd_view {
205
221
#undef DEF_BINOP
206
222
207
223
#define DEF_RELOP (RELOP ) \
208
- simd<uint16_t , length> operator RELOP (const simd_view &RHS) const { \
209
- auto R = read ().data () RELOP RHS.read ().data (); \
224
+ ESIMD_INLINE friend simd<uint16_t , length> operator RELOP ( \
225
+ const simd_view &X, const value_type &Y) { \
226
+ auto R = X.read ().data () RELOP Y.data (); \
210
227
mask_type_t <length> M (1 ); \
211
228
return M & convert<mask_type_t <length>>(R); \
229
+ } \
230
+ ESIMD_INLINE friend simd<uint16_t , length> operator RELOP ( \
231
+ const value_type &X, const simd_view &Y) { \
232
+ auto R = X.data () RELOP Y.read ().data (); \
233
+ mask_type_t <length> M (1 ); \
234
+ return M & convert<mask_type_t <length>>(R); \
235
+ } \
236
+ ESIMD_INLINE friend simd<uint16_t , length> operator RELOP ( \
237
+ const simd_view &X, const simd_view &Y) { \
238
+ return (X RELOP Y.read ()); \
212
239
}
213
240
214
241
DEF_RELOP (>)
@@ -221,19 +248,32 @@ template <typename BaseTy, typename RegionTy> class simd_view {
221
248
#undef DEF_RELOP
222
249
223
250
#define DEF_LOGIC_OP (LOGIC_OP, OPASSIGN ) \
224
- simd_view operator LOGIC_OP (const simd_view &RHS) const { \
251
+ ESIMD_INLINE friend auto operator LOGIC_OP (const simd_view &X, \
252
+ const value_type &Y) { \
225
253
static_assert (std::is_integral<element_type>(), " not integral type" ); \
226
- auto V2 = read ().data () LOGIC_OP RHS. read (). data (); \
227
- return simd_view (V2); \
254
+ auto V2 = X. read ().data () LOGIC_OP Y. data (); \
255
+ return simd<element_type, length> (V2); \
228
256
} \
229
- simd_view &operator OPASSIGN (const simd_view &RHS) { \
257
+ ESIMD_INLINE friend auto operator LOGIC_OP (const value_type &X, \
258
+ const simd_view &Y) { \
259
+ static_assert (std::is_integral<element_type>(), " not integral type" ); \
260
+ auto V2 = X.data () LOGIC_OP Y.read ().data (); \
261
+ return simd<element_type, length>(V2); \
262
+ } \
263
+ ESIMD_INLINE friend auto operator LOGIC_OP (const simd_view &X, \
264
+ const simd_view &Y) { \
265
+ return (X LOGIC_OP Y.read ()); \
266
+ } \
267
+ simd_view &operator OPASSIGN (const value_type &RHS) { \
230
268
static_assert (std::is_integral<element_type>(), " not integeral type" ); \
231
- auto V2 = read ().data LOGIC_OP RHS.read (). data (); \
269
+ auto V2 = read ().data () LOGIC_OP RHS.data (); \
232
270
auto V3 = convert<vector_type>(V2); \
233
271
write (V3); \
234
272
return *this ; \
273
+ } \
274
+ simd_view &operator OPASSIGN (const simd_view &RHS) { \
275
+ return (*this OPASSIGN RHS.read ()); \
235
276
}
236
-
237
277
DEF_LOGIC_OP (&, &=)
238
278
DEF_LOGIC_OP(|, |=)
239
279
DEF_LOGIC_OP(^, ^=)
0 commit comments