@@ -153,18 +153,12 @@ static void doAtomicBinOpExpansion(const LoongArchInstrInfo *TII,
153
153
Register ScratchReg = MI.getOperand (1 ).getReg ();
154
154
Register AddrReg = MI.getOperand (2 ).getReg ();
155
155
Register IncrReg = MI.getOperand (3 ).getReg ();
156
- AtomicOrdering Ordering =
157
- static_cast <AtomicOrdering>(MI.getOperand (4 ).getImm ());
158
156
159
157
// .loop:
160
- // if(Ordering != AtomicOrdering::Monotonic)
161
- // dbar 0
162
158
// ll.[w|d] dest, (addr)
163
159
// binop scratch, dest, val
164
160
// sc.[w|d] scratch, scratch, (addr)
165
161
// beqz scratch, loop
166
- if (Ordering != AtomicOrdering::Monotonic)
167
- BuildMI (LoopMBB, DL, TII->get (LoongArch::DBAR)).addImm (0 );
168
162
BuildMI (LoopMBB, DL,
169
163
TII->get (Width == 32 ? LoongArch::LL_W : LoongArch::LL_D), DestReg)
170
164
.addReg (AddrReg)
@@ -251,21 +245,15 @@ static void doMaskedAtomicBinOpExpansion(
251
245
Register AddrReg = MI.getOperand (2 ).getReg ();
252
246
Register IncrReg = MI.getOperand (3 ).getReg ();
253
247
Register MaskReg = MI.getOperand (4 ).getReg ();
254
- AtomicOrdering Ordering =
255
- static_cast <AtomicOrdering>(MI.getOperand (5 ).getImm ());
256
248
257
249
// .loop:
258
- // if(Ordering != AtomicOrdering::Monotonic)
259
- // dbar 0
260
250
// ll.w destreg, (alignedaddr)
261
251
// binop scratch, destreg, incr
262
252
// xor scratch, destreg, scratch
263
253
// and scratch, scratch, masktargetdata
264
254
// xor scratch, destreg, scratch
265
255
// sc.w scratch, scratch, (alignedaddr)
266
256
// beqz scratch, loop
267
- if (Ordering != AtomicOrdering::Monotonic)
268
- BuildMI (LoopMBB, DL, TII->get (LoongArch::DBAR)).addImm (0 );
269
257
BuildMI (LoopMBB, DL, TII->get (LoongArch::LL_W), DestReg)
270
258
.addReg (AddrReg)
271
259
.addImm (0 );
@@ -372,23 +360,20 @@ bool LoongArchExpandAtomicPseudo::expandAtomicMinMaxOp(
372
360
auto LoopHeadMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
373
361
auto LoopIfBodyMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
374
362
auto LoopTailMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
375
- auto TailMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
376
363
auto DoneMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
377
364
378
365
// Insert new MBBs.
379
366
MF->insert (++MBB.getIterator (), LoopHeadMBB);
380
367
MF->insert (++LoopHeadMBB->getIterator (), LoopIfBodyMBB);
381
368
MF->insert (++LoopIfBodyMBB->getIterator (), LoopTailMBB);
382
- MF->insert (++LoopTailMBB->getIterator (), TailMBB);
383
- MF->insert (++TailMBB->getIterator (), DoneMBB);
369
+ MF->insert (++LoopTailMBB->getIterator (), DoneMBB);
384
370
385
371
// Set up successors and transfer remaining instructions to DoneMBB.
386
372
LoopHeadMBB->addSuccessor (LoopIfBodyMBB);
387
373
LoopHeadMBB->addSuccessor (LoopTailMBB);
388
374
LoopIfBodyMBB->addSuccessor (LoopTailMBB);
389
375
LoopTailMBB->addSuccessor (LoopHeadMBB);
390
- LoopTailMBB->addSuccessor (TailMBB);
391
- TailMBB->addSuccessor (DoneMBB);
376
+ LoopTailMBB->addSuccessor (DoneMBB);
392
377
DoneMBB->splice (DoneMBB->end (), &MBB, MI, MBB.end ());
393
378
DoneMBB->transferSuccessors (&MBB);
394
379
MBB.addSuccessor (LoopHeadMBB);
@@ -402,11 +387,9 @@ bool LoongArchExpandAtomicPseudo::expandAtomicMinMaxOp(
402
387
403
388
//
404
389
// .loophead:
405
- // dbar 0
406
390
// ll.w destreg, (alignedaddr)
407
391
// and scratch2, destreg, mask
408
392
// move scratch1, destreg
409
- BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::DBAR)).addImm (0 );
410
393
BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::LL_W), DestReg)
411
394
.addReg (AddrReg)
412
395
.addImm (0 );
@@ -463,7 +446,6 @@ bool LoongArchExpandAtomicPseudo::expandAtomicMinMaxOp(
463
446
// .looptail:
464
447
// sc.w scratch1, scratch1, (addr)
465
448
// beqz scratch1, loop
466
- // dbar 0x700
467
449
BuildMI (LoopTailMBB, DL, TII->get (LoongArch::SC_W), Scratch1Reg)
468
450
.addReg (Scratch1Reg)
469
451
.addReg (AddrReg)
@@ -472,18 +454,13 @@ bool LoongArchExpandAtomicPseudo::expandAtomicMinMaxOp(
472
454
.addReg (Scratch1Reg)
473
455
.addMBB (LoopHeadMBB);
474
456
475
- // .tail:
476
- // dbar 0x700
477
- BuildMI (TailMBB, DL, TII->get (LoongArch::DBAR)).addImm (0x700 );
478
-
479
457
NextMBBI = MBB.end ();
480
458
MI.eraseFromParent ();
481
459
482
460
LivePhysRegs LiveRegs;
483
461
computeAndAddLiveIns (LiveRegs, *LoopHeadMBB);
484
462
computeAndAddLiveIns (LiveRegs, *LoopIfBodyMBB);
485
463
computeAndAddLiveIns (LiveRegs, *LoopTailMBB);
486
- computeAndAddLiveIns (LiveRegs, *TailMBB);
487
464
computeAndAddLiveIns (LiveRegs, *DoneMBB);
488
465
489
466
return true ;
@@ -535,12 +512,10 @@ bool LoongArchExpandAtomicPseudo::expandAtomicCmpXchg(
535
512
.addReg (CmpValReg)
536
513
.addMBB (TailMBB);
537
514
// .looptail:
538
- // dbar 0
539
515
// move scratch, newval
540
516
// sc.[w|d] scratch, scratch, (addr)
541
517
// beqz scratch, loophead
542
518
// b done
543
- BuildMI (LoopTailMBB, DL, TII->get (LoongArch::DBAR)).addImm (0 );
544
519
BuildMI (LoopTailMBB, DL, TII->get (LoongArch::OR), ScratchReg)
545
520
.addReg (NewValReg)
546
521
.addReg (LoongArch::R0);
@@ -573,13 +548,11 @@ bool LoongArchExpandAtomicPseudo::expandAtomicCmpXchg(
573
548
.addMBB (TailMBB);
574
549
575
550
// .looptail:
576
- // dbar 0
577
551
// andn scratch, dest, mask
578
552
// or scratch, scratch, newval
579
553
// sc.[w|d] scratch, scratch, (addr)
580
554
// beqz scratch, loophead
581
555
// b done
582
- BuildMI (LoopTailMBB, DL, TII->get (LoongArch::DBAR)).addImm (0 );
583
556
BuildMI (LoopTailMBB, DL, TII->get (LoongArch::ANDN), ScratchReg)
584
557
.addReg (DestReg)
585
558
.addReg (MaskReg);
@@ -598,9 +571,24 @@ bool LoongArchExpandAtomicPseudo::expandAtomicCmpXchg(
598
571
BuildMI (LoopTailMBB, DL, TII->get (LoongArch::B)).addMBB (DoneMBB);
599
572
}
600
573
574
+ AtomicOrdering Ordering =
575
+ static_cast <AtomicOrdering>(MI.getOperand (IsMasked ? 6 : 5 ).getImm ());
576
+ int hint;
577
+
578
+ switch (Ordering) {
579
+ case AtomicOrdering::Acquire:
580
+ case AtomicOrdering::AcquireRelease:
581
+ case AtomicOrdering::SequentiallyConsistent:
582
+ // TODO: acquire
583
+ hint = 0 ;
584
+ break ;
585
+ default :
586
+ hint = 0x700 ;
587
+ }
588
+
601
589
// .tail:
602
- // dbar 0x700
603
- BuildMI (TailMBB, DL, TII->get (LoongArch::DBAR)).addImm (0x700 );
590
+ // dbar 0x700 | acquire
591
+ BuildMI (TailMBB, DL, TII->get (LoongArch::DBAR)).addImm (hint );
604
592
605
593
NextMBBI = MBB.end ();
606
594
MI.eraseFromParent ();
0 commit comments