[Beignet] [PATCH 3/3] add llvm intrinsic call translate.

Zhigang Gong zhigang.gong at linux.intel.com
Wed Jan 14 23:30:48 PST 2015


You are right, to use rndz is not just an optimization.
We must use rndz here. Xionghu, please fix it.

Thanks.

On Thu, Jan 15, 2015 at 08:24:29AM +0000, Song, Ruiling wrote:
> Sorry, I previously thought it was for integer to integer truncation.
> For the floating point llvm.trunc to nearest integer, you need use RNDZ.
> When you convert from float to 32bit integer, numbers larger than 2^31 will get wrong result.
> Floating point value range is larger than integer.
> 
> > -----Original Message-----
> > From: Zhigang Gong [mailto:zhigang.gong at linux.intel.com]
> > Sent: Thursday, January 15, 2015 4:13 PM
> > To: Song, Ruiling; Luo, Xionghu; beignet at lists.freedesktop.org
> > Cc: Luo, Xionghu
> > Subject: RE: [Beignet] [PATCH 3/3] add llvm intrinsic call translate.
> > 
> > 
> > 
> > > -----Original Message-----
> > > From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf
> > > Of Song, Ruiling
> > > Sent: Thursday, January 15, 2015 4:00 PM
> > > To: Luo, Xionghu; beignet at lists.freedesktop.org
> > > Cc: Luo, Xionghu
> > > Subject: Re: [Beignet] [PATCH 3/3] add llvm intrinsic call translate.
> > >
> > > > +          case Intrinsic::trunc:
> > > > +          {
> > > > +            Type *llvmDstType = I.getType();
> > > > +            Type *llvmSrcType = I.getOperand(0)->getType();
> > > > +            ir::Type dstType = getType(ctx, llvmDstType);
> > > > +            ir::Type srcType = getType(ctx, llvmSrcType);
> > > > +            GBE_ASSERT(srcType == dstType);
> > > > +
> > > > +            const ir::Register tmp = ctx.reg(getFamily(ir::TYPE_S32));
> > > > +            const ir::Register dst = this->getRegister(&I);
> > > > +            const ir::Register src =
> > this->getRegister(I.getOperand(0));
> > > > +            ctx.CVT(ir::TYPE_S32, srcType, tmp, src);
> > > > +            ctx.CVT(dstType, ir::TYPE_S32, dst, tmp);
> > > Why do we need to convert to TYPE_S32 to convert from TYPE_S32 to
> > dstType?
> > This is what llvm.trunc's purpose:
> > 
> > ‘llvm.trunc.*‘ Intrinsic
> > 
> > Syntax:
> > 
> > This is an overloaded intrinsic. You can use llvm.trunc on any floating point
> > or vector of floating point type. Not all targets support all types however.
> > 
> > declare float     @llvm.trunc.f32(float  %Val)
> > declare double    @llvm.trunc.f64(double %Val)
> > declare x86_fp80  @llvm.trunc.f80(x86_fp80  %Val)
> > declare fp128     @llvm.trunc.f128(fp128 %Val)
> > declare ppc_fp128 @llvm.trunc.ppcf128(ppc_fp128  %Val)
> > Overview:
> > 
> > The ‘llvm.trunc.*‘ intrinsics returns the operand rounded to the nearest
> > integer not larger in magnitude than the operand.
> > 
> > >
> > > _______________________________________________
> > > Beignet mailing list
> > > Beignet at lists.freedesktop.org
> > > http://lists.freedesktop.org/mailman/listinfo/beignet
> 


More information about the Beignet mailing list