LGTM

-----Original Message-----
From: Beignet [mailto:[email protected]] On Behalf Of Yang 
Rong
Sent: Monday, March 24, 2014 5:22 PM
To: [email protected]
Cc: Yang, Rong R
Subject: [Beignet] [PATCH] Refine the FCMP_ORD and FCMP_UNO.

If there is a constant between src0 and src1 of FCMP_ORD/FCMP_UNO, the constant 
value must be ordered, otherwise, llvm will optimize the instruction to 
ture/false.
So discard this constant value, only compare the other src.

Signed-off-by: Yang Rong <[email protected]>
---
 backend/src/llvm/llvm_gen_backend.cpp | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/backend/src/llvm/llvm_gen_backend.cpp 
b/backend/src/llvm/llvm_gen_backend.cpp
index c459f25..2904037 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -1653,10 +1653,26 @@ namespace gbe
       case ICmpInst::FCMP_OGE: ctx.GE(type, dst, src0, src1); break;
       case ICmpInst::FCMP_OLT: ctx.LT(type, dst, src0, src1); break;
       case ICmpInst::FCMP_OGT: ctx.GT(type, dst, src0, src1); break;
-      case ICmpInst::FCMP_ORD: ctx.ORD(type, dst, src0, src1); break;
+      case ICmpInst::FCMP_ORD:
+        //If there is a constant between src0 and src1, this constant value
+        //must ordered, otherwise, llvm will optimize the instruction to ture.
+        //So discard this constant value, only compare the other src.
+        if(isa<ConstantFP>(I.getOperand(0)))
+          ctx.EQ(type, dst, src1, src1);
+        else if(isa<ConstantFP>(I.getOperand(1)))
+          ctx.EQ(type, dst, src0, src0);
+        else
+          ctx.ORD(type, dst, src0, src1);
+        break;
       case ICmpInst::FCMP_UNO:
-        ctx.ORD(type, tmp, src0, src1);
-        ctx.XOR(insnType, dst, tmp, getRegister(cv));  //TODO: Use NOT directly
+        if(isa<ConstantFP>(I.getOperand(0)))
+          ctx.NE(type, dst, src1, src1);
+        else if(isa<ConstantFP>(I.getOperand(1)))
+          ctx.NE(type, dst, src0, src0);
+        else {
+          ctx.ORD(type, tmp, src0, src1);
+          ctx.XOR(insnType, dst, tmp, getRegister(cv));  //TODO: Use NOT 
directly
+        }
         break;
       case ICmpInst::FCMP_UEQ:
         ctx.NE(type, tmp, src0, src1);
--
1.8.3.2

_______________________________________________
Beignet mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/beignet
_______________________________________________
Beignet mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to