diff --git a/compiler/compiler.go b/compiler/compiler.go index 185b6ea0..758d2adc 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -1821,6 +1821,22 @@ func (c *Compiler) parseBinOp(op token.Token, typ types.Type, x, y llvm.Value, p ieq := c.builder.CreateFCmp(llvm.FloatOEQ, i1, i2, "") neq := c.builder.CreateAnd(req, ieq, "") return c.builder.CreateNot(neq, ""), nil + case token.ADD, token.SUB: + var r, i llvm.Value + switch op { + case token.ADD: + r = c.builder.CreateFAdd(r1, r2, "") + i = c.builder.CreateFAdd(i1, i2, "") + case token.SUB: + r = c.builder.CreateFSub(r1, r2, "") + i = c.builder.CreateFSub(i1, i2, "") + default: + panic("unreachable") + } + cplx := llvm.Undef(c.ctx.StructType([]llvm.Type{r.Type(), i.Type()}, false)) + cplx = c.builder.CreateInsertValue(cplx, r, 0, "") + cplx = c.builder.CreateInsertValue(cplx, i, 1, "") + return cplx, nil default: return llvm.Value{}, c.makeError(pos, "todo: binop on complex number: "+op.String()) } diff --git a/testdata/float.go b/testdata/float.go index 6e2d5bf7..91223023 100644 --- a/testdata/float.go +++ b/testdata/float.go @@ -56,4 +56,12 @@ func main() { // cast complex println(complex64(c128)) println(complex128(c64)) + + // binops on complex numbers + c64 = 5+2i + println("complex64 add: ", c64 + -3+8i) + println("complex64 sub: ", c64 - -3+8i) + c128 = -5+2i + println("complex128 add:", c128 + 2+6i) + println("complex128 sub:", c128 - 2+6i) } diff --git a/testdata/float.txt b/testdata/float.txt index e20f0e52..cd75cd21 100644 --- a/testdata/float.txt +++ b/testdata/float.txt @@ -23,3 +23,7 @@ (+2.000000e+000-2.000000e+000i) (+6.666667e-001-2.000000e+000i) (+6.666667e-001+1.200000e+000i) +complex64 add: (+2.000000e+000+1.000000e+001i) +complex64 sub: (+8.000000e+000+1.000000e+001i) +complex128 add: (-3.000000e+000+8.000000e+000i) +complex128 sub: (-7.000000e+000+8.000000e+000i)