}
const (
- Yxxx = 0 + iota
+ Yxxx = iota
Ynone
Yi0
Yi1
Yml
Ym
Ybr
- Ycol
Ycs
Yss
Yds
Yxm
Ytls
Ytextsize
+ Yreg2
Ymax
- Zxxx = 0 + iota - 68
+)
+
+const (
+ Zxxx = iota
Zlit
Zlitm_r
Z_rp
Zclr
Zbyte
Zmax
+)
+
+const (
Px = 0
P32 = 0x32
Pe = 0x66
// TODO(rsc): This special case is for SHRQ $3, AX:DX,
// which encodes as SHRQ $32(DX*0), AX.
// Similarly SHRQ CX, AX:DX is really SHRQ CX(DX*0), AX.
- // Change encoding and remove.
- if (a.Type == obj.TYPE_CONST || a.Type == obj.TYPE_REG) && a.Index != REG_NONE && a.Scale == 0 {
- return Ycol
+ // Change encoding generated by assemblers and remove.
+ if a == &p.From && (a.Type == obj.TYPE_CONST || a.Type == obj.TYPE_REG) && a.Index != REG_NONE && a.Scale == 0 {
+ p.From3.Type = obj.TYPE_REG
+ p.From3.Reg = a.Index
+ a.Index = 0
+ }
+
+ // To avoid changing tables, the info about p.From and p.From3 are returned together.
+ if a == &p.From && p.From3.Type != obj.TYPE_NONE {
+ if (a.Type == obj.TYPE_CONST || a.Type == obj.TYPE_REG) && p.From3.Type == obj.TYPE_REG {
+ return Yreg2
+ }
+
+ switch p.As {
+ case obj.ATEXT, obj.ADATA, obj.AGLOBL:
+ // we know these use From3 - ignore that
+ default:
+ // unexpected use of From3. report invalid argument
+ ctxt.Diag("unexpected argument: %v", obj.Dconv(p, &p.From3))
+ return Yxxx
+ }
}
switch a.Type {
Movtab{AMOVW, Yml, Ytask, 4, [4]uint8{0x0f, 0x00, 3, 0}},
Movtab{AMOVW, Ytask, Yml, 3, [4]uint8{0x0f, 0x00, 1, 0}},
- /* load full pointer */
+ /* load full pointer - unsupported
Movtab{AMOVL, Yml, Ycol, 5, [4]uint8{0, 0, 0, 0}},
Movtab{AMOVW, Yml, Ycol, 5, [4]uint8{Pe, 0, 0, 0}},
+ */
/* double shift */
- Movtab{ASHLL, Ycol, Yml, 6, [4]uint8{0xa4, 0xa5, 0, 0}},
- Movtab{ASHRL, Ycol, Yml, 6, [4]uint8{0xac, 0xad, 0, 0}},
- Movtab{ASHLQ, Ycol, Yml, 6, [4]uint8{Pw, 0xa4, 0xa5, 0}},
- Movtab{ASHRQ, Ycol, Yml, 6, [4]uint8{Pw, 0xac, 0xad, 0}},
- Movtab{ASHLW, Ycol, Yml, 6, [4]uint8{Pe, 0xa4, 0xa5, 0}},
- Movtab{ASHRW, Ycol, Yml, 6, [4]uint8{Pe, 0xac, 0xad, 0}},
+ Movtab{ASHLL, Yreg2, Yml, 6, [4]uint8{0xa4, 0xa5, 0, 0}},
+ Movtab{ASHRL, Yreg2, Yml, 6, [4]uint8{0xac, 0xad, 0, 0}},
+ Movtab{ASHLQ, Yreg2, Yml, 6, [4]uint8{Pw, 0xa4, 0xa5, 0}},
+ Movtab{ASHRQ, Yreg2, Yml, 6, [4]uint8{Pw, 0xac, 0xad, 0}},
+ Movtab{ASHLW, Yreg2, Yml, 6, [4]uint8{Pe, 0xa4, 0xa5, 0}},
+ Movtab{ASHRW, Yreg2, Yml, 6, [4]uint8{Pe, 0xac, 0xad, 0}},
/* load TLS base */
Movtab{AMOVQ, Ytls, Yrl, 7, [4]uint8{0, 0, 0, 0}},
ctxt.Andptr = ctxt.Andptr[1:]
ctxt.Andptr[0] = t[0]
ctxt.Andptr = ctxt.Andptr[1:]
- asmandsz(ctxt, p, &p.To, reg[int(p.From.Index)], regrex[int(p.From.Index)], 0)
+ asmandsz(ctxt, p, &p.To, reg[p.From3.Reg], regrex[p.From3.Reg], 0)
ctxt.Andptr[0] = byte(p.From.Offset)
ctxt.Andptr = ctxt.Andptr[1:]
default:
goto bad
- case REG_CL,
- REG_CX:
+ case REG_CL, REG_CX:
ctxt.Andptr[0] = 0x0f
ctxt.Andptr = ctxt.Andptr[1:]
ctxt.Andptr[0] = t[1]
ctxt.Andptr = ctxt.Andptr[1:]
- asmandsz(ctxt, p, &p.To, reg[int(p.From.Index)], regrex[int(p.From.Index)], 0)
+ asmandsz(ctxt, p, &p.To, reg[p.From3.Reg], regrex[p.From3.Reg], 0)
}
}