Skip to content

Commit 5b9ff11

Browse files
committed
cmd/compile: ppc64le working, not optimized enough
This time with the cherry-pick from the proper patch of the old CL. Stack size increased. Corrected NaN-comparison glitches. Marked g register as clobbered by calls. Fixed shared libraries. live_ssa.go still disabled because of differences. Presumably turning on more optimization will fix both the stack size and the live_ssa.go glitches. Enhanced debugging output for shared libs test. Rebased onto master. Updates #16010. Change-Id: I40864faf1ef32c118fb141b7ef8e854498e6b2c4 Reviewed-on: https://go-review.googlesource.com/27159 Run-TryBot: David Chase <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Cherry Zhang <[email protected]>
1 parent dea6dab commit 5b9ff11

File tree

17 files changed

+121
-128
lines changed

17 files changed

+121
-128
lines changed

misc/cgo/testshared/shared_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ func testMain(m *testing.M) (int, error) {
9797
if gorootInstallDir == "" {
9898
return 0, errors.New("could not create temporary directory after 10000 tries")
9999
}
100+
if testing.Verbose() {
101+
fmt.Printf("+ mkdir -p %s\n", gorootInstallDir)
102+
}
100103
defer os.RemoveAll(gorootInstallDir)
101104

102105
// Some tests need to edit the source in GOPATH, so copy this directory to a
@@ -105,27 +108,42 @@ func testMain(m *testing.M) (int, error) {
105108
if err != nil {
106109
return 0, fmt.Errorf("TempDir failed: %v", err)
107110
}
111+
if testing.Verbose() {
112+
fmt.Printf("+ mkdir -p %s\n", scratchDir)
113+
}
108114
defer os.RemoveAll(scratchDir)
109115
err = filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
110116
scratchPath := filepath.Join(scratchDir, path)
111117
if info.IsDir() {
112118
if path == "." {
113119
return nil
114120
}
121+
if testing.Verbose() {
122+
fmt.Printf("+ mkdir -p %s\n", scratchPath)
123+
}
115124
return os.Mkdir(scratchPath, info.Mode())
116125
} else {
117126
fromBytes, err := ioutil.ReadFile(path)
118127
if err != nil {
119128
return err
120129
}
130+
if testing.Verbose() {
131+
fmt.Printf("+ cp %s %s\n", path, scratchPath)
132+
}
121133
return ioutil.WriteFile(scratchPath, fromBytes, info.Mode())
122134
}
123135
})
124136
if err != nil {
125137
return 0, fmt.Errorf("walk failed: %v", err)
126138
}
127139
os.Setenv("GOPATH", scratchDir)
140+
if testing.Verbose() {
141+
fmt.Printf("+ export GOPATH=%s\n", scratchDir)
142+
}
128143
myContext.GOPATH = scratchDir
144+
if testing.Verbose() {
145+
fmt.Printf("+ cd %s\n", scratchDir)
146+
}
129147
os.Chdir(scratchDir)
130148

131149
// All tests depend on runtime being built into a shared library. Because

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func shouldssa(fn *Node) bool {
4040
if os.Getenv("SSATEST") == "" {
4141
return false
4242
}
43-
case "amd64", "amd64p32", "arm", "386", "arm64":
43+
case "amd64", "amd64p32", "arm", "386", "arm64", "ppc64le":
4444
// Generally available.
4545
}
4646
if !ssaEnabled {

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

Lines changed: 67 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -747,9 +747,27 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
747747
// This is different from obj.ANOP, which is a virtual no-op
748748
// that doesn't make it into the instruction stream.
749749
// PPC64 is unusual because TWO nops are required
750-
// (see gc/cgen.go, gc/plive.go)
751-
ginsnop()
750+
// (see gc/cgen.go, gc/plive.go -- copy of comment below)
751+
//
752+
// On ppc64, when compiling Go into position
753+
// independent code on ppc64le we insert an
754+
// instruction to reload the TOC pointer from the
755+
// stack as well. See the long comment near
756+
// jmpdefer in runtime/asm_ppc64.s for why.
757+
// If the MOVD is not needed, insert a hardware NOP
758+
// so that the same number of instructions are used
759+
// on ppc64 in both shared and non-shared modes.
752760
ginsnop()
761+
if gc.Ctxt.Flag_shared {
762+
p := gc.Prog(ppc64.AMOVD)
763+
p.From.Type = obj.TYPE_MEM
764+
p.From.Offset = 24
765+
p.From.Reg = ppc64.REGSP
766+
p.To.Type = obj.TYPE_REG
767+
p.To.Reg = ppc64.REG_R2
768+
} else {
769+
ginsnop()
770+
}
753771
}
754772
p := gc.Prog(obj.ACALL)
755773
p.To.Type = obj.TYPE_MEM
@@ -758,13 +776,48 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
758776
if gc.Maxarg < v.AuxInt {
759777
gc.Maxarg = v.AuxInt
760778
}
761-
case ssa.OpPPC64CALLclosure:
762-
p := gc.Prog(obj.ACALL)
763-
p.To.Type = obj.TYPE_MEM
764-
p.To.Reg = gc.SSARegNum(v.Args[0])
779+
780+
case ssa.OpPPC64CALLclosure, ssa.OpPPC64CALLinter:
781+
p := gc.Prog(ppc64.AMOVD)
782+
p.From.Type = obj.TYPE_REG
783+
p.From.Reg = gc.SSARegNum(v.Args[0])
784+
p.To.Type = obj.TYPE_REG
785+
p.To.Reg = ppc64.REG_CTR
786+
787+
if gc.Ctxt.Flag_shared && p.From.Reg != ppc64.REG_R12 {
788+
// Make sure function pointer is in R12 as well when
789+
// compiling Go into PIC.
790+
// TODO(mwhudson): it would obviously be better to
791+
// change the register allocation to put the value in
792+
// R12 already, but I don't know how to do that.
793+
// TODO: We have the technology now to implement TODO above.
794+
q := gc.Prog(ppc64.AMOVD)
795+
q.From = p.From
796+
q.To.Type = obj.TYPE_REG
797+
q.To.Reg = ppc64.REG_R12
798+
}
799+
800+
pp := gc.Prog(obj.ACALL)
801+
pp.To.Type = obj.TYPE_REG
802+
pp.To.Reg = ppc64.REG_CTR
803+
804+
if gc.Ctxt.Flag_shared {
805+
// When compiling Go into PIC, the function we just
806+
// called via pointer might have been implemented in
807+
// a separate module and so overwritten the TOC
808+
// pointer in R2; reload it.
809+
q := gc.Prog(ppc64.AMOVD)
810+
q.From.Type = obj.TYPE_MEM
811+
q.From.Offset = 24
812+
q.From.Reg = ppc64.REGSP
813+
q.To.Type = obj.TYPE_REG
814+
q.To.Reg = ppc64.REG_R2
815+
}
816+
765817
if gc.Maxarg < v.AuxInt {
766818
gc.Maxarg = v.AuxInt
767819
}
820+
768821
case ssa.OpPPC64CALLdefer:
769822
p := gc.Prog(obj.ACALL)
770823
p.To.Type = obj.TYPE_MEM
@@ -781,14 +834,6 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
781834
if gc.Maxarg < v.AuxInt {
782835
gc.Maxarg = v.AuxInt
783836
}
784-
case ssa.OpPPC64CALLinter:
785-
p := gc.Prog(obj.ACALL)
786-
p.To.Type = obj.TYPE_MEM
787-
p.To.Reg = gc.SSARegNum(v.Args[0])
788-
if gc.Maxarg < v.AuxInt {
789-
gc.Maxarg = v.AuxInt
790-
}
791-
792837
case ssa.OpVarDef:
793838
gc.Gvardef(v.Aux.(*gc.Node))
794839
case ssa.OpVarKill:
@@ -902,7 +947,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
902947

