operand: include '+0' in named symbol references

Intended to address an asmdecl error.

  [amd64] Butterfly: use of unnamed argument 0(FP); offset 0 is x0+0(FP)

Updates #24
This commit is contained in:
Michael McLoughlin
2019-01-13 11:59:14 -08:00
parent 16c602d345
commit 475a241446
18 changed files with 41 additions and 43 deletions

View File

@@ -65,7 +65,7 @@ After running `go generate` the [`add.s`](examples/add/add.s) file will contain
// func Add(x uint64, y uint64) uint64 // func Add(x uint64, y uint64) uint64
TEXT ·Add(SB), NOSPLIT, $0-24 TEXT ·Add(SB), NOSPLIT, $0-24
MOVQ x(FP), AX MOVQ x+0(FP), AX
MOVQ y+8(FP), CX MOVQ y+8(FP), CX
ADDQ AX, CX ADDQ AX, CX
MOVQ CX, ret+16(FP) MOVQ CX, ret+16(FP)
@@ -137,7 +137,7 @@ The result from this code generator is:
// func Sum(xs []uint64) uint64 // func Sum(xs []uint64) uint64
TEXT ·Sum(SB), NOSPLIT, $0-32 TEXT ·Sum(SB), NOSPLIT, $0-32
MOVQ xs_base(FP), AX MOVQ xs_base+0(FP), AX
MOVQ xs_len+8(FP), CX MOVQ xs_len+8(FP), CX
// Initialize sum register to zero. // Initialize sum register to zero.

View File

@@ -43,7 +43,7 @@ This produces [`add.s`](add.s) as follows:
// func Add(x uint64, y uint64) uint64 // func Add(x uint64, y uint64) uint64
TEXT ·Add(SB), NOSPLIT, $0-24 TEXT ·Add(SB), NOSPLIT, $0-24
MOVQ x(FP), AX MOVQ x+0(FP), AX
MOVQ y+8(FP), CX MOVQ y+8(FP), CX
ADDQ AX, CX ADDQ AX, CX
MOVQ CX, ret+16(FP) MOVQ CX, ret+16(FP)

View File

@@ -4,7 +4,7 @@
// func Add(x uint64, y uint64) uint64 // func Add(x uint64, y uint64) uint64
TEXT ·Add(SB), NOSPLIT, $0-24 TEXT ·Add(SB), NOSPLIT, $0-24
MOVQ x(FP), AX MOVQ x+0(FP), AX
MOVQ y+8(FP), CX MOVQ y+8(FP), CX
ADDQ AX, CX ADDQ AX, CX
MOVQ CX, ret+16(FP) MOVQ CX, ret+16(FP)

View File

@@ -34,7 +34,7 @@ TEXT ·ArrayThree(SB), NOSPLIT, $0-64
// func FieldByte(s Struct) byte // func FieldByte(s Struct) byte
TEXT ·FieldByte(SB), NOSPLIT, $0-177 TEXT ·FieldByte(SB), NOSPLIT, $0-177
MOVB s_Byte(FP), AL MOVB s_Byte+0(FP), AL
MOVB AL, ret+176(FP) MOVB AL, ret+176(FP)
RET RET

View File

@@ -25,7 +25,7 @@ Generated assembly:
```s ```s
// func Norm(z complex128) float64 // func Norm(z complex128) float64
TEXT ·Norm(SB), NOSPLIT, $0-24 TEXT ·Norm(SB), NOSPLIT, $0-24
MOVSD z_real(FP), X0 MOVSD z_real+0(FP), X0
MOVSD z_imag+8(FP), X1 MOVSD z_imag+8(FP), X1
MULSD X0, X0 MULSD X0, X0
MULSD X1, X1 MULSD X1, X1

View File

@@ -4,7 +4,7 @@
// func Real(z complex128) float64 // func Real(z complex128) float64
TEXT ·Real(SB), NOSPLIT, $0-24 TEXT ·Real(SB), NOSPLIT, $0-24
MOVSD z_real(FP), X0 MOVSD z_real+0(FP), X0
MOVSD X0, ret+16(FP) MOVSD X0, ret+16(FP)
RET RET
@@ -16,7 +16,7 @@ TEXT ·Imag(SB), NOSPLIT, $0-24
// func Norm(z complex128) float64 // func Norm(z complex128) float64
TEXT ·Norm(SB), NOSPLIT, $0-24 TEXT ·Norm(SB), NOSPLIT, $0-24
MOVSD z_real(FP), X0 MOVSD z_real+0(FP), X0
MOVSD z_imag+8(FP), X1 MOVSD z_imag+8(FP), X1
MULSD X0, X0 MULSD X0, X0
MULSD X1, X1 MULSD X1, X1

View File

@@ -2,7 +2,7 @@
#include "textflag.h" #include "textflag.h"
DATA bytes<>(SB)/8, $0x0011223344556677 DATA bytes<>+0(SB)/8, $0x0011223344556677
DATA bytes<>+8(SB)/8, $"strconst" DATA bytes<>+8(SB)/8, $"strconst"
DATA bytes<>+16(SB)/4, $(3.1415927) DATA bytes<>+16(SB)/4, $(3.1415927)
DATA bytes<>+24(SB)/8, $(3.141592653589793) DATA bytes<>+24(SB)/8, $(3.141592653589793)
@@ -14,8 +14,8 @@ GLOBL bytes<>(SB), RODATA|NOPTR, $40
// func DataAt(i int) byte // func DataAt(i int) byte
TEXT ·DataAt(SB), NOSPLIT, $0-9 TEXT ·DataAt(SB), NOSPLIT, $0-9
MOVQ i(FP), AX MOVQ i+0(FP), AX
LEAQ bytes<>(SB), CX LEAQ bytes<>+0(SB), CX
MOVB (CX)(AX*1), AL MOVB (CX)(AX*1), AL
MOVB AL, ret+8(FP) MOVB AL, ret+8(FP)
RET RET

View File

@@ -4,7 +4,7 @@
// func Dot(x []float32, y []float32) float32 // func Dot(x []float32, y []float32) float32
TEXT ·Dot(SB), NOSPLIT, $0-52 TEXT ·Dot(SB), NOSPLIT, $0-52
MOVQ x_base(FP), AX MOVQ x_base+0(FP), AX
MOVQ y_base+24(FP), CX MOVQ y_base+24(FP), CX
MOVQ x_len+8(FP), DX MOVQ x_len+8(FP), DX
VXORPS Y0, Y0, Y0 VXORPS Y0, Y0, Y0

View File

@@ -4,7 +4,7 @@
// func Hash64(data []byte) uint64 // func Hash64(data []byte) uint64
TEXT ·Hash64(SB), NOSPLIT, $0-32 TEXT ·Hash64(SB), NOSPLIT, $0-32
MOVQ data_base(FP), CX MOVQ data_base+0(FP), CX
MOVQ data_len+8(FP), BX MOVQ data_len+8(FP), BX
MOVQ $0xcbf29ce484222325, AX MOVQ $0xcbf29ce484222325, AX
MOVQ $0x00000100000001b3, BP MOVQ $0x00000100000001b3, BP

View File

@@ -4,31 +4,31 @@
// func EncodeInt(lat float64, lng float64) uint64 // func EncodeInt(lat float64, lng float64) uint64
TEXT ·EncodeInt(SB), NOSPLIT, $0-24 TEXT ·EncodeInt(SB), NOSPLIT, $0-24
MOVSD lat(FP), X0 MOVSD lat+0(FP), X0
MOVSD lng+8(FP), X1 MOVSD lng+8(FP), X1
MULSD reciprocal180<>(SB), X0 MULSD reciprocal180<>+0(SB), X0
ADDSD onepointfive<>(SB), X0 ADDSD onepointfive<>+0(SB), X0
MULSD reciprocal360<>(SB), X1 MULSD reciprocal360<>+0(SB), X1
ADDSD onepointfive<>(SB), X1 ADDSD onepointfive<>+0(SB), X1
MOVQ X0, CX MOVQ X0, CX
SHRQ $0x14, CX SHRQ $0x14, CX
MOVQ X1, AX MOVQ X1, AX
SHRQ $0x14, AX SHRQ $0x14, AX
PDEPQ mask<>(SB), CX, CX PDEPQ mask<>+0(SB), CX, CX
PDEPQ mask<>(SB), AX, AX PDEPQ mask<>+0(SB), AX, AX
SHLQ $0x01, AX SHLQ $0x01, AX
XORQ AX, CX XORQ AX, CX
MOVQ CX, ret+16(FP) MOVQ CX, ret+16(FP)
RET RET
DATA reciprocal180<>(SB)/8, $(0.005555555555555556) DATA reciprocal180<>+0(SB)/8, $(0.005555555555555556)
GLOBL reciprocal180<>(SB), RODATA|NOPTR, $8 GLOBL reciprocal180<>(SB), RODATA|NOPTR, $8
DATA onepointfive<>(SB)/8, $(1.5) DATA onepointfive<>+0(SB)/8, $(1.5)
GLOBL onepointfive<>(SB), RODATA|NOPTR, $8 GLOBL onepointfive<>(SB), RODATA|NOPTR, $8
DATA reciprocal360<>(SB)/8, $(0.002777777777777778) DATA reciprocal360<>+0(SB)/8, $(0.002777777777777778)
GLOBL reciprocal360<>(SB), RODATA|NOPTR, $8 GLOBL reciprocal360<>(SB), RODATA|NOPTR, $8
DATA mask<>(SB)/8, $0x5555555555555555 DATA mask<>+0(SB)/8, $0x5555555555555555
GLOBL mask<>(SB), RODATA|NOPTR, $8 GLOBL mask<>(SB), RODATA|NOPTR, $8

View File

@@ -4,7 +4,7 @@
// func Interval(start uint64, size uint64) (uint64, uint64) // func Interval(start uint64, size uint64) (uint64, uint64)
TEXT ·Interval(SB), NOSPLIT, $0-32 TEXT ·Interval(SB), NOSPLIT, $0-32
MOVQ start(FP), AX MOVQ start+0(FP), AX
MOVQ size+8(FP), CX MOVQ size+8(FP), CX
ADDQ AX, CX ADDQ AX, CX
MOVQ AX, ret+16(FP) MOVQ AX, ret+16(FP)
@@ -13,7 +13,7 @@ TEXT ·Interval(SB), NOSPLIT, $0-32
// func Butterfly(x0 float64, x1 float64) (y0 float64, y1 float64) // func Butterfly(x0 float64, x1 float64) (y0 float64, y1 float64)
TEXT ·Butterfly(SB), NOSPLIT, $0-32 TEXT ·Butterfly(SB), NOSPLIT, $0-32
MOVSD x0(FP), X0 MOVSD x0+0(FP), X0
MOVSD x1+8(FP), X1 MOVSD x1+8(FP), X1
MOVSD X0, X2 MOVSD X0, X2
ADDSD X1, X2 ADDSD X1, X2
@@ -25,7 +25,7 @@ TEXT ·Butterfly(SB), NOSPLIT, $0-32
// func Septuple(byte) [7]byte // func Septuple(byte) [7]byte
TEXT ·Septuple(SB), NOSPLIT, $0-15 TEXT ·Septuple(SB), NOSPLIT, $0-15
MOVB arg(FP), AL MOVB arg+0(FP), AL
MOVB AL, ret_0+8(FP) MOVB AL, ret_0+8(FP)
MOVB AL, ret_1+9(FP) MOVB AL, ret_1+9(FP)
MOVB AL, ret_2+10(FP) MOVB AL, ret_2+10(FP)
@@ -37,18 +37,18 @@ TEXT ·Septuple(SB), NOSPLIT, $0-15
// func CriticalLine(t float64) complex128 // func CriticalLine(t float64) complex128
TEXT ·CriticalLine(SB), NOSPLIT, $0-24 TEXT ·CriticalLine(SB), NOSPLIT, $0-24
MOVSD t(FP), X0 MOVSD t+0(FP), X0
MOVSD half<>(SB), X1 MOVSD half<>+0(SB), X1
MOVSD X1, ret_real+8(FP) MOVSD X1, ret_real+8(FP)
MOVSD X0, ret_imag+16(FP) MOVSD X0, ret_imag+16(FP)
RET RET
DATA half<>(SB)/8, $(0.5) DATA half<>+0(SB)/8, $(0.5)
GLOBL half<>(SB), RODATA|NOPTR, $8 GLOBL half<>(SB), RODATA|NOPTR, $8
// func NewStruct(w uint16, p [2]float64, q uint64) Struct // func NewStruct(w uint16, p [2]float64, q uint64) Struct
TEXT ·NewStruct(SB), NOSPLIT, $0-64 TEXT ·NewStruct(SB), NOSPLIT, $0-64
MOVW w(FP), AX MOVW w+0(FP), AX
MOVSD p_0+8(FP), X0 MOVSD p_0+8(FP), X0
MOVSD p_1+16(FP), X1 MOVSD p_1+16(FP), X1
MOVQ q+24(FP), CX MOVQ q+24(FP), CX

View File

@@ -2,7 +2,7 @@
// func block(h *[5]uint32, m []byte) // func block(h *[5]uint32, m []byte)
TEXT ·block(SB), $64-32 TEXT ·block(SB), $64-32
MOVQ h(FP), AX MOVQ h+0(FP), AX
MOVQ m_base+8(FP), CX MOVQ m_base+8(FP), CX
// Load initial hash. // Load initial hash.

View File

@@ -4,7 +4,7 @@
// func Hash(state *State, key []byte) uint64 // func Hash(state *State, key []byte) uint64
TEXT ·Hash(SB), NOSPLIT, $0-40 TEXT ·Hash(SB), NOSPLIT, $0-40
MOVQ state(FP), AX MOVQ state+0(FP), AX
MOVQ key_base+8(FP), CX MOVQ key_base+8(FP), CX
MOVQ key_len+16(FP), DX MOVQ key_len+16(FP), DX
MOVQ (AX), BX MOVQ (AX), BX

View File

@@ -4,7 +4,7 @@
// func Sum(xs []uint64) uint64 // func Sum(xs []uint64) uint64
TEXT ·Sum(SB), NOSPLIT, $0-32 TEXT ·Sum(SB), NOSPLIT, $0-32
MOVQ xs_base(FP), AX MOVQ xs_base+0(FP), AX
MOVQ xs_len+8(FP), CX MOVQ xs_len+8(FP), CX
// Initialize sum register to zero. // Initialize sum register to zero.

View File

@@ -87,12 +87,10 @@ func (m Mem) Idx(r reg.Register, s uint8) Mem {
// Asm returns an assembly syntax representation of m. // Asm returns an assembly syntax representation of m.
func (m Mem) Asm() string { func (m Mem) Asm() string {
a := m.Symbol.String() a := m.Symbol.String()
if m.Disp != 0 { if a != "" {
if a == "" { a += fmt.Sprintf("%+d", m.Disp)
a += fmt.Sprintf("%d", m.Disp) } else if m.Disp != 0 {
} else { a += fmt.Sprintf("%d", m.Disp)
a += fmt.Sprintf("%+d", m.Disp)
}
} }
if m.Base != nil { if m.Base != nil {
a += fmt.Sprintf("(%s)", m.Base.Asm()) a += fmt.Sprintf("(%s)", m.Base.Asm())

View File

@@ -37,7 +37,7 @@ func TestMemAsm(t *testing.T) {
{Mem{Base: reg.R11, Index: reg.RAX}, "(R11)"}, {Mem{Base: reg.R11, Index: reg.RAX}, "(R11)"},
{Mem{Base: reg.R11, Scale: 8}, "(R11)"}, {Mem{Base: reg.R11, Scale: 8}, "(R11)"},
{Mem{Disp: 2048, Base: reg.R11, Index: reg.RAX, Scale: 8}, "2048(R11)(AX*8)"}, {Mem{Disp: 2048, Base: reg.R11, Index: reg.RAX, Scale: 8}, "2048(R11)(AX*8)"},
{Mem{Symbol: Symbol{Name: "foo"}, Base: reg.StaticBase}, "foo(SB)"}, {Mem{Symbol: Symbol{Name: "foo"}, Base: reg.StaticBase}, "foo+0(SB)"},
{Mem{Symbol: Symbol{Name: "foo"}, Base: reg.StaticBase, Disp: 4}, "foo+4(SB)"}, {Mem{Symbol: Symbol{Name: "foo"}, Base: reg.StaticBase, Disp: 4}, "foo+4(SB)"},
{Mem{Symbol: Symbol{Name: "foo"}, Base: reg.StaticBase, Disp: -7}, "foo-7(SB)"}, {Mem{Symbol: Symbol{Name: "foo"}, Base: reg.StaticBase, Disp: -7}, "foo-7(SB)"},
{Mem{Symbol: Symbol{Name: "bar", Static: true}, Base: reg.StaticBase, Disp: 4, Index: reg.R11, Scale: 4}, "bar<>+4(SB)(R11*4)"}, {Mem{Symbol: Symbol{Name: "bar", Static: true}, Base: reg.StaticBase, Disp: 4, Index: reg.R11, Scale: 4}, "bar<>+4(SB)(R11*4)"},

View File

@@ -24,7 +24,7 @@ func TestBasic(t *testing.T) {
"", "",
"// func add(x uint64, y uint64) uint64", "// func add(x uint64, y uint64) uint64",
"TEXT ·add(SB), $0-24", "TEXT ·add(SB), $0-24",
"\tMOVQ x(FP), AX", "\tMOVQ x+0(FP), AX",
"\tMOVQ y+8(FP), R9", "\tMOVQ y+8(FP), R9",
"\tADDQ AX, R9", "\tADDQ AX, R9",
"\tMOVQ R9, ret+16(FP)", "\tMOVQ R9, ret+16(FP)",

View File

@@ -4,7 +4,7 @@
// func Split(x uint64) (q uint64, l uint32, w uint16, b uint8) // func Split(x uint64) (q uint64, l uint32, w uint16, b uint8)
TEXT ·Split(SB), NOSPLIT, $0-23 TEXT ·Split(SB), NOSPLIT, $0-23
MOVQ x(FP), AX MOVQ x+0(FP), AX
MOVQ AX, q+8(FP) MOVQ AX, q+8(FP)
MOVL AX, l+16(FP) MOVL AX, l+16(FP)
MOVW AX, w+20(FP) MOVW AX, w+20(FP)