[Beignet] [PATCH] Refine the FCMP_ORD and FCMP_UNO.
Zhigang Gong
zhigang.gong at linux.intel.com
Mon Mar 24 22:31:07 PDT 2014
LGTM, pushed, thanks.
On Mon, Mar 24, 2014 at 05:21:40PM +0800, Yang Rong wrote:
> 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 <rong.r.yang at intel.com>
> ---
> 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
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list