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);