903948
var blockJump = [...]struct {
904949
asm, invasm obj.As
905-
asmeq, invasmeq bool
950+
asmeq, invasmun bool
906951
}{
907952
ssa.BlockPPC64EQ: {ppc64.ABEQ, ppc64.ABNE, false, false},
908953
ssa.BlockPPC64NE: {ppc64.ABNE, ppc64.ABEQ, false, false},
@@ -913,10 +958,10 @@ var blockJump = [...]struct {
913958
ssa.BlockPPC64GT: {ppc64.ABGT, ppc64.ABLE, false, false},
914959

915960
// TODO: need to work FP comparisons into block jumps
916-
ssa.BlockPPC64FLT: {ppc64.ABLT, ppc64.ABGT, false, true},
917-
ssa.BlockPPC64FGE: {ppc64.ABGT, ppc64.ABLT, true, false},
918-
ssa.BlockPPC64FLE: {ppc64.ABLT, ppc64.ABGT, true, false},
919-
ssa.BlockPPC64FGT: {ppc64.ABGT, ppc64.ABLT, false, true},
961+
ssa.BlockPPC64FLT: {ppc64.ABLT, ppc64.ABGE, false, false},
962+
ssa.BlockPPC64FGE: {ppc64.ABGT, ppc64.ABLT, true, true}, // GE = GT or EQ; !GE = LT or UN
963+
ssa.BlockPPC64FLE: {ppc64.ABLT, ppc64.ABGT, true, true}, // LE = LT or EQ; !LE = GT or UN
964+
ssa.BlockPPC64FGT: {ppc64.ABGT, ppc64.ABLE, false, false},
920965
}
921966

922967
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
@@ -973,9 +1018,9 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
9731018
likely *= -1
9741019
p.To.Type = obj.TYPE_BRANCH
9751020
s.Branches = append(s.Branches, gc.Branch{P: p, B: b.Succs[1].Block()})
976-
if jmp.invasmeq {
977-
// TODO: The second branch is probably predict-not-taken since it is for FP equality
978-
q := gc.Prog(ppc64.ABEQ)
1021+
if jmp.invasmun {
1022+
// TODO: The second branch is probably predict-not-taken since it is for FP unordered
1023+
q := gc.Prog(ppc64.ABVS)
9791024
q.To.Type = obj.TYPE_BRANCH
9801025
s.Branches = append(s.Branches, gc.Branch{P: q, B: b.Succs[1].Block()})
9811026
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ func (c *Config) Set387(b bool) {
254254

255255
func (c *Config) Frontend() Frontend { return c.fe }
256256
func (c *Config) SparsePhiCutoff() uint64 { return c.sparsePhiCutoff }
257+
func (c *Config) Ctxt() *obj.Link { return c.ctxt }
257258

258259
// NewFunc returns a new, empty function object.
259260
// Caller must call f.Free() before calling NewFunc again.

src/cmd/compile/internal/ssa/gen/PPC64.rules

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,10 +380,11 @@
380380
(GreaterThan (InvertFlags x)) -> (LessThan x)
381381
(LessEqual (InvertFlags x)) -> (GreaterEqual x)
382382
(GreaterEqual (InvertFlags x)) -> (LessEqual x)
383-
(FLessThan (InvertFlags x)) -> (FGreaterThan x)
384-
(FGreaterThan (InvertFlags x)) -> (FLessThan x)
385-
(FLessEqual (InvertFlags x)) -> (FGreaterEqual x)
386-
(FGreaterEqual (InvertFlags x)) -> (FLessEqual x)
383+
384+
// (FLessThan (InvertFlags x)) -> (FGreaterThan x)
385+
// (FGreaterThan (InvertFlags x)) -> (FLessThan x)
386+
// (FLessEqual (InvertFlags x)) -> (FGreaterEqual x)
387+
// (FGreaterEqual (InvertFlags x)) -> (FLessEqual x)
387388

388389

389390
// Lowering loads

src/cmd/compile/internal/ssa/gen/PPC64Ops.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func init() {
124124
fp = buildReg("F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26")
125125
sp = buildReg("SP")
126126
sb = buildReg("SB")
127-
// gr = buildReg("g")
127+
gr = buildReg("g")
128128
// cr = buildReg("CR")
129129
// ctr = buildReg("CTR")
130130
// lr = buildReg("LR")
@@ -148,7 +148,7 @@ func init() {
148148
fp2cr = regInfo{inputs: []regMask{fp, fp}}
149149
fpload = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{fp}}
150150
fpstore = regInfo{inputs: []regMask{gp | sp | sb, fp}}
151-
callerSave = regMask(gp | fp)
151+
callerSave = regMask(gp | fp | gr)
152152
)
153153
ops := []opData{
154154
{name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true}, // arg0 + arg1

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13247,7 +13247,7 @@ var opcodeTable = [...]opInfo{
1324713247
argLen: 1,
1324813248
clobberFlags: true,
1324913249
reg: regInfo{
13250-
clobbers: 288230372393611260, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
13250+
clobbers: 288230372930482172, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 g F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
1325113251
},
1325213252
},
1325313253
{
@@ -13260,7 +13260,7 @@ var opcodeTable = [...]opInfo{
1326013260
{1, 1024}, // R11
1326113261
{0, 536866813}, // SP R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
1326213262
},
13263-
clobbers: 288230372393611260, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
13263+
clobbers: 288230372930482172, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 g F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
1326413264
},
1326513265
},
1326613266
{
@@ -13269,7 +13269,7 @@ var opcodeTable = [...]opInfo{
1326913269
argLen: 1,
1327013270
clobberFlags: true,
1327113271
reg: regInfo{
13272-
clobbers: 288230372393611260, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
13272+
clobbers: 288230372930482172, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 g F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
1327313273
},
1327413274
},
1327513275
{
@@ -13278,7 +13278,7 @@ var opcodeTable = [...]opInfo{
1327813278
argLen: 1,
1327913279
clobberFlags: true,
1328013280
reg: regInfo{
13281-
clobbers: 288230372393611260, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
13281+
clobbers: 288230372930482172, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 g F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
1328213282
},
1328313283
},
1328413284
{
@@ -13290,7 +13290,7 @@ var opcodeTable = [...]opInfo{
1329013290
inputs: []inputInfo{
1329113291
{0, 536866812}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
1329213292
},
13293-
clobbers: 288230372393611260, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
13293+
clobbers: 288230372930482172, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 g F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
1329413294
},
1329513295
},
1329613296
{

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,12 +480,20 @@ func (s *regAllocState) init(f *Func) {
480480
if s.f.Config.ctxt.Framepointer_enabled && s.f.Config.FPReg >= 0 {
481481
s.allocatable &^= 1 << uint(s.f.Config.FPReg)
482482
}
483+
if s.f.Config.ctxt.Flag_shared {
484+
switch s.f.Config.arch {
485+
case "ppc64le": // R2 already reserved.
486+
s.allocatable &^= 1 << 11 // R12 -- R0 is skipped in PPC64Ops.go
487+
}
488+
}
483489
if s.f.Config.ctxt.Flag_dynlink {
484490
switch s.f.Config.arch {
485491
case "amd64":
486492
s.allocatable &^= 1 << 15 // R15
487493
case "arm":
488494
s.allocatable &^= 1 << 9 // R9
495+
case "ppc64le": // R2 already reserved.
496+
s.allocatable &^= 1 << 11 // R12 -- R0 is skipped in PPC64Ops.go
489497
case "arm64":
490498
// nothing to do?
491499
case "386":

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

Lines changed: 0 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -350,14 +350,6 @@ func rewriteValuePPC64(v *Value, config *Config) bool {
350350
return rewriteValuePPC64_OpPPC64CMPconst(v, config)
351351
case OpPPC64Equal:
352352
return rewriteValuePPC64_OpPPC64Equal(v, config)
353-
case OpPPC64FGreaterEqual:
354-
return rewriteValuePPC64_OpPPC64FGreaterEqual(v, config)
355-
case OpPPC64FGreaterThan:
356-
return rewriteValuePPC64_OpPPC64FGreaterThan(v, config)
357-
case OpPPC64FLessEqual:
358-
return rewriteValuePPC64_OpPPC64FLessEqual(v, config)
359-
case OpPPC64FLessThan:
360-
return rewriteValuePPC64_OpPPC64FLessThan(v, config)
361353
case OpPPC64GreaterEqual:
362354
return rewriteValuePPC64_OpPPC64GreaterEqual(v, config)
363355
case OpPPC64GreaterThan:
@@ -4178,78 +4170,6 @@ func rewriteValuePPC64_OpPPC64Equal(v *Value, config *Config) bool {
41784170
}
41794171
return false
41804172
}
4181-
func rewriteValuePPC64_OpPPC64FGreaterEqual(v *Value, config *Config) bool {
4182-
b := v.Block
4183-
_ = b
4184-
// match: (FGreaterEqual (InvertFlags x))
4185-
// cond:
4186-
// result: (FLessEqual x)
4187-
for {
4188-
v_0 := v.Args[0]
4189-
if v_0.Op != OpPPC64InvertFlags {
4190-
break
4191-
}
4192-
x := v_0.Args[0]
4193-
v.reset(OpPPC64FLessEqual)
4194-
v.AddArg(x)
4195-
return true
4196-
}
4197-
return false
4198-
}
4199-
func rewriteValuePPC64_OpPPC64FGreaterThan(v *Value, config *Config) bool {
4200-
b := v.Block
4201-
_ = b
4202-
// match: (FGreaterThan (InvertFlags x))
4203-
// cond:
4204-
// result: (FLessThan x)
4205-
for {
4206-
v_0 := v.Args[0]
4207-
if v_0.Op != OpPPC64InvertFlags {
4208-
break
4209-
}
4210-
x := v_0.Args[0]
4211-
v.reset(OpPPC64FLessThan)
4212-
v.AddArg(x)
4213-
return true
4214-
}
4215-
return false
4216-
}
4217-
func rewriteValuePPC64_OpPPC64FLessEqual(v *Value, config *Config) bool {
4218-
b := v.Block
4219-
_ = b
4220-
// match: (FLessEqual (InvertFlags x))
4221-
// cond:
4222-
// result: (FGreaterEqual x)
4223-
for {
4224-
v_0 := v.Args[0]
4225-
if v_0.Op != OpPPC64InvertFlags {
4226-
break
4227-
}
4228-
x := v_0.Args[0]
4229-
v.reset(OpPPC64FGreaterEqual)
4230-
v.AddArg(x)
4231-
return true
4232-
}
4233-
return false
4234-
}
4235-
func rewriteValuePPC64_OpPPC64FLessThan(v *Value, config *Config) bool {
4236-
b := v.Block
4237-
_ = b
4238-
// match: (FLessThan (InvertFlags x))
4239-
// cond:
4240-
// result: (FGreaterThan x)
4241-
for {
4242-
v_0 := v.Args[0]
4243-
if v_0.Op != OpPPC64InvertFlags {
4244-
break
4245-
}
4246-
x := v_0.Args[0]
4247-
v.reset(OpPPC64FGreaterThan)
4248-
v.AddArg(x)
4249-
return true
4250-
}
4251-
return false
4252-
}
42534173
func rewriteValuePPC64_OpPPC64GreaterEqual(v *Value, config *Config) bool {
42544174
b := v.Block
42554175
_ = b

0 commit comments

Comments
 (0)