@@ -357,18 +357,16 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
357
357
358
358
case ssa .OpPPC64LoweredAtomicCas64 ,
359
359
ssa .OpPPC64LoweredAtomicCas32 :
360
+ // MOVD $0, Rout
360
361
// LWSYNC
361
362
// loop:
362
363
// LDAR (Rarg0), MutexHint, Rtmp
363
364
// CMP Rarg1, Rtmp
364
- // BNE fail
365
+ // BNE end
365
366
// STDCCC Rarg2, (Rarg0)
366
367
// BNE loop
367
368
// LWSYNC // Only for sequential consistency; not required in CasRel.
368
369
// MOVD $1, Rout
369
- // BR end
370
- // fail:
371
- // MOVD $0, Rout
372
370
// end:
373
371
ld := ppc64 .ALDAR
374
372
st := ppc64 .ASTDCCC
@@ -382,28 +380,34 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
382
380
r1 := v .Args [1 ].Reg ()
383
381
r2 := v .Args [2 ].Reg ()
384
382
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
385
389
// LWSYNC - Assuming shared data not write-through-required nor
386
390
// caching-inhibited. See Appendix B.2.2.2 in the ISA 2.07b.
387
391
plwsync1 := s .Prog (ppc64 .ALWSYNC )
388
392
plwsync1 .To .Type = obj .TYPE_NONE
389
393
// 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
395
399
// If it is a Compare-and-Swap-Release operation, set the EH field with
396
400
// the release hint.
397
401
if v .AuxInt == 0 {
398
- p .SetFrom3Const (0 )
402
+ p0 .SetFrom3Const (0 )
399
403
}
400
404
// CMP reg1,reg2
401
405
p1 := s .Prog (cmp )
402
406
p1 .From .Type = obj .TYPE_REG
403
407
p1 .From .Reg = r1
404
408
p1 .To .Reg = ppc64 .REGTMP
405
409
p1 .To .Type = obj .TYPE_REG
406
- // BNE cas_fail
410
+ // BNE done with return value = false
407
411
p2 := s .Prog (ppc64 .ABNE )
408
412
p2 .To .Type = obj .TYPE_BRANCH
409
413
// STDCCC or STWCCC
@@ -415,33 +419,23 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
415
419
// BNE retry
416
420
p4 := s .Prog (ppc64 .ABNE )
417
421
p4 .To .Type = obj .TYPE_BRANCH
418
- p4 .To .SetTarget (p )
422
+ p4 .To .SetTarget (p0 )
419
423
// LWSYNC - Assuming shared data not write-through-required nor
420
424
// caching-inhibited. See Appendix B.2.1.1 in the ISA 2.07b.
421
425
// If the operation is a CAS-Release, then synchronization is not necessary.
422
426
if v .AuxInt != 0 {
423
427
plwsync2 := s .Prog (ppc64 .ALWSYNC )
424
428
plwsync2 .To .Type = obj .TYPE_NONE
425
429
}
426
- // return true
430
+ // return value true
427
431
p5 := s .Prog (ppc64 .AMOVD )
428
432
p5 .From .Type = obj .TYPE_CONST
429
433
p5 .From .Offset = 1
430
434
p5 .To .Type = obj .TYPE_REG
431
435
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 )
442
436
// done (label)
443
- p8 := s .Prog (obj .ANOP )
444
- p6 .To .SetTarget (p8 )
437
+ p6 := s .Prog (obj .ANOP )
438
+ p2 .To .SetTarget (p6 )
445
439
446
440
case ssa .OpPPC64LoweredPubBarrier :
447
441
// LWSYNC
0 commit comments