Compiler projects using llvm
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=i686-- | FileCheck %s -check-prefix=X87
; RUN: llc < %s -mtriple=i686-- -mattr=-x87 | FileCheck %s -check-prefixes=NOX87,NOSSE-NOX87
; RUN: llc < %s -mtriple=i686-- -mattr=-x87,-sse2 | FileCheck %s -check-prefixes=NOX87,NOSSE-NOX87
; RUN: llc < %s -mtriple=i686-- -mattr=-x87,+sse2 | FileCheck %s -check-prefixes=NOX87,SSE-NOX87

define float @f1(float %a, float %b) nounwind {
; X87-LABEL: f1:
; X87:       # %bb.0: # %entry
; X87-NEXT:    flds {{[0-9]+}}(%esp)
; X87-NEXT:    retl
;
; NOSSE-NOX87-LABEL: f1:
; NOSSE-NOX87:       # %bb.0: # %entry
; NOSSE-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
; NOSSE-NOX87-NEXT:    retl
;
; SSE-NOX87-LABEL: f1:
; SSE-NOX87:       # %bb.0: # %entry
; SSE-NOX87-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE-NOX87-NEXT:    movd %xmm0, %eax
; SSE-NOX87-NEXT:    retl
entry:
  ret float %b
}

define double @f2(double %a, double %b) nounwind {
; X87-LABEL: f2:
; X87:       # %bb.0: # %entry
; X87-NEXT:    fldl {{[0-9]+}}(%esp)
; X87-NEXT:    retl
;
; NOX87-LABEL: f2:
; NOX87:       # %bb.0: # %entry
; NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
; NOX87-NEXT:    movl {{[0-9]+}}(%esp), %edx
; NOX87-NEXT:    retl
entry:
  ret double %b
}

define x86_fp80 @f3(x86_fp80 %a, x86_fp80 %b) nounwind {
; X87-LABEL: f3:
; X87:       # %bb.0: # %entry
; X87-NEXT:    fldt {{[0-9]+}}(%esp)
; X87-NEXT:    retl
;
; NOX87-LABEL: f3:
; NOX87:       # %bb.0: # %entry
; NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
; NOX87-NEXT:    movl {{[0-9]+}}(%esp), %edx
; NOX87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
; NOX87-NEXT:    retl
entry:
  ret x86_fp80 %b
}

define float @f4(float %a, float %b) nounwind {
; X87-LABEL: f4:
; X87:       # %bb.0: # %entry
; X87-NEXT:    flds {{[0-9]+}}(%esp)
; X87-NEXT:    fadds {{[0-9]+}}(%esp)
; X87-NEXT:    retl
;
; NOSSE-NOX87-LABEL: f4:
; NOSSE-NOX87:       # %bb.0: # %entry
; NOSSE-NOX87-NEXT:    pushl {{[0-9]+}}(%esp)
; NOSSE-NOX87-NEXT:    pushl {{[0-9]+}}(%esp)
; NOSSE-NOX87-NEXT:    calll __addsf3
; NOSSE-NOX87-NEXT:    addl $8, %esp
; NOSSE-NOX87-NEXT:    retl
;
; SSE-NOX87-LABEL: f4:
; SSE-NOX87:       # %bb.0: # %entry
; SSE-NOX87-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE-NOX87-NEXT:    addss {{[0-9]+}}(%esp), %xmm0
; SSE-NOX87-NEXT:    movd %xmm0, %eax
; SSE-NOX87-NEXT:    retl
entry:
  %0 = fadd float %a, %b
  ret float %0
}

define double @f5(double %a, double %b) nounwind {
; X87-LABEL: f5:
; X87:       # %bb.0: # %entry
; X87-NEXT:    fldl {{[0-9]+}}(%esp)
; X87-NEXT:    faddl {{[0-9]+}}(%esp)
; X87-NEXT:    retl
;
; NOSSE-NOX87-LABEL: f5:
; NOSSE-NOX87:       # %bb.0: # %entry
; NOSSE-NOX87-NEXT:    pushl {{[0-9]+}}(%esp)
; NOSSE-NOX87-NEXT:    pushl {{[0-9]+}}(%esp)
; NOSSE-NOX87-NEXT:    pushl {{[0-9]+}}(%esp)
; NOSSE-NOX87-NEXT:    pushl {{[0-9]+}}(%esp)
; NOSSE-NOX87-NEXT:    calll __adddf3
; NOSSE-NOX87-NEXT:    addl $16, %esp
; NOSSE-NOX87-NEXT:    retl
;
; SSE-NOX87-LABEL: f5:
; SSE-NOX87:       # %bb.0: # %entry
; SSE-NOX87-NEXT:    pushl %ebp
; SSE-NOX87-NEXT:    movl %esp, %ebp
; SSE-NOX87-NEXT:    andl $-8, %esp
; SSE-NOX87-NEXT:    subl $8, %esp
; SSE-NOX87-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
; SSE-NOX87-NEXT:    addsd 16(%ebp), %xmm0
; SSE-NOX87-NEXT:    movsd %xmm0, (%esp)
; SSE-NOX87-NEXT:    movl (%esp), %eax
; SSE-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %edx
; SSE-NOX87-NEXT:    movl %ebp, %esp
; SSE-NOX87-NEXT:    popl %ebp
; SSE-NOX87-NEXT:    retl
entry:
  %0 = fadd double %a, %b
  ret double %0
}

