mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/internal/obj/arm64: fix constant pool size calculation error
The current calculation method of constant pool size is:
c.pool.size = -c.pool.size & (funcAlign - 1)
c.pool.size += uint32(sz)
This doesn't make sense. This CL changes it as:
if q.As == ADWORD {
c.pool.size = roundUp(c.pool.size, 8)
}
c.pool.size += uint32(sz)
which takes into account the padding size generated by aligning DWORD to
8 bytes.
It's unnecessary to set the Pc field in addpool and addpool128 because
the Pc value will be reset in function span7, so remove the related lines.
Change-Id: I5eb8f259be55a6b97fc2c20958b4a602bffa4f88
Reviewed-on: https://go-review.googlesource.com/c/go/+/298609
Reviewed-by: eric fang <eric.fang@arm.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Trust: eric fang <eric.fang@arm.com>
Run-TryBot: eric fang <eric.fang@arm.com>
TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
parent
c819907754
commit
d25476ebb2
1 changed files with 18 additions and 8 deletions
|
|
@ -1200,19 +1200,16 @@ func (c *ctxt7) flushpool(p *obj.Prog, skip int) {
|
||||||
// addpool128 adds a 128-bit constant to literal pool by two consecutive DWORD
|
// addpool128 adds a 128-bit constant to literal pool by two consecutive DWORD
|
||||||
// instructions, the 128-bit constant is formed by ah.Offset<<64+al.Offset.
|
// instructions, the 128-bit constant is formed by ah.Offset<<64+al.Offset.
|
||||||
func (c *ctxt7) addpool128(p *obj.Prog, al, ah *obj.Addr) {
|
func (c *ctxt7) addpool128(p *obj.Prog, al, ah *obj.Addr) {
|
||||||
lit := al.Offset
|
|
||||||
q := c.newprog()
|
q := c.newprog()
|
||||||
q.As = ADWORD
|
q.As = ADWORD
|
||||||
q.To.Type = obj.TYPE_CONST
|
q.To.Type = obj.TYPE_CONST
|
||||||
q.To.Offset = lit
|
q.To.Offset = al.Offset
|
||||||
q.Pc = int64(c.pool.size)
|
|
||||||
|
|
||||||
lit = ah.Offset
|
|
||||||
t := c.newprog()
|
t := c.newprog()
|
||||||
t.As = ADWORD
|
t.As = ADWORD
|
||||||
t.To.Type = obj.TYPE_CONST
|
t.To.Type = obj.TYPE_CONST
|
||||||
t.To.Offset = lit
|
t.To.Offset = ah.Offset
|
||||||
t.Pc = int64(c.pool.size + 8)
|
|
||||||
q.Link = t
|
q.Link = t
|
||||||
|
|
||||||
if c.blitrl == nil {
|
if c.blitrl == nil {
|
||||||
|
|
@ -1223,6 +1220,7 @@ func (c *ctxt7) addpool128(p *obj.Prog, al, ah *obj.Addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
c.elitrl = t
|
c.elitrl = t
|
||||||
|
c.pool.size = roundUp(c.pool.size, 16)
|
||||||
c.pool.size += 16
|
c.pool.size += 16
|
||||||
p.Pool = q
|
p.Pool = q
|
||||||
}
|
}
|
||||||
|
|
@ -1267,7 +1265,6 @@ func (c *ctxt7) addpool(p *obj.Prog, a *obj.Addr) {
|
||||||
|
|
||||||
q := c.newprog()
|
q := c.newprog()
|
||||||
*q = *t
|
*q = *t
|
||||||
q.Pc = int64(c.pool.size)
|
|
||||||
if c.blitrl == nil {
|
if c.blitrl == nil {
|
||||||
c.blitrl = q
|
c.blitrl = q
|
||||||
c.pool.start = uint32(p.Pc)
|
c.pool.start = uint32(p.Pc)
|
||||||
|
|
@ -1275,11 +1272,24 @@ func (c *ctxt7) addpool(p *obj.Prog, a *obj.Addr) {
|
||||||
c.elitrl.Link = q
|
c.elitrl.Link = q
|
||||||
}
|
}
|
||||||
c.elitrl = q
|
c.elitrl = q
|
||||||
c.pool.size = -c.pool.size & (funcAlign - 1)
|
if q.As == ADWORD {
|
||||||
|
// make DWORD 8-byte aligned, this is not required by ISA,
|
||||||
|
// just to avoid performance penalties when loading from
|
||||||
|
// the constant pool across a cache line.
|
||||||
|
c.pool.size = roundUp(c.pool.size, 8)
|
||||||
|
}
|
||||||
c.pool.size += uint32(sz)
|
c.pool.size += uint32(sz)
|
||||||
p.Pool = q
|
p.Pool = q
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// roundUp rounds up x to "to".
|
||||||
|
func roundUp(x, to uint32) uint32 {
|
||||||
|
if to == 0 || to&(to-1) != 0 {
|
||||||
|
log.Fatalf("rounded up to a value that is not a power of 2: %d\n", to)
|
||||||
|
}
|
||||||
|
return (x + to - 1) &^ (to - 1)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *ctxt7) regoff(a *obj.Addr) uint32 {
|
func (c *ctxt7) regoff(a *obj.Addr) uint32 {
|
||||||
c.instoffset = 0
|
c.instoffset = 0
|
||||||
c.aclass(a)
|
c.aclass(a)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue