; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=x86_64-windows-msvc < %s -mattr=-sse | FileCheck %s ; RUN: llc -mtriple=x86_64-windows-gnu < %s -mattr=-sse | FileCheck %s define void @recv_double(double %v, double* %p) { ; CHECK-LABEL: recv_double: ; CHECK: # %bb.0: ; CHECK-NEXT: movq %rcx, (%rdx) ; CHECK-NEXT: retq store double %v, double* %p ret void } define void @recv_float(float %v, float* %p) { ; CHECK-LABEL: recv_float: ; CHECK: # %bb.0: ; CHECK-NEXT: movl %ecx, (%rdx) ; CHECK-NEXT: retq store float %v, float* %p ret void } define dso_local double @ret_double(double* %p) { ; CHECK-LABEL: ret_double: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: movq (%rcx), %rax ; CHECK-NEXT: retq entry: %v = load double, double* %p ret double %v } define dso_local float @ret_float(float* %p) { ; CHECK-LABEL: ret_float: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: movl (%rcx), %eax ; CHECK-NEXT: retq entry: %v = load float, float* %p ret float %v } declare void @take_double(double) declare void @take_float(float) define void @pass_double(double* %p) { ; CHECK-LABEL: pass_double: ; CHECK: # %bb.0: ; CHECK-NEXT: subq $40, %rsp ; CHECK-NEXT: .seh_stackalloc 40 ; CHECK-NEXT: .seh_endprologue ; CHECK-NEXT: movq (%rcx), %rcx ; CHECK-NEXT: callq take_double ; CHECK-NEXT: nop ; CHECK-NEXT: addq $40, %rsp ; CHECK-NEXT: retq ; CHECK-NEXT: .seh_endproc %v = load double, double* %p call void @take_double(double %v) ret void } define void @pass_float(float* %p) { ; CHECK-LABEL: pass_float: ; CHECK: # %bb.0: ; CHECK-NEXT: subq $40, %rsp ; CHECK-NEXT: .seh_stackalloc 40 ; CHECK-NEXT: .seh_endprologue ; CHECK-NEXT: movl (%rcx), %ecx ; CHECK-NEXT: callq take_float ; CHECK-NEXT: nop ; CHECK-NEXT: addq $40, %rsp ; CHECK-NEXT: retq ; CHECK-NEXT: .seh_endproc %v = load float, float* %p call void @take_float(float %v) ret void } declare double @produce_double() declare float @produce_float() define void @call_double(double* %p) { ; CHECK-LABEL: call_double: ; CHECK: # %bb.0: ; CHECK-NEXT: pushq %rsi ; CHECK-NEXT: .seh_pushreg %rsi ; CHECK-NEXT: subq $32, %rsp ; CHECK-NEXT: .seh_stackalloc 32 ; CHECK-NEXT: .seh_endprologue ; CHECK-NEXT: movq %rcx, %rsi ; CHECK-NEXT: callq produce_double ; CHECK-NEXT: movq %rax, (%rsi) ; CHECK-NEXT: addq $32, %rsp ; CHECK-NEXT: popq %rsi ; CHECK-NEXT: retq ; CHECK-NEXT: .seh_endproc %v = call double @produce_double() store double %v, double* %p ret void } define void @call_float(float* %p) { ; CHECK-LABEL: call_float: ; CHECK: # %bb.0: ; CHECK-NEXT: pushq %rsi ; CHECK-NEXT: .seh_pushreg %rsi ; CHECK-NEXT: subq $32, %rsp ; CHECK-NEXT: .seh_stackalloc 32 ; CHECK-NEXT: .seh_endprologue ; CHECK-NEXT: movq %rcx, %rsi ; CHECK-NEXT: callq produce_float ; CHECK-NEXT: movl %eax, (%rsi) ; CHECK-NEXT: addq $32, %rsp ; CHECK-NEXT: popq %rsi ; CHECK-NEXT: retq ; CHECK-NEXT: .seh_endproc %v = call float @produce_float() store float %v, float* %p ret void }