mirror of
https://github.com/golang/go.git
synced 2025-11-04 18:50:57 +00:00
[dev.ssa] cmd/compile: tweak init function prologue
We used to compare the init state with == to 0 and 2, which requires 2 comparisons. Instead, compare with 1 and use <, ==. That requires only one comparison. This isn't a big deal performance-wise, as it is just init code. But there is a fair amount of init code, so this should help a bit with code size. Change-Id: I4a2765f1005776f0edce28ac143f4b7596d95a68 Reviewed-on: https://go-review.googlesource.com/18948 Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
f94e0745b3
commit
f3575a9561
1 changed files with 15 additions and 16 deletions
|
|
@ -33,10 +33,10 @@ func renameinit() *Sym {
|
|||
// hand-craft the following initialization code
|
||||
// var initdone· uint8 (1)
|
||||
// func init() (2)
|
||||
// if initdone· != 0 { (3)
|
||||
// if initdone· == 2 (4)
|
||||
// return
|
||||
// throw(); (5)
|
||||
// if initdone· > 1 { (3)
|
||||
// return (3a)
|
||||
// if initdone· == 1 { (4)
|
||||
// throw(); (4a)
|
||||
// }
|
||||
// initdone· = 1; (6)
|
||||
// // over all matching imported symbols
|
||||
|
|
@ -118,22 +118,21 @@ func fninit(n *NodeList) {
|
|||
|
||||
// (3)
|
||||
a := Nod(OIF, nil, nil)
|
||||
|
||||
a.Left = Nod(ONE, gatevar, Nodintconst(0))
|
||||
a.Left = Nod(OGT, gatevar, Nodintconst(1))
|
||||
a.Likely = 1
|
||||
r = list(r, a)
|
||||
// (3a)
|
||||
a.Nbody = list1(Nod(ORETURN, nil, nil))
|
||||
|
||||
// (4)
|
||||
b := Nod(OIF, nil, nil)
|
||||
|
||||
b.Left = Nod(OEQ, gatevar, Nodintconst(2))
|
||||
b.Nbody = list1(Nod(ORETURN, nil, nil))
|
||||
a.Nbody = list1(b)
|
||||
|
||||
// (5)
|
||||
b = syslook("throwinit", 0)
|
||||
|
||||
b = Nod(OCALL, b, nil)
|
||||
a.Nbody = list(a.Nbody, b)
|
||||
b.Left = Nod(OEQ, gatevar, Nodintconst(1))
|
||||
// this actually isn't likely, but code layout is better
|
||||
// like this: no JMP needed after the call.
|
||||
b.Likely = 1
|
||||
r = list(r, b)
|
||||
// (4a)
|
||||
b.Nbody = list1(Nod(OCALL, syslook("throwinit", 0), nil))
|
||||
|
||||
// (6)
|
||||
a = Nod(OAS, gatevar, Nodintconst(1))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue