llvm-6502/lib
Chris Lattner d43d00cf3a Significantly simplify and improve handling of FP function results on x86-32.
This case returns the value in ST(0) and then has to convert it to an SSE
register.  This causes significant codegen ugliness in some cases.  For 
example in the trivial fp-stack-direct-ret.ll testcase we used to generate:

_bar:
	subl	$28, %esp
	call	L_foo$stub
	fstpl	16(%esp)
	movsd	16(%esp), %xmm0
	movsd	%xmm0, 8(%esp)
	fldl	8(%esp)
	addl	$28, %esp
	ret

because we move the result of foo() into an XMM register, then have to
move it back for the return of bar.

Instead of hacking ever-more special cases into the call result lowering code
we take a much simpler approach: on x86-32, fp return is modeled as always 
returning into an f80 register which is then truncated to f32 or f64 as needed.
Similarly for a result, we model it as an extension to f80 + return.

This exposes the truncate and extensions to the dag combiner, allowing target
independent code to hack on them, eliminating them in this case.  This gives 
us this code for the example above:

_bar:
	subl	$12, %esp
	call	L_foo$stub
	addl	$12, %esp
	ret

The nasty aspect of this is that these conversions are not legal, but we want
the second pass of dag combiner (post-legalize) to be able to hack on them.
To handle this, we lie to legalize and say they are legal, then custom expand
them on entry to the isel pass (PreprocessForFPConvert).  This is gross, but
less gross than the code it is replacing :)

This also allows us to generate better code in several other cases.  For 
example on fp-stack-ret-conv.ll, we now generate:

_test:
	subl	$12, %esp
	call	L_foo$stub
	fstps	8(%esp)
	movl	16(%esp), %eax
	cvtss2sd	8(%esp), %xmm0
	movsd	%xmm0, (%eax)
	addl	$12, %esp
	ret

where before we produced (incidentally, the old bad code is identical to what
gcc produces):

_test:
	subl	$12, %esp
	call	L_foo$stub
	fstpl	(%esp)
	cvtsd2ss	(%esp), %xmm0
	cvtss2sd	%xmm0, %xmm0
	movl	16(%esp), %eax
	movsd	%xmm0, (%eax)
	addl	$12, %esp
	ret

Note that we generate slightly worse code on pr1505b.ll due to a scheduling 
deficiency that is unrelated to this patch.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46307 91177308-0d34-0410-b5e6-96231b3b80d8
2008-01-24 08:07:48 +00:00
..
Analysis Don't be rude, emit debugging info where asked to. 2008-01-02 02:49:20 +00:00
Archive Remove attribution from file headers, per discussion on llvmdev. 2007-12-29 20:36:04 +00:00
AsmParser If there are attributes on the varargs part of a 2008-01-11 21:23:39 +00:00
Bitcode Remove attribution from file headers, per discussion on llvmdev. 2007-12-29 20:36:04 +00:00
CodeGen Fix this buggy transformation. Two observations: 2008-01-24 07:57:06 +00:00
Debugger Remove attribution from file headers, per discussion on llvmdev. 2007-12-29 20:36:04 +00:00
ExecutionEngine I doubt the address of the Error string was intended 2008-01-07 19:14:42 +00:00
Linker Remove attribution from file headers, per discussion on llvmdev. 2007-12-29 20:36:04 +00:00
Support Added FoldingSet style 'profiling' support for APSInt. 2008-01-19 04:31:12 +00:00
System Fix potential buffer overflow 2008-01-24 01:20:48 +00:00
Target Significantly simplify and improve handling of FP function results on x86-32. 2008-01-24 08:07:48 +00:00
Transforms Enable the fix I just checked in, silly me. 2008-01-22 05:42:02 +00:00
VMCore It turns out that in C++ it is legal to declare functions 2008-01-21 21:37:41 +00:00
Makefile remove attribution from lib Makefiles. 2007-12-29 20:09:26 +00:00