Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions compiler/compiler.go
Original file line number Diff line number Diff line change
Expand Up @@ -2581,6 +2581,16 @@ func (b *builder) createUnOp(unop *ssa.UnOp) (llvm.Value, error) {
return b.CreateSub(llvm.ConstInt(x.Type(), 0, false), x, ""), nil
} else if typ.Info()&types.IsFloat != 0 {
return b.CreateFNeg(x, ""), nil
} else if typ.Info()&types.IsComplex != 0 {
// Negate both components of the complex number.
r := b.CreateExtractValue(x, 0, "r")
i := b.CreateExtractValue(x, 1, "i")
r = b.CreateFNeg(r, "")
i = b.CreateFNeg(i, "")
cplx := llvm.Undef(x.Type())
cplx = b.CreateInsertValue(cplx, r, 0, "")
cplx = b.CreateInsertValue(cplx, i, 1, "")
return cplx, nil
} else {
return llvm.Value{}, b.makeError(unop.Pos(), "todo: unknown basic type for negate: "+typ.String())
}
Expand Down
4 changes: 3 additions & 1 deletion testdata/float.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,17 @@ func main() {
println(complex64(c128))
println(complex128(c64))

// binops on complex numbers
// binops and negate on complex numbers
c64 = 5 + 2i
println("complex64 add: ", c64+-3+8i)
println("complex64 sub: ", c64 - -3 + 8i)
println("complex64 mul: ", c64*-3+8i)
println("complex64 div: ", c64/-3+8i)
println("complex64 neg: ", -c64)
c128 = -5 + 2i
println("complex128 add:", c128+2+6i)
println("complex128 sub:", c128-2+6i)
println("complex128 mul:", c128*2+6i)
println("complex128 div:", c128/2+6i)
println("complex128 neg:", -c128)
}
2 changes: 2 additions & 0 deletions testdata/float.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ complex64 add: (+2.000000e+000+1.000000e+001i)
complex64 sub: (+8.000000e+000+1.000000e+001i)
complex64 mul: (-1.500000e+001+2.000000e+000i)
complex64 div: (-1.666667e+000+7.333333e+000i)
complex64 neg: (-5.000000e+000-2.000000e+000i)
complex128 add: (-3.000000e+000+8.000000e+000i)
complex128 sub: (-7.000000e+000+8.000000e+000i)
complex128 mul: (-1.000000e+001+1.000000e+001i)
complex128 div: (-2.500000e+000+7.000000e+000i)
complex128 neg: (+5.000000e+000-2.000000e+000i)