; FIXME: We should not generate x87 instructions when x87 is disabled.
define x86_fp80 @f6(x86_fp80 %a, x86_fp80 %b) nounwind {
; X87-LABEL: f6:
; X87:       # %bb.0: # %entry
; X87-NEXT:    fldt {{[0-9]+}}(%esp)
; X87-NEXT:    fldt {{[0-9]+}}(%esp)
; X87-NEXT:    faddp %st, %st(1)
; X87-NEXT:    retl
;
; NOX87-LABEL: f6:
; NOX87:       # %bb.0: # %entry
; NOX87-NEXT:    pushl %ebp
; NOX87-NEXT:    movl %esp, %ebp
; NOX87-NEXT:    andl $-8, %esp
; NOX87-NEXT:    subl $48, %esp
; NOX87-NEXT:    movl 20(%ebp), %eax
; NOX87-NEXT:    movl 24(%ebp), %ecx
; NOX87-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
; NOX87-NEXT:    movl %eax, {{[0-9]+}}(%esp)
; NOX87-NEXT:    movl 28(%ebp), %eax
; NOX87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
; NOX87-NEXT:    movl 8(%ebp), %eax
; NOX87-NEXT:    movl 12(%ebp), %ecx
; NOX87-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
; NOX87-NEXT:    movl %eax, {{[0-9]+}}(%esp)
; NOX87-NEXT:    movl 16(%ebp), %eax
; NOX87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
; NOX87-NEXT:    fldt {{[0-9]+}}(%esp)
; NOX87-NEXT:    fldt {{[0-9]+}}(%esp)
; NOX87-NEXT:    faddp %st, %st(1)
; NOX87-NEXT:    fstpt (%esp)
; NOX87-NEXT:    movl (%esp), %eax
; NOX87-NEXT:    movl {{[0-9]+}}(%esp), %edx
; NOX87-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
; NOX87-NEXT:    movl %ebp, %esp
; NOX87-NEXT:    popl %ebp
; NOX87-NEXT:    retl
entry:
  %0 = fadd x86_fp80 %a, %b
  ret x86_fp80 %0
}

define {float, float, float} @f7(float %a, float %b) nounwind {
; X87-LABEL: f7:
; X87:       # %bb.0: # %entry
; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
; X87-NEXT:    flds {{[0-9]+}}(%esp)
; X87-NEXT:    flds {{[0-9]+}}(%esp)
; X87-NEXT:    fstps 8(%eax)
; X87-NEXT:    fsts 4(%eax)
; X87-NEXT:    fstps (%eax)
; X87-NEXT:    retl $4
;
; NOSSE-NOX87-LABEL: f7:
; NOSSE-NOX87:       # %bb.0: # %entry
; NOSSE-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
; NOSSE-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
; NOSSE-NOX87-NEXT:    movl %eax, %edx
; NOSSE-NOX87-NEXT:    retl
;
; SSE-NOX87-LABEL: f7:
; SSE-NOX87:       # %bb.0: # %entry
; SSE-NOX87-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE-NOX87-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
; SSE-NOX87-NEXT:    movd %xmm0, %eax
; SSE-NOX87-NEXT:    movd %xmm0, %edx
; SSE-NOX87-NEXT:    movd %xmm1, %ecx
; SSE-NOX87-NEXT:    retl
entry:
  %0 = insertvalue {float, float, float} undef, float %a, 0
  %1 = insertvalue {float, float, float} %0, float %a, 1
  %2 = insertvalue {float, float, float} %1, float %b, 2
  ret {float, float, float} %2
}