8
8
//
9
9
// vector: masking skip helper
10
10
//
11
- #define VI_MASK_VARS \
12
- const int midx = i / 64 ; \
13
- const int mpos = i % 64 ;
14
-
15
11
#define VI_LOOP_ELEMENT_SKIP (BODY ) \
16
- VI_MASK_VARS \
17
12
if (insn.v_vm() == 0 ) { \
18
13
BODY; \
19
- bool skip = ((P.VU .elt <uint64_t >(0 , midx) >> mpos) & 0x1 ) == 0 ; \
20
- if (skip) { \
14
+ if (!P.VU .mask_elt (0 , i)) { \
21
15
continue ; \
22
16
} \
23
17
}
@@ -231,24 +225,18 @@ static inline bool is_overlapped_widen(const int astart, int asize,
231
225
232
226
#define VI_LOOP_CARRY_BASE \
233
227
VI_GENERAL_LOOP_BASE \
234
- VI_MASK_VARS \
235
- auto v0 = P.VU.elt<uint64_t >(0 , midx); \
236
- const uint64_t mmask = UINT64_C(1 ) << mpos; \
237
228
const uint128_t op_mask = (UINT64_MAX >> (64 - sew)); \
238
- uint64_t carry = insn.v_vm() == 0 ? (v0 >> mpos) & 0x1 : 0 ; \
239
- uint128_t res = 0 ; \
240
- auto &vd = P.VU.elt<uint64_t >(rd_num, midx, true );
229
+ uint64_t carry = insn.v_vm() == 0 ? P.VU.mask_elt(0 , i) : 0 ; \
230
+ bool res = false ;
241
231
242
232
#define VI_LOOP_CARRY_END \
243
- vd = (vd & ~mmask) | (((res) << mpos) & mmask ); \
233
+ P.VU.set_mask_elt(insn.rd(), i, res ); \
244
234
} \
245
235
P.VU.vstart->write (0 );
246
236
#define VI_LOOP_WITH_CARRY_BASE \
247
237
VI_GENERAL_LOOP_BASE \
248
- VI_MASK_VARS \
249
- auto &v0 = P.VU.elt<uint64_t >(0 , midx); \
250
238
const uint128_t op_mask = (UINT64_MAX >> (64 - sew)); \
251
- uint64_t carry = (v0 >> mpos) & 0x1 ;
239
+ uint64_t carry = P.VU.mask_elt( 0 , i) ;
252
240
253
241
#define VI_LOOP_CMP_BASE \
254
242
require (P.VU.vsew >= e8 && P.VU.vsew <= e64 ); \
@@ -260,12 +248,10 @@ static inline bool is_overlapped_widen(const int astart, int asize,
260
248
reg_t rs2_num = insn.rs2(); \
261
249
for (reg_t i = P.VU.vstart->read (); i < vl; ++i) { \
262
250
VI_LOOP_ELEMENT_SKIP (); \
263
- uint64_t mmask = UINT64_C (1 ) << mpos; \
264
- uint64_t &vdi = P.VU .elt <uint64_t >(insn.rd (), midx, true ); \
265
- uint64_t res = 0 ;
251
+ bool res = false ;
266
252
267
253
#define VI_LOOP_CMP_END \
268
- vdi = (vdi & ~mmask) | (((res) << mpos) & mmask ); \
254
+ P. VU . set_mask_elt (insn. rd (), i, res ); \
269
255
} \
270
256
P.VU.vstart->write (0 );
271
257
@@ -274,13 +260,9 @@ static inline bool is_overlapped_widen(const int astart, int asize,
274
260
require_vector (true ); \
275
261
reg_t vl = P.VU.vl->read (); \
276
262
for (reg_t i = P.VU.vstart->read (); i < vl; ++i) { \
277
- int midx = i / 64 ; \
278
- int mpos = i % 64 ; \
279
- uint64_t mmask = UINT64_C (1 ) << mpos; \
280
- uint64_t vs2 = P.VU .elt <uint64_t >(insn.rs2 (), midx); \
281
- uint64_t vs1 = P.VU .elt <uint64_t >(insn.rs1 (), midx); \
282
- uint64_t &res = P.VU .elt <uint64_t >(insn.rd (), midx, true ); \
283
- res = (res & ~mmask) | ((op) & (1ULL << mpos)); \
263
+ bool vs2 = P.VU .mask_elt (insn.rs2 (), i); \
264
+ bool vs1 = P.VU .mask_elt (insn.rs1 (), i); \
265
+ P.VU .set_mask_elt (insn.rd (), i, (op)); \
284
266
} \
285
267
P.VU.vstart->write (0 );
286
268
@@ -523,8 +505,7 @@ static inline bool is_overlapped_widen(const int astart, int asize,
523
505
524
506
// merge and copy loop
525
507
#define VI_MERGE_VARS \
526
- VI_MASK_VARS \
527
- bool UNUSED use_first = (P.VU.elt<uint64_t >(0 , midx) >> mpos) & 0x1 ;
508
+ bool UNUSED use_first = P.VU.mask_elt(0 , i);
528
509
529
510
#define VI_MERGE_LOOP_BASE \
530
511
VI_GENERAL_LOOP_BASE \
@@ -1482,9 +1463,7 @@ VI_VX_ULOOP({ \
1482
1463
VI_VFP_COMMON \
1483
1464
for (reg_t i = P.VU .vstart ->read (); i < vl; ++i) { \
1484
1465
VI_LOOP_ELEMENT_SKIP (); \
1485
- uint64_t mmask = UINT64_C (1 ) << mpos; \
1486
- uint64_t &vd = P.VU .elt <uint64_t >(rd_num, midx, true ); \
1487
- uint64_t res = 0 ;
1466
+ bool res = false ;
1488
1467
1489
1468
#define VI_VFP_LOOP_REDUCTION_BASE (width ) \
1490
1469
float ##width##_t vd_0 = P.VU .elt <float ##width##_t>(rd_num, 0 ); \
@@ -1562,7 +1541,7 @@ VI_VX_ULOOP({ \
1562
1541
case e16 : \
1563
1542
case e32 : \
1564
1543
case e64 : { \
1565
- vd = (vd & ~mmask) | (((res) << mpos) & mmask ); \
1544
+ P. VU . set_mask_elt (insn. rd (), i, res ); \
1566
1545
break ; \
1567
1546
} \
1568
1547
default : \
0 commit comments