130 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-windows-msvc < %s -mattr=-sse | FileCheck %s3; RUN: llc -mtriple=x86_64-windows-gnu < %s -mattr=-sse | FileCheck %s4 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: retq10 store double %v, ptr %p11 ret void12}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: retq19 store float %v, ptr %p20 ret void21}22 23define dso_local double @ret_double(ptr %p) {24; CHECK-LABEL: ret_double:25; CHECK: # %bb.0: # %entry26; CHECK-NEXT: movq (%rcx), %rax27; CHECK-NEXT: retq28entry:29 %v = load double, ptr %p30 ret double %v31}32 33define dso_local float @ret_float(ptr %p) {34; CHECK-LABEL: ret_float:35; CHECK: # %bb.0: # %entry36; CHECK-NEXT: movl (%rcx), %eax37; CHECK-NEXT: retq38entry:39 %v = load float, ptr %p40 ret float %v41}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, %rsp50; CHECK-NEXT: .seh_stackalloc 4051; CHECK-NEXT: .seh_endprologue52; CHECK-NEXT: movq (%rcx), %rcx53; CHECK-NEXT: callq take_double54; CHECK-NEXT: nop55; CHECK-NEXT: .seh_startepilogue56; CHECK-NEXT: addq $40, %rsp57; CHECK-NEXT: .seh_endepilogue58; CHECK-NEXT: retq59; CHECK-NEXT: .seh_endproc60 %v = load double, ptr %p61 call void @take_double(double %v)62 ret void63}64 65define void @pass_float(ptr %p) {66; CHECK-LABEL: pass_float:67; CHECK: # %bb.0:68; CHECK-NEXT: subq $40, %rsp69; CHECK-NEXT: .seh_stackalloc 4070; CHECK-NEXT: .seh_endprologue71; CHECK-NEXT: movl (%rcx), %ecx72; CHECK-NEXT: callq take_float73; CHECK-NEXT: nop74; CHECK-NEXT: .seh_startepilogue75; CHECK-NEXT: addq $40, %rsp76; CHECK-NEXT: .seh_endepilogue77; CHECK-NEXT: retq78; CHECK-NEXT: .seh_endproc79 %v = load float, ptr %p80 call void @take_float(float %v)81 ret void82}83 84declare double @produce_double()85declare float @produce_float()86 87define void @call_double(ptr %p) {88; CHECK-LABEL: call_double:89; CHECK: # %bb.0:90; CHECK-NEXT: pushq %rsi91; CHECK-NEXT: .seh_pushreg %rsi92; CHECK-NEXT: subq $32, %rsp93; CHECK-NEXT: .seh_stackalloc 3294; CHECK-NEXT: .seh_endprologue95; CHECK-NEXT: movq %rcx, %rsi96; CHECK-NEXT: callq produce_double97; CHECK-NEXT: movq %rax, (%rsi)98; CHECK-NEXT: .seh_startepilogue99; CHECK-NEXT: addq $32, %rsp100; CHECK-NEXT: popq %rsi101; CHECK-NEXT: .seh_endepilogue102; CHECK-NEXT: retq103; CHECK-NEXT: .seh_endproc104 %v = call double @produce_double()105 store double %v, ptr %p106 ret void107}108 109define void @call_float(ptr %p) {110; CHECK-LABEL: call_float:111; CHECK: # %bb.0:112; CHECK-NEXT: pushq %rsi113; CHECK-NEXT: .seh_pushreg %rsi114; CHECK-NEXT: subq $32, %rsp115; CHECK-NEXT: .seh_stackalloc 32116; CHECK-NEXT: .seh_endprologue117; CHECK-NEXT: movq %rcx, %rsi118; CHECK-NEXT: callq produce_float119; CHECK-NEXT: movl %eax, (%rsi)120; CHECK-NEXT: .seh_startepilogue121; CHECK-NEXT: addq $32, %rsp122; CHECK-NEXT: popq %rsi123; CHECK-NEXT: .seh_endepilogue124; CHECK-NEXT: retq125; CHECK-NEXT: .seh_endproc126 %v = call float @produce_float()127 store float %v, ptr %p128 ret void129}130