[llvm-commits] CVS: llvm-gcc/gcc/llvm-expand.c

Chris Lattner lattner at cs.uiuc.edu
Sat Apr 9 20:18:50 PDT 2005



Changes in directory llvm-gcc/gcc:

llvm-expand.c updated: 1.94 -> 1.95
---
Log message:

add support for ==/!= complex


---
Diffs of the changes:  (+20 -8)

 llvm-expand.c |   28 ++++++++++++++++++++--------
 1 files changed, 20 insertions(+), 8 deletions(-)


Index: llvm-gcc/gcc/llvm-expand.c
diff -u llvm-gcc/gcc/llvm-expand.c:1.94 llvm-gcc/gcc/llvm-expand.c:1.95
--- llvm-gcc/gcc/llvm-expand.c:1.94	Sat Apr  9 22:06:48 2005
+++ llvm-gcc/gcc/llvm-expand.c	Sat Apr  9 22:18:37 2005
@@ -5890,11 +5890,11 @@
  * expressions on complex numbers (including both complex floating point and
  * complex integer).  Supported operations are +, -, *, and /.
  */
-static void llvm_expand_complex_binary_expr(llvm_function *Fn, tree exp,
-                                            llvm_value *DestLoc) {
-  llvm_type *DestTy = llvm_type_get_from_tree(TREE_TYPE(exp));  
-  llvm_value *Op0 = D2V(make_temporary_alloca(Fn, DestTy));
-  llvm_value *Op1 = D2V(make_temporary_alloca(Fn, DestTy));
+static llvm_value *llvm_expand_complex_binary_expr(llvm_function *Fn, tree exp,
+                                                   llvm_value *DestLoc) {
+  llvm_type *OpTy = llvm_type_get_from_tree(TREE_TYPE(TREE_OPERAND(exp, 0)));
+  llvm_value *Op0 = D2V(make_temporary_alloca(Fn, OpTy));
+  llvm_value *Op1 = D2V(make_temporary_alloca(Fn, OpTy));
   llvm_value *Op0r, *Op0i;   /* real and imaginary components. */
   llvm_value *Op1r, *Op1i;
   llvm_value *ResultR, *ResultI;
@@ -5920,6 +5920,16 @@
     ResultR = append_inst(Fn, create_binary_inst("tmp", O_Sub, Op0r, Op1r));
     ResultI = append_inst(Fn, create_binary_inst("tmp", O_Sub, Op0i, Op1i));
     break;
+  case EQ_EXPR:  /* (a+ib) == (c+id) = (a == c) & (b == d) */
+    ResultR = append_inst(Fn, create_binary_inst("tmp", O_SetEQ, Op0r, Op1r));
+    ResultI = append_inst(Fn, create_binary_inst("tmp", O_SetEQ, Op0i, Op1i));
+    return append_inst(Fn, create_binary_inst("tmp", O_And, ResultR, ResultI));
+
+  case NE_EXPR:  /* (a+ib) != (c+id) = (a != c) | (b != d) */
+    ResultR = append_inst(Fn, create_binary_inst("tmp", O_SetNE, Op0r, Op1r));
+    ResultI = append_inst(Fn, create_binary_inst("tmp", O_SetNE, Op0i, Op1i));
+    return append_inst(Fn, create_binary_inst("tmp", O_Or, ResultR, ResultI));
+
   case MULT_EXPR: {  /* (a+ib) * (c+id) = (ac-bd) + i(ad+cb) */
     llvm_value *Tmp1 =  /* a*c */
       append_inst(Fn, create_binary_inst("tmp", O_Mul, Op0r, Op1r));
@@ -5962,6 +5972,7 @@
 
   if (DestLoc)
     InitializeComplex(Fn, DestLoc, ResultR, ResultI, 0);
+  return 0;
 }
 
 /* llvm_expand_complex_unary_expr - Expand one of the supported unary
@@ -6391,9 +6402,6 @@
 
   case CONJ_EXPR:      /* ~A = Ar + i*(-Ai)*/
     assert(llvm_type_is_composite(DestTy) && "conj of noncomplex?");
-    llvm_expand_complex_unary_expr(Fn, exp, DestLoc);
-    break;
-
   case NEGATE_EXPR:    /* -A === 0-A */
     if (llvm_type_is_composite(DestTy)) {
       llvm_expand_complex_unary_expr(Fn, exp, DestLoc);
@@ -6453,6 +6461,10 @@
       llvm_expand_complex_binary_expr(Fn, exp, DestLoc);
       return 0;
     }
+    if ((TREE_CODE(exp) == NE_EXPR || TREE_CODE(exp) == EQ_EXPR) &&
+        TREE_CODE(TREE_TYPE(TREE_OPERAND(exp, 0))) == COMPLEX_TYPE) {
+      return llvm_expand_complex_binary_expr(Fn, exp, DestLoc);
+    }
 
     op0 = llvm_expand_expr(Fn, TREE_OPERAND(exp, 0), 0);
     op1 = llvm_expand_expr(Fn, TREE_OPERAND(exp, 1), 0);






More information about the llvm-commits mailing list