@@ -736,12 +736,24 @@ module ChapelBase {
736736 inline operator * (param a: imag (32 ), param b: imag (32 )) param do return __primitive(" *" , - a, b) : real (32 );
737737 inline operator * (param a: imag (64 ), param b: imag (64 )) param do return __primitive(" *" , - a, b) : real (64 );
738738
739+ inline operator * (param a: complex (64 ), param b: complex (64 )) param do return __primitive(" *" , a, b);
740+ inline operator * (param a: complex (128 ), param b: complex (128 )) param do return __primitive(" *" , a, b);
741+
739742 inline operator * (param a: real (32 ), param b: imag (32 )) param do return __primitive(" *" , a, b : real (32 )) : imag (32 );
740743 inline operator * (param a: real (64 ), param b: imag (64 )) param do return __primitive(" *" , a, b : real (64 )) : imag (64 );
741-
742744 inline operator * (param a: imag (32 ), param b: real (32 )) param do return __primitive(" *" , a : real (32 ), b) : imag (32 );
743745 inline operator * (param a: imag (64 ), param b: real (64 )) param do return __primitive(" *" , a : real (64 ), b) : imag (64 );
744746
747+ inline operator * (param a: real (32 ), param b: complex (64 )) param do return __primitive(" build_complex" , a* b.re, a* b.im) : complex (64 );
748+ inline operator * (param a: complex (64 ), param b: real (32 )) param do return __primitive(" build_complex" , a.re* b, a.im* b) : complex (64 );
749+ inline operator * (param a: real (64 ), param b: complex (128 )) param do return __primitive(" build_complex" , a* b.re, a* b.im) : complex (128 );
750+ inline operator * (param a: complex (128 ), param b: real (64 )) param do return __primitive(" build_complex" , a.re* b, a.im* b) : complex (128 );
751+
752+ inline operator * (param a: imag (32 ), param b: complex (64 )) param do return __primitive(" build_complex" , - _i2r(a)* b.im, _i2r(a)* b.re) : complex (64 );
753+ inline operator * (param a: complex (64 ), param b: imag (32 )) param do return __primitive(" build_complex" , - a.im* _i2r(b), a.re* _i2r(b)) : complex (64 );
754+ inline operator * (param a: imag (64 ), param b: complex (128 )) param do return __primitive(" build_complex" , - _i2r(a)* b.im, _i2r(a)* b.re) : complex (128 );
755+ inline operator * (param a: complex (128 ), param b: imag (64 )) param do return __primitive(" build_complex" , - a.im* _i2r(b), a.re* _i2r(b)) : complex (128 );
756+
745757 inline operator / (param a: int (8 ), param b: int (8 )) param {
746758 if b == 0 then compilerError(" Attempt to divide by zero" );
747759 return __primitive(" /" , a, b);
@@ -782,12 +794,36 @@ module ChapelBase {
782794 inline operator / (param a: imag (32 ), param b: imag (32 )) param do return __primitive(" /" , a, b) : real (32 );
783795 inline operator / (param a: imag (64 ), param b: imag (64 )) param do return __primitive(" /" , a, b) : real (64 );
784796
797+ inline operator / (param a: complex (64 ), param b: complex (64 )) param do return __primitive(" /" , a, b);
798+ inline operator / (param a: complex (128 ), param b: complex (128 )) param do return __primitive(" /" , a, b);
799+
800+
785801 inline operator / (param a: real (32 ), param b: imag (32 )) param do return __primitive(" /" , - a, b : real (32 )) : imag (32 );
786802 inline operator / (param a: real (64 ), param b: imag (64 )) param do return __primitive(" /" , - a, b : real (64 )) : imag (64 );
787-
788803 inline operator / (param a: imag (32 ), param b: real (32 )) param do return __primitive(" /" , a : real (32 ), b) : imag (32 );
789804 inline operator / (param a: imag (64 ), param b: real (64 )) param do return __primitive(" /" , a : real (64 ), b) : imag (64 );
790805
806+ inline operator / (param a: real (32 ), param b: complex (64 )) param {
807+ param d = abs (b);
808+ return __primitive(" build_complex" , (a/ d)* (b.re/ d), (- a/ d)* (b.im/ d)): complex (64 );
809+ }
810+ inline operator / (param a: complex (64 ), param b: real (32 )) param do return __primitive(" build_complex" , a.re/ b, a.im/ b) : complex (64 );
811+ inline operator / (param a: real (64 ), param b: complex (128 )) param {
812+ param d = abs (b);
813+ return __primitive(" build_complex" , (a/ d)* (b.re/ d), (- a/ d)* (b.im/ d)): complex (128 );
814+ }
815+ inline operator / (param a: complex (128 ), param b: real (64 )) param do return __primitive(" build_complex" , a.re/ b, a.im/ b) : complex (128 );
816+
817+ inline operator / (param a: imag (32 ), param b: complex (64 )) param {
818+ param d = abs (b);
819+ return __primitive(" build_complex" , (_i2r(a)/ d)* (b.im/ d), (_i2r(a)/ d)* (b.re/ d)): complex (64 );
820+ }
821+ inline operator / (param a: complex (64 ), param b: imag (32 )) param do return __primitive(" build_complex" , a.im/ _i2r(b), - a.re/ _i2r(b)) : complex (64 );
822+ inline operator / (param a: imag (64 ), param b: complex (128 )) param {
823+ param d = abs (b);
824+ return __primitive(" build_complex" , (_i2r(a)/ d)* (b.im/ d), (_i2r(a)/ d)* (b.re/ d)): complex (128 );
825+ }
826+ inline operator / (param a: complex (128 ), param b: imag (64 )) param do return __primitive(" build_complex" , a.im/ _i2r(b), - a.re/ _i2r(b)) : complex (128 );
791827
792828 //
793829 // % on primitive types
@@ -1516,6 +1552,8 @@ module ChapelBase {
15161552 //
15171553 inline proc _i2r(a: imag (?w)) do return __primitive(" cast" , real (w), a);
15181554 inline proc _r2i(a: real (?w)) do return __primitive(" cast" , imag (w), a);
1555+ inline proc _i2r(param a: imag (?w)) param do return a: real (w);
1556+ inline proc _r2i(param a: real (?w)) param do return a: imag (w);
15191557
15201558 //
15211559 // More primitive funs
0 commit comments