Disabling x87 instructions for a sub-target

Hello there,

I recently started working on the LLVM backend for a target that doesn’t support x87 instructions.

Currently, I am in the process of completely disabling some x87 instructions such as fcomi, fcompi,… for a specific sub-target. I also do not have SSE enabled for my sub-target, and llvm resorts to fcomi* instructions for FP compare instructions.

Is there a way to bypass the automatic optimization that generates the x87 instructions when SSE is disabled, and completely eliminate the code generation for the same(error out)?

Thanks

Sriram Murali

+1 (519) 772-2579

Hello there,
I recently started working on the LLVM backend for a target that doesn’t support x87 instructions.
Currently, I am in the process of completely disabling some x87 instructions such as fcomi, fcompi,… for a specific sub-target. I also do not have SSE enabled for my sub-target, and llvm resorts to fcomi* instructions for FP compare instructions.

Is there a way to bypass the automatic optimization that generates the x87 instructions when SSE is disabled, and completely eliminate the code generation for the same(error out)?

A simple trick without requiring code changes is forcing the code generator to use soft fp (llc -soft-float). It will generate libcalls instead of x87 instructions for any floating point operations. The compile will then fail at link time because libcompiler-rt/libgcc don't supply those function for x86.

- Ben

Hi Sriram,

I'm not sure if I understand your question correctly: Do you need to
generate code that contains no x87 floating-point instructions
altogether, but uses calls into a soft-float library instead? That
behaviour can be enabled using the "-soft-float" flag, as far as I know.

Or is it only about the fcomi* instructions, which are not supported by
pre-Pentium Pro chips? Then I have good news: I have been working on
getting this bug [1] fixed, and I'm planning to submit a patch within
the next few days (hopefully in time for the 3.1 release).

Best regards,
Christoph

[1] http://llvm.org/bugs/show_bug.cgi?id=6679

Hi Christoph,
It is the second issue. I am finding each and every instruction that is not supported in the (pre-Pentium pro) arch, and disabling them one by one. I found a way to disable them in the X86InstrFPStack.td, by enforcing sub-target predicates in their definition.
For instance, if I disable:
UCOM_FPIr32, UCOM_FPIr64, and UCOM_FPIr80, it works.

However, several lit-tests fail as a result of that. Therefore, I am still trying to figure it out. If you are working on it, it is good news indeed.

Thanks
Ram

Thanks Chris, your response has been very helpful so far. I will try your solution, as opposed to the one that I have right now. (Disabling all the x87 instructions altogether).

Yours,
Ram