Skip to content

Commit 7893442

Browse files
committed
cmd/internal/obj: simplify Optab range handling code
Use slices as slices, instead of as clumsy pointers. Passes toolstash/buildall. Change-Id: If09eacc2d8805d7d5eaa5566f9b6305541074371 Reviewed-on: https://go-review.googlesource.com/20322 Run-TryBot: Matthew Dempsky <[email protected]> Reviewed-by: Brad Fitzpatrick <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 42f07ff commit 7893442

File tree

2 files changed

+39
-71
lines changed

2 files changed

+39
-71
lines changed

src/cmd/internal/obj/arm64/asm7.go

Lines changed: 20 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,9 @@ type Optab struct {
5858
scond uint16
5959
}
6060

61-
type Oprange struct {
62-
start []Optab
63-
stop []Optab
64-
}
65-
66-
var oprange [ALAST]Oprange
61+
var oprange [ALAST][]Optab
6762

68-
var xcmp [C_NCLASS][C_NCLASS]uint8
63+
var xcmp [C_NCLASS][C_NCLASS]bool
6964

7065
const (
7166
S32 = 0 << 31
@@ -532,7 +527,7 @@ func span7(ctxt *obj.Link, cursym *obj.LSym) {
532527
ctxt.Cursym = cursym
533528
ctxt.Autosize = int32(p.To.Offset&0xffffffff) + 8
534529

535-
if oprange[AAND].start == nil {
530+
if oprange[AAND] == nil {
536531
buildop(ctxt)
537532
}
538533

@@ -1112,41 +1107,31 @@ func oplook(ctxt *obj.Link, p *obj.Prog) *Optab {
11121107
if p.Reg != 0 {
11131108
a2 = rclass(p.Reg)
11141109
}
1115-
r := int(p.As)
1116-
o := oprange[r].start
1117-
if o == nil {
1118-
o = oprange[r].stop /* just generate an error */
1119-
}
11201110

11211111
if false {
11221112
fmt.Printf("oplook %v %d %d %d\n", obj.Aconv(int(p.As)), a1, a2, a3)
11231113
fmt.Printf("\t\t%d %d\n", p.From.Type, p.To.Type)
11241114
}
11251115

1126-
e := oprange[r].stop
1127-
c1 := xcmp[a1][:]
1128-
c2 := xcmp[a2][:]
1129-
c3 := xcmp[a3][:]
1130-
c4 := xcmp[p.Scond>>5][:]
1131-
for ; -cap(o) < -cap(e); o = o[1:] {
1132-
if int(o[0].a2) == a2 || c2[o[0].a2] != 0 {
1133-
if c4[o[0].scond>>5] != 0 {
1134-
if c1[o[0].a1] != 0 {
1135-
if c3[o[0].a3] != 0 {
1136-
p.Optab = uint16((-cap(o) + cap(optab)) + 1)
1137-
return &o[0]
1138-
}
1139-
}
1140-
}
1116+
ops := oprange[p.As]
1117+
c1 := &xcmp[a1]
1118+
c2 := &xcmp[a2]
1119+
c3 := &xcmp[a3]
1120+
c4 := &xcmp[p.Scond>>5]
1121+
for i := range ops {
1122+
op := &ops[i]
1123+
if (int(op.a2) == a2 || c2[op.a2]) && c4[op.scond>>5] && c1[op.a1] && c3[op.a3] {
1124+
p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
1125+
return op
11411126
}
11421127
}
11431128

11441129
ctxt.Diag("illegal combination %v %v %v %v, %d %d", p, DRconv(a1), DRconv(a2), DRconv(a3), p.From.Type, p.To.Type)
11451130
prasm(p)
1146-
if o == nil {
1147-
o = optab
1131+
if ops == nil {
1132+
ops = optab
11481133
}
1149-
return &o[0]
1134+
return &ops[0]
11501135
}
11511136

11521137
func cmp(a int, b int) bool {
@@ -1333,24 +1318,23 @@ func buildop(ctxt *obj.Link) {
13331318
for i := 0; i < C_GOK; i++ {
13341319
for n = 0; n < C_GOK; n++ {
13351320
if cmp(n, i) {
1336-
xcmp[i][n] = 1
1321+
xcmp[i][n] = true
13371322
}
13381323
}
13391324
}
13401325
for n = 0; optab[n].as != obj.AXXX; n++ {
13411326
}
13421327
sort.Sort(ocmp(optab[:n]))
13431328
var r int
1344-
var t Oprange
13451329
for i := 0; i < n; i++ {
13461330
r = int(optab[i].as)
1347-
oprange[r].start = optab[i:]
1331+
start := i
13481332
for int(optab[i].as) == r {
13491333
i++
13501334
}
1351-
oprange[r].stop = optab[i:]
1335+
t := optab[start:i]
13521336
i--
1353-
t = oprange[r]
1337+
oprange[r] = t
13541338
switch r {
13551339
default:
13561340
ctxt.Diag("unknown op in build: %v", obj.Aconv(r))

src/cmd/internal/obj/ppc64/asm9.go

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -403,14 +403,9 @@ var optab = []Optab{
403403
{obj.AXXX, C_NONE, C_NONE, C_NONE, C_NONE, 0, 4, 0},
404404
}
405405

406-
type Oprang struct {
407-
start []Optab
408-
stop []Optab
409-
}
410-
411-
var oprange [ALAST & obj.AMask]Oprang
406+
var oprange [ALAST & obj.AMask][]Optab
412407

413-
var xcmp [C_NCLASS][C_NCLASS]uint8
408+
var xcmp [C_NCLASS][C_NCLASS]bool
414409

415410
func span9(ctxt *obj.Link, cursym *obj.LSym) {
416411
p := cursym.Text
@@ -420,7 +415,7 @@ func span9(ctxt *obj.Link, cursym *obj.LSym) {
420415
ctxt.Cursym = cursym
421416
ctxt.Autosize = int32(p.To.Offset)
422417

423-
if oprange[AANDN&obj.AMask].start == nil {
418+
if oprange[AANDN&obj.AMask] == nil {
424419
buildop(ctxt)
425420
}
426421

@@ -731,7 +726,7 @@ func prasm(p *obj.Prog) {
731726
func oplook(ctxt *obj.Link, p *obj.Prog) *Optab {
732727
a1 := int(p.Optab)
733728
if a1 != 0 {
734-
return &optab[a1-1:][0]
729+
return &optab[a1-1]
735730
}
736731
a1 = int(p.From.Class)
737732
if a1 == 0 {
@@ -763,35 +758,24 @@ func oplook(ctxt *obj.Link, p *obj.Prog) *Optab {
763758
}
764759

765760
//print("oplook %v %d %d %d %d\n", p, a1, a2, a3, a4);
766-
r0 := p.As & obj.AMask
767-
768-
o := oprange[r0].start
769-
if o == nil {
770-
o = oprange[r0].stop /* just generate an error */
771-
}
772-
e := oprange[r0].stop
773-
c1 := xcmp[a1][:]
774-
c3 := xcmp[a3][:]
775-
c4 := xcmp[a4][:]
776-
for ; -cap(o) < -cap(e); o = o[1:] {
777-
if int(o[0].a2) == a2 {
778-
if c1[o[0].a1] != 0 {
779-
if c3[o[0].a3] != 0 {
780-
if c4[o[0].a4] != 0 {
781-
p.Optab = uint16((-cap(o) + cap(optab)) + 1)
782-
return &o[0]
783-
}
784-
}
785-
}
761+
ops := oprange[p.As&obj.AMask]
762+
c1 := &xcmp[a1]
763+
c3 := &xcmp[a3]
764+
c4 := &xcmp[a4]
765+
for i := range ops {
766+
op := &ops[i]
767+
if int(op.a2) == a2 && c1[op.a1] && c3[op.a3] && c4[op.a4] {
768+
p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
769+
return op
786770
}
787771
}
788772

789773
ctxt.Diag("illegal combination %v %v %v %v %v", obj.Aconv(int(p.As)), DRconv(a1), DRconv(a2), DRconv(a3), DRconv(a4))
790774
prasm(p)
791-
if o == nil {
792-
o = optab
775+
if ops == nil {
776+
ops = optab
793777
}
794-
return &o[0]
778+
return &ops[0]
795779
}
796780

797781
func cmp(a int, b int) bool {
@@ -916,7 +900,7 @@ func buildop(ctxt *obj.Link) {
916900
for i := 0; i < C_NCLASS; i++ {
917901
for n = 0; n < C_NCLASS; n++ {
918902
if cmp(n, i) {
919-
xcmp[i][n] = 1
903+
xcmp[i][n] = true
920904
}
921905
}
922906
}
@@ -926,11 +910,11 @@ func buildop(ctxt *obj.Link) {
926910
for i := 0; i < n; i++ {
927911
r := optab[i].as
928912
r0 := r & obj.AMask
929-
oprange[r0].start = optab[i:]
913+
start := i
930914
for optab[i].as == r {
931915
i++
932916
}
933-
oprange[r0].stop = optab[i:]
917+
oprange[r0] = optab[start:i]
934918
i--
935919

936920
switch r {

0 commit comments

Comments
 (0)