Demonstrates how to access complex types in avo
.
The Real()
and Imag()
parameter methods may be used to load the sub-components of complex arguments. The following function uses these to implement the complex norm.
TEXT("Norm", NOSPLIT, "func(z complex128) float64")
Doc("Norm returns the complex norm of z.")
r = Load(Param("z").Real(), XMM())
i = Load(Param("z").Imag(), XMM())
MULSD(r, r)
MULSD(i, i)
ADDSD(i, r)
n := XMM()
SQRTSD(r, n)
Store(n, ReturnIndex(0))
RET()
Generated assembly:
// func Norm(z complex128) float64
// Requires: SSE2
TEXT ·Norm(SB), NOSPLIT, $0-24
MOVSD z_real+0(FP), X0
MOVSD z_imag+8(FP), X1
MULSD X0, X0
MULSD X1, X1
ADDSD X1, X0
SQRTSD X0, X2
MOVSD X2, ret+16(FP)
RET