@@ -388,18 +388,32 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
388
388
Opcode = Mips::XOR;
389
389
break ;
390
390
case Mips::ATOMIC_LOAD_UMIN_I8_POSTRA:
391
+ IsUnsigned = true ;
392
+ IsMin = true ;
393
+ break ;
391
394
case Mips::ATOMIC_LOAD_UMIN_I16_POSTRA:
392
395
IsUnsigned = true ;
393
- [[fallthrough]];
396
+ IsMin = true ;
397
+ break ;
394
398
case Mips::ATOMIC_LOAD_MIN_I8_POSTRA:
399
+ SEOp = Mips::SEB;
400
+ IsMin = true ;
401
+ break ;
395
402
case Mips::ATOMIC_LOAD_MIN_I16_POSTRA:
396
403
IsMin = true ;
397
404
break ;
398
405
case Mips::ATOMIC_LOAD_UMAX_I8_POSTRA:
406
+ IsUnsigned = true ;
407
+ IsMax = true ;
408
+ break ;
399
409
case Mips::ATOMIC_LOAD_UMAX_I16_POSTRA:
400
410
IsUnsigned = true ;
401
- [[fallthrough]];
411
+ IsMax = true ;
412
+ break ;
402
413
case Mips::ATOMIC_LOAD_MAX_I8_POSTRA:
414
+ SEOp = Mips::SEB;
415
+ IsMax = true ;
416
+ break ;
403
417
case Mips::ATOMIC_LOAD_MAX_I16_POSTRA:
404
418
IsMax = true ;
405
419
break ;
@@ -461,14 +475,33 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
461
475
462
476
// For little endian we need to clear uninterested bits.
463
477
if (STI->isLittle ()) {
464
- // and OldVal, OldVal, Mask
465
- // and Incr, Incr, Mask
466
- BuildMI (loopMBB, DL, TII->get (Mips::AND), OldVal)
467
- .addReg (OldVal)
468
- .addReg (Mask);
469
- BuildMI (loopMBB, DL, TII->get (Mips::AND), Incr).addReg (Incr).addReg (Mask);
478
+ if (!IsUnsigned) {
479
+ BuildMI (loopMBB, DL, TII->get (Mips::SRAV), OldVal)
480
+ .addReg (OldVal)
481
+ .addReg (ShiftAmnt);
482
+ BuildMI (loopMBB, DL, TII->get (Mips::SRAV), Incr)
483
+ .addReg (Incr)
484
+ .addReg (ShiftAmnt);
485
+ if (STI->hasMips32r2 ()) {
486
+ BuildMI (loopMBB, DL, TII->get (SEOp), OldVal).addReg (OldVal);
487
+ BuildMI (loopMBB, DL, TII->get (SEOp), Incr).addReg (Incr);
488
+ } else {
489
+ const unsigned ShiftImm = SEOp == Mips::SEH ? 16 : 24 ;
490
+ BuildMI (loopMBB, DL, TII->get (Mips::SLL), OldVal)
491
+ .addReg (OldVal, RegState::Kill)
492
+ .addImm (ShiftImm);
493
+ BuildMI (loopMBB, DL, TII->get (Mips::SRA), OldVal)
494
+ .addReg (OldVal, RegState::Kill)
495
+ .addImm (ShiftImm);
496
+ BuildMI (loopMBB, DL, TII->get (Mips::SLL), Incr)
497
+ .addReg (Incr, RegState::Kill)
498
+ .addImm (ShiftImm);
499
+ BuildMI (loopMBB, DL, TII->get (Mips::SRA), Incr)
500
+ .addReg (Incr, RegState::Kill)
501
+ .addImm (ShiftImm);
502
+ }
503
+ }
470
504
}
471
-
472
505
// unsigned: sltu Scratch4, oldVal, Incr
473
506
// signed: slt Scratch4, oldVal, Incr
474
507
BuildMI (loopMBB, DL, TII->get (SLTScratch4), Scratch4)
0 commit comments