[llvm-commits] [dragonegg] r94962 - in /dragonegg/trunk: llvm-convert.cpp llvm-internal.h
Duncan Sands
baldrick at free.fr
Sun Jan 31 08:35:20 PST 2010
Author: baldrick
Date: Sun Jan 31 10:35:20 2010
New Revision: 94962
URL: http://llvm.org/viewvc/llvm-project?rev=94962&view=rev
Log:
Move RDIV_EXPR out of EmitReg_BinOp and EmitComplexBinOp, and handle it directly.
With this, EmitComplexBinOp is no more.
Modified:
dragonegg/trunk/llvm-convert.cpp
dragonegg/trunk/llvm-internal.h
Modified: dragonegg/trunk/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=94962&r1=94961&r2=94962&view=diff
==============================================================================
--- dragonegg/trunk/llvm-convert.cpp (original)
+++ dragonegg/trunk/llvm-convert.cpp Sun Jan 31 10:35:20 2010
@@ -5046,40 +5046,6 @@
Imag = Mem2Reg(Builder.CreateExtractValue(Complex, 1), elt_type, Builder);
}
-// EmitComplexBinOp - Note that this operates on binops like ==/!=, which return
-// a bool, not a complex value.
-Value *TreeToLLVM::EmitComplexBinOp(tree_code code, tree op0, tree op1) {
- Value *LHSr, *LHSi;
- SplitComplex(EmitRegister(op0), LHSr, LHSi, TREE_TYPE(TREE_TYPE(op0)));
- Value *RHSr, *RHSi;
- SplitComplex(EmitRegister(op1), RHSr, RHSi, TREE_TYPE(TREE_TYPE(op1)));
-
- Value *DSTr, *DSTi;
- switch (code) {
- default: llvm_unreachable("Unhandled complex binop!");
- case RDIV_EXPR: { // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
- // RDIV_EXPR should always be floating point.
- assert (LHSr->getType()->isFloatingPoint());
- Value *Tmp1 = Builder.CreateFMul(LHSr, RHSr); // a*c
- Value *Tmp2 = Builder.CreateFMul(LHSi, RHSi); // b*d
- Value *Tmp3 = Builder.CreateFAdd(Tmp1, Tmp2); // ac+bd
-
- Value *Tmp4 = Builder.CreateFMul(RHSr, RHSr); // c*c
- Value *Tmp5 = Builder.CreateFMul(RHSi, RHSi); // d*d
- Value *Tmp6 = Builder.CreateFAdd(Tmp4, Tmp5); // cc+dd
- DSTr = Builder.CreateFDiv(Tmp3, Tmp6);
-
- Value *Tmp7 = Builder.CreateFMul(LHSi, RHSr); // b*c
- Value *Tmp8 = Builder.CreateFMul(LHSr, RHSi); // a*d
- Value *Tmp9 = Builder.CreateFSub(Tmp7, Tmp8); // bc-ad
- DSTi = Builder.CreateFDiv(Tmp9, Tmp6);
- break;
- }
- }
-
- return CreateComplex(DSTr, DSTi, TREE_TYPE(TREE_TYPE(op1)));
-}
-
//===----------------------------------------------------------------------===//
// ... L-Value Expressions ...
@@ -6058,8 +6024,7 @@
/// EmitReg_BinOp - 'exp' is a binary operator.
Value *TreeToLLVM::EmitReg_BinOp(tree type, tree_code code, tree op0, tree op1,
unsigned Opc) {
- if (TREE_CODE(type) == COMPLEX_TYPE)
- return EmitComplexBinOp(code, op0, op1);
+ assert(TREE_CODE(type) != COMPLEX_TYPE && "Unexpected complex binop!");
Value *LHS = EmitRegister(op0);
Value *RHS = EmitRegister(op1);
@@ -6455,6 +6420,41 @@
return UselesslyTypeConvert(GEP, GetRegType(type));
}
+Value *TreeToLLVM::EmitReg_RDIV_EXPR(tree op0, tree op1) {
+ Value *LHS = EmitRegister(op0);
+ Value *RHS = EmitRegister(op1);
+ tree type = TREE_TYPE(op0);
+
+ if (TREE_CODE(type) == COMPLEX_TYPE) {
+ tree elt_type = TREE_TYPE(type);
+ Value *LHSr, *LHSi; SplitComplex(LHS, LHSr, LHSi, elt_type);
+ Value *RHSr, *RHSi; SplitComplex(RHS, RHSr, RHSi, elt_type);
+ Value *DSTr, *DSTi;
+
+ // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
+ assert (LHSr->getType()->isFloatingPoint() &&
+ "RDIV_EXPR not floating point!");
+ Value *Tmp1 = Builder.CreateFMul(LHSr, RHSr); // a*c
+ Value *Tmp2 = Builder.CreateFMul(LHSi, RHSi); // b*d
+ Value *Tmp3 = Builder.CreateFAdd(Tmp1, Tmp2); // ac+bd
+
+ Value *Tmp4 = Builder.CreateFMul(RHSr, RHSr); // c*c
+ Value *Tmp5 = Builder.CreateFMul(RHSi, RHSi); // d*d
+ Value *Tmp6 = Builder.CreateFAdd(Tmp4, Tmp5); // cc+dd
+ DSTr = Builder.CreateFDiv(Tmp3, Tmp6);
+
+ Value *Tmp7 = Builder.CreateFMul(LHSi, RHSr); // b*c
+ Value *Tmp8 = Builder.CreateFMul(LHSr, RHSi); // a*d
+ Value *Tmp9 = Builder.CreateFSub(Tmp7, Tmp8); // bc-ad
+ DSTi = Builder.CreateFDiv(Tmp9, Tmp6);
+
+ return CreateComplex(DSTr, DSTi, elt_type);
+ }
+
+ assert(LHS->getType()->isFPOrFPVector() && "RDIV_EXPR not floating point!");
+ return Builder.CreateFDiv(LHS, RHS);
+}
+
Value *TreeToLLVM::EmitReg_ROUND_DIV_EXPR(tree type, tree op0, tree op1) {
// Notation: ROUND_DIV_EXPR <-> RDiv, TRUNC_DIV_EXPR <-> Div.
@@ -7273,18 +7273,15 @@
ICmpInst::ICMP_SLE, FCmpInst::FCMP_OLE, false);
break;
case MINUS_EXPR:
- RHS = EmitReg_MINUS_EXPR(rhs1, rhs2);
- break;
+ RHS = EmitReg_MINUS_EXPR(rhs1, rhs2); break;
case MULT_EXPR:
- RHS = EmitReg_MULT_EXPR(rhs1, rhs2);
- break;
+ RHS = EmitReg_MULT_EXPR(rhs1, rhs2); break;
case PLUS_EXPR:
- RHS = EmitReg_PLUS_EXPR(rhs1, rhs2);
- break;
+ RHS = EmitReg_PLUS_EXPR(rhs1, rhs2); break;
case POINTER_PLUS_EXPR:
RHS = EmitReg_POINTER_PLUS_EXPR(type, rhs1, rhs2); break;
case RDIV_EXPR:
- RHS = EmitReg_BinOp(type, code, rhs1, rhs2, Instruction::FDiv); break;
+ RHS = EmitReg_RDIV_EXPR(rhs1, rhs2); break;
case ROUND_DIV_EXPR:
RHS = EmitReg_ROUND_DIV_EXPR(type, rhs1, rhs2); break;
case RROTATE_EXPR:
Modified: dragonegg/trunk/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-internal.h?rev=94962&r1=94961&r2=94962&view=diff
==============================================================================
--- dragonegg/trunk/llvm-internal.h (original)
+++ dragonegg/trunk/llvm-internal.h Sun Jan 31 10:35:20 2010
@@ -649,6 +649,7 @@
Value *EmitReg_PLUS_EXPR(tree_node *op0, tree_node *op1);
Value *EmitReg_POINTER_PLUS_EXPR(tree_node *type, tree_node *op0,
tree_node *op1);
+ Value *EmitReg_RDIV_EXPR(tree_node *op0, tree_node *op1);
Value *EmitReg_ROUND_DIV_EXPR(tree_node *type, tree_node *op0,
tree_node *op1);
@@ -717,7 +718,6 @@
Value *CreateComplex(Value *Real, Value *Imag, tree_node *elt_type);
void SplitComplex(Value *Complex, Value *&Real, Value *&Imag,
tree_node *elt_type);
- Value *EmitComplexBinOp(tree_code code, tree_node *op0, tree_node *op1);
// L-Value Expressions.
LValue EmitLV_ARRAY_REF(tree_node *exp);
More information about the llvm-commits
mailing list