Changes in directory llvm/lib/Target/X86:
README.txt updated: 1.110 -> 1.111 --- Log message: Add a note --- Diffs of the changes: (+38 -0) README.txt | 38 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 38 insertions(+) Index: llvm/lib/Target/X86/README.txt diff -u llvm/lib/Target/X86/README.txt:1.110 llvm/lib/Target/X86/README.txt:1.111 --- llvm/lib/Target/X86/README.txt:1.110 Fri May 19 15:51:43 2006 +++ llvm/lib/Target/X86/README.txt Fri May 19 15:55:31 2006 @@ -539,3 +539,41 @@ ret //===---------------------------------------------------------------------===// + +Consider this: + +typedef struct pair { float A, B; } pair; +void pairtest(pair P, float *FP) { + *FP = P.A+P.B; +} + +We currently generate this code with llvmgcc4: + +_pairtest: + subl $12, %esp + movl 20(%esp), %eax + movl %eax, 4(%esp) + movl 16(%esp), %eax + movl %eax, (%esp) + movss (%esp), %xmm0 + addss 4(%esp), %xmm0 + movl 24(%esp), %eax + movss %xmm0, (%eax) + addl $12, %esp + ret + +we should be able to generate: +_pairtest: + movss 4(%esp), %xmm0 + movl 12(%esp), %eax + addss 8(%esp), %xmm0 + movss %xmm0, (%eax) + ret + +The issue is that llvmgcc4 is forcing the struct to memory, then passing it as +integer chunks. It does this so that structs like {short,short} are passed in +a single 32-bit integer stack slot. We should handle the safe cases above much +nicer, while still handling the hard cases. + +//===---------------------------------------------------------------------===// + _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits