[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