xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fpext-vp.ll (revision 1cb599835ccf7ee8b2d1d5a7f3107e19a26fc6f5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s
3; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s
4; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfhmin,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s
5; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfhmin,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s
6
7declare <2 x float> @llvm.vp.fpext.v2f32.v2f16(<2 x half>, <2 x i1>, i32)
8
9define <2 x float> @vfpext_v2f16_v2f32(<2 x half> %a, <2 x i1> %m, i32 zeroext %vl) {
10; CHECK-LABEL: vfpext_v2f16_v2f32:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
13; CHECK-NEXT:    vfwcvt.f.f.v v9, v8, v0.t
14; CHECK-NEXT:    vmv1r.v v8, v9
15; CHECK-NEXT:    ret
16  %v = call <2 x float> @llvm.vp.fpext.v2f32.v2f16(<2 x half> %a, <2 x i1> %m, i32 %vl)
17  ret <2 x float> %v
18}
19
20define <2 x float> @vfpext_v2f16_v2f32_unmasked(<2 x half> %a, i32 zeroext %vl) {
21; CHECK-LABEL: vfpext_v2f16_v2f32_unmasked:
22; CHECK:       # %bb.0:
23; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
24; CHECK-NEXT:    vfwcvt.f.f.v v9, v8
25; CHECK-NEXT:    vmv1r.v v8, v9
26; CHECK-NEXT:    ret
27  %v = call <2 x float> @llvm.vp.fpext.v2f32.v2f16(<2 x half> %a, <2 x i1> splat (i1 true), i32 %vl)
28  ret <2 x float> %v
29}
30
31declare <2 x double> @llvm.vp.fpext.v2f64.v2f16(<2 x half>, <2 x i1>, i32)
32
33define <2 x double> @vfpext_v2f16_v2f64(<2 x half> %a, <2 x i1> %m, i32 zeroext %vl) {
34; CHECK-LABEL: vfpext_v2f16_v2f64:
35; CHECK:       # %bb.0:
36; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
37; CHECK-NEXT:    vfwcvt.f.f.v v9, v8, v0.t
38; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
39; CHECK-NEXT:    vfwcvt.f.f.v v8, v9, v0.t
40; CHECK-NEXT:    ret
41  %v = call <2 x double> @llvm.vp.fpext.v2f64.v2f16(<2 x half> %a, <2 x i1> %m, i32 %vl)
42  ret <2 x double> %v
43}
44
45define <2 x double> @vfpext_v2f16_v2f64_unmasked(<2 x half> %a, i32 zeroext %vl) {
46; CHECK-LABEL: vfpext_v2f16_v2f64_unmasked:
47; CHECK:       # %bb.0:
48; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
49; CHECK-NEXT:    vfwcvt.f.f.v v9, v8
50; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
51; CHECK-NEXT:    vfwcvt.f.f.v v8, v9
52; CHECK-NEXT:    ret
53  %v = call <2 x double> @llvm.vp.fpext.v2f64.v2f16(<2 x half> %a, <2 x i1> splat (i1 true), i32 %vl)
54  ret <2 x double> %v
55}
56
57declare <2 x double> @llvm.vp.fpext.v2f64.v2f32(<2 x float>, <2 x i1>, i32)
58
59define <2 x double> @vfpext_v2f32_v2f64(<2 x float> %a, <2 x i1> %m, i32 zeroext %vl) {
60; CHECK-LABEL: vfpext_v2f32_v2f64:
61; CHECK:       # %bb.0:
62; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
63; CHECK-NEXT:    vfwcvt.f.f.v v9, v8, v0.t
64; CHECK-NEXT:    vmv1r.v v8, v9
65; CHECK-NEXT:    ret
66  %v = call <2 x double> @llvm.vp.fpext.v2f64.v2f32(<2 x float> %a, <2 x i1> %m, i32 %vl)
67  ret <2 x double> %v
68}
69
70define <2 x double> @vfpext_v2f32_v2f64_unmasked(<2 x float> %a, i32 zeroext %vl) {
71; CHECK-LABEL: vfpext_v2f32_v2f64_unmasked:
72; CHECK:       # %bb.0:
73; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
74; CHECK-NEXT:    vfwcvt.f.f.v v9, v8
75; CHECK-NEXT:    vmv1r.v v8, v9
76; CHECK-NEXT:    ret
77  %v = call <2 x double> @llvm.vp.fpext.v2f64.v2f32(<2 x float> %a, <2 x i1> splat (i1 true), i32 %vl)
78  ret <2 x double> %v
79}
80
81declare <15 x double> @llvm.vp.fpext.v15f64.v15f32(<15 x float>, <15 x i1>, i32)
82
83define <15 x double> @vfpext_v15f32_v15f64(<15 x float> %a, <15 x i1> %m, i32 zeroext %vl) {
84; CHECK-LABEL: vfpext_v15f32_v15f64:
85; CHECK:       # %bb.0:
86; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
87; CHECK-NEXT:    vfwcvt.f.f.v v16, v8, v0.t
88; CHECK-NEXT:    vmv8r.v v8, v16
89; CHECK-NEXT:    ret
90  %v = call <15 x double> @llvm.vp.fpext.v15f64.v15f32(<15 x float> %a, <15 x i1> %m, i32 %vl)
91  ret <15 x double> %v
92}
93
94declare <32 x double> @llvm.vp.fpext.v32f64.v32f32(<32 x float>, <32 x i1>, i32)
95
96define <32 x double> @vfpext_v32f32_v32f64(<32 x float> %a, <32 x i1> %m, i32 zeroext %vl) {
97; CHECK-LABEL: vfpext_v32f32_v32f64:
98; CHECK:       # %bb.0:
99; CHECK-NEXT:    li a2, 16
100; CHECK-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
101; CHECK-NEXT:    vslidedown.vi v16, v0, 2
102; CHECK-NEXT:    mv a1, a0
103; CHECK-NEXT:    bltu a0, a2, .LBB7_2
104; CHECK-NEXT:  # %bb.1:
105; CHECK-NEXT:    li a1, 16
106; CHECK-NEXT:  .LBB7_2:
107; CHECK-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
108; CHECK-NEXT:    vfwcvt.f.f.v v24, v8, v0.t
109; CHECK-NEXT:    addi a1, a0, -16
110; CHECK-NEXT:    sltu a0, a0, a1
111; CHECK-NEXT:    addi a0, a0, -1
112; CHECK-NEXT:    and a0, a0, a1
113; CHECK-NEXT:    vsetivli zero, 16, e32, m8, ta, ma
114; CHECK-NEXT:    vslidedown.vi v8, v8, 16
115; CHECK-NEXT:    vmv1r.v v0, v16
116; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
117; CHECK-NEXT:    vfwcvt.f.f.v v16, v8, v0.t
118; CHECK-NEXT:    vmv8r.v v8, v24
119; CHECK-NEXT:    ret
120  %v = call <32 x double> @llvm.vp.fpext.v32f64.v32f32(<32 x float> %a, <32 x i1> %m, i32 %vl)
121  ret <32 x double> %v
122}
123
124declare <2 x float> @llvm.vp.fpext.v2f32.v2bf16(<2 x bfloat>, <2 x i1>, i32)
125
126define <2 x float> @vfpext_v2bf16_v2f32(<2 x bfloat> %a, <2 x i1> %m, i32 zeroext %vl) {
127; CHECK-LABEL: vfpext_v2bf16_v2f32:
128; CHECK:       # %bb.0:
129; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
130; CHECK-NEXT:    vfwcvtbf16.f.f.v v9, v8, v0.t
131; CHECK-NEXT:    vmv1r.v v8, v9
132; CHECK-NEXT:    ret
133  %v = call <2 x float> @llvm.vp.fpext.v2f32.v2bf16(<2 x bfloat> %a, <2 x i1> %m, i32 %vl)
134  ret <2 x float> %v
135}
136
137define <2 x float> @vfpext_v2bf16_v2f32_unmasked(<2 x bfloat> %a, i32 zeroext %vl) {
138; CHECK-LABEL: vfpext_v2bf16_v2f32_unmasked:
139; CHECK:       # %bb.0:
140; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
141; CHECK-NEXT:    vfwcvtbf16.f.f.v v9, v8
142; CHECK-NEXT:    vmv1r.v v8, v9
143; CHECK-NEXT:    ret
144  %v = call <2 x float> @llvm.vp.fpext.v2f32.v2bf16(<2 x bfloat> %a, <2 x i1> shufflevector (<2 x i1> insertelement (<2 x i1> undef, i1 true, i32 0), <2 x i1> undef, <2 x i32> zeroinitializer), i32 %vl)
145  ret <2 x float> %v
146}
147
148declare <2 x double> @llvm.vp.fpext.v2f64.v2bf16(<2 x bfloat>, <2 x i1>, i32)
149
150define <2 x double> @vfpext_v2bf16_v2f64(<2 x bfloat> %a, <2 x i1> %m, i32 zeroext %vl) {
151; CHECK-LABEL: vfpext_v2bf16_v2f64:
152; CHECK:       # %bb.0:
153; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
154; CHECK-NEXT:    vfwcvtbf16.f.f.v v9, v8, v0.t
155; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
156; CHECK-NEXT:    vfwcvt.f.f.v v8, v9, v0.t
157; CHECK-NEXT:    ret
158  %v = call <2 x double> @llvm.vp.fpext.v2f64.v2bf16(<2 x bfloat> %a, <2 x i1> %m, i32 %vl)
159  ret <2 x double> %v
160}
161
162define <2 x double> @vfpext_v2bf16_v2f64_unmasked(<2 x bfloat> %a, i32 zeroext %vl) {
163; CHECK-LABEL: vfpext_v2bf16_v2f64_unmasked:
164; CHECK:       # %bb.0:
165; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
166; CHECK-NEXT:    vfwcvtbf16.f.f.v v9, v8
167; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
168; CHECK-NEXT:    vfwcvt.f.f.v v8, v9
169; CHECK-NEXT:    ret
170  %v = call <2 x double> @llvm.vp.fpext.v2f64.v2bf16(<2 x bfloat> %a, <2 x i1> shufflevector (<2 x i1> insertelement (<2 x i1> undef, i1 true, i32 0), <2 x i1> undef, <2 x i32> zeroinitializer), i32 %vl)
171  ret <2 x double> %v
172}
173