Implement FRINT lowering on PPC using frin
authorHal Finkel <hfinkel@anl.gov>
Fri, 29 Mar 2013 19:41:55 +0000 (19:41 +0000)
committerHal Finkel <hfinkel@anl.gov>
Fri, 29 Mar 2013 19:41:55 +0000 (19:41 +0000)
commitf8ac57e2890ec0fc6eeb840d561ae3b6d2ca5473
treea2a00adccd50c283d4470ff08b6b726174d77145
parent0f6df00e4d64e74ebb9621edf9beb0ced42e1697
Implement FRINT lowering on PPC using frin

Like nearbyint, rint can be implemented on PPC using the frin instruction. The
complication comes from the fact that rint needs to set the FE_INEXACT flag
when the result does not equal the input value (and frin does not do that). As
a result, we use a custom inserter which, after the rounding, compares the
rounded value with the original, and if they differ, explicitly sets the XX bit
in the FPSCR register (which corresponds to FE_INEXACT).

Once LLVM has better modeling of the floating-point environment we should be
able to (often) eliminate this extra complexity.

llvm-svn: 178362
llvm/lib/Target/PowerPC/PPCISelLowering.cpp
llvm/lib/Target/PowerPC/PPCInstrInfo.td
llvm/test/CodeGen/PowerPC/rounding-ops.ll