pcrelsiz uint8
}
-type Oprang struct {
- start []Optab
- stop []Optab
-}
-
type Opcross [32][2][32]uint8
const (
extra uint32
}
-var oprange [ALAST & obj.AMask]Oprang
+var oprange [ALAST & obj.AMask][]Optab
-var xcmp [C_GOK + 1][C_GOK + 1]uint8
+var xcmp [C_GOK + 1][C_GOK + 1]bool
var deferreturn *obj.LSym
return
}
- if oprange[AAND&obj.AMask].start == nil {
+ if oprange[AAND&obj.AMask] == nil {
buildop(ctxt)
}
func oplook(ctxt *obj.Link, p *obj.Prog) *Optab {
a1 := int(p.Optab)
if a1 != 0 {
- return &optab[a1-1:][0]
+ return &optab[a1-1]
}
a1 = int(p.From.Class)
if a1 == 0 {
if p.Reg != 0 {
a2 = C_REG
}
- r := p.As & obj.AMask
- o := oprange[r].start
- if o == nil {
- o = oprange[r].stop /* just generate an error */
- }
if false { /*debug['O']*/
fmt.Printf("oplook %v %v %v %v\n", obj.Aconv(p.As), DRconv(a1), DRconv(a2), DRconv(a3))
fmt.Printf("\t\t%d %d\n", p.From.Type, p.To.Type)
}
- e := oprange[r].stop
- c1 := xcmp[a1][:]
- c3 := xcmp[a3][:]
- for ; -cap(o) < -cap(e); o = o[1:] {
- if int(o[0].a2) == a2 {
- if c1[o[0].a1] != 0 {
- if c3[o[0].a3] != 0 {
- p.Optab = uint16((-cap(o) + cap(optab)) + 1)
- return &o[0]
- }
- }
+ ops := oprange[p.As&obj.AMask]
+ c1 := &xcmp[a1]
+ c3 := &xcmp[a3]
+ for i := range ops {
+ op := &ops[i]
+ if int(op.a2) == a2 && c1[op.a1] && c3[op.a3] {
+ p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
+ return op
}
}
ctxt.Diag("illegal combination %v; %v %v %v, %d %d", p, DRconv(a1), DRconv(a2), DRconv(a3), p.From.Type, p.To.Type)
ctxt.Diag("from %d %d to %d %d\n", p.From.Type, p.From.Name, p.To.Type, p.To.Name)
prasm(p)
- if o == nil {
- o = optab
+ if ops == nil {
+ ops = optab
}
- return &o[0]
+ return &ops[0]
}
func cmp(a int, b int) bool {
for i := 0; i < C_GOK; i++ {
for n = 0; n < C_GOK; n++ {
if cmp(n, i) {
- xcmp[i][n] = 1
+ xcmp[i][n] = true
}
}
}
for i := 0; i < n; i++ {
r := optab[i].as
r0 := r & obj.AMask
- oprange[r0].start = optab[i:]
+ start := i
for optab[i].as == r {
i++
}
- oprange[r0].stop = optab[i:]
+ oprange[r0] = optab[start:i]
i--
switch r {
{obj.AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0},
}
-type Oprang struct {
- start []Optab
- stop []Optab
-}
-
-var oprange [ALAST & obj.AMask]Oprang
+var oprange [ALAST & obj.AMask][]Optab
-var xcmp [C_NCLASS][C_NCLASS]uint8
+var xcmp [C_NCLASS][C_NCLASS]bool
func span0(ctxt *obj.Link, cursym *obj.LSym) {
p := cursym.Text
ctxt.Cursym = cursym
ctxt.Autosize = int32(p.To.Offset + 8)
- if oprange[AOR&obj.AMask].start == nil {
+ if oprange[AOR&obj.AMask] == nil {
buildop(ctxt)
}
}
func oplook(ctxt *obj.Link, p *obj.Prog) *Optab {
- if oprange[AOR&obj.AMask].start == nil {
+ if oprange[AOR&obj.AMask] == nil {
buildop(ctxt)
}
}
//print("oplook %P %d %d %d\n", p, a1, a2, a3);
- r0 := p.As & obj.AMask
- o := oprange[r0].start
- if o == nil {
- o = oprange[r0].stop /* just generate an error */
- }
- e := oprange[r0].stop
- c1 := xcmp[a1][:]
- c3 := xcmp[a3][:]
- for ; -cap(o) < -cap(e); o = o[1:] {
- if int(o[0].a2) == a2 {
- if c1[o[0].a1] != 0 {
- if c3[o[0].a3] != 0 {
- p.Optab = uint16((-cap(o) + cap(optab)) + 1)
- return &o[0]
- }
- }
+ ops := oprange[p.As&obj.AMask]
+ c1 := &xcmp[a1]
+ c3 := &xcmp[a3]
+ for i := range ops {
+ op := &ops[i]
+ if int(op.a2) == a2 && c1[op.a1] && c3[op.a3] {
+ p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
+ return op
}
}
ctxt.Diag("illegal combination %v %v %v %v", obj.Aconv(p.As), DRconv(a1), DRconv(a2), DRconv(a3))
prasm(p)
- if o == nil {
- o = optab
+ if ops == nil {
+ ops = optab
}
- return &o[0]
+ return &ops[0]
}
func cmp(a int, b int) bool {
for i := 0; i < C_NCLASS; i++ {
for n = 0; n < C_NCLASS; n++ {
if cmp(n, i) {
- xcmp[i][n] = 1
+ xcmp[i][n] = true
}
}
}
for i := 0; i < n; i++ {
r := optab[i].as
r0 := r & obj.AMask
- oprange[r0].start = optab[i:]
+ start := i
for optab[i].as == r {
i++
}
- oprange[r0].stop = optab[i:]
+ oprange[r0] = optab[start:i]
i--
switch r {