1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=x86_64-windows-msvc < %s -mattr=-sse | FileCheck %s 3; RUN: llc -mtriple=x86_64-windows-gnu < %s -mattr=-sse | FileCheck %s 4 5define void @recv_double(double %v, ptr %p) { 6; CHECK-LABEL: recv_double: 7; CHECK: # %bb.0: 8; CHECK-NEXT: movq %rcx, (%rdx) 9; CHECK-NEXT: retq 10 store double %v, ptr %p 11 ret void 12} 13 14define void @recv_float(float %v, ptr %p) { 15; CHECK-LABEL: recv_float: 16; CHECK: # %bb.0: 17; CHECK-NEXT: movl %ecx, (%rdx) 18; CHECK-NEXT: retq 19 store float %v, ptr %p 20 ret void 21} 22 23define dso_local double @ret_double(ptr %p) { 24; CHECK-LABEL: ret_double: 25; CHECK: # %bb.0: # %entry 26; CHECK-NEXT: movq (%rcx), %rax 27; CHECK-NEXT: retq 28entry: 29 %v = load double, ptr %p 30 ret double %v 31} 32 33define dso_local float @ret_float(ptr %p) { 34; CHECK-LABEL: ret_float: 35; CHECK: # %bb.0: # %entry 36; CHECK-NEXT: movl (%rcx), %eax 37; CHECK-NEXT: retq 38entry: 39 %v = load float, ptr %p 40 ret float %v 41} 42 43declare void @take_double(double) 44declare void @take_float(float) 45 46define void @pass_double(ptr %p) { 47; CHECK-LABEL: pass_double: 48; CHECK: # %bb.0: 49; CHECK-NEXT: subq $40, %rsp 50; CHECK-NEXT: .seh_stackalloc 40 51; CHECK-NEXT: .seh_endprologue 52; CHECK-NEXT: movq (%rcx), %rcx 53; CHECK-NEXT: callq take_double 54; CHECK-NEXT: nop 55; CHECK-NEXT: addq $40, %rsp 56; CHECK-NEXT: retq 57; CHECK-NEXT: .seh_endproc 58 %v = load double, ptr %p 59 call void @take_double(double %v) 60 ret void 61} 62 63define void @pass_float(ptr %p) { 64; CHECK-LABEL: pass_float: 65; CHECK: # %bb.0: 66; CHECK-NEXT: subq $40, %rsp 67; CHECK-NEXT: .seh_stackalloc 40 68; CHECK-NEXT: .seh_endprologue 69; CHECK-NEXT: movl (%rcx), %ecx 70; CHECK-NEXT: callq take_float 71; CHECK-NEXT: nop 72; CHECK-NEXT: addq $40, %rsp 73; CHECK-NEXT: retq 74; CHECK-NEXT: .seh_endproc 75 %v = load float, ptr %p 76 call void @take_float(float %v) 77 ret void 78} 79 80declare double @produce_double() 81declare float @produce_float() 82 83define void @call_double(ptr %p) { 84; CHECK-LABEL: call_double: 85; CHECK: # %bb.0: 86; CHECK-NEXT: pushq %rsi 87; CHECK-NEXT: .seh_pushreg %rsi 88; CHECK-NEXT: subq $32, %rsp 89; CHECK-NEXT: .seh_stackalloc 32 90; CHECK-NEXT: .seh_endprologue 91; CHECK-NEXT: movq %rcx, %rsi 92; CHECK-NEXT: callq produce_double 93; CHECK-NEXT: movq %rax, (%rsi) 94; CHECK-NEXT: addq $32, %rsp 95; CHECK-NEXT: popq %rsi 96; CHECK-NEXT: retq 97; CHECK-NEXT: .seh_endproc 98 %v = call double @produce_double() 99 store double %v, ptr %p 100 ret void 101} 102 103define void @call_float(ptr %p) { 104; CHECK-LABEL: call_float: 105; CHECK: # %bb.0: 106; CHECK-NEXT: pushq %rsi 107; CHECK-NEXT: .seh_pushreg %rsi 108; CHECK-NEXT: subq $32, %rsp 109; CHECK-NEXT: .seh_stackalloc 32 110; CHECK-NEXT: .seh_endprologue 111; CHECK-NEXT: movq %rcx, %rsi 112; CHECK-NEXT: callq produce_float 113; CHECK-NEXT: movl %eax, (%rsi) 114; CHECK-NEXT: addq $32, %rsp 115; CHECK-NEXT: popq %rsi 116; CHECK-NEXT: retq 117; CHECK-NEXT: .seh_endproc 118 %v = call float @produce_float() 119 store float %v, ptr %p 120 ret void 121} 122