xref: /llvm-project/llvm/test/CodeGen/X86/pr59258.ll (revision a2a0089ac3a5781ba74d4d319c87c9e8b46d4eda)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
3
4define <8 x half> @cvt_and_clamp2(<8 x float>) nounwind {
5; CHECK-LABEL: cvt_and_clamp2:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    subq $104, %rsp
8; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
9; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
10; CHECK-NEXT:    movaps %xmm1, %xmm0
11; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3],xmm1[3,3]
12; CHECK-NEXT:    callq __truncsfhf2@PLT
13; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
14; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
15; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
16; CHECK-NEXT:    callq __truncsfhf2@PLT
17; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
18; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
19; CHECK-NEXT:    callq __truncsfhf2@PLT
20; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
21; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
22; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
23; CHECK-NEXT:    callq __truncsfhf2@PLT
24; CHECK-NEXT:    movss %xmm0, (%rsp) # 4-byte Spill
25; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
26; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
27; CHECK-NEXT:    callq __truncsfhf2@PLT
28; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
29; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
30; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
31; CHECK-NEXT:    callq __truncsfhf2@PLT
32; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
33; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
34; CHECK-NEXT:    callq __truncsfhf2@PLT
35; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
36; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
37; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
38; CHECK-NEXT:    callq __truncsfhf2@PLT
39; CHECK-NEXT:    callq __extendhfsf2@PLT
40; CHECK-NEXT:    xorps %xmm1, %xmm1
41; CHECK-NEXT:    callq fmaxf@PLT
42; CHECK-NEXT:    callq __truncsfhf2@PLT
43; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
44; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
45; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
46; CHECK-NEXT:    callq __extendhfsf2@PLT
47; CHECK-NEXT:    xorps %xmm1, %xmm1
48; CHECK-NEXT:    callq fmaxf@PLT
49; CHECK-NEXT:    callq __truncsfhf2@PLT
50; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
51; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
52; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
53; CHECK-NEXT:    callq __extendhfsf2@PLT
54; CHECK-NEXT:    xorps %xmm1, %xmm1
55; CHECK-NEXT:    callq fmaxf@PLT
56; CHECK-NEXT:    callq __truncsfhf2@PLT
57; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
58; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
59; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
60; CHECK-NEXT:    callq __extendhfsf2@PLT
61; CHECK-NEXT:    xorps %xmm1, %xmm1
62; CHECK-NEXT:    callq fmaxf@PLT
63; CHECK-NEXT:    callq __truncsfhf2@PLT
64; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
65; CHECK-NEXT:    movss (%rsp), %xmm0 # 4-byte Reload
66; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
67; CHECK-NEXT:    callq __extendhfsf2@PLT
68; CHECK-NEXT:    xorps %xmm1, %xmm1
69; CHECK-NEXT:    callq fmaxf@PLT
70; CHECK-NEXT:    callq __truncsfhf2@PLT
71; CHECK-NEXT:    movss %xmm0, (%rsp) # 4-byte Spill
72; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
73; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
74; CHECK-NEXT:    callq __extendhfsf2@PLT
75; CHECK-NEXT:    xorps %xmm1, %xmm1
76; CHECK-NEXT:    callq fmaxf@PLT
77; CHECK-NEXT:    callq __truncsfhf2@PLT
78; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
79; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
80; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
81; CHECK-NEXT:    callq __extendhfsf2@PLT
82; CHECK-NEXT:    xorps %xmm1, %xmm1
83; CHECK-NEXT:    callq fmaxf@PLT
84; CHECK-NEXT:    callq __truncsfhf2@PLT
85; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
86; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
87; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
88; CHECK-NEXT:    callq __extendhfsf2@PLT
89; CHECK-NEXT:    xorps %xmm1, %xmm1
90; CHECK-NEXT:    callq fmaxf@PLT
91; CHECK-NEXT:    callq __truncsfhf2@PLT
92; CHECK-NEXT:    callq __extendhfsf2@PLT
93; CHECK-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
94; CHECK-NEXT:    callq fminf@PLT
95; CHECK-NEXT:    callq __truncsfhf2@PLT
96; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
97; CHECK-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
98; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
99; CHECK-NEXT:    callq __extendhfsf2@PLT
100; CHECK-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
101; CHECK-NEXT:    callq fminf@PLT
102; CHECK-NEXT:    callq __truncsfhf2@PLT
103; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
104; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
105; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
106; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
107; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
108; CHECK-NEXT:    callq __extendhfsf2@PLT
109; CHECK-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
110; CHECK-NEXT:    callq fminf@PLT
111; CHECK-NEXT:    callq __truncsfhf2@PLT
112; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
113; CHECK-NEXT:    movd (%rsp), %xmm0 # 4-byte Folded Reload
114; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
115; CHECK-NEXT:    callq __extendhfsf2@PLT
116; CHECK-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
117; CHECK-NEXT:    callq fminf@PLT
118; CHECK-NEXT:    callq __truncsfhf2@PLT
119; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
120; CHECK-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
121; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
122; CHECK-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
123; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
124; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
125; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
126; CHECK-NEXT:    callq __extendhfsf2@PLT
127; CHECK-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
128; CHECK-NEXT:    callq fminf@PLT
129; CHECK-NEXT:    callq __truncsfhf2@PLT
130; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
131; CHECK-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
132; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
133; CHECK-NEXT:    callq __extendhfsf2@PLT
134; CHECK-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
135; CHECK-NEXT:    callq fminf@PLT
136; CHECK-NEXT:    callq __truncsfhf2@PLT
137; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
138; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
139; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
140; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
141; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
142; CHECK-NEXT:    callq __extendhfsf2@PLT
143; CHECK-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
144; CHECK-NEXT:    callq fminf@PLT
145; CHECK-NEXT:    callq __truncsfhf2@PLT
146; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
147; CHECK-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
148; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
149; CHECK-NEXT:    callq __extendhfsf2@PLT
150; CHECK-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
151; CHECK-NEXT:    callq fminf@PLT
152; CHECK-NEXT:    callq __truncsfhf2@PLT
153; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
154; CHECK-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
155; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
156; CHECK-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
157; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
158; CHECK-NEXT:    # xmm1 = xmm1[0],mem[0]
159; CHECK-NEXT:    movdqa %xmm1, %xmm0
160; CHECK-NEXT:    addq $104, %rsp
161; CHECK-NEXT:    retq
162    %2 = fptrunc <8 x float> %0 to <8 x half>
163    %3 = call <8 x half> @llvm.maxnum.v8f16(<8 x half> zeroinitializer, <8 x half> %2)
164    %4 = call <8 x half> @llvm.minnum.v8f16(<8 x half> %3, <8 x half> <half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0>)
165    ret <8 x half> %4
166}
167
168declare <8 x half> @llvm.maxnum.v8f16(<8 x half>, <8 x half>)
169declare <8 x half> @llvm.minnum.v8f16(<8 x half>, <8 x half>)
170