Skip to content

Commit 17ae587

Browse files
committed
cmd/compile: use addressing modes pass on s390x
Add s390x support to the addressing modes pass. This significantly reduces the number of rules we need to have to handle indexed addressing modes on s390x. There are some changes introduced with the new approach. Notably pointer calculations of the form '(ADD x (ADDconst y [c]))' won't get fully merged into address fields right now, the constant offset will remain separate. That is a relatively minor issue though. file before after Δ % addr2line 4120904 4120960 +56 +0.001% api 4944005 4948765 +4760 +0.096% asm 4977431 4984335 +6904 +0.139% buildid 2683760 2683504 -256 -0.010% cgo 4557976 4558408 +432 +0.009% compile 19103577 18916634 -186943 -0.979% cover 4883694 4885054 +1360 +0.028% dist 3545177 3553689 +8512 +0.240% doc 3921766 3921518 -248 -0.006% fix 3295254 3302182 +6928 +0.210% link 6539222 6540286 +1064 +0.016% nm 4105085 4107757 +2672 +0.065% objdump 4546015 4545439 -576 -0.013% pack 2416661 2415485 -1176 -0.049% pprof 13267433 13265489 -1944 -0.015% test2json 2762180 2761996 -184 -0.007% trace 10145090 10135626 -9464 -0.093% vet 6772946 6771738 -1208 -0.018% total 106588176 106418865 -169311 -0.159% Fixes #37891. Change-Id: If60d51f31eb2806b011432a6519951b8668cb42f Reviewed-on: https://go-review.googlesource.com/c/go/+/250958 Run-TryBot: Michael Munday <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Keith Randall <[email protected]>
1 parent 73a5c37 commit 17ae587

File tree

3 files changed

+145
-4127
lines changed

3 files changed

+145
-4127
lines changed

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

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ package ssa
77
// addressingModes combines address calculations into memory operations
88
// that can perform complicated addressing modes.
99
func addressingModes(f *Func) {
10+
isInImmediateRange := is32Bit
1011
switch f.Config.arch {
1112
default:
1213
// Most architectures can't do this.
1314
return
1415
case "amd64", "386":
15-
// TODO: s390x?
16+
case "s390x":
17+
isInImmediateRange = is20Bit
1618
}
1719

1820
var tmp []*Value
@@ -40,15 +42,15 @@ func addressingModes(f *Func) {
4042
switch [2]auxType{opcodeTable[v.Op].auxType, opcodeTable[p.Op].auxType} {
4143
case [2]auxType{auxSymOff, auxInt32}:
4244
// TODO: introduce auxSymOff32
43-
if !is32Bit(v.AuxInt + p.AuxInt) {
45+
if !isInImmediateRange(v.AuxInt + p.AuxInt) {
4446
continue
4547
}
4648
v.AuxInt += p.AuxInt
4749
case [2]auxType{auxSymOff, auxSymOff}:
4850
if v.Aux != nil && p.Aux != nil {
4951
continue
5052
}
51-
if !is32Bit(v.AuxInt + p.AuxInt) {
53+
if !isInImmediateRange(v.AuxInt + p.AuxInt) {
5254
continue
5355
}
5456
if p.Aux != nil {
@@ -398,4 +400,61 @@ var combine = map[[2]Op]Op{
398400
[2]Op{Op386ANDLconstmodify, Op386LEAL4}: Op386ANDLconstmodifyidx4,
399401
[2]Op{Op386ORLconstmodify, Op386LEAL4}: Op386ORLconstmodifyidx4,
400402
[2]Op{Op386XORLconstmodify, Op386LEAL4}: Op386XORLconstmodifyidx4,
403+
404+
// s390x
405+
[2]Op{OpS390XMOVDload, OpS390XADD}: OpS390XMOVDloadidx,
406+
[2]Op{OpS390XMOVWload, OpS390XADD}: OpS390XMOVWloadidx,
407+
[2]Op{OpS390XMOVHload, OpS390XADD}: OpS390XMOVHloadidx,
408+
[2]Op{OpS390XMOVBload, OpS390XADD}: OpS390XMOVBloadidx,
409+
410+
[2]Op{OpS390XMOVWZload, OpS390XADD}: OpS390XMOVWZloadidx,
411+
[2]Op{OpS390XMOVHZload, OpS390XADD}: OpS390XMOVHZloadidx,
412+
[2]Op{OpS390XMOVBZload, OpS390XADD}: OpS390XMOVBZloadidx,
413+
414+
[2]Op{OpS390XMOVDBRload, OpS390XADD}: OpS390XMOVDBRloadidx,
415+
[2]Op{OpS390XMOVWBRload, OpS390XADD}: OpS390XMOVWBRloadidx,
416+
[2]Op{OpS390XMOVHBRload, OpS390XADD}: OpS390XMOVHBRloadidx,
417+
418+
[2]Op{OpS390XFMOVDload, OpS390XADD}: OpS390XFMOVDloadidx,
419+
[2]Op{OpS390XFMOVSload, OpS390XADD}: OpS390XFMOVSloadidx,
420+
421+
[2]Op{OpS390XMOVDstore, OpS390XADD}: OpS390XMOVDstoreidx,
422+
[2]Op{OpS390XMOVWstore, OpS390XADD}: OpS390XMOVWstoreidx,
423+
[2]Op{OpS390XMOVHstore, OpS390XADD}: OpS390XMOVHstoreidx,
424+
[2]Op{OpS390XMOVBstore, OpS390XADD}: OpS390XMOVBstoreidx,
425+
426+
[2]Op{OpS390XMOVDBRstore, OpS390XADD}: OpS390XMOVDBRstoreidx,
427+
[2]Op{OpS390XMOVWBRstore, OpS390XADD}: OpS390XMOVWBRstoreidx,
428+
[2]Op{OpS390XMOVHBRstore, OpS390XADD}: OpS390XMOVHBRstoreidx,
429+
430+
[2]Op{OpS390XFMOVDstore, OpS390XADD}: OpS390XFMOVDstoreidx,
431+
[2]Op{OpS390XFMOVSstore, OpS390XADD}: OpS390XFMOVSstoreidx,
432+
433+
[2]Op{OpS390XMOVDload, OpS390XMOVDaddridx}: OpS390XMOVDloadidx,
434+
[2]Op{OpS390XMOVWload, OpS390XMOVDaddridx}: OpS390XMOVWloadidx,
435+
[2]Op{OpS390XMOVHload, OpS390XMOVDaddridx}: OpS390XMOVHloadidx,
436+
[2]Op{OpS390XMOVBload, OpS390XMOVDaddridx}: OpS390XMOVBloadidx,
437+
438+
[2]Op{OpS390XMOVWZload, OpS390XMOVDaddridx}: OpS390XMOVWZloadidx,
439+
[2]Op{OpS390XMOVHZload, OpS390XMOVDaddridx}: OpS390XMOVHZloadidx,
440+
[2]Op{OpS390XMOVBZload, OpS390XMOVDaddridx}: OpS390XMOVBZloadidx,
441+
442+
[2]Op{OpS390XMOVDBRload, OpS390XMOVDaddridx}: OpS390XMOVDBRloadidx,
443+
[2]Op{OpS390XMOVWBRload, OpS390XMOVDaddridx}: OpS390XMOVWBRloadidx,
444+
[2]Op{OpS390XMOVHBRload, OpS390XMOVDaddridx}: OpS390XMOVHBRloadidx,
445+
446+
[2]Op{OpS390XFMOVDload, OpS390XMOVDaddridx}: OpS390XFMOVDloadidx,
447+
[2]Op{OpS390XFMOVSload, OpS390XMOVDaddridx}: OpS390XFMOVSloadidx,
448+
449+
[2]Op{OpS390XMOVDstore, OpS390XMOVDaddridx}: OpS390XMOVDstoreidx,
450+
[2]Op{OpS390XMOVWstore, OpS390XMOVDaddridx}: OpS390XMOVWstoreidx,
451+
[2]Op{OpS390XMOVHstore, OpS390XMOVDaddridx}: OpS390XMOVHstoreidx,
452+
[2]Op{OpS390XMOVBstore, OpS390XMOVDaddridx}: OpS390XMOVBstoreidx,
453+
454+
[2]Op{OpS390XMOVDBRstore, OpS390XMOVDaddridx}: OpS390XMOVDBRstoreidx,
455+
[2]Op{OpS390XMOVWBRstore, OpS390XMOVDaddridx}: OpS390XMOVWBRstoreidx,
456+
[2]Op{OpS390XMOVHBRstore, OpS390XMOVDaddridx}: OpS390XMOVHBRstoreidx,
457+
458+
[2]Op{OpS390XFMOVDstore, OpS390XMOVDaddridx}: OpS390XFMOVDstoreidx,
459+
[2]Op{OpS390XFMOVSstore, OpS390XMOVDaddridx}: OpS390XFMOVSstoreidx,
401460
}

0 commit comments

Comments
 (0)