@@ -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 ;
@@ -467,8 +481,34 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
467
481
.addReg (OldVal)
468
482
.addReg (Mask);
469
483
BuildMI (loopMBB, DL, TII->get (Mips::AND), Incr).addReg (Incr).addReg (Mask);
470
- }
471
484
485
+ if (!IsUnsigned) {
486
+ BuildMI (loopMBB, DL, TII->get (Mips::SRAV), OldVal)
487
+ .addReg (OldVal)
488
+ .addReg (ShiftAmnt);
489
+ BuildMI (loopMBB, DL, TII->get (Mips::SRAV), Incr)
490
+ .addReg (Incr)
491
+ .addReg (ShiftAmnt);
492
+ if (STI->hasMips32r2 ()) {
493
+ BuildMI (loopMBB, DL, TII->get (SEOp), OldVal).addReg (OldVal);
494
+ BuildMI (loopMBB, DL, TII->get (SEOp), Incr).addReg (Incr);
495
+ } else {
496
+ const unsigned ShiftImm = SEOp == Mips::SEH ? 16 : 24 ;
497
+ BuildMI (loopMBB, DL, TII->get (Mips::SLL), OldVal)
498
+ .addReg (OldVal, RegState::Kill)
499
+ .addImm (ShiftImm);
500
+ BuildMI (loopMBB, DL, TII->get (Mips::SRA), OldVal)
501
+ .addReg (OldVal, RegState::Kill)
502
+ .addImm (ShiftImm);
503
+ BuildMI (loopMBB, DL, TII->get (Mips::SLL), Incr)
504
+ .addReg (Incr, RegState::Kill)
505
+ .addImm (ShiftImm);
506
+ BuildMI (loopMBB, DL, TII->get (Mips::SRA), Incr)
507
+ .addReg (Incr, RegState::Kill)
508
+ .addImm (ShiftImm);
509
+ }
510
+ }
511
+ }
472
512
// unsigned: sltu Scratch4, oldVal, Incr
473
513
// signed: slt Scratch4, oldVal, Incr
474
514
BuildMI (loopMBB, DL, TII->get (SLTScratch4), Scratch4)
0 commit comments