@@ -229,16 +229,28 @@ typedef uint64_t regMaskSmall;
229
229
#define REG_MASK_ALL_FMT " %016llX"
230
230
#endif
231
231
232
+ #ifdef TARGET_ARM64
233
+ #define HAS_MORE_THAN_64_REGISTERS 1
234
+ #define MORE_THAN_64_REGISTERS (x ) x
235
+ #else
236
+ #define MORE_THAN_64_REGISTERS (x )
237
+ #endif // TARGET_ARM64
238
+
232
239
typedef regMaskSmall SingleTypeRegSet;
240
+ inline SingleTypeRegSet genRegMask (regNumber reg);
241
+ inline SingleTypeRegSet genRegMaskFloat (regNumber reg ARM_ARG (var_types type = TYP_DOUBLE));
233
242
234
243
struct regMaskTP
235
244
{
236
245
private:
237
246
regMaskSmall low;
247
+ MORE_THAN_64_REGISTERS (regMaskSmall high);
248
+
238
249
public:
239
- constexpr regMaskTP (regMaskSmall regMask)
250
+ regMaskTP (regMaskSmall regMask)
240
251
: low(regMask)
241
252
{
253
+
242
254
}
243
255
244
256
regMaskTP ()
@@ -278,12 +290,12 @@ struct regMaskTP
278
290
return low;
279
291
}
280
292
281
- bool IsEmpty ()
293
+ bool IsEmpty () const
282
294
{
283
295
return low == RBM_NONE;
284
296
}
285
297
286
- bool IsNonEmpty ()
298
+ bool IsNonEmpty () const
287
299
{
288
300
return !IsEmpty ();
289
301
}
@@ -313,48 +325,54 @@ struct regMaskTP
313
325
bool IsRegNumInMask (regNumber reg);
314
326
};
315
327
316
- static regMaskTP operator ^(regMaskTP first, regMaskTP second)
328
+ static regMaskTP operator ^(const regMaskTP& first, const regMaskTP& second)
317
329
{
318
330
regMaskTP result (first.getLow () ^ second.getLow ());
319
331
return result;
320
332
}
321
333
322
- static regMaskTP operator &(regMaskTP first, regMaskTP second)
334
+ static regMaskTP operator &(const regMaskTP& first, const regMaskTP& second)
323
335
{
324
336
regMaskTP result (first.getLow () & second.getLow ());
325
337
return result;
326
338
}
327
339
328
- static regMaskTP operator |(regMaskTP first, regMaskTP second)
340
+ static regMaskTP operator |(const regMaskTP& first, const regMaskTP& second)
329
341
{
330
342
regMaskTP result (first.getLow () | second.getLow ());
331
343
return result;
332
344
}
333
345
334
- static regMaskTP& operator |=(regMaskTP& first, regMaskTP second)
346
+ static regMaskTP& operator |=(regMaskTP& first, const regMaskTP& second)
335
347
{
336
348
first = first | second;
337
349
return first;
338
350
}
339
351
340
- static regMaskTP& operator ^=(regMaskTP& first, regMaskTP second)
352
+ static regMaskTP& operator ^=(regMaskTP& first, const regMaskTP& second)
341
353
{
342
354
first = first ^ second;
343
355
return first;
344
356
}
345
357
346
- static regMaskTP& operator &=(regMaskTP& first, regMaskTP second)
358
+ static regMaskTP& operator ^=(regMaskTP& first, const regNumber reg)
359
+ {
360
+ first = first ^ genRegMask (reg);
361
+ return first;
362
+ }
363
+
364
+ static regMaskTP& operator &=(regMaskTP& first, const regMaskTP& second)
347
365
{
348
366
first = first & second;
349
367
return first;
350
368
}
351
369
352
- static bool operator ==(regMaskTP first, regMaskTP second)
370
+ static bool operator ==(const regMaskTP& first, const regMaskTP& second)
353
371
{
354
372
return (first.getLow () == second.getLow ());
355
373
}
356
374
357
- static bool operator !=(regMaskTP first, regMaskTP second)
375
+ static bool operator !=(const regMaskTP& first, const regMaskTP& second)
358
376
{
359
377
return !(first == second);
360
378
}
@@ -390,18 +408,18 @@ static regMaskTP& operator<<=(regMaskTP& first, const int b)
390
408
}
391
409
#endif
392
410
393
- static regMaskTP operator ~(regMaskTP first)
411
+ static regMaskTP operator ~(const regMaskTP& first)
394
412
{
395
413
regMaskTP result (~first.getLow ());
396
414
return result;
397
415
}
398
416
399
- static uint32_t PopCount (regMaskTP value)
417
+ static uint32_t PopCount (const regMaskTP& value)
400
418
{
401
419
return BitOperations::PopCount (value.getLow ());
402
420
}
403
421
404
- static uint32_t BitScanForward (regMaskTP mask)
422
+ static uint32_t BitScanForward (const regMaskTP& mask)
405
423
{
406
424
return BitOperations::BitScanForward (mask.getLow ());
407
425
}
0 commit comments