1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+experimental-zvfh,+v -target-abi=ilp32d \
3; RUN:     -verify-machineinstrs < %s | FileCheck %s
4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+experimental-zvfh,+v -target-abi=lp64d \
5; RUN:     -verify-machineinstrs < %s | FileCheck %s
6
7declare <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half>, <vscale x 1 x half>)
8
9define <vscale x 1 x half> @vfcopysign_vv_nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %vs) {
10; CHECK-LABEL: vfcopysign_vv_nxv1f16:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
13; CHECK-NEXT:    vfsgnj.vv v8, v8, v9
14; CHECK-NEXT:    ret
15  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %vs)
16  ret <vscale x 1 x half> %r
17}
18
19define <vscale x 1 x half> @vfcopysign_vf_nxv1f16(<vscale x 1 x half> %vm, half %s) {
20; CHECK-LABEL: vfcopysign_vf_nxv1f16:
21; CHECK:       # %bb.0:
22; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
23; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
24; CHECK-NEXT:    ret
25  %head = insertelement <vscale x 1 x half> poison, half %s, i32 0
26  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
27  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %splat)
28  ret <vscale x 1 x half> %r
29}
30
31define <vscale x 1 x half> @vfcopynsign_vv_nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %vs) {
32; CHECK-LABEL: vfcopynsign_vv_nxv1f16:
33; CHECK:       # %bb.0:
34; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
35; CHECK-NEXT:    vfsgnjn.vv v8, v8, v9
36; CHECK-NEXT:    ret
37  %n = fneg <vscale x 1 x half> %vs
38  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %n)
39  ret <vscale x 1 x half> %r
40}
41
42define <vscale x 1 x half> @vfcopynsign_vf_nxv1f16(<vscale x 1 x half> %vm, half %s) {
43; CHECK-LABEL: vfcopynsign_vf_nxv1f16:
44; CHECK:       # %bb.0:
45; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
46; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
47; CHECK-NEXT:    ret
48  %head = insertelement <vscale x 1 x half> poison, half %s, i32 0
49  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
50  %n = fneg <vscale x 1 x half> %splat
51  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %n)
52  ret <vscale x 1 x half> %r
53}
54
55define <vscale x 1 x half> @vfcopysign_exttrunc_vv_nxv1f16_nxv1f32(<vscale x 1 x half> %vm, <vscale x 1 x float> %vs) {
56; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f16_nxv1f32:
57; CHECK:       # %bb.0:
58; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
59; CHECK-NEXT:    vfncvt.f.f.w v10, v9
60; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
61; CHECK-NEXT:    ret
62  %e = fptrunc <vscale x 1 x float> %vs to <vscale x 1 x half>
63  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %e)
64  ret <vscale x 1 x half> %r
65}
66
67define <vscale x 1 x half> @vfcopysign_exttrunc_vf_nxv1f16_nxv1f32(<vscale x 1 x half> %vm, float %s) {
68; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f16_nxv1f32:
69; CHECK:       # %bb.0:
70; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
71; CHECK-NEXT:    vfmv.v.f v9, fa0
72; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
73; CHECK-NEXT:    vfncvt.f.f.w v10, v9
74; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
75; CHECK-NEXT:    ret
76  %head = insertelement <vscale x 1 x float> poison, float %s, i32 0
77  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
78  %esplat = fptrunc <vscale x 1 x float> %splat to <vscale x 1 x half>
79  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %esplat)
80  ret <vscale x 1 x half> %r
81}
82
83define <vscale x 1 x half> @vfcopynsign_exttrunc_vv_nxv1f16_nxv1f32(<vscale x 1 x half> %vm, <vscale x 1 x float> %vs) {
84; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f16_nxv1f32:
85; CHECK:       # %bb.0:
86; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
87; CHECK-NEXT:    vfncvt.f.f.w v10, v9
88; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
89; CHECK-NEXT:    ret
90  %n = fneg <vscale x 1 x float> %vs
91  %eneg = fptrunc <vscale x 1 x float> %n to <vscale x 1 x half>
92  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %eneg)
93  ret <vscale x 1 x half> %r
94}
95
96define <vscale x 1 x half> @vfcopynsign_exttrunc_vf_nxv1f16_nxv1f32(<vscale x 1 x half> %vm, float %s) {
97; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f16_nxv1f32:
98; CHECK:       # %bb.0:
99; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
100; CHECK-NEXT:    vfmv.v.f v9, fa0
101; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
102; CHECK-NEXT:    vfncvt.f.f.w v10, v9
103; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
104; CHECK-NEXT:    ret
105  %head = insertelement <vscale x 1 x float> poison, float %s, i32 0
106  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
107  %n = fneg <vscale x 1 x float> %splat
108  %eneg = fptrunc <vscale x 1 x float> %n to <vscale x 1 x half>
109  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %eneg)
110  ret <vscale x 1 x half> %r
111}
112
113define <vscale x 1 x half> @vfcopysign_exttrunc_vv_nxv1f16_nxv1f64(<vscale x 1 x half> %vm, <vscale x 1 x double> %vs) {
114; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f16_nxv1f64:
115; CHECK:       # %bb.0:
116; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
117; CHECK-NEXT:    vfncvt.rod.f.f.w v10, v9
118; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
119; CHECK-NEXT:    vfncvt.f.f.w v9, v10
120; CHECK-NEXT:    vfsgnj.vv v8, v8, v9
121; CHECK-NEXT:    ret
122  %e = fptrunc <vscale x 1 x double> %vs to <vscale x 1 x half>
123  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %e)
124  ret <vscale x 1 x half> %r
125}
126
127define <vscale x 1 x half> @vfcopysign_exttrunc_vf_nxv1f16_nxv1f64(<vscale x 1 x half> %vm, double %s) {
128; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f16_nxv1f64:
129; CHECK:       # %bb.0:
130; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
131; CHECK-NEXT:    vfmv.v.f v9, fa0
132; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
133; CHECK-NEXT:    vfncvt.rod.f.f.w v10, v9
134; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
135; CHECK-NEXT:    vfncvt.f.f.w v9, v10
136; CHECK-NEXT:    vfsgnj.vv v8, v8, v9
137; CHECK-NEXT:    ret
138  %head = insertelement <vscale x 1 x double> poison, double %s, i32 0
139  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
140  %esplat = fptrunc <vscale x 1 x double> %splat to <vscale x 1 x half>
141  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %esplat)
142  ret <vscale x 1 x half> %r
143}
144
145define <vscale x 1 x half> @vfcopynsign_exttrunc_vv_nxv1f16_nxv1f64(<vscale x 1 x half> %vm, <vscale x 1 x double> %vs) {
146; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f16_nxv1f64:
147; CHECK:       # %bb.0:
148; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
149; CHECK-NEXT:    vfncvt.rod.f.f.w v10, v9
150; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
151; CHECK-NEXT:    vfncvt.f.f.w v9, v10
152; CHECK-NEXT:    vfsgnjn.vv v8, v8, v9
153; CHECK-NEXT:    ret
154  %n = fneg <vscale x 1 x double> %vs
155  %eneg = fptrunc <vscale x 1 x double> %n to <vscale x 1 x half>
156  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %eneg)
157  ret <vscale x 1 x half> %r
158}
159
160define <vscale x 1 x half> @vfcopynsign_exttrunc_vf_nxv1f16_nxv1f64(<vscale x 1 x half> %vm, double %s) {
161; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f16_nxv1f64:
162; CHECK:       # %bb.0:
163; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
164; CHECK-NEXT:    vfmv.v.f v9, fa0
165; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
166; CHECK-NEXT:    vfncvt.rod.f.f.w v10, v9
167; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, mu
168; CHECK-NEXT:    vfncvt.f.f.w v9, v10
169; CHECK-NEXT:    vfsgnjn.vv v8, v8, v9
170; CHECK-NEXT:    ret
171  %head = insertelement <vscale x 1 x double> poison, double %s, i32 0
172  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
173  %n = fneg <vscale x 1 x double> %splat
174  %eneg = fptrunc <vscale x 1 x double> %n to <vscale x 1 x half>
175  %r = call <vscale x 1 x half> @llvm.copysign.nxv1f16(<vscale x 1 x half> %vm, <vscale x 1 x half> %eneg)
176  ret <vscale x 1 x half> %r
177}
178
179declare <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half>, <vscale x 2 x half>)
180
181define <vscale x 2 x half> @vfcopysign_vv_nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %vs) {
182; CHECK-LABEL: vfcopysign_vv_nxv2f16:
183; CHECK:       # %bb.0:
184; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
185; CHECK-NEXT:    vfsgnj.vv v8, v8, v9
186; CHECK-NEXT:    ret
187  %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %vs)
188  ret <vscale x 2 x half> %r
189}
190
191define <vscale x 2 x half> @vfcopysign_vf_nxv2f16(<vscale x 2 x half> %vm, half %s) {
192; CHECK-LABEL: vfcopysign_vf_nxv2f16:
193; CHECK:       # %bb.0:
194; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
195; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
196; CHECK-NEXT:    ret
197  %head = insertelement <vscale x 2 x half> poison, half %s, i32 0
198  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
199  %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %splat)
200  ret <vscale x 2 x half> %r
201}
202
203define <vscale x 2 x half> @vfcopynsign_vv_nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %vs) {
204; CHECK-LABEL: vfcopynsign_vv_nxv2f16:
205; CHECK:       # %bb.0:
206; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
207; CHECK-NEXT:    vfsgnjn.vv v8, v8, v9
208; CHECK-NEXT:    ret
209  %n = fneg <vscale x 2 x half> %vs
210  %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %n)
211  ret <vscale x 2 x half> %r
212}
213
214define <vscale x 2 x half> @vfcopynsign_vf_nxv2f16(<vscale x 2 x half> %vm, half %s) {
215; CHECK-LABEL: vfcopynsign_vf_nxv2f16:
216; CHECK:       # %bb.0:
217; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
218; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
219; CHECK-NEXT:    ret
220  %head = insertelement <vscale x 2 x half> poison, half %s, i32 0
221  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
222  %n = fneg <vscale x 2 x half> %splat
223  %r = call <vscale x 2 x half> @llvm.copysign.nxv2f16(<vscale x 2 x half> %vm, <vscale x 2 x half> %n)
224  ret <vscale x 2 x half> %r
225}
226
227declare <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>)
228
229define <vscale x 4 x half> @vfcopysign_vv_nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %vs) {
230; CHECK-LABEL: vfcopysign_vv_nxv4f16:
231; CHECK:       # %bb.0:
232; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
233; CHECK-NEXT:    vfsgnj.vv v8, v8, v9
234; CHECK-NEXT:    ret
235  %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %vs)
236  ret <vscale x 4 x half> %r
237}
238
239define <vscale x 4 x half> @vfcopysign_vf_nxv4f16(<vscale x 4 x half> %vm, half %s) {
240; CHECK-LABEL: vfcopysign_vf_nxv4f16:
241; CHECK:       # %bb.0:
242; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
243; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
244; CHECK-NEXT:    ret
245  %head = insertelement <vscale x 4 x half> poison, half %s, i32 0
246  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
247  %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %splat)
248  ret <vscale x 4 x half> %r
249}
250
251define <vscale x 4 x half> @vfcopynsign_vv_nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %vs) {
252; CHECK-LABEL: vfcopynsign_vv_nxv4f16:
253; CHECK:       # %bb.0:
254; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
255; CHECK-NEXT:    vfsgnjn.vv v8, v8, v9
256; CHECK-NEXT:    ret
257  %n = fneg <vscale x 4 x half> %vs
258  %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %n)
259  ret <vscale x 4 x half> %r
260}
261
262define <vscale x 4 x half> @vfcopynsign_vf_nxv4f16(<vscale x 4 x half> %vm, half %s) {
263; CHECK-LABEL: vfcopynsign_vf_nxv4f16:
264; CHECK:       # %bb.0:
265; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
266; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
267; CHECK-NEXT:    ret
268  %head = insertelement <vscale x 4 x half> poison, half %s, i32 0
269  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
270  %n = fneg <vscale x 4 x half> %splat
271  %r = call <vscale x 4 x half> @llvm.copysign.nxv4f16(<vscale x 4 x half> %vm, <vscale x 4 x half> %n)
272  ret <vscale x 4 x half> %r
273}
274
275declare <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)
276
277define <vscale x 8 x half> @vfcopysign_vv_nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %vs) {
278; CHECK-LABEL: vfcopysign_vv_nxv8f16:
279; CHECK:       # %bb.0:
280; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
281; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
282; CHECK-NEXT:    ret
283  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %vs)
284  ret <vscale x 8 x half> %r
285}
286
287define <vscale x 8 x half> @vfcopysign_vf_nxv8f16(<vscale x 8 x half> %vm, half %s) {
288; CHECK-LABEL: vfcopysign_vf_nxv8f16:
289; CHECK:       # %bb.0:
290; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
291; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
292; CHECK-NEXT:    ret
293  %head = insertelement <vscale x 8 x half> poison, half %s, i32 0
294  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
295  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %splat)
296  ret <vscale x 8 x half> %r
297}
298
299define <vscale x 8 x half> @vfcopynsign_vv_nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %vs) {
300; CHECK-LABEL: vfcopynsign_vv_nxv8f16:
301; CHECK:       # %bb.0:
302; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
303; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
304; CHECK-NEXT:    ret
305  %n = fneg <vscale x 8 x half> %vs
306  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %n)
307  ret <vscale x 8 x half> %r
308}
309
310define <vscale x 8 x half> @vfcopynsign_vf_nxv8f16(<vscale x 8 x half> %vm, half %s) {
311; CHECK-LABEL: vfcopynsign_vf_nxv8f16:
312; CHECK:       # %bb.0:
313; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
314; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
315; CHECK-NEXT:    ret
316  %head = insertelement <vscale x 8 x half> poison, half %s, i32 0
317  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
318  %n = fneg <vscale x 8 x half> %splat
319  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %n)
320  ret <vscale x 8 x half> %r
321}
322
323define <vscale x 8 x half> @vfcopysign_exttrunc_vv_nxv8f16_nxv8f32(<vscale x 8 x half> %vm, <vscale x 8 x float> %vs) {
324; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f16_nxv8f32:
325; CHECK:       # %bb.0:
326; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
327; CHECK-NEXT:    vfncvt.f.f.w v10, v12
328; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
329; CHECK-NEXT:    ret
330  %e = fptrunc <vscale x 8 x float> %vs to <vscale x 8 x half>
331  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %e)
332  ret <vscale x 8 x half> %r
333}
334
335define <vscale x 8 x half> @vfcopysign_exttrunc_vf_nxv8f16_nxv8f32(<vscale x 8 x half> %vm, float %s) {
336; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f16_nxv8f32:
337; CHECK:       # %bb.0:
338; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
339; CHECK-NEXT:    vfmv.v.f v12, fa0
340; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
341; CHECK-NEXT:    vfncvt.f.f.w v10, v12
342; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
343; CHECK-NEXT:    ret
344  %head = insertelement <vscale x 8 x float> poison, float %s, i32 0
345  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
346  %esplat = fptrunc <vscale x 8 x float> %splat to <vscale x 8 x half>
347  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %esplat)
348  ret <vscale x 8 x half> %r
349}
350
351define <vscale x 8 x half> @vfcopynsign_exttrunc_vv_nxv8f16_nxv8f32(<vscale x 8 x half> %vm, <vscale x 8 x float> %vs) {
352; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f16_nxv8f32:
353; CHECK:       # %bb.0:
354; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
355; CHECK-NEXT:    vfncvt.f.f.w v10, v12
356; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
357; CHECK-NEXT:    ret
358  %n = fneg <vscale x 8 x float> %vs
359  %eneg = fptrunc <vscale x 8 x float> %n to <vscale x 8 x half>
360  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %eneg)
361  ret <vscale x 8 x half> %r
362}
363
364define <vscale x 8 x half> @vfcopynsign_exttrunc_vf_nxv8f16_nxv8f32(<vscale x 8 x half> %vm, float %s) {
365; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f16_nxv8f32:
366; CHECK:       # %bb.0:
367; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
368; CHECK-NEXT:    vfmv.v.f v12, fa0
369; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
370; CHECK-NEXT:    vfncvt.f.f.w v10, v12
371; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
372; CHECK-NEXT:    ret
373  %head = insertelement <vscale x 8 x float> poison, float %s, i32 0
374  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
375  %n = fneg <vscale x 8 x float> %splat
376  %eneg = fptrunc <vscale x 8 x float> %n to <vscale x 8 x half>
377  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %eneg)
378  ret <vscale x 8 x half> %r
379}
380
381define <vscale x 8 x half> @vfcopysign_exttrunc_vv_nxv8f16_nxv8f64(<vscale x 8 x half> %vm, <vscale x 8 x double> %vs) {
382; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f16_nxv8f64:
383; CHECK:       # %bb.0:
384; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
385; CHECK-NEXT:    vfncvt.rod.f.f.w v12, v16
386; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
387; CHECK-NEXT:    vfncvt.f.f.w v10, v12
388; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
389; CHECK-NEXT:    ret
390  %e = fptrunc <vscale x 8 x double> %vs to <vscale x 8 x half>
391  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %e)
392  ret <vscale x 8 x half> %r
393}
394
395define <vscale x 8 x half> @vfcopysign_exttrunc_vf_nxv8f16_nxv8f64(<vscale x 8 x half> %vm, double %s) {
396; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f16_nxv8f64:
397; CHECK:       # %bb.0:
398; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
399; CHECK-NEXT:    vfmv.v.f v16, fa0
400; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
401; CHECK-NEXT:    vfncvt.rod.f.f.w v12, v16
402; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
403; CHECK-NEXT:    vfncvt.f.f.w v10, v12
404; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
405; CHECK-NEXT:    ret
406  %head = insertelement <vscale x 8 x double> poison, double %s, i32 0
407  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
408  %esplat = fptrunc <vscale x 8 x double> %splat to <vscale x 8 x half>
409  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %esplat)
410  ret <vscale x 8 x half> %r
411}
412
413define <vscale x 8 x half> @vfcopynsign_exttrunc_vv_nxv8f16_nxv8f64(<vscale x 8 x half> %vm, <vscale x 8 x double> %vs) {
414; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f16_nxv8f64:
415; CHECK:       # %bb.0:
416; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
417; CHECK-NEXT:    vfncvt.rod.f.f.w v12, v16
418; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
419; CHECK-NEXT:    vfncvt.f.f.w v10, v12
420; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
421; CHECK-NEXT:    ret
422  %n = fneg <vscale x 8 x double> %vs
423  %eneg = fptrunc <vscale x 8 x double> %n to <vscale x 8 x half>
424  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %eneg)
425  ret <vscale x 8 x half> %r
426}
427
428define <vscale x 8 x half> @vfcopynsign_exttrunc_vf_nxv8f16_nxv8f64(<vscale x 8 x half> %vm, double %s) {
429; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f16_nxv8f64:
430; CHECK:       # %bb.0:
431; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
432; CHECK-NEXT:    vfmv.v.f v16, fa0
433; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
434; CHECK-NEXT:    vfncvt.rod.f.f.w v12, v16
435; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, mu
436; CHECK-NEXT:    vfncvt.f.f.w v10, v12
437; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
438; CHECK-NEXT:    ret
439  %head = insertelement <vscale x 8 x double> poison, double %s, i32 0
440  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
441  %n = fneg <vscale x 8 x double> %splat
442  %eneg = fptrunc <vscale x 8 x double> %n to <vscale x 8 x half>
443  %r = call <vscale x 8 x half> @llvm.copysign.nxv8f16(<vscale x 8 x half> %vm, <vscale x 8 x half> %eneg)
444  ret <vscale x 8 x half> %r
445}
446
447declare <vscale x 16 x half> @llvm.copysign.nxv16f16(<vscale x 16 x half>, <vscale x 16 x half>)
448
449define <vscale x 16 x half> @vfcopysign_vv_nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %vs) {
450; CHECK-LABEL: vfcopysign_vv_nxv16f16:
451; CHECK:       # %bb.0:
452; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
453; CHECK-NEXT:    vfsgnj.vv v8, v8, v12
454; CHECK-NEXT:    ret
455  %r = call <vscale x 16 x half> @llvm.copysign.nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %vs)
456  ret <vscale x 16 x half> %r
457}
458
459define <vscale x 16 x half> @vfcopysign_vf_nxv16f16(<vscale x 16 x half> %vm, half %s) {
460; CHECK-LABEL: vfcopysign_vf_nxv16f16:
461; CHECK:       # %bb.0:
462; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
463; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
464; CHECK-NEXT:    ret
465  %head = insertelement <vscale x 16 x half> poison, half %s, i32 0
466  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
467  %r = call <vscale x 16 x half> @llvm.copysign.nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %splat)
468  ret <vscale x 16 x half> %r
469}
470
471define <vscale x 16 x half> @vfcopynsign_vv_nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %vs) {
472; CHECK-LABEL: vfcopynsign_vv_nxv16f16:
473; CHECK:       # %bb.0:
474; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
475; CHECK-NEXT:    vfsgnjn.vv v8, v8, v12
476; CHECK-NEXT:    ret
477  %n = fneg <vscale x 16 x half> %vs
478  %r = call <vscale x 16 x half> @llvm.copysign.nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %n)
479  ret <vscale x 16 x half> %r
480}
481
482define <vscale x 16 x half> @vfcopynsign_vf_nxv16f16(<vscale x 16 x half> %vm, half %s) {
483; CHECK-LABEL: vfcopynsign_vf_nxv16f16:
484; CHECK:       # %bb.0:
485; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
486; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
487; CHECK-NEXT:    ret
488  %head = insertelement <vscale x 16 x half> poison, half %s, i32 0
489  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
490  %n = fneg <vscale x 16 x half> %splat
491  %r = call <vscale x 16 x half> @llvm.copysign.nxv16f16(<vscale x 16 x half> %vm, <vscale x 16 x half> %n)
492  ret <vscale x 16 x half> %r
493}
494
495declare <vscale x 32 x half> @llvm.copysign.nxv32f16(<vscale x 32 x half>, <vscale x 32 x half>)
496
497define <vscale x 32 x half> @vfcopysign_vv_nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %vs) {
498; CHECK-LABEL: vfcopysign_vv_nxv32f16:
499; CHECK:       # %bb.0:
500; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
501; CHECK-NEXT:    vfsgnj.vv v8, v8, v16
502; CHECK-NEXT:    ret
503  %r = call <vscale x 32 x half> @llvm.copysign.nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %vs)
504  ret <vscale x 32 x half> %r
505}
506
507define <vscale x 32 x half> @vfcopysign_vf_nxv32f16(<vscale x 32 x half> %vm, half %s) {
508; CHECK-LABEL: vfcopysign_vf_nxv32f16:
509; CHECK:       # %bb.0:
510; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
511; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
512; CHECK-NEXT:    ret
513  %head = insertelement <vscale x 32 x half> poison, half %s, i32 0
514  %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
515  %r = call <vscale x 32 x half> @llvm.copysign.nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %splat)
516  ret <vscale x 32 x half> %r
517}
518
519define <vscale x 32 x half> @vfcopynsign_vv_nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %vs) {
520; CHECK-LABEL: vfcopynsign_vv_nxv32f16:
521; CHECK:       # %bb.0:
522; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
523; CHECK-NEXT:    vfsgnjn.vv v8, v8, v16
524; CHECK-NEXT:    ret
525  %n = fneg <vscale x 32 x half> %vs
526  %r = call <vscale x 32 x half> @llvm.copysign.nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %n)
527  ret <vscale x 32 x half> %r
528}
529
530define <vscale x 32 x half> @vfcopynsign_vf_nxv32f16(<vscale x 32 x half> %vm, half %s) {
531; CHECK-LABEL: vfcopynsign_vf_nxv32f16:
532; CHECK:       # %bb.0:
533; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
534; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
535; CHECK-NEXT:    ret
536  %head = insertelement <vscale x 32 x half> poison, half %s, i32 0
537  %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
538  %n = fneg <vscale x 32 x half> %splat
539  %r = call <vscale x 32 x half> @llvm.copysign.nxv32f16(<vscale x 32 x half> %vm, <vscale x 32 x half> %n)
540  ret <vscale x 32 x half> %r
541}
542
543declare <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float>, <vscale x 1 x float>)
544
545define <vscale x 1 x float> @vfcopysign_vv_nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %vs) {
546; CHECK-LABEL: vfcopysign_vv_nxv1f32:
547; CHECK:       # %bb.0:
548; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
549; CHECK-NEXT:    vfsgnj.vv v8, v8, v9
550; CHECK-NEXT:    ret
551  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %vs)
552  ret <vscale x 1 x float> %r
553}
554
555define <vscale x 1 x float> @vfcopysign_vf_nxv1f32(<vscale x 1 x float> %vm, float %s) {
556; CHECK-LABEL: vfcopysign_vf_nxv1f32:
557; CHECK:       # %bb.0:
558; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
559; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
560; CHECK-NEXT:    ret
561  %head = insertelement <vscale x 1 x float> poison, float %s, i32 0
562  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
563  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %splat)
564  ret <vscale x 1 x float> %r
565}
566
567define <vscale x 1 x float> @vfcopynsign_vv_nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %vs) {
568; CHECK-LABEL: vfcopynsign_vv_nxv1f32:
569; CHECK:       # %bb.0:
570; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
571; CHECK-NEXT:    vfsgnjn.vv v8, v8, v9
572; CHECK-NEXT:    ret
573  %n = fneg <vscale x 1 x float> %vs
574  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %n)
575  ret <vscale x 1 x float> %r
576}
577
578define <vscale x 1 x float> @vfcopynsign_vf_nxv1f32(<vscale x 1 x float> %vm, float %s) {
579; CHECK-LABEL: vfcopynsign_vf_nxv1f32:
580; CHECK:       # %bb.0:
581; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
582; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
583; CHECK-NEXT:    ret
584  %head = insertelement <vscale x 1 x float> poison, float %s, i32 0
585  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
586  %n = fneg <vscale x 1 x float> %splat
587  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %n)
588  ret <vscale x 1 x float> %r
589}
590
591define <vscale x 1 x float> @vfcopysign_exttrunc_vv_nxv1f32_nxv1f16(<vscale x 1 x float> %vm, <vscale x 1 x half> %vs) {
592; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f32_nxv1f16:
593; CHECK:       # %bb.0:
594; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
595; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
596; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
597; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
598; CHECK-NEXT:    ret
599  %e = fpext <vscale x 1 x half> %vs to <vscale x 1 x float>
600  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %e)
601  ret <vscale x 1 x float> %r
602}
603
604define <vscale x 1 x float> @vfcopysign_exttrunc_vf_nxv1f32_nxv1f16(<vscale x 1 x float> %vm, half %s) {
605; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f32_nxv1f16:
606; CHECK:       # %bb.0:
607; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
608; CHECK-NEXT:    vfmv.v.f v9, fa0
609; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
610; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
611; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
612; CHECK-NEXT:    ret
613  %head = insertelement <vscale x 1 x half> poison, half %s, i32 0
614  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
615  %esplat = fpext <vscale x 1 x half> %splat to <vscale x 1 x float>
616  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %esplat)
617  ret <vscale x 1 x float> %r
618}
619
620define <vscale x 1 x float> @vfcopynsign_exttrunc_vv_nxv1f32_nxv1f16(<vscale x 1 x float> %vm, <vscale x 1 x half> %vs) {
621; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f32_nxv1f16:
622; CHECK:       # %bb.0:
623; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
624; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
625; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
626; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
627; CHECK-NEXT:    ret
628  %n = fneg <vscale x 1 x half> %vs
629  %eneg = fpext <vscale x 1 x half> %n to <vscale x 1 x float>
630  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %eneg)
631  ret <vscale x 1 x float> %r
632}
633
634define <vscale x 1 x float> @vfcopynsign_exttrunc_vf_nxv1f32_nxv1f16(<vscale x 1 x float> %vm, half %s) {
635; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f32_nxv1f16:
636; CHECK:       # %bb.0:
637; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
638; CHECK-NEXT:    vfmv.v.f v9, fa0
639; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
640; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
641; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
642; CHECK-NEXT:    ret
643  %head = insertelement <vscale x 1 x half> poison, half %s, i32 0
644  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
645  %n = fneg <vscale x 1 x half> %splat
646  %eneg = fpext <vscale x 1 x half> %n to <vscale x 1 x float>
647  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %eneg)
648  ret <vscale x 1 x float> %r
649}
650
651define <vscale x 1 x float> @vfcopysign_exttrunc_vv_nxv1f32_nxv1f64(<vscale x 1 x float> %vm, <vscale x 1 x double> %vs) {
652; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f32_nxv1f64:
653; CHECK:       # %bb.0:
654; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
655; CHECK-NEXT:    vfncvt.f.f.w v10, v9
656; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
657; CHECK-NEXT:    ret
658  %e = fptrunc <vscale x 1 x double> %vs to <vscale x 1 x float>
659  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %e)
660  ret <vscale x 1 x float> %r
661}
662
663define <vscale x 1 x float> @vfcopysign_exttrunc_vf_nxv1f32_nxv1f64(<vscale x 1 x float> %vm, double %s) {
664; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f32_nxv1f64:
665; CHECK:       # %bb.0:
666; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
667; CHECK-NEXT:    vfmv.v.f v9, fa0
668; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
669; CHECK-NEXT:    vfncvt.f.f.w v10, v9
670; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
671; CHECK-NEXT:    ret
672  %head = insertelement <vscale x 1 x double> poison, double %s, i32 0
673  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
674  %esplat = fptrunc <vscale x 1 x double> %splat to <vscale x 1 x float>
675  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %esplat)
676  ret <vscale x 1 x float> %r
677}
678
679define <vscale x 1 x float> @vfcopynsign_exttrunc_vv_nxv1f32_nxv1f64(<vscale x 1 x float> %vm, <vscale x 1 x double> %vs) {
680; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f32_nxv1f64:
681; CHECK:       # %bb.0:
682; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
683; CHECK-NEXT:    vfncvt.f.f.w v10, v9
684; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
685; CHECK-NEXT:    ret
686  %n = fneg <vscale x 1 x double> %vs
687  %eneg = fptrunc <vscale x 1 x double> %n to <vscale x 1 x float>
688  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %eneg)
689  ret <vscale x 1 x float> %r
690}
691
692define <vscale x 1 x float> @vfcopynsign_exttrunc_vf_nxv1f32_nxv1f64(<vscale x 1 x float> %vm, double %s) {
693; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f32_nxv1f64:
694; CHECK:       # %bb.0:
695; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
696; CHECK-NEXT:    vfmv.v.f v9, fa0
697; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
698; CHECK-NEXT:    vfncvt.f.f.w v10, v9
699; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
700; CHECK-NEXT:    ret
701  %head = insertelement <vscale x 1 x double> poison, double %s, i32 0
702  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
703  %n = fneg <vscale x 1 x double> %splat
704  %eneg = fptrunc <vscale x 1 x double> %n to <vscale x 1 x float>
705  %r = call <vscale x 1 x float> @llvm.copysign.nxv1f32(<vscale x 1 x float> %vm, <vscale x 1 x float> %eneg)
706  ret <vscale x 1 x float> %r
707}
708
709declare <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>)
710
711define <vscale x 2 x float> @vfcopysign_vv_nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %vs) {
712; CHECK-LABEL: vfcopysign_vv_nxv2f32:
713; CHECK:       # %bb.0:
714; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
715; CHECK-NEXT:    vfsgnj.vv v8, v8, v9
716; CHECK-NEXT:    ret
717  %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %vs)
718  ret <vscale x 2 x float> %r
719}
720
721define <vscale x 2 x float> @vfcopysign_vf_nxv2f32(<vscale x 2 x float> %vm, float %s) {
722; CHECK-LABEL: vfcopysign_vf_nxv2f32:
723; CHECK:       # %bb.0:
724; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
725; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
726; CHECK-NEXT:    ret
727  %head = insertelement <vscale x 2 x float> poison, float %s, i32 0
728  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
729  %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %splat)
730  ret <vscale x 2 x float> %r
731}
732
733define <vscale x 2 x float> @vfcopynsign_vv_nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %vs) {
734; CHECK-LABEL: vfcopynsign_vv_nxv2f32:
735; CHECK:       # %bb.0:
736; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
737; CHECK-NEXT:    vfsgnjn.vv v8, v8, v9
738; CHECK-NEXT:    ret
739  %n = fneg <vscale x 2 x float> %vs
740  %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %n)
741  ret <vscale x 2 x float> %r
742}
743
744define <vscale x 2 x float> @vfcopynsign_vf_nxv2f32(<vscale x 2 x float> %vm, float %s) {
745; CHECK-LABEL: vfcopynsign_vf_nxv2f32:
746; CHECK:       # %bb.0:
747; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
748; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
749; CHECK-NEXT:    ret
750  %head = insertelement <vscale x 2 x float> poison, float %s, i32 0
751  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
752  %n = fneg <vscale x 2 x float> %splat
753  %r = call <vscale x 2 x float> @llvm.copysign.nxv2f32(<vscale x 2 x float> %vm, <vscale x 2 x float> %n)
754  ret <vscale x 2 x float> %r
755}
756
757declare <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>)
758
759define <vscale x 4 x float> @vfcopysign_vv_nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %vs) {
760; CHECK-LABEL: vfcopysign_vv_nxv4f32:
761; CHECK:       # %bb.0:
762; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
763; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
764; CHECK-NEXT:    ret
765  %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %vs)
766  ret <vscale x 4 x float> %r
767}
768
769define <vscale x 4 x float> @vfcopysign_vf_nxv4f32(<vscale x 4 x float> %vm, float %s) {
770; CHECK-LABEL: vfcopysign_vf_nxv4f32:
771; CHECK:       # %bb.0:
772; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
773; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
774; CHECK-NEXT:    ret
775  %head = insertelement <vscale x 4 x float> poison, float %s, i32 0
776  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
777  %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %splat)
778  ret <vscale x 4 x float> %r
779}
780
781define <vscale x 4 x float> @vfcopynsign_vv_nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %vs) {
782; CHECK-LABEL: vfcopynsign_vv_nxv4f32:
783; CHECK:       # %bb.0:
784; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
785; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
786; CHECK-NEXT:    ret
787  %n = fneg <vscale x 4 x float> %vs
788  %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %n)
789  ret <vscale x 4 x float> %r
790}
791
792define <vscale x 4 x float> @vfcopynsign_vf_nxv4f32(<vscale x 4 x float> %vm, float %s) {
793; CHECK-LABEL: vfcopynsign_vf_nxv4f32:
794; CHECK:       # %bb.0:
795; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
796; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
797; CHECK-NEXT:    ret
798  %head = insertelement <vscale x 4 x float> poison, float %s, i32 0
799  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
800  %n = fneg <vscale x 4 x float> %splat
801  %r = call <vscale x 4 x float> @llvm.copysign.nxv4f32(<vscale x 4 x float> %vm, <vscale x 4 x float> %n)
802  ret <vscale x 4 x float> %r
803}
804
805declare <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float>, <vscale x 8 x float>)
806
807define <vscale x 8 x float> @vfcopysign_vv_nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %vs) {
808; CHECK-LABEL: vfcopysign_vv_nxv8f32:
809; CHECK:       # %bb.0:
810; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
811; CHECK-NEXT:    vfsgnj.vv v8, v8, v12
812; CHECK-NEXT:    ret
813  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %vs)
814  ret <vscale x 8 x float> %r
815}
816
817define <vscale x 8 x float> @vfcopysign_vf_nxv8f32(<vscale x 8 x float> %vm, float %s) {
818; CHECK-LABEL: vfcopysign_vf_nxv8f32:
819; CHECK:       # %bb.0:
820; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
821; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
822; CHECK-NEXT:    ret
823  %head = insertelement <vscale x 8 x float> poison, float %s, i32 0
824  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
825  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %splat)
826  ret <vscale x 8 x float> %r
827}
828
829define <vscale x 8 x float> @vfcopynsign_vv_nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %vs) {
830; CHECK-LABEL: vfcopynsign_vv_nxv8f32:
831; CHECK:       # %bb.0:
832; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
833; CHECK-NEXT:    vfsgnjn.vv v8, v8, v12
834; CHECK-NEXT:    ret
835  %n = fneg <vscale x 8 x float> %vs
836  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %n)
837  ret <vscale x 8 x float> %r
838}
839
840define <vscale x 8 x float> @vfcopynsign_vf_nxv8f32(<vscale x 8 x float> %vm, float %s) {
841; CHECK-LABEL: vfcopynsign_vf_nxv8f32:
842; CHECK:       # %bb.0:
843; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
844; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
845; CHECK-NEXT:    ret
846  %head = insertelement <vscale x 8 x float> poison, float %s, i32 0
847  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
848  %n = fneg <vscale x 8 x float> %splat
849  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %n)
850  ret <vscale x 8 x float> %r
851}
852
853define <vscale x 8 x float> @vfcopysign_exttrunc_vv_nxv8f32_nxv8f16(<vscale x 8 x float> %vm, <vscale x 8 x half> %vs) {
854; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f32_nxv8f16:
855; CHECK:       # %bb.0:
856; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
857; CHECK-NEXT:    vfwcvt.f.f.v v16, v12
858; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
859; CHECK-NEXT:    vfsgnj.vv v8, v8, v16
860; CHECK-NEXT:    ret
861  %e = fpext <vscale x 8 x half> %vs to <vscale x 8 x float>
862  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %e)
863  ret <vscale x 8 x float> %r
864}
865
866define <vscale x 8 x float> @vfcopysign_exttrunc_vf_nxv8f32_nxv8f16(<vscale x 8 x float> %vm, half %s) {
867; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f32_nxv8f16:
868; CHECK:       # %bb.0:
869; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
870; CHECK-NEXT:    vfmv.v.f v12, fa0
871; CHECK-NEXT:    vfwcvt.f.f.v v16, v12
872; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
873; CHECK-NEXT:    vfsgnj.vv v8, v8, v16
874; CHECK-NEXT:    ret
875  %head = insertelement <vscale x 8 x half> poison, half %s, i32 0
876  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
877  %esplat = fpext <vscale x 8 x half> %splat to <vscale x 8 x float>
878  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %esplat)
879  ret <vscale x 8 x float> %r
880}
881
882define <vscale x 8 x float> @vfcopynsign_exttrunc_vv_nxv8f32_nxv8f16(<vscale x 8 x float> %vm, <vscale x 8 x half> %vs) {
883; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f32_nxv8f16:
884; CHECK:       # %bb.0:
885; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
886; CHECK-NEXT:    vfwcvt.f.f.v v16, v12
887; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
888; CHECK-NEXT:    vfsgnjn.vv v8, v8, v16
889; CHECK-NEXT:    ret
890  %n = fneg <vscale x 8 x half> %vs
891  %eneg = fpext <vscale x 8 x half> %n to <vscale x 8 x float>
892  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %eneg)
893  ret <vscale x 8 x float> %r
894}
895
896define <vscale x 8 x float> @vfcopynsign_exttrunc_vf_nxv8f32_nxv8f16(<vscale x 8 x float> %vm, half %s) {
897; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f32_nxv8f16:
898; CHECK:       # %bb.0:
899; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
900; CHECK-NEXT:    vfmv.v.f v12, fa0
901; CHECK-NEXT:    vfwcvt.f.f.v v16, v12
902; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
903; CHECK-NEXT:    vfsgnjn.vv v8, v8, v16
904; CHECK-NEXT:    ret
905  %head = insertelement <vscale x 8 x half> poison, half %s, i32 0
906  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
907  %n = fneg <vscale x 8 x half> %splat
908  %eneg = fpext <vscale x 8 x half> %n to <vscale x 8 x float>
909  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %eneg)
910  ret <vscale x 8 x float> %r
911}
912
913define <vscale x 8 x float> @vfcopysign_exttrunc_vv_nxv8f32_nxv8f64(<vscale x 8 x float> %vm, <vscale x 8 x double> %vs) {
914; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f32_nxv8f64:
915; CHECK:       # %bb.0:
916; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
917; CHECK-NEXT:    vfncvt.f.f.w v12, v16
918; CHECK-NEXT:    vfsgnj.vv v8, v8, v12
919; CHECK-NEXT:    ret
920  %e = fptrunc <vscale x 8 x double> %vs to <vscale x 8 x float>
921  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %e)
922  ret <vscale x 8 x float> %r
923}
924
925define <vscale x 8 x float> @vfcopysign_exttrunc_vf_nxv8f32_nxv8f64(<vscale x 8 x float> %vm, double %s) {
926; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f32_nxv8f64:
927; CHECK:       # %bb.0:
928; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
929; CHECK-NEXT:    vfmv.v.f v16, fa0
930; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
931; CHECK-NEXT:    vfncvt.f.f.w v12, v16
932; CHECK-NEXT:    vfsgnj.vv v8, v8, v12
933; CHECK-NEXT:    ret
934  %head = insertelement <vscale x 8 x double> poison, double %s, i32 0
935  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
936  %esplat = fptrunc <vscale x 8 x double> %splat to <vscale x 8 x float>
937  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %esplat)
938  ret <vscale x 8 x float> %r
939}
940
941define <vscale x 8 x float> @vfcopynsign_exttrunc_vv_nxv8f32_nxv8f64(<vscale x 8 x float> %vm, <vscale x 8 x double> %vs) {
942; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f32_nxv8f64:
943; CHECK:       # %bb.0:
944; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
945; CHECK-NEXT:    vfncvt.f.f.w v12, v16
946; CHECK-NEXT:    vfsgnjn.vv v8, v8, v12
947; CHECK-NEXT:    ret
948  %n = fneg <vscale x 8 x double> %vs
949  %eneg = fptrunc <vscale x 8 x double> %n to <vscale x 8 x float>
950  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %eneg)
951  ret <vscale x 8 x float> %r
952}
953
954define <vscale x 8 x float> @vfcopynsign_exttrunc_vf_nxv8f32_nxv8f64(<vscale x 8 x float> %vm, double %s) {
955; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f32_nxv8f64:
956; CHECK:       # %bb.0:
957; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
958; CHECK-NEXT:    vfmv.v.f v16, fa0
959; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
960; CHECK-NEXT:    vfncvt.f.f.w v12, v16
961; CHECK-NEXT:    vfsgnjn.vv v8, v8, v12
962; CHECK-NEXT:    ret
963  %head = insertelement <vscale x 8 x double> poison, double %s, i32 0
964  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
965  %n = fneg <vscale x 8 x double> %splat
966  %eneg = fptrunc <vscale x 8 x double> %n to <vscale x 8 x float>
967  %r = call <vscale x 8 x float> @llvm.copysign.nxv8f32(<vscale x 8 x float> %vm, <vscale x 8 x float> %eneg)
968  ret <vscale x 8 x float> %r
969}
970
971declare <vscale x 16 x float> @llvm.copysign.nxv16f32(<vscale x 16 x float>, <vscale x 16 x float>)
972
973define <vscale x 16 x float> @vfcopysign_vv_nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %vs) {
974; CHECK-LABEL: vfcopysign_vv_nxv16f32:
975; CHECK:       # %bb.0:
976; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
977; CHECK-NEXT:    vfsgnj.vv v8, v8, v16
978; CHECK-NEXT:    ret
979  %r = call <vscale x 16 x float> @llvm.copysign.nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %vs)
980  ret <vscale x 16 x float> %r
981}
982
983define <vscale x 16 x float> @vfcopysign_vf_nxv16f32(<vscale x 16 x float> %vm, float %s) {
984; CHECK-LABEL: vfcopysign_vf_nxv16f32:
985; CHECK:       # %bb.0:
986; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
987; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
988; CHECK-NEXT:    ret
989  %head = insertelement <vscale x 16 x float> poison, float %s, i32 0
990  %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
991  %r = call <vscale x 16 x float> @llvm.copysign.nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %splat)
992  ret <vscale x 16 x float> %r
993}
994
995define <vscale x 16 x float> @vfcopynsign_vv_nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %vs) {
996; CHECK-LABEL: vfcopynsign_vv_nxv16f32:
997; CHECK:       # %bb.0:
998; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
999; CHECK-NEXT:    vfsgnjn.vv v8, v8, v16
1000; CHECK-NEXT:    ret
1001  %n = fneg <vscale x 16 x float> %vs
1002  %r = call <vscale x 16 x float> @llvm.copysign.nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %n)
1003  ret <vscale x 16 x float> %r
1004}
1005
1006define <vscale x 16 x float> @vfcopynsign_vf_nxv16f32(<vscale x 16 x float> %vm, float %s) {
1007; CHECK-LABEL: vfcopynsign_vf_nxv16f32:
1008; CHECK:       # %bb.0:
1009; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
1010; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
1011; CHECK-NEXT:    ret
1012  %head = insertelement <vscale x 16 x float> poison, float %s, i32 0
1013  %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
1014  %n = fneg <vscale x 16 x float> %splat
1015  %r = call <vscale x 16 x float> @llvm.copysign.nxv16f32(<vscale x 16 x float> %vm, <vscale x 16 x float> %n)
1016  ret <vscale x 16 x float> %r
1017}
1018
1019declare <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double>, <vscale x 1 x double>)
1020
1021define <vscale x 1 x double> @vfcopysign_vv_nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %vs) {
1022; CHECK-LABEL: vfcopysign_vv_nxv1f64:
1023; CHECK:       # %bb.0:
1024; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
1025; CHECK-NEXT:    vfsgnj.vv v8, v8, v9
1026; CHECK-NEXT:    ret
1027  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %vs)
1028  ret <vscale x 1 x double> %r
1029}
1030
1031define <vscale x 1 x double> @vfcopysign_vf_nxv1f64(<vscale x 1 x double> %vm, double %s) {
1032; CHECK-LABEL: vfcopysign_vf_nxv1f64:
1033; CHECK:       # %bb.0:
1034; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
1035; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
1036; CHECK-NEXT:    ret
1037  %head = insertelement <vscale x 1 x double> poison, double %s, i32 0
1038  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
1039  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %splat)
1040  ret <vscale x 1 x double> %r
1041}
1042
1043define <vscale x 1 x double> @vfcopynsign_vv_nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %vs) {
1044; CHECK-LABEL: vfcopynsign_vv_nxv1f64:
1045; CHECK:       # %bb.0:
1046; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
1047; CHECK-NEXT:    vfsgnjn.vv v8, v8, v9
1048; CHECK-NEXT:    ret
1049  %n = fneg <vscale x 1 x double> %vs
1050  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %n)
1051  ret <vscale x 1 x double> %r
1052}
1053
1054define <vscale x 1 x double> @vfcopynsign_vf_nxv1f64(<vscale x 1 x double> %vm, double %s) {
1055; CHECK-LABEL: vfcopynsign_vf_nxv1f64:
1056; CHECK:       # %bb.0:
1057; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
1058; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
1059; CHECK-NEXT:    ret
1060  %head = insertelement <vscale x 1 x double> poison, double %s, i32 0
1061  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
1062  %n = fneg <vscale x 1 x double> %splat
1063  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %n)
1064  ret <vscale x 1 x double> %r
1065}
1066
1067define <vscale x 1 x double> @vfcopysign_exttrunc_vv_nxv1f64_nxv1f16(<vscale x 1 x double> %vm, <vscale x 1 x half> %vs) {
1068; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f64_nxv1f16:
1069; CHECK:       # %bb.0:
1070; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
1071; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
1072; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
1073; CHECK-NEXT:    vfwcvt.f.f.v v9, v10
1074; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
1075; CHECK-NEXT:    vfsgnj.vv v8, v8, v9
1076; CHECK-NEXT:    ret
1077  %e = fpext <vscale x 1 x half> %vs to <vscale x 1 x double>
1078  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %e)
1079  ret <vscale x 1 x double> %r
1080}
1081
1082define <vscale x 1 x double> @vfcopysign_exttrunc_vf_nxv1f64_nxv1f16(<vscale x 1 x double> %vm, half %s) {
1083; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f64_nxv1f16:
1084; CHECK:       # %bb.0:
1085; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
1086; CHECK-NEXT:    vfmv.v.f v9, fa0
1087; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
1088; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
1089; CHECK-NEXT:    vfwcvt.f.f.v v9, v10
1090; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
1091; CHECK-NEXT:    vfsgnj.vv v8, v8, v9
1092; CHECK-NEXT:    ret
1093  %head = insertelement <vscale x 1 x half> poison, half %s, i32 0
1094  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
1095  %esplat = fpext <vscale x 1 x half> %splat to <vscale x 1 x double>
1096  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %esplat)
1097  ret <vscale x 1 x double> %r
1098}
1099
1100define <vscale x 1 x double> @vfcopynsign_exttrunc_vv_nxv1f64_nxv1f16(<vscale x 1 x double> %vm, <vscale x 1 x half> %vs) {
1101; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f64_nxv1f16:
1102; CHECK:       # %bb.0:
1103; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
1104; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
1105; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
1106; CHECK-NEXT:    vfwcvt.f.f.v v9, v10
1107; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
1108; CHECK-NEXT:    vfsgnjn.vv v8, v8, v9
1109; CHECK-NEXT:    ret
1110  %n = fneg <vscale x 1 x half> %vs
1111  %eneg = fpext <vscale x 1 x half> %n to <vscale x 1 x double>
1112  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %eneg)
1113  ret <vscale x 1 x double> %r
1114}
1115
1116define <vscale x 1 x double> @vfcopynsign_exttrunc_vf_nxv1f64_nxv1f16(<vscale x 1 x double> %vm, half %s) {
1117; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f64_nxv1f16:
1118; CHECK:       # %bb.0:
1119; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
1120; CHECK-NEXT:    vfmv.v.f v9, fa0
1121; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
1122; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, mu
1123; CHECK-NEXT:    vfwcvt.f.f.v v9, v10
1124; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
1125; CHECK-NEXT:    vfsgnjn.vv v8, v8, v9
1126; CHECK-NEXT:    ret
1127  %head = insertelement <vscale x 1 x half> poison, half %s, i32 0
1128  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
1129  %n = fneg <vscale x 1 x half> %splat
1130  %eneg = fpext <vscale x 1 x half> %n to <vscale x 1 x double>
1131  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %eneg)
1132  ret <vscale x 1 x double> %r
1133}
1134
1135define <vscale x 1 x double> @vfcopysign_exttrunc_vv_nxv1f64_nxv1f32(<vscale x 1 x double> %vm, <vscale x 1 x float> %vs) {
1136; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv1f64_nxv1f32:
1137; CHECK:       # %bb.0:
1138; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
1139; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
1140; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
1141; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
1142; CHECK-NEXT:    ret
1143  %e = fpext <vscale x 1 x float> %vs to <vscale x 1 x double>
1144  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %e)
1145  ret <vscale x 1 x double> %r
1146}
1147
1148define <vscale x 1 x double> @vfcopysign_exttrunc_vf_nxv1f64_nxv1f32(<vscale x 1 x double> %vm, float %s) {
1149; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv1f64_nxv1f32:
1150; CHECK:       # %bb.0:
1151; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
1152; CHECK-NEXT:    vfmv.v.f v9, fa0
1153; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
1154; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
1155; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
1156; CHECK-NEXT:    ret
1157  %head = insertelement <vscale x 1 x float> poison, float %s, i32 0
1158  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
1159  %esplat = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>
1160  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %esplat)
1161  ret <vscale x 1 x double> %r
1162}
1163
1164define <vscale x 1 x double> @vfcopynsign_exttrunc_vv_nxv1f64_nxv1f32(<vscale x 1 x double> %vm, <vscale x 1 x float> %vs) {
1165; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv1f64_nxv1f32:
1166; CHECK:       # %bb.0:
1167; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
1168; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
1169; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
1170; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
1171; CHECK-NEXT:    ret
1172  %n = fneg <vscale x 1 x float> %vs
1173  %eneg = fpext <vscale x 1 x float> %n to <vscale x 1 x double>
1174  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %eneg)
1175  ret <vscale x 1 x double> %r
1176}
1177
1178define <vscale x 1 x double> @vfcopynsign_exttrunc_vf_nxv1f64_nxv1f32(<vscale x 1 x double> %vm, float %s) {
1179; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv1f64_nxv1f32:
1180; CHECK:       # %bb.0:
1181; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
1182; CHECK-NEXT:    vfmv.v.f v9, fa0
1183; CHECK-NEXT:    vfwcvt.f.f.v v10, v9
1184; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, mu
1185; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
1186; CHECK-NEXT:    ret
1187  %head = insertelement <vscale x 1 x float> poison, float %s, i32 0
1188  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
1189  %n = fneg <vscale x 1 x float> %splat
1190  %eneg = fpext <vscale x 1 x float> %n to <vscale x 1 x double>
1191  %r = call <vscale x 1 x double> @llvm.copysign.nxv1f64(<vscale x 1 x double> %vm, <vscale x 1 x double> %eneg)
1192  ret <vscale x 1 x double> %r
1193}
1194
1195declare <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)
1196
1197define <vscale x 2 x double> @vfcopysign_vv_nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %vs) {
1198; CHECK-LABEL: vfcopysign_vv_nxv2f64:
1199; CHECK:       # %bb.0:
1200; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
1201; CHECK-NEXT:    vfsgnj.vv v8, v8, v10
1202; CHECK-NEXT:    ret
1203  %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %vs)
1204  ret <vscale x 2 x double> %r
1205}
1206
1207define <vscale x 2 x double> @vfcopysign_vf_nxv2f64(<vscale x 2 x double> %vm, double %s) {
1208; CHECK-LABEL: vfcopysign_vf_nxv2f64:
1209; CHECK:       # %bb.0:
1210; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
1211; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
1212; CHECK-NEXT:    ret
1213  %head = insertelement <vscale x 2 x double> poison, double %s, i32 0
1214  %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
1215  %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %splat)
1216  ret <vscale x 2 x double> %r
1217}
1218
1219define <vscale x 2 x double> @vfcopynsign_vv_nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %vs) {
1220; CHECK-LABEL: vfcopynsign_vv_nxv2f64:
1221; CHECK:       # %bb.0:
1222; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
1223; CHECK-NEXT:    vfsgnjn.vv v8, v8, v10
1224; CHECK-NEXT:    ret
1225  %n = fneg <vscale x 2 x double> %vs
1226  %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %n)
1227  ret <vscale x 2 x double> %r
1228}
1229
1230define <vscale x 2 x double> @vfcopynsign_vf_nxv2f64(<vscale x 2 x double> %vm, double %s) {
1231; CHECK-LABEL: vfcopynsign_vf_nxv2f64:
1232; CHECK:       # %bb.0:
1233; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
1234; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
1235; CHECK-NEXT:    ret
1236  %head = insertelement <vscale x 2 x double> poison, double %s, i32 0
1237  %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
1238  %n = fneg <vscale x 2 x double> %splat
1239  %r = call <vscale x 2 x double> @llvm.copysign.nxv2f64(<vscale x 2 x double> %vm, <vscale x 2 x double> %n)
1240  ret <vscale x 2 x double> %r
1241}
1242
1243declare <vscale x 4 x double> @llvm.copysign.nxv4f64(<vscale x 4 x double>, <vscale x 4 x double>)
1244
1245define <vscale x 4 x double> @vfcopysign_vv_nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %vs) {
1246; CHECK-LABEL: vfcopysign_vv_nxv4f64:
1247; CHECK:       # %bb.0:
1248; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
1249; CHECK-NEXT:    vfsgnj.vv v8, v8, v12
1250; CHECK-NEXT:    ret
1251  %r = call <vscale x 4 x double> @llvm.copysign.nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %vs)
1252  ret <vscale x 4 x double> %r
1253}
1254
1255define <vscale x 4 x double> @vfcopysign_vf_nxv4f64(<vscale x 4 x double> %vm, double %s) {
1256; CHECK-LABEL: vfcopysign_vf_nxv4f64:
1257; CHECK:       # %bb.0:
1258; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
1259; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
1260; CHECK-NEXT:    ret
1261  %head = insertelement <vscale x 4 x double> poison, double %s, i32 0
1262  %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
1263  %r = call <vscale x 4 x double> @llvm.copysign.nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %splat)
1264  ret <vscale x 4 x double> %r
1265}
1266
1267define <vscale x 4 x double> @vfcopynsign_vv_nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %vs) {
1268; CHECK-LABEL: vfcopynsign_vv_nxv4f64:
1269; CHECK:       # %bb.0:
1270; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
1271; CHECK-NEXT:    vfsgnjn.vv v8, v8, v12
1272; CHECK-NEXT:    ret
1273  %n = fneg <vscale x 4 x double> %vs
1274  %r = call <vscale x 4 x double> @llvm.copysign.nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %n)
1275  ret <vscale x 4 x double> %r
1276}
1277
1278define <vscale x 4 x double> @vfcopynsign_vf_nxv4f64(<vscale x 4 x double> %vm, double %s) {
1279; CHECK-LABEL: vfcopynsign_vf_nxv4f64:
1280; CHECK:       # %bb.0:
1281; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
1282; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
1283; CHECK-NEXT:    ret
1284  %head = insertelement <vscale x 4 x double> poison, double %s, i32 0
1285  %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
1286  %n = fneg <vscale x 4 x double> %splat
1287  %r = call <vscale x 4 x double> @llvm.copysign.nxv4f64(<vscale x 4 x double> %vm, <vscale x 4 x double> %n)
1288  ret <vscale x 4 x double> %r
1289}
1290
1291declare <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double>, <vscale x 8 x double>)
1292
1293define <vscale x 8 x double> @vfcopysign_vv_nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %vs) {
1294; CHECK-LABEL: vfcopysign_vv_nxv8f64:
1295; CHECK:       # %bb.0:
1296; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
1297; CHECK-NEXT:    vfsgnj.vv v8, v8, v16
1298; CHECK-NEXT:    ret
1299  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %vs)
1300  ret <vscale x 8 x double> %r
1301}
1302
1303define <vscale x 8 x double> @vfcopysign_vf_nxv8f64(<vscale x 8 x double> %vm, double %s) {
1304; CHECK-LABEL: vfcopysign_vf_nxv8f64:
1305; CHECK:       # %bb.0:
1306; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
1307; CHECK-NEXT:    vfsgnj.vf v8, v8, fa0
1308; CHECK-NEXT:    ret
1309  %head = insertelement <vscale x 8 x double> poison, double %s, i32 0
1310  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
1311  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %splat)
1312  ret <vscale x 8 x double> %r
1313}
1314
1315define <vscale x 8 x double> @vfcopynsign_vv_nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %vs) {
1316; CHECK-LABEL: vfcopynsign_vv_nxv8f64:
1317; CHECK:       # %bb.0:
1318; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
1319; CHECK-NEXT:    vfsgnjn.vv v8, v8, v16
1320; CHECK-NEXT:    ret
1321  %n = fneg <vscale x 8 x double> %vs
1322  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %n)
1323  ret <vscale x 8 x double> %r
1324}
1325
1326define <vscale x 8 x double> @vfcopynsign_vf_nxv8f64(<vscale x 8 x double> %vm, double %s) {
1327; CHECK-LABEL: vfcopynsign_vf_nxv8f64:
1328; CHECK:       # %bb.0:
1329; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
1330; CHECK-NEXT:    vfsgnjn.vf v8, v8, fa0
1331; CHECK-NEXT:    ret
1332  %head = insertelement <vscale x 8 x double> poison, double %s, i32 0
1333  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
1334  %n = fneg <vscale x 8 x double> %splat
1335  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %n)
1336  ret <vscale x 8 x double> %r
1337}
1338
1339define <vscale x 8 x double> @vfcopysign_exttrunc_vv_nxv8f64_nxv8f16(<vscale x 8 x double> %vm, <vscale x 8 x half> %vs) {
1340; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f64_nxv8f16:
1341; CHECK:       # %bb.0:
1342; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
1343; CHECK-NEXT:    vfwcvt.f.f.v v20, v16
1344; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
1345; CHECK-NEXT:    vfwcvt.f.f.v v24, v20
1346; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
1347; CHECK-NEXT:    vfsgnj.vv v8, v8, v24
1348; CHECK-NEXT:    ret
1349  %e = fpext <vscale x 8 x half> %vs to <vscale x 8 x double>
1350  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %e)
1351  ret <vscale x 8 x double> %r
1352}
1353
1354define <vscale x 8 x double> @vfcopysign_exttrunc_vf_nxv8f64_nxv8f16(<vscale x 8 x double> %vm, half %s) {
1355; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f64_nxv8f16:
1356; CHECK:       # %bb.0:
1357; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
1358; CHECK-NEXT:    vfmv.v.f v16, fa0
1359; CHECK-NEXT:    vfwcvt.f.f.v v20, v16
1360; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
1361; CHECK-NEXT:    vfwcvt.f.f.v v24, v20
1362; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
1363; CHECK-NEXT:    vfsgnj.vv v8, v8, v24
1364; CHECK-NEXT:    ret
1365  %head = insertelement <vscale x 8 x half> poison, half %s, i32 0
1366  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
1367  %esplat = fpext <vscale x 8 x half> %splat to <vscale x 8 x double>
1368  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %esplat)
1369  ret <vscale x 8 x double> %r
1370}
1371
1372define <vscale x 8 x double> @vfcopynsign_exttrunc_vv_nxv8f64_nxv8f16(<vscale x 8 x double> %vm, <vscale x 8 x half> %vs) {
1373; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f64_nxv8f16:
1374; CHECK:       # %bb.0:
1375; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
1376; CHECK-NEXT:    vfwcvt.f.f.v v20, v16
1377; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
1378; CHECK-NEXT:    vfwcvt.f.f.v v24, v20
1379; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
1380; CHECK-NEXT:    vfsgnjn.vv v8, v8, v24
1381; CHECK-NEXT:    ret
1382  %n = fneg <vscale x 8 x half> %vs
1383  %eneg = fpext <vscale x 8 x half> %n to <vscale x 8 x double>
1384  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %eneg)
1385  ret <vscale x 8 x double> %r
1386}
1387
1388define <vscale x 8 x double> @vfcopynsign_exttrunc_vf_nxv8f64_nxv8f16(<vscale x 8 x double> %vm, half %s) {
1389; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f64_nxv8f16:
1390; CHECK:       # %bb.0:
1391; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
1392; CHECK-NEXT:    vfmv.v.f v16, fa0
1393; CHECK-NEXT:    vfwcvt.f.f.v v20, v16
1394; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, mu
1395; CHECK-NEXT:    vfwcvt.f.f.v v24, v20
1396; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
1397; CHECK-NEXT:    vfsgnjn.vv v8, v8, v24
1398; CHECK-NEXT:    ret
1399  %head = insertelement <vscale x 8 x half> poison, half %s, i32 0
1400  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
1401  %n = fneg <vscale x 8 x half> %splat
1402  %eneg = fpext <vscale x 8 x half> %n to <vscale x 8 x double>
1403  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %eneg)
1404  ret <vscale x 8 x double> %r
1405}
1406
1407define <vscale x 8 x double> @vfcopysign_exttrunc_vv_nxv8f64_nxv8f32(<vscale x 8 x double> %vm, <vscale x 8 x float> %vs) {
1408; CHECK-LABEL: vfcopysign_exttrunc_vv_nxv8f64_nxv8f32:
1409; CHECK:       # %bb.0:
1410; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
1411; CHECK-NEXT:    vfwcvt.f.f.v v24, v16
1412; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
1413; CHECK-NEXT:    vfsgnj.vv v8, v8, v24
1414; CHECK-NEXT:    ret
1415  %e = fpext <vscale x 8 x float> %vs to <vscale x 8 x double>
1416  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %e)
1417  ret <vscale x 8 x double> %r
1418}
1419
1420define <vscale x 8 x double> @vfcopysign_exttrunc_vf_nxv8f64_nxv8f32(<vscale x 8 x double> %vm, float %s) {
1421; CHECK-LABEL: vfcopysign_exttrunc_vf_nxv8f64_nxv8f32:
1422; CHECK:       # %bb.0:
1423; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
1424; CHECK-NEXT:    vfmv.v.f v16, fa0
1425; CHECK-NEXT:    vfwcvt.f.f.v v24, v16
1426; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
1427; CHECK-NEXT:    vfsgnj.vv v8, v8, v24
1428; CHECK-NEXT:    ret
1429  %head = insertelement <vscale x 8 x float> poison, float %s, i32 0
1430  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1431  %esplat = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>
1432  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %esplat)
1433  ret <vscale x 8 x double> %r
1434}
1435
1436define <vscale x 8 x double> @vfcopynsign_exttrunc_vv_nxv8f64_nxv8f32(<vscale x 8 x double> %vm, <vscale x 8 x float> %vs) {
1437; CHECK-LABEL: vfcopynsign_exttrunc_vv_nxv8f64_nxv8f32:
1438; CHECK:       # %bb.0:
1439; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
1440; CHECK-NEXT:    vfwcvt.f.f.v v24, v16
1441; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
1442; CHECK-NEXT:    vfsgnjn.vv v8, v8, v24
1443; CHECK-NEXT:    ret
1444  %n = fneg <vscale x 8 x float> %vs
1445  %eneg = fpext <vscale x 8 x float> %n to <vscale x 8 x double>
1446  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %eneg)
1447  ret <vscale x 8 x double> %r
1448}
1449
1450define <vscale x 8 x double> @vfcopynsign_exttrunc_vf_nxv8f64_nxv8f32(<vscale x 8 x double> %vm, float %s) {
1451; CHECK-LABEL: vfcopynsign_exttrunc_vf_nxv8f64_nxv8f32:
1452; CHECK:       # %bb.0:
1453; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
1454; CHECK-NEXT:    vfmv.v.f v16, fa0
1455; CHECK-NEXT:    vfwcvt.f.f.v v24, v16
1456; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, mu
1457; CHECK-NEXT:    vfsgnjn.vv v8, v8, v24
1458; CHECK-NEXT:    ret
1459  %head = insertelement <vscale x 8 x float> poison, float %s, i32 0
1460  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1461  %n = fneg <vscale x 8 x float> %splat
1462  %eneg = fpext <vscale x 8 x float> %n to <vscale x 8 x double>
1463  %r = call <vscale x 8 x double> @llvm.copysign.nxv8f64(<vscale x 8 x double> %vm, <vscale x 8 x double> %eneg)
1464  ret <vscale x 8 x double> %r
1465}
1466