Skip to content

Commit 62125c9

Browse files
committed
cmd/compile: remove branch in atomicCas{32,64} sequence on ppc64x.
This removes one of the branches in the atomicCas sequences for ppc64/ppc64le. Change-Id: Ibb46fbfdce052889c69e3da298f28caff540d99b Reviewed-on: https://go-review.googlesource.com/c/go/+/422014 Reviewed-by: Archana Ravindar <[email protected]> Reviewed-by: David Chase <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Lynn Boger <[email protected]> Reviewed-by: Cherry Mui <[email protected]> Reviewed-by: Paul Murphy <[email protected]>
1 parent afd792f commit 62125c9

File tree

1 file changed

+19
-25
lines changed
  • src/cmd/compile/internal/ppc64

1 file changed

+19
-25
lines changed

src/cmd/compile/internal/ppc64/ssa.go

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -357,18 +357,16 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
357357

358358
case ssa.OpPPC64LoweredAtomicCas64,
359359
ssa.OpPPC64LoweredAtomicCas32:
360+
// MOVD $0, Rout
360361
// LWSYNC
361362
// loop:
362363
// LDAR (Rarg0), MutexHint, Rtmp
363364
// CMP Rarg1, Rtmp
364-
// BNE fail
365+
// BNE end
365366
// STDCCC Rarg2, (Rarg0)
366367
// BNE loop
367368
// LWSYNC // Only for sequential consistency; not required in CasRel.
368369
// MOVD $1, Rout
369-
// BR end
370-
// fail:
371-
// MOVD $0, Rout
372370
// end:
373371
ld := ppc64.ALDAR
374372
st := ppc64.ASTDCCC
@@ -382,28 +380,34 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
382380
r1 := v.Args[1].Reg()
383381
r2 := v.Args[2].Reg()
384382
out := v.Reg0()
383+
// Initialize return value to false
384+
p := s.Prog(ppc64.AMOVD)
385+
p.From.Type = obj.TYPE_CONST
386+
p.From.Offset = 0
387+
p.To.Type = obj.TYPE_REG
388+
p.To.Reg = out
385389
// LWSYNC - Assuming shared data not write-through-required nor
386390
// caching-inhibited. See Appendix B.2.2.2 in the ISA 2.07b.
387391
plwsync1 := s.Prog(ppc64.ALWSYNC)
388392
plwsync1.To.Type = obj.TYPE_NONE
389393
// LDAR or LWAR
390-
p := s.Prog(ld)
391-
p.From.Type = obj.TYPE_MEM
392-
p.From.Reg = r0
393-
p.To.Type = obj.TYPE_REG
394-
p.To.Reg = ppc64.REGTMP
394+
p0 := s.Prog(ld)
395+
p0.From.Type = obj.TYPE_MEM
396+
p0.From.Reg = r0
397+
p0.To.Type = obj.TYPE_REG
398+
p0.To.Reg = ppc64.REGTMP
395399
// If it is a Compare-and-Swap-Release operation, set the EH field with
396400
// the release hint.
397401
if v.AuxInt == 0 {
398-
p.SetFrom3Const(0)
402+
p0.SetFrom3Const(0)
399403
}
400404
// CMP reg1,reg2
401405
p1 := s.Prog(cmp)
402406
p1.From.Type = obj.TYPE_REG
403407
p1.From.Reg = r1
404408
p1.To.Reg = ppc64.REGTMP
405409
p1.To.Type = obj.TYPE_REG
406-
// BNE cas_fail
410+
// BNE done with return value = false
407411
p2 := s.Prog(ppc64.ABNE)
408412
p2.To.Type = obj.TYPE_BRANCH
409413
// STDCCC or STWCCC
@@ -415,33 +419,23 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
415419
// BNE retry
416420
p4 := s.Prog(ppc64.ABNE)
417421
p4.To.Type = obj.TYPE_BRANCH
418-
p4.To.SetTarget(p)
422+
p4.To.SetTarget(p0)
419423
// LWSYNC - Assuming shared data not write-through-required nor
420424
// caching-inhibited. See Appendix B.2.1.1 in the ISA 2.07b.
421425
// If the operation is a CAS-Release, then synchronization is not necessary.
422426
if v.AuxInt != 0 {
423427
plwsync2 := s.Prog(ppc64.ALWSYNC)
424428
plwsync2.To.Type = obj.TYPE_NONE
425429
}
426-
// return true
430+
// return value true
427431
p5 := s.Prog(ppc64.AMOVD)
428432
p5.From.Type = obj.TYPE_CONST
429433
p5.From.Offset = 1
430434
p5.To.Type = obj.TYPE_REG
431435
p5.To.Reg = out
432-
// BR done
433-
p6 := s.Prog(obj.AJMP)
434-
p6.To.Type = obj.TYPE_BRANCH
435-
// return false
436-
p7 := s.Prog(ppc64.AMOVD)
437-
p7.From.Type = obj.TYPE_CONST
438-
p7.From.Offset = 0
439-
p7.To.Type = obj.TYPE_REG
440-
p7.To.Reg = out
441-
p2.To.SetTarget(p7)
442436
// done (label)
443-
p8 := s.Prog(obj.ANOP)
444-
p6.To.SetTarget(p8)
437+
p6 := s.Prog(obj.ANOP)
438+
p2.To.SetTarget(p6)
445439

446440
case ssa.OpPPC64LoweredPubBarrier:
447441
// LWSYNC

0 commit comments

Comments
 (0)