@@ -122,6 +122,18 @@ bool LoongArchExpandAtomicPseudo::expandMI(
122122 case LoongArch::PseudoAtomicLoadXor32:
123123 return expandAtomicBinOp (MBB, MBBI, AtomicRMWInst::Xor, false , 32 ,
124124 NextMBBI);
125+ case LoongArch::PseudoAtomicLoadUMax32:
126+ return expandAtomicMinMaxOp (MBB, MBBI, AtomicRMWInst::UMax, false , 32 ,
127+ NextMBBI);
128+ case LoongArch::PseudoAtomicLoadUMin32:
129+ return expandAtomicMinMaxOp (MBB, MBBI, AtomicRMWInst::UMin, false , 32 ,
130+ NextMBBI);
131+ case LoongArch::PseudoAtomicLoadMax32:
132+ return expandAtomicMinMaxOp (MBB, MBBI, AtomicRMWInst::Max, false , 32 ,
133+ NextMBBI);
134+ case LoongArch::PseudoAtomicLoadMin32:
135+ return expandAtomicMinMaxOp (MBB, MBBI, AtomicRMWInst::Min, false , 32 ,
136+ NextMBBI);
125137 case LoongArch::PseudoMaskedAtomicLoadUMax32:
126138 return expandAtomicMinMaxOp (MBB, MBBI, AtomicRMWInst::UMax, true , 32 ,
127139 NextMBBI);
@@ -356,8 +368,6 @@ bool LoongArchExpandAtomicPseudo::expandAtomicMinMaxOp(
356368 MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
357369 AtomicRMWInst::BinOp BinOp, bool IsMasked, int Width,
358370 MachineBasicBlock::iterator &NextMBBI) {
359- assert (IsMasked == true &&
360- " Should only need to expand masked atomic max/min" );
361371 assert (Width == 32 && " Should never need to expand masked 64-bit operations" );
362372
363373 MachineInstr &MI = *MBBI;
@@ -385,79 +395,92 @@ bool LoongArchExpandAtomicPseudo::expandAtomicMinMaxOp(
385395 MBB.addSuccessor (LoopHeadMBB);
386396
387397 Register DestReg = MI.getOperand (0 ).getReg ();
388- Register Scratch1Reg = MI.getOperand (1 ).getReg ();
389- Register Scratch2Reg = MI.getOperand (2 ).getReg ();
390- Register AddrReg = MI.getOperand (3 ).getReg ();
391- Register IncrReg = MI.getOperand (4 ).getReg ();
392- Register MaskReg = MI.getOperand (5 ).getReg ();
398+ Register ScratchReg = MI.getOperand (1 ).getReg ();
399+ Register AddrReg = MI.getOperand (IsMasked ? 3 : 2 ).getReg ();
400+ Register IncrReg = MI.getOperand (IsMasked ? 4 : 3 ).getReg ();
401+ Register CmprReg = DestReg;
393402
394403 //
395404 // .loophead:
396405 // ll.w destreg, (alignedaddr)
397- // and scratch2, destreg, mask
398- // move scratch1, destreg
399406 BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::LL_W), DestReg)
400407 .addReg (AddrReg)
401408 .addImm (0 );
402- BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::AND), Scratch2Reg)
403- .addReg (DestReg)
404- .addReg (MaskReg);
405- BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::OR), Scratch1Reg)
409+ // and cmpr, destreg, mask
410+ if (IsMasked) {
411+ Register MaskReg = MI.getOperand (5 ).getReg ();
412+ CmprReg = MI.getOperand (2 ).getReg ();
413+ BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::AND), CmprReg)
414+ .addReg (DestReg)
415+ .addReg (MaskReg);
416+ }
417+ // move scratch, destreg
418+ BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::OR), ScratchReg)
406419 .addReg (DestReg)
407420 .addReg (LoongArch::R0);
408421
409422 switch (BinOp) {
410423 default :
411424 llvm_unreachable (" Unexpected AtomicRMW BinOp" );
412- // bgeu scratch2 , incr, .looptail
425+ // bgeu cmpr , incr, .looptail
413426 case AtomicRMWInst::UMax:
414427 BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::BGEU))
415- .addReg (Scratch2Reg )
428+ .addReg (CmprReg )
416429 .addReg (IncrReg)
417430 .addMBB (LoopTailMBB);
418431 break ;
419- // bgeu incr, scratch2 , .looptail
432+ // bgeu incr, cmpr , .looptail
420433 case AtomicRMWInst::UMin:
421434 BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::BGEU))
422435 .addReg (IncrReg)
423- .addReg (Scratch2Reg )
436+ .addReg (CmprReg )
424437 .addMBB (LoopTailMBB);
425438 break ;
426439 case AtomicRMWInst::Max:
427- insertSext (TII, DL, LoopHeadMBB, Scratch2Reg, MI.getOperand (6 ).getReg ());
428- // bge scratch2, incr, .looptail
440+ if (IsMasked)
441+ insertSext (TII, DL, LoopHeadMBB, CmprReg, MI.getOperand (6 ).getReg ());
442+ // bge cmpr, incr, .looptail
429443 BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::BGE))
430- .addReg (Scratch2Reg )
444+ .addReg (CmprReg )
431445 .addReg (IncrReg)
432446 .addMBB (LoopTailMBB);
433447 break ;
434448 case AtomicRMWInst::Min:
435- insertSext (TII, DL, LoopHeadMBB, Scratch2Reg, MI.getOperand (6 ).getReg ());
436- // bge incr, scratch2, .looptail
449+ if (IsMasked)
450+ insertSext (TII, DL, LoopHeadMBB, CmprReg, MI.getOperand (6 ).getReg ());
451+ // bge incr, cmpr, .looptail
437452 BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::BGE))
438453 .addReg (IncrReg)
439- .addReg (Scratch2Reg )
454+ .addReg (CmprReg )
440455 .addMBB (LoopTailMBB);
441456 break ;
442457 // TODO: support other AtomicRMWInst.
443458 }
444459
445460 // .loopifbody:
446- // xor scratch1, destreg, incr
447- // and scratch1, scratch1, mask
448- // xor scratch1, destreg, scratch1
449- insertMaskedMerge (TII, DL, LoopIfBodyMBB, Scratch1Reg, DestReg, IncrReg,
450- MaskReg, Scratch1Reg);
461+ if (IsMasked) {
462+ Register MaskReg = MI.getOperand (5 ).getReg ();
463+ // xor scratch, destreg, incr
464+ // and scratch, scratch, mask
465+ // xor scratch, destreg, scratch
466+ insertMaskedMerge (TII, DL, LoopIfBodyMBB, ScratchReg, DestReg, IncrReg,
467+ MaskReg, ScratchReg);
468+ } else {
469+ // move scratch, incr
470+ BuildMI (LoopIfBodyMBB, DL, TII->get (LoongArch::OR), ScratchReg)
471+ .addReg (IncrReg)
472+ .addReg (LoongArch::R0);
473+ }
451474
452475 // .looptail:
453- // sc.w scratch1, scratch1 , (addr)
454- // beqz scratch1 , loop
455- BuildMI (LoopTailMBB, DL, TII->get (LoongArch::SC_W), Scratch1Reg )
456- .addReg (Scratch1Reg )
476+ // sc.w scratch, scratch , (addr)
477+ // beqz scratch , loop
478+ BuildMI (LoopTailMBB, DL, TII->get (LoongArch::SC_W), ScratchReg )
479+ .addReg (ScratchReg )
457480 .addReg (AddrReg)
458481 .addImm (0 );
459482 BuildMI (LoopTailMBB, DL, TII->get (LoongArch::BEQ))
460- .addReg (Scratch1Reg )
483+ .addReg (ScratchReg )
461484 .addReg (LoongArch::R0)
462485 .addMBB (LoopHeadMBB);
463486
0 commit comments