gollvm: fix for complex division support
Fix for complex division following incomplete change in CL 275072 -- a
change in the bridge is also needed. As with the other complex
operators, we have to fully expand.
Change-Id: I9a54777dd8722f1b99868e1066f7630c76e7fdc4
Reviewed-on: https://go-review.googlesource.com/c/gollvm/+/275232
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
diff --git a/bridge/go-llvm.cpp b/bridge/go-llvm.cpp
index 445259c..599cd42 100644
--- a/bridge/go-llvm.cpp
+++ b/bridge/go-llvm.cpp
@@ -1589,6 +1589,26 @@
val = complex_expression(valr, vali, location);
break;
}
+ case OPERATOR_DIV: {
+ // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
+ Bexpression *valr, *vali;
+ { Bexpression *ac = binary_expression(OPERATOR_MULT, lr, rr, location);
+ Bexpression *bd = binary_expression(OPERATOR_MULT, li, ri, location);
+ Bexpression *cc = binary_expression(OPERATOR_MULT, rr, rr, location);
+ Bexpression *dd = binary_expression(OPERATOR_MULT, ri, ri, location);
+ Bexpression *acpbd = binary_expression(OPERATOR_PLUS, ac, bd, location);
+ Bexpression *ccpdd = binary_expression(OPERATOR_PLUS, cc, dd, location);
+ valr = binary_expression(OPERATOR_DIV, acpbd, ccpdd, location); }
+ { Bexpression *ad = binary_expression(OPERATOR_MULT, lr, ri, location);
+ Bexpression *bc = binary_expression(OPERATOR_MULT, li, rr, location);
+ Bexpression *cc = binary_expression(OPERATOR_MULT, rr, rr, location);
+ Bexpression *dd = binary_expression(OPERATOR_MULT, ri, ri, location);
+ Bexpression *ccpdd = binary_expression(OPERATOR_PLUS, cc, dd, location);
+ Bexpression *bcmad = binary_expression(OPERATOR_MINUS, bc, ad, location);
+ vali = binary_expression(OPERATOR_DIV, bcmad, ccpdd, location); }
+ val = complex_expression(valr, vali, location);
+ break;
+ }
case OPERATOR_EQEQ:
case OPERATOR_NOTEQ: {
Bexpression *cmpr = binary_expression(op, lr, rr, location);