xref: /llvm-project/llvm/test/CodeGen/X86/no-sse-win64.ll (revision 2f448bf509432c1a19ec46ab8cbc7353c03c6280)
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