mirror of
https://github.com/golang/go
synced 2024-11-19 08:54:47 -07:00
cmd/internal/obj/x86: clean up asm buffer
c2go translated writing and advancing a pointer using slices. Switch to something more idiomatic. It is also more efficient, but not enough to matter. Change-Id: I67709632ac53253615a35365824ae97bbe5458d5 Reviewed-on: https://go-review.googlesource.com/20767 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
e248b96d24
commit
e6ed3e8a46
@ -635,8 +635,7 @@ type Link struct {
|
|||||||
Repn int
|
Repn int
|
||||||
Lock int
|
Lock int
|
||||||
Asmode int
|
Asmode int
|
||||||
Andptr []byte
|
AsmBuf AsmBuf // instruction buffer for x86
|
||||||
And [100]uint8
|
|
||||||
Instoffset int64
|
Instoffset int64
|
||||||
Autosize int32
|
Autosize int32
|
||||||
Armsize int32
|
Armsize int32
|
||||||
@ -737,3 +736,96 @@ func Linknewplist(ctxt *Link) *Plist {
|
|||||||
ctxt.Plast = pl
|
ctxt.Plast = pl
|
||||||
return pl
|
return pl
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AsmBuf is a simple buffer to assemble variable-length x86 instructions into.
|
||||||
|
type AsmBuf struct {
|
||||||
|
buf [100]byte
|
||||||
|
off int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put1 appends one byte to the end of the buffer.
|
||||||
|
func (a *AsmBuf) Put1(x byte) {
|
||||||
|
a.buf[a.off] = x
|
||||||
|
a.off++
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put2 appends two bytes to the end of the buffer.
|
||||||
|
func (a *AsmBuf) Put2(x, y byte) {
|
||||||
|
a.buf[a.off+0] = x
|
||||||
|
a.buf[a.off+1] = y
|
||||||
|
a.off += 2
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put3 appends three bytes to the end of the buffer.
|
||||||
|
func (a *AsmBuf) Put3(x, y, z byte) {
|
||||||
|
a.buf[a.off+0] = x
|
||||||
|
a.buf[a.off+1] = y
|
||||||
|
a.buf[a.off+2] = z
|
||||||
|
a.off += 3
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put4 appends four bytes to the end of the buffer.
|
||||||
|
func (a *AsmBuf) Put4(x, y, z, w byte) {
|
||||||
|
a.buf[a.off+0] = x
|
||||||
|
a.buf[a.off+1] = y
|
||||||
|
a.buf[a.off+2] = z
|
||||||
|
a.buf[a.off+3] = w
|
||||||
|
a.off += 4
|
||||||
|
}
|
||||||
|
|
||||||
|
// PutInt16 writes v into the buffer using little-endian encoding.
|
||||||
|
func (a *AsmBuf) PutInt16(v int16) {
|
||||||
|
a.buf[a.off+0] = byte(v)
|
||||||
|
a.buf[a.off+1] = byte(v >> 8)
|
||||||
|
a.off += 2
|
||||||
|
}
|
||||||
|
|
||||||
|
// PutInt32 writes v into the buffer using little-endian encoding.
|
||||||
|
func (a *AsmBuf) PutInt32(v int32) {
|
||||||
|
a.buf[a.off+0] = byte(v)
|
||||||
|
a.buf[a.off+1] = byte(v >> 8)
|
||||||
|
a.buf[a.off+2] = byte(v >> 16)
|
||||||
|
a.buf[a.off+3] = byte(v >> 24)
|
||||||
|
a.off += 4
|
||||||
|
}
|
||||||
|
|
||||||
|
// PutInt64 writes v into the buffer using little-endian encoding.
|
||||||
|
func (a *AsmBuf) PutInt64(v int64) {
|
||||||
|
a.buf[a.off+0] = byte(v)
|
||||||
|
a.buf[a.off+1] = byte(v >> 8)
|
||||||
|
a.buf[a.off+2] = byte(v >> 16)
|
||||||
|
a.buf[a.off+3] = byte(v >> 24)
|
||||||
|
a.buf[a.off+4] = byte(v >> 32)
|
||||||
|
a.buf[a.off+5] = byte(v >> 40)
|
||||||
|
a.buf[a.off+6] = byte(v >> 48)
|
||||||
|
a.buf[a.off+7] = byte(v >> 56)
|
||||||
|
a.off += 8
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put copies b into the buffer.
|
||||||
|
func (a *AsmBuf) Put(b []byte) {
|
||||||
|
copy(a.buf[a.off:], b)
|
||||||
|
a.off += len(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert inserts b at offset i.
|
||||||
|
func (a *AsmBuf) Insert(i int, b byte) {
|
||||||
|
a.off++
|
||||||
|
copy(a.buf[i+1:a.off], a.buf[i:a.off-1])
|
||||||
|
a.buf[i] = b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last returns the byte at the end of the buffer.
|
||||||
|
func (a *AsmBuf) Last() byte { return a.buf[a.off-1] }
|
||||||
|
|
||||||
|
// Len returns the length of the buffer.
|
||||||
|
func (a *AsmBuf) Len() int { return a.off }
|
||||||
|
|
||||||
|
// Bytes returns the contents of the buffer.
|
||||||
|
func (a *AsmBuf) Bytes() []byte { return a.buf[:a.off] }
|
||||||
|
|
||||||
|
// Reset empties the buffer.
|
||||||
|
func (a *AsmBuf) Reset() { a.off = 0 }
|
||||||
|
|
||||||
|
// Peek returns the byte at offset i.
|
||||||
|
func (a *AsmBuf) Peek(i int) byte { return a.buf[i] }
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user