xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vfmax-sdnode.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \
3; RUN:     -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \
4; RUN:     --check-prefixes=CHECK,ZVFH
5; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \
6; RUN:     -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \
7; RUN:     --check-prefixes=CHECK,ZVFH
8; RUN: llc -mtriple=riscv32 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \
9; RUN:     -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \
10; RUN:     --check-prefixes=CHECK,ZVFHMIN
11; RUN: llc -mtriple=riscv64 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \
12; RUN:     -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \
13; RUN:     --check-prefixes=CHECK,ZVFHMIN
14
15define <vscale x 1 x bfloat> @vfmax_nxv1bf16_vv(<vscale x 1 x bfloat> %a, <vscale x 1 x bfloat> %b) {
16; CHECK-LABEL: vfmax_nxv1bf16_vv:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
19; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v9
20; CHECK-NEXT:    vfwcvtbf16.f.f.v v9, v8
21; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
22; CHECK-NEXT:    vfmax.vv v9, v9, v10
23; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
24; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v9
25; CHECK-NEXT:    ret
26  %v = call <vscale x 1 x bfloat> @llvm.maxnum.nxv1bf16(<vscale x 1 x bfloat> %a, <vscale x 1 x bfloat> %b)
27  ret <vscale x 1 x bfloat> %v
28}
29
30define <vscale x 1 x bfloat> @vfmax_nxv1bf16_vf(<vscale x 1 x bfloat> %a, bfloat %b) {
31; CHECK-LABEL: vfmax_nxv1bf16_vf:
32; CHECK:       # %bb.0:
33; CHECK-NEXT:    fmv.x.h a0, fa0
34; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, ma
35; CHECK-NEXT:    vmv.v.x v9, a0
36; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v8
37; CHECK-NEXT:    vfwcvtbf16.f.f.v v8, v9
38; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
39; CHECK-NEXT:    vfmax.vv v9, v10, v8
40; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
41; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v9
42; CHECK-NEXT:    ret
43  %head = insertelement <vscale x 1 x bfloat> poison, bfloat %b, i32 0
44  %splat = shufflevector <vscale x 1 x bfloat> %head, <vscale x 1 x bfloat> poison, <vscale x 1 x i32> zeroinitializer
45  %v = call <vscale x 1 x bfloat> @llvm.maxnum.nxv1bf16(<vscale x 1 x bfloat> %a, <vscale x 1 x bfloat> %splat)
46  ret <vscale x 1 x bfloat> %v
47}
48
49declare <vscale x 2 x bfloat> @llvm.maxnum.nxv2bf16(<vscale x 2 x bfloat>, <vscale x 2 x bfloat>)
50
51define <vscale x 2 x bfloat> @vfmax_nxv2bf16_vv(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {
52; CHECK-LABEL: vfmax_nxv2bf16_vv:
53; CHECK:       # %bb.0:
54; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
55; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v9
56; CHECK-NEXT:    vfwcvtbf16.f.f.v v9, v8
57; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
58; CHECK-NEXT:    vfmax.vv v9, v9, v10
59; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
60; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v9
61; CHECK-NEXT:    ret
62  %v = call <vscale x 2 x bfloat> @llvm.maxnum.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b)
63  ret <vscale x 2 x bfloat> %v
64}
65
66define <vscale x 2 x bfloat> @vfmax_nxv2bf16_vf(<vscale x 2 x bfloat> %a, bfloat %b) {
67; CHECK-LABEL: vfmax_nxv2bf16_vf:
68; CHECK:       # %bb.0:
69; CHECK-NEXT:    fmv.x.h a0, fa0
70; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
71; CHECK-NEXT:    vmv.v.x v9, a0
72; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v8
73; CHECK-NEXT:    vfwcvtbf16.f.f.v v8, v9
74; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
75; CHECK-NEXT:    vfmax.vv v9, v10, v8
76; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
77; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v9
78; CHECK-NEXT:    ret
79  %head = insertelement <vscale x 2 x bfloat> poison, bfloat %b, i32 0
80  %splat = shufflevector <vscale x 2 x bfloat> %head, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer
81  %v = call <vscale x 2 x bfloat> @llvm.maxnum.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %splat)
82  ret <vscale x 2 x bfloat> %v
83}
84
85declare <vscale x 4 x bfloat> @llvm.maxnum.nxv4bf16(<vscale x 4 x bfloat>, <vscale x 4 x bfloat>)
86
87define <vscale x 4 x bfloat> @vfmax_nxv4bf16_vv(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {
88; CHECK-LABEL: vfmax_nxv4bf16_vv:
89; CHECK:       # %bb.0:
90; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
91; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v9
92; CHECK-NEXT:    vfwcvtbf16.f.f.v v12, v8
93; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
94; CHECK-NEXT:    vfmax.vv v10, v12, v10
95; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
96; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v10
97; CHECK-NEXT:    ret
98  %v = call <vscale x 4 x bfloat> @llvm.maxnum.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b)
99  ret <vscale x 4 x bfloat> %v
100}
101
102define <vscale x 4 x bfloat> @vfmax_nxv4bf16_vf(<vscale x 4 x bfloat> %a, bfloat %b) {
103; CHECK-LABEL: vfmax_nxv4bf16_vf:
104; CHECK:       # %bb.0:
105; CHECK-NEXT:    fmv.x.h a0, fa0
106; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
107; CHECK-NEXT:    vmv.v.x v9, a0
108; CHECK-NEXT:    vfwcvtbf16.f.f.v v10, v8
109; CHECK-NEXT:    vfwcvtbf16.f.f.v v12, v9
110; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
111; CHECK-NEXT:    vfmax.vv v10, v10, v12
112; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
113; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v10
114; CHECK-NEXT:    ret
115  %head = insertelement <vscale x 4 x bfloat> poison, bfloat %b, i32 0
116  %splat = shufflevector <vscale x 4 x bfloat> %head, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer
117  %v = call <vscale x 4 x bfloat> @llvm.maxnum.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %splat)
118  ret <vscale x 4 x bfloat> %v
119}
120
121declare <vscale x 8 x bfloat> @llvm.maxnum.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
122
123define <vscale x 8 x bfloat> @vfmax_nxv8bf16_vv(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {
124; CHECK-LABEL: vfmax_nxv8bf16_vv:
125; CHECK:       # %bb.0:
126; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
127; CHECK-NEXT:    vfwcvtbf16.f.f.v v12, v10
128; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v8
129; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
130; CHECK-NEXT:    vfmax.vv v12, v16, v12
131; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
132; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v12
133; CHECK-NEXT:    ret
134  %v = call <vscale x 8 x bfloat> @llvm.maxnum.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b)
135  ret <vscale x 8 x bfloat> %v
136}
137
138define <vscale x 8 x bfloat> @vfmax_nxv8bf16_vf(<vscale x 8 x bfloat> %a, bfloat %b) {
139; CHECK-LABEL: vfmax_nxv8bf16_vf:
140; CHECK:       # %bb.0:
141; CHECK-NEXT:    fmv.x.h a0, fa0
142; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, ma
143; CHECK-NEXT:    vmv.v.x v10, a0
144; CHECK-NEXT:    vfwcvtbf16.f.f.v v12, v8
145; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v10
146; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
147; CHECK-NEXT:    vfmax.vv v12, v12, v16
148; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
149; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v12
150; CHECK-NEXT:    ret
151  %head = insertelement <vscale x 8 x bfloat> poison, bfloat %b, i32 0
152  %splat = shufflevector <vscale x 8 x bfloat> %head, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer
153  %v = call <vscale x 8 x bfloat> @llvm.maxnum.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %splat)
154  ret <vscale x 8 x bfloat> %v
155}
156
157declare <vscale x 16 x bfloat> @llvm.maxnum.nxv16bf16(<vscale x 16 x bfloat>, <vscale x 16 x bfloat>)
158
159define <vscale x 16 x bfloat> @vfmax_nxv16bf16_vv(<vscale x 16 x bfloat> %a, <vscale x 16 x bfloat> %b) {
160; CHECK-LABEL: vfmax_nxv16bf16_vv:
161; CHECK:       # %bb.0:
162; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
163; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v12
164; CHECK-NEXT:    vfwcvtbf16.f.f.v v24, v8
165; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
166; CHECK-NEXT:    vfmax.vv v16, v24, v16
167; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
168; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v16
169; CHECK-NEXT:    ret
170  %v = call <vscale x 16 x bfloat> @llvm.maxnum.nxv16bf16(<vscale x 16 x bfloat> %a, <vscale x 16 x bfloat> %b)
171  ret <vscale x 16 x bfloat> %v
172}
173
174define <vscale x 16 x bfloat> @vfmax_nxv16bf16_vf(<vscale x 16 x bfloat> %a, bfloat %b) {
175; CHECK-LABEL: vfmax_nxv16bf16_vf:
176; CHECK:       # %bb.0:
177; CHECK-NEXT:    fmv.x.h a0, fa0
178; CHECK-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
179; CHECK-NEXT:    vmv.v.x v12, a0
180; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v8
181; CHECK-NEXT:    vfwcvtbf16.f.f.v v24, v12
182; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
183; CHECK-NEXT:    vfmax.vv v16, v16, v24
184; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
185; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v16
186; CHECK-NEXT:    ret
187  %head = insertelement <vscale x 16 x bfloat> poison, bfloat %b, i32 0
188  %splat = shufflevector <vscale x 16 x bfloat> %head, <vscale x 16 x bfloat> poison, <vscale x 16 x i32> zeroinitializer
189  %v = call <vscale x 16 x bfloat> @llvm.maxnum.nxv16bf16(<vscale x 16 x bfloat> %a, <vscale x 16 x bfloat> %splat)
190  ret <vscale x 16 x bfloat> %v
191}
192
193declare <vscale x 32 x bfloat> @llvm.maxnum.nxv32bf16(<vscale x 32 x bfloat>, <vscale x 32 x bfloat>)
194
195define <vscale x 32 x bfloat> @vfmax_nxv32bf16_vv(<vscale x 32 x bfloat> %a, <vscale x 32 x bfloat> %b) {
196; CHECK-LABEL: vfmax_nxv32bf16_vv:
197; CHECK:       # %bb.0:
198; CHECK-NEXT:    addi sp, sp, -16
199; CHECK-NEXT:    .cfi_def_cfa_offset 16
200; CHECK-NEXT:    csrr a0, vlenb
201; CHECK-NEXT:    slli a0, a0, 3
202; CHECK-NEXT:    sub sp, sp, a0
203; CHECK-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
204; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
205; CHECK-NEXT:    vfwcvtbf16.f.f.v v24, v16
206; CHECK-NEXT:    addi a0, sp, 16
207; CHECK-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
208; CHECK-NEXT:    vfwcvtbf16.f.f.v v0, v8
209; CHECK-NEXT:    vfwcvtbf16.f.f.v v24, v20
210; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v12
211; CHECK-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
212; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
213; CHECK-NEXT:    vfmax.vv v0, v0, v8
214; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
215; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v0
216; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
217; CHECK-NEXT:    vfmax.vv v16, v16, v24
218; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
219; CHECK-NEXT:    vfncvtbf16.f.f.w v12, v16
220; CHECK-NEXT:    csrr a0, vlenb
221; CHECK-NEXT:    slli a0, a0, 3
222; CHECK-NEXT:    add sp, sp, a0
223; CHECK-NEXT:    .cfi_def_cfa sp, 16
224; CHECK-NEXT:    addi sp, sp, 16
225; CHECK-NEXT:    .cfi_def_cfa_offset 0
226; CHECK-NEXT:    ret
227  %v = call <vscale x 32 x bfloat> @llvm.maxnum.nxv32bf16(<vscale x 32 x bfloat> %a, <vscale x 32 x bfloat> %b)
228  ret <vscale x 32 x bfloat> %v
229}
230
231define <vscale x 32 x bfloat> @vfmax_nxv32bf16_vf(<vscale x 32 x bfloat> %a, bfloat %b) {
232; CHECK-LABEL: vfmax_nxv32bf16_vf:
233; CHECK:       # %bb.0:
234; CHECK-NEXT:    addi sp, sp, -16
235; CHECK-NEXT:    .cfi_def_cfa_offset 16
236; CHECK-NEXT:    csrr a0, vlenb
237; CHECK-NEXT:    slli a0, a0, 3
238; CHECK-NEXT:    sub sp, sp, a0
239; CHECK-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
240; CHECK-NEXT:    fmv.x.h a0, fa0
241; CHECK-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
242; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v8
243; CHECK-NEXT:    addi a1, sp, 16
244; CHECK-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
245; CHECK-NEXT:    vfwcvtbf16.f.f.v v24, v12
246; CHECK-NEXT:    vsetvli a1, zero, e16, m8, ta, ma
247; CHECK-NEXT:    vmv.v.x v8, a0
248; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
249; CHECK-NEXT:    vfwcvtbf16.f.f.v v0, v8
250; CHECK-NEXT:    vfwcvtbf16.f.f.v v16, v12
251; CHECK-NEXT:    addi a0, sp, 16
252; CHECK-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
253; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
254; CHECK-NEXT:    vfmax.vv v0, v8, v0
255; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
256; CHECK-NEXT:    vfncvtbf16.f.f.w v8, v0
257; CHECK-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
258; CHECK-NEXT:    vfmax.vv v16, v24, v16
259; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
260; CHECK-NEXT:    vfncvtbf16.f.f.w v12, v16
261; CHECK-NEXT:    csrr a0, vlenb
262; CHECK-NEXT:    slli a0, a0, 3
263; CHECK-NEXT:    add sp, sp, a0
264; CHECK-NEXT:    .cfi_def_cfa sp, 16
265; CHECK-NEXT:    addi sp, sp, 16
266; CHECK-NEXT:    .cfi_def_cfa_offset 0
267; CHECK-NEXT:    ret
268  %head = insertelement <vscale x 32 x bfloat> poison, bfloat %b, i32 0
269  %splat = shufflevector <vscale x 32 x bfloat> %head, <vscale x 32 x bfloat> poison, <vscale x 32 x i32> zeroinitializer
270  %v = call <vscale x 32 x bfloat> @llvm.maxnum.nxv32bf16(<vscale x 32 x bfloat> %a, <vscale x 32 x bfloat> %splat)
271  ret <vscale x 32 x bfloat> %v
272}
273
274declare <vscale x 1 x half> @llvm.maxnum.nxv1f16(<vscale x 1 x half>, <vscale x 1 x half>)
275
276define <vscale x 1 x half> @vfmax_nxv1f16_vv(<vscale x 1 x half> %a, <vscale x 1 x half> %b) {
277; ZVFH-LABEL: vfmax_nxv1f16_vv:
278; ZVFH:       # %bb.0:
279; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
280; ZVFH-NEXT:    vfmax.vv v8, v8, v9
281; ZVFH-NEXT:    ret
282;
283; ZVFHMIN-LABEL: vfmax_nxv1f16_vv:
284; ZVFHMIN:       # %bb.0:
285; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
286; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
287; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
288; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
289; ZVFHMIN-NEXT:    vfmax.vv v9, v9, v10
290; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
291; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
292; ZVFHMIN-NEXT:    ret
293  %v = call <vscale x 1 x half> @llvm.maxnum.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x half> %b)
294  ret <vscale x 1 x half> %v
295}
296
297define <vscale x 1 x half> @vfmax_nxv1f16_vf(<vscale x 1 x half> %a, half %b) {
298; ZVFH-LABEL: vfmax_nxv1f16_vf:
299; ZVFH:       # %bb.0:
300; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
301; ZVFH-NEXT:    vfmax.vf v8, v8, fa0
302; ZVFH-NEXT:    ret
303;
304; ZVFHMIN-LABEL: vfmax_nxv1f16_vf:
305; ZVFHMIN:       # %bb.0:
306; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
307; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf4, ta, ma
308; ZVFHMIN-NEXT:    vmv.v.x v9, a0
309; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
310; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v9
311; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
312; ZVFHMIN-NEXT:    vfmax.vv v9, v10, v8
313; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
314; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
315; ZVFHMIN-NEXT:    ret
316  %head = insertelement <vscale x 1 x half> poison, half %b, i32 0
317  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
318  %v = call <vscale x 1 x half> @llvm.maxnum.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x half> %splat)
319  ret <vscale x 1 x half> %v
320}
321
322declare <vscale x 2 x half> @llvm.maxnum.nxv2f16(<vscale x 2 x half>, <vscale x 2 x half>)
323
324define <vscale x 2 x half> @vfmax_nxv2f16_vv(<vscale x 2 x half> %a, <vscale x 2 x half> %b) {
325; ZVFH-LABEL: vfmax_nxv2f16_vv:
326; ZVFH:       # %bb.0:
327; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
328; ZVFH-NEXT:    vfmax.vv v8, v8, v9
329; ZVFH-NEXT:    ret
330;
331; ZVFHMIN-LABEL: vfmax_nxv2f16_vv:
332; ZVFHMIN:       # %bb.0:
333; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
334; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
335; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
336; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
337; ZVFHMIN-NEXT:    vfmax.vv v9, v9, v10
338; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
339; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
340; ZVFHMIN-NEXT:    ret
341  %v = call <vscale x 2 x half> @llvm.maxnum.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b)
342  ret <vscale x 2 x half> %v
343}
344
345define <vscale x 2 x half> @vfmax_nxv2f16_vf(<vscale x 2 x half> %a, half %b) {
346; ZVFH-LABEL: vfmax_nxv2f16_vf:
347; ZVFH:       # %bb.0:
348; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
349; ZVFH-NEXT:    vfmax.vf v8, v8, fa0
350; ZVFH-NEXT:    ret
351;
352; ZVFHMIN-LABEL: vfmax_nxv2f16_vf:
353; ZVFHMIN:       # %bb.0:
354; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
355; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
356; ZVFHMIN-NEXT:    vmv.v.x v9, a0
357; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
358; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v9
359; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
360; ZVFHMIN-NEXT:    vfmax.vv v9, v10, v8
361; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
362; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
363; ZVFHMIN-NEXT:    ret
364  %head = insertelement <vscale x 2 x half> poison, half %b, i32 0
365  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
366  %v = call <vscale x 2 x half> @llvm.maxnum.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %splat)
367  ret <vscale x 2 x half> %v
368}
369
370declare <vscale x 4 x half> @llvm.maxnum.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>)
371
372define <vscale x 4 x half> @vfmax_nxv4f16_vv(<vscale x 4 x half> %a, <vscale x 4 x half> %b) {
373; ZVFH-LABEL: vfmax_nxv4f16_vv:
374; ZVFH:       # %bb.0:
375; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
376; ZVFH-NEXT:    vfmax.vv v8, v8, v9
377; ZVFH-NEXT:    ret
378;
379; ZVFHMIN-LABEL: vfmax_nxv4f16_vv:
380; ZVFHMIN:       # %bb.0:
381; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
382; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9
383; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8
384; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
385; ZVFHMIN-NEXT:    vfmax.vv v10, v12, v10
386; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
387; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v10
388; ZVFHMIN-NEXT:    ret
389  %v = call <vscale x 4 x half> @llvm.maxnum.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b)
390  ret <vscale x 4 x half> %v
391}
392
393define <vscale x 4 x half> @vfmax_nxv4f16_vf(<vscale x 4 x half> %a, half %b) {
394; ZVFH-LABEL: vfmax_nxv4f16_vf:
395; ZVFH:       # %bb.0:
396; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
397; ZVFH-NEXT:    vfmax.vf v8, v8, fa0
398; ZVFH-NEXT:    ret
399;
400; ZVFHMIN-LABEL: vfmax_nxv4f16_vf:
401; ZVFHMIN:       # %bb.0:
402; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
403; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
404; ZVFHMIN-NEXT:    vmv.v.x v9, a0
405; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
406; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v9
407; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
408; ZVFHMIN-NEXT:    vfmax.vv v10, v10, v12
409; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
410; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v10
411; ZVFHMIN-NEXT:    ret
412  %head = insertelement <vscale x 4 x half> poison, half %b, i32 0
413  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
414  %v = call <vscale x 4 x half> @llvm.maxnum.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %splat)
415  ret <vscale x 4 x half> %v
416}
417
418declare <vscale x 8 x half> @llvm.maxnum.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)
419
420define <vscale x 8 x half> @vfmax_nxv8f16_vv(<vscale x 8 x half> %a, <vscale x 8 x half> %b) {
421; ZVFH-LABEL: vfmax_nxv8f16_vv:
422; ZVFH:       # %bb.0:
423; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
424; ZVFH-NEXT:    vfmax.vv v8, v8, v10
425; ZVFH-NEXT:    ret
426;
427; ZVFHMIN-LABEL: vfmax_nxv8f16_vv:
428; ZVFHMIN:       # %bb.0:
429; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
430; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10
431; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
432; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
433; ZVFHMIN-NEXT:    vfmax.vv v12, v16, v12
434; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
435; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12
436; ZVFHMIN-NEXT:    ret
437  %v = call <vscale x 8 x half> @llvm.maxnum.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b)
438  ret <vscale x 8 x half> %v
439}
440
441define <vscale x 8 x half> @vfmax_nxv8f16_vf(<vscale x 8 x half> %a, half %b) {
442; ZVFH-LABEL: vfmax_nxv8f16_vf:
443; ZVFH:       # %bb.0:
444; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
445; ZVFH-NEXT:    vfmax.vf v8, v8, fa0
446; ZVFH-NEXT:    ret
447;
448; ZVFHMIN-LABEL: vfmax_nxv8f16_vf:
449; ZVFHMIN:       # %bb.0:
450; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
451; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m2, ta, ma
452; ZVFHMIN-NEXT:    vmv.v.x v10, a0
453; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8
454; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v10
455; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
456; ZVFHMIN-NEXT:    vfmax.vv v12, v12, v16
457; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
458; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12
459; ZVFHMIN-NEXT:    ret
460  %head = insertelement <vscale x 8 x half> poison, half %b, i32 0
461  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
462  %v = call <vscale x 8 x half> @llvm.maxnum.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %splat)
463  ret <vscale x 8 x half> %v
464}
465
466declare <vscale x 16 x half> @llvm.maxnum.nxv16f16(<vscale x 16 x half>, <vscale x 16 x half>)
467
468define <vscale x 16 x half> @vfmax_nxv16f16_vv(<vscale x 16 x half> %a, <vscale x 16 x half> %b) {
469; ZVFH-LABEL: vfmax_nxv16f16_vv:
470; ZVFH:       # %bb.0:
471; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
472; ZVFH-NEXT:    vfmax.vv v8, v8, v12
473; ZVFH-NEXT:    ret
474;
475; ZVFHMIN-LABEL: vfmax_nxv16f16_vv:
476; ZVFHMIN:       # %bb.0:
477; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
478; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
479; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v8
480; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
481; ZVFHMIN-NEXT:    vfmax.vv v16, v24, v16
482; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
483; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
484; ZVFHMIN-NEXT:    ret
485  %v = call <vscale x 16 x half> @llvm.maxnum.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x half> %b)
486  ret <vscale x 16 x half> %v
487}
488
489define <vscale x 16 x half> @vfmax_nxv16f16_vf(<vscale x 16 x half> %a, half %b) {
490; ZVFH-LABEL: vfmax_nxv16f16_vf:
491; ZVFH:       # %bb.0:
492; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
493; ZVFH-NEXT:    vfmax.vf v8, v8, fa0
494; ZVFH-NEXT:    ret
495;
496; ZVFHMIN-LABEL: vfmax_nxv16f16_vf:
497; ZVFHMIN:       # %bb.0:
498; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
499; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
500; ZVFHMIN-NEXT:    vmv.v.x v12, a0
501; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
502; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12
503; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
504; ZVFHMIN-NEXT:    vfmax.vv v16, v16, v24
505; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
506; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
507; ZVFHMIN-NEXT:    ret
508  %head = insertelement <vscale x 16 x half> poison, half %b, i32 0
509  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
510  %v = call <vscale x 16 x half> @llvm.maxnum.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x half> %splat)
511  ret <vscale x 16 x half> %v
512}
513
514declare <vscale x 32 x half> @llvm.maxnum.nxv32f16(<vscale x 32 x half>, <vscale x 32 x half>)
515
516define <vscale x 32 x half> @vfmax_nxv32f16_vv(<vscale x 32 x half> %a, <vscale x 32 x half> %b) {
517; ZVFH-LABEL: vfmax_nxv32f16_vv:
518; ZVFH:       # %bb.0:
519; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
520; ZVFH-NEXT:    vfmax.vv v8, v8, v16
521; ZVFH-NEXT:    ret
522;
523; ZVFHMIN-LABEL: vfmax_nxv32f16_vv:
524; ZVFHMIN:       # %bb.0:
525; ZVFHMIN-NEXT:    addi sp, sp, -16
526; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
527; ZVFHMIN-NEXT:    csrr a0, vlenb
528; ZVFHMIN-NEXT:    slli a0, a0, 3
529; ZVFHMIN-NEXT:    sub sp, sp, a0
530; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
531; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
532; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16
533; ZVFHMIN-NEXT:    addi a0, sp, 16
534; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
535; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v8
536; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v20
537; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
538; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
539; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
540; ZVFHMIN-NEXT:    vfmax.vv v0, v0, v8
541; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
542; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0
543; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
544; ZVFHMIN-NEXT:    vfmax.vv v16, v16, v24
545; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
546; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16
547; ZVFHMIN-NEXT:    csrr a0, vlenb
548; ZVFHMIN-NEXT:    slli a0, a0, 3
549; ZVFHMIN-NEXT:    add sp, sp, a0
550; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16
551; ZVFHMIN-NEXT:    addi sp, sp, 16
552; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0
553; ZVFHMIN-NEXT:    ret
554  %v = call <vscale x 32 x half> @llvm.maxnum.nxv32f16(<vscale x 32 x half> %a, <vscale x 32 x half> %b)
555  ret <vscale x 32 x half> %v
556}
557
558define <vscale x 32 x half> @vfmax_nxv32f16_vf(<vscale x 32 x half> %a, half %b) {
559; ZVFH-LABEL: vfmax_nxv32f16_vf:
560; ZVFH:       # %bb.0:
561; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
562; ZVFH-NEXT:    vfmax.vf v8, v8, fa0
563; ZVFH-NEXT:    ret
564;
565; ZVFHMIN-LABEL: vfmax_nxv32f16_vf:
566; ZVFHMIN:       # %bb.0:
567; ZVFHMIN-NEXT:    addi sp, sp, -16
568; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16
569; ZVFHMIN-NEXT:    csrr a0, vlenb
570; ZVFHMIN-NEXT:    slli a0, a0, 3
571; ZVFHMIN-NEXT:    sub sp, sp, a0
572; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
573; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
574; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
575; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
576; ZVFHMIN-NEXT:    addi a1, sp, 16
577; ZVFHMIN-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
578; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12
579; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m8, ta, ma
580; ZVFHMIN-NEXT:    vmv.v.x v8, a0
581; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
582; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v8
583; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
584; ZVFHMIN-NEXT:    addi a0, sp, 16
585; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
586; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
587; ZVFHMIN-NEXT:    vfmax.vv v0, v8, v0
588; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
589; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0
590; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
591; ZVFHMIN-NEXT:    vfmax.vv v16, v24, v16
592; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
593; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16
594; ZVFHMIN-NEXT:    csrr a0, vlenb
595; ZVFHMIN-NEXT:    slli a0, a0, 3
596; ZVFHMIN-NEXT:    add sp, sp, a0
597; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16
598; ZVFHMIN-NEXT:    addi sp, sp, 16
599; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0
600; ZVFHMIN-NEXT:    ret
601  %head = insertelement <vscale x 32 x half> poison, half %b, i32 0
602  %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
603  %v = call <vscale x 32 x half> @llvm.maxnum.nxv32f16(<vscale x 32 x half> %a, <vscale x 32 x half> %splat)
604  ret <vscale x 32 x half> %v
605}
606
607declare <vscale x 1 x float> @llvm.maxnum.nxv1f32(<vscale x 1 x float>, <vscale x 1 x float>)
608
609define <vscale x 1 x float> @vfmax_nxv1f32_vv(<vscale x 1 x float> %a, <vscale x 1 x float> %b) {
610; CHECK-LABEL: vfmax_nxv1f32_vv:
611; CHECK:       # %bb.0:
612; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
613; CHECK-NEXT:    vfmax.vv v8, v8, v9
614; CHECK-NEXT:    ret
615  %v = call <vscale x 1 x float> @llvm.maxnum.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x float> %b)
616  ret <vscale x 1 x float> %v
617}
618
619define <vscale x 1 x float> @vfmax_nxv1f32_vf(<vscale x 1 x float> %a, float %b) {
620; CHECK-LABEL: vfmax_nxv1f32_vf:
621; CHECK:       # %bb.0:
622; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
623; CHECK-NEXT:    vfmax.vf v8, v8, fa0
624; CHECK-NEXT:    ret
625  %head = insertelement <vscale x 1 x float> poison, float %b, i32 0
626  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
627  %v = call <vscale x 1 x float> @llvm.maxnum.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x float> %splat)
628  ret <vscale x 1 x float> %v
629}
630
631declare <vscale x 2 x float> @llvm.maxnum.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>)
632
633define <vscale x 2 x float> @vfmax_nxv2f32_vv(<vscale x 2 x float> %a, <vscale x 2 x float> %b) {
634; CHECK-LABEL: vfmax_nxv2f32_vv:
635; CHECK:       # %bb.0:
636; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
637; CHECK-NEXT:    vfmax.vv v8, v8, v9
638; CHECK-NEXT:    ret
639  %v = call <vscale x 2 x float> @llvm.maxnum.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b)
640  ret <vscale x 2 x float> %v
641}
642
643define <vscale x 2 x float> @vfmax_nxv2f32_vf(<vscale x 2 x float> %a, float %b) {
644; CHECK-LABEL: vfmax_nxv2f32_vf:
645; CHECK:       # %bb.0:
646; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
647; CHECK-NEXT:    vfmax.vf v8, v8, fa0
648; CHECK-NEXT:    ret
649  %head = insertelement <vscale x 2 x float> poison, float %b, i32 0
650  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
651  %v = call <vscale x 2 x float> @llvm.maxnum.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %splat)
652  ret <vscale x 2 x float> %v
653}
654
655declare <vscale x 4 x float> @llvm.maxnum.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>)
656
657define <vscale x 4 x float> @vfmax_nxv4f32_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
658; CHECK-LABEL: vfmax_nxv4f32_vv:
659; CHECK:       # %bb.0:
660; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
661; CHECK-NEXT:    vfmax.vv v8, v8, v10
662; CHECK-NEXT:    ret
663  %v = call <vscale x 4 x float> @llvm.maxnum.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b)
664  ret <vscale x 4 x float> %v
665}
666
667define <vscale x 4 x float> @vfmax_nxv4f32_vf(<vscale x 4 x float> %a, float %b) {
668; CHECK-LABEL: vfmax_nxv4f32_vf:
669; CHECK:       # %bb.0:
670; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
671; CHECK-NEXT:    vfmax.vf v8, v8, fa0
672; CHECK-NEXT:    ret
673  %head = insertelement <vscale x 4 x float> poison, float %b, i32 0
674  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
675  %v = call <vscale x 4 x float> @llvm.maxnum.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %splat)
676  ret <vscale x 4 x float> %v
677}
678
679declare <vscale x 8 x float> @llvm.maxnum.nxv8f32(<vscale x 8 x float>, <vscale x 8 x float>)
680
681define <vscale x 8 x float> @vfmax_nxv8f32_vv(<vscale x 8 x float> %a, <vscale x 8 x float> %b) {
682; CHECK-LABEL: vfmax_nxv8f32_vv:
683; CHECK:       # %bb.0:
684; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
685; CHECK-NEXT:    vfmax.vv v8, v8, v12
686; CHECK-NEXT:    ret
687  %v = call <vscale x 8 x float> @llvm.maxnum.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x float> %b)
688  ret <vscale x 8 x float> %v
689}
690
691define <vscale x 8 x float> @vfmax_nxv8f32_vf(<vscale x 8 x float> %a, float %b) {
692; CHECK-LABEL: vfmax_nxv8f32_vf:
693; CHECK:       # %bb.0:
694; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
695; CHECK-NEXT:    vfmax.vf v8, v8, fa0
696; CHECK-NEXT:    ret
697  %head = insertelement <vscale x 8 x float> poison, float %b, i32 0
698  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
699  %v = call <vscale x 8 x float> @llvm.maxnum.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x float> %splat)
700  ret <vscale x 8 x float> %v
701}
702
703declare <vscale x 16 x float> @llvm.maxnum.nxv16f32(<vscale x 16 x float>, <vscale x 16 x float>)
704
705define <vscale x 16 x float> @vfmax_nxv16f32_vv(<vscale x 16 x float> %a, <vscale x 16 x float> %b) {
706; CHECK-LABEL: vfmax_nxv16f32_vv:
707; CHECK:       # %bb.0:
708; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
709; CHECK-NEXT:    vfmax.vv v8, v8, v16
710; CHECK-NEXT:    ret
711  %v = call <vscale x 16 x float> @llvm.maxnum.nxv16f32(<vscale x 16 x float> %a, <vscale x 16 x float> %b)
712  ret <vscale x 16 x float> %v
713}
714
715define <vscale x 16 x float> @vfmax_nxv16f32_vf(<vscale x 16 x float> %a, float %b) {
716; CHECK-LABEL: vfmax_nxv16f32_vf:
717; CHECK:       # %bb.0:
718; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
719; CHECK-NEXT:    vfmax.vf v8, v8, fa0
720; CHECK-NEXT:    ret
721  %head = insertelement <vscale x 16 x float> poison, float %b, i32 0
722  %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
723  %v = call <vscale x 16 x float> @llvm.maxnum.nxv16f32(<vscale x 16 x float> %a, <vscale x 16 x float> %splat)
724  ret <vscale x 16 x float> %v
725}
726
727declare <vscale x 1 x double> @llvm.maxnum.nxv1f64(<vscale x 1 x double>, <vscale x 1 x double>)
728
729define <vscale x 1 x double> @vfmax_nxv1f64_vv(<vscale x 1 x double> %a, <vscale x 1 x double> %b) {
730; CHECK-LABEL: vfmax_nxv1f64_vv:
731; CHECK:       # %bb.0:
732; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
733; CHECK-NEXT:    vfmax.vv v8, v8, v9
734; CHECK-NEXT:    ret
735  %v = call <vscale x 1 x double> @llvm.maxnum.nxv1f64(<vscale x 1 x double> %a, <vscale x 1 x double> %b)
736  ret <vscale x 1 x double> %v
737}
738
739define <vscale x 1 x double> @vfmax_nxv1f64_vf(<vscale x 1 x double> %a, double %b) {
740; CHECK-LABEL: vfmax_nxv1f64_vf:
741; CHECK:       # %bb.0:
742; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
743; CHECK-NEXT:    vfmax.vf v8, v8, fa0
744; CHECK-NEXT:    ret
745  %head = insertelement <vscale x 1 x double> poison, double %b, i32 0
746  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
747  %v = call <vscale x 1 x double> @llvm.maxnum.nxv1f64(<vscale x 1 x double> %a, <vscale x 1 x double> %splat)
748  ret <vscale x 1 x double> %v
749}
750
751declare <vscale x 2 x double> @llvm.maxnum.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)
752
753define <vscale x 2 x double> @vfmax_nxv2f64_vv(<vscale x 2 x double> %a, <vscale x 2 x double> %b) {
754; CHECK-LABEL: vfmax_nxv2f64_vv:
755; CHECK:       # %bb.0:
756; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
757; CHECK-NEXT:    vfmax.vv v8, v8, v10
758; CHECK-NEXT:    ret
759  %v = call <vscale x 2 x double> @llvm.maxnum.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b)
760  ret <vscale x 2 x double> %v
761}
762
763define <vscale x 2 x double> @vfmax_nxv2f64_vf(<vscale x 2 x double> %a, double %b) {
764; CHECK-LABEL: vfmax_nxv2f64_vf:
765; CHECK:       # %bb.0:
766; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
767; CHECK-NEXT:    vfmax.vf v8, v8, fa0
768; CHECK-NEXT:    ret
769  %head = insertelement <vscale x 2 x double> poison, double %b, i32 0
770  %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
771  %v = call <vscale x 2 x double> @llvm.maxnum.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %splat)
772  ret <vscale x 2 x double> %v
773}
774
775declare <vscale x 4 x double> @llvm.maxnum.nxv4f64(<vscale x 4 x double>, <vscale x 4 x double>)
776
777define <vscale x 4 x double> @vfmax_nxv4f64_vv(<vscale x 4 x double> %a, <vscale x 4 x double> %b) {
778; CHECK-LABEL: vfmax_nxv4f64_vv:
779; CHECK:       # %bb.0:
780; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
781; CHECK-NEXT:    vfmax.vv v8, v8, v12
782; CHECK-NEXT:    ret
783  %v = call <vscale x 4 x double> @llvm.maxnum.nxv4f64(<vscale x 4 x double> %a, <vscale x 4 x double> %b)
784  ret <vscale x 4 x double> %v
785}
786
787define <vscale x 4 x double> @vfmax_nxv4f64_vf(<vscale x 4 x double> %a, double %b) {
788; CHECK-LABEL: vfmax_nxv4f64_vf:
789; CHECK:       # %bb.0:
790; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
791; CHECK-NEXT:    vfmax.vf v8, v8, fa0
792; CHECK-NEXT:    ret
793  %head = insertelement <vscale x 4 x double> poison, double %b, i32 0
794  %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
795  %v = call <vscale x 4 x double> @llvm.maxnum.nxv4f64(<vscale x 4 x double> %a, <vscale x 4 x double> %splat)
796  ret <vscale x 4 x double> %v
797}
798
799declare <vscale x 8 x double> @llvm.maxnum.nxv8f64(<vscale x 8 x double>, <vscale x 8 x double>)
800
801define <vscale x 8 x double> @vfmax_nxv8f64_vv(<vscale x 8 x double> %a, <vscale x 8 x double> %b) {
802; CHECK-LABEL: vfmax_nxv8f64_vv:
803; CHECK:       # %bb.0:
804; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
805; CHECK-NEXT:    vfmax.vv v8, v8, v16
806; CHECK-NEXT:    ret
807  %v = call <vscale x 8 x double> @llvm.maxnum.nxv8f64(<vscale x 8 x double> %a, <vscale x 8 x double> %b)
808  ret <vscale x 8 x double> %v
809}
810
811define <vscale x 8 x double> @vfmax_nxv8f64_vf(<vscale x 8 x double> %a, double %b) {
812; CHECK-LABEL: vfmax_nxv8f64_vf:
813; CHECK:       # %bb.0:
814; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
815; CHECK-NEXT:    vfmax.vf v8, v8, fa0
816; CHECK-NEXT:    ret
817  %head = insertelement <vscale x 8 x double> poison, double %b, i32 0
818  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
819  %v = call <vscale x 8 x double> @llvm.maxnum.nxv8f64(<vscale x 8 x double> %a, <vscale x 8 x double> %splat)
820  ret <vscale x 8 x double> %v
821}
822