I'm currently adding the floating point math instructions (fabs, fsin, fcos ...) to the x86 instruction set. I'm a bit unsure how to make the back end actually generate these instructions, though. My current plan is to add llvm intrinsics for these instructions but I've noticed that llvm already handles C math library functions to some extent. It feels a bit strange to add code for example to constant fold these intrinsics when there is already code to constant fold a calls to libmath functions -- but the libmath functions have certain semantics regarding how errno is set which I don't really want to deal with.
Other compilers have options to enable the direct use of fp instructions for math operations (gcc has -fno-math-errno, -funsafe-math-optimizations and -fno-trapping-math), this could be useful also for LLVM. Assuming there is such an option, should I modify the visitCallInst function to generate machine instructions directly for calls to math functions or is it better to include a pass which converts the calls into intrinsics? An advantage of the second solution is that it makes it easier for other front ends (like ours) which don't have the semantics of libmath to generate code...