forked from OSchip/llvm-project
Fix FP_TO_UINT with Scalar SSE2 now that the legalizer can handle it. We
now generate the relatively good code sequences: unsigned short foo(float a) { return a; } _foo: movss 4(%esp), %xmm0 cvttss2si %xmm0, %eax movzwl %ax, %eax ret and unsigned bar(float a) { return a; } _bar: movss .CPI_bar_0, %xmm0 movss 4(%esp), %xmm1 movapd %xmm1, %xmm2 subss %xmm0, %xmm2 cvttss2si %xmm2, %eax xorl $-2147483648, %eax cvttss2si %xmm1, %ecx ucomiss %xmm0, %xmm1 cmovb %ecx, %eax ret llvm-svn: 22786
This commit is contained in:
parent
36853ee1fd
commit
4d959f6627
|
@ -141,12 +141,20 @@ namespace {
|
|||
setOperationAction(ISD::FP_TO_UINT , MVT::i1 , Promote);
|
||||
setOperationAction(ISD::FP_TO_UINT , MVT::i8 , Promote);
|
||||
setOperationAction(ISD::FP_TO_UINT , MVT::i16 , Promote);
|
||||
setOperationAction(ISD::FP_TO_UINT , MVT::i32 , Promote);
|
||||
|
||||
if (!X86ScalarSSE)
|
||||
setOperationAction(ISD::FP_TO_UINT , MVT::i32 , Promote);
|
||||
|
||||
// Promote i1/i8 FP_TO_SINT to larger FP_TO_SINTS's, as X86 doesn't have
|
||||
// this operation.
|
||||
setOperationAction(ISD::FP_TO_SINT , MVT::i1 , Promote);
|
||||
setOperationAction(ISD::FP_TO_SINT , MVT::i8 , Promote);
|
||||
setOperationAction(ISD::FP_TO_SINT , MVT::i16 , Promote);
|
||||
|
||||
// Expand FP_TO_UINT into a select.
|
||||
// FIXME: We would like to use a Custom expander here eventually to do
|
||||
// the optimal thing for SSE vs. the default expansion in the legalizer.
|
||||
setOperationAction(ISD::FP_TO_UINT , MVT::i32 , Expand);
|
||||
|
||||
setOperationAction(ISD::BRCONDTWOWAY , MVT::Other, Expand);
|
||||
setOperationAction(ISD::MEMMOVE , MVT::Other, Expand);
|
||||
|
|
Loading…
Reference in New Issue