This patch teaches X86FastISel how to select scalar float/double convert operations using AVX instructions.
Before this patch, X86FastISel always selected legacy SSE instructions for FPExt (from float to double) and FPTrunc (from double to float).
For example:
\code
define double @foo(float %f) { %conv = fpext float %f to double ret double %conv }
\end code
Before (with -mattr=+avx -fast-isel), X86FastIsel selected a CVTSS2SDrr which is
legacy SSE:
cvtss2sd %xmm0, %xmm0
With this patch (with -mattr=+avx -fast-isel), X86FastIsel selects a VCVTSS2SDrr instead:
vcvtss2sd %xmm0, %xmm0, %xmm0
Added test fast-isel-fptrunc-fpext.ll to check both the register-register and the register-memory float/double conversion variants.
Please let me know if ok to submit.
Thanks!
Andrea
I have the feeling just reusing OpReg here would be better.
It's true that having an IMPLICIT_DEF, in theory, gives the regalloc more freedom, but I'm afraid it may just cause false-dependence trouble further on if decides to choose a different register. So it may be better to just force OpReg.
This is what the pattern for the rr version does, btw:
The pattern for the rm version has an IMPLICIT_DEF, but in that case, there is no choice.