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 7define <vscale x 1 x double> @vfwadd_vv_nxv1f64(<vscale x 1 x float> %va, <vscale x 1 x float> %vb) { 8; CHECK-LABEL: vfwadd_vv_nxv1f64: 9; CHECK: # %bb.0: 10; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 11; CHECK-NEXT: vfwadd.vv v10, v8, v9 12; CHECK-NEXT: vmv1r.v v8, v10 13; CHECK-NEXT: ret 14 %vc = fpext <vscale x 1 x float> %va to <vscale x 1 x double> 15 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 16 %ve = fadd <vscale x 1 x double> %vc, %vd 17 ret <vscale x 1 x double> %ve 18} 19 20define <vscale x 1 x double> @vfwadd_vf_nxv1f64(<vscale x 1 x float> %va, float %b) { 21; CHECK-LABEL: vfwadd_vf_nxv1f64: 22; CHECK: # %bb.0: 23; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 24; CHECK-NEXT: vfwadd.vf v9, v8, fa0 25; CHECK-NEXT: vmv1r.v v8, v9 26; CHECK-NEXT: ret 27 %head = insertelement <vscale x 1 x float> poison, float %b, i32 0 28 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 29 %vc = fpext <vscale x 1 x float> %va to <vscale x 1 x double> 30 %vd = fpext <vscale x 1 x float> %splat to <vscale x 1 x double> 31 %ve = fadd <vscale x 1 x double> %vc, %vd 32 ret <vscale x 1 x double> %ve 33} 34 35define <vscale x 1 x double> @vfwadd_vf_nxv1f64_2(<vscale x 1 x float> %va, float %b) { 36; CHECK-LABEL: vfwadd_vf_nxv1f64_2: 37; CHECK: # %bb.0: 38; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 39; CHECK-NEXT: vfwadd.vf v9, v8, fa0 40; CHECK-NEXT: vmv1r.v v8, v9 41; CHECK-NEXT: ret 42 %fpext = fpext float %b to double 43 %head = insertelement <vscale x 1 x double> poison, double %fpext, i32 0 44 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 45 %vc = fpext <vscale x 1 x float> %va to <vscale x 1 x double> 46 %ve = fadd <vscale x 1 x double> %vc, %splat 47 ret <vscale x 1 x double> %ve 48} 49 50define <vscale x 1 x double> @vfwadd_wv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb) { 51; CHECK-LABEL: vfwadd_wv_nxv1f64: 52; CHECK: # %bb.0: 53; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 54; CHECK-NEXT: vfwadd.wv v10, v8, v9 55; CHECK-NEXT: vmv1r.v v8, v10 56; CHECK-NEXT: ret 57 %vc = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 58 %vd = fadd <vscale x 1 x double> %va, %vc 59 ret <vscale x 1 x double> %vd 60} 61 62define <vscale x 1 x double> @vfwadd_wf_nxv1f64(<vscale x 1 x double> %va, float %b) { 63; CHECK-LABEL: vfwadd_wf_nxv1f64: 64; CHECK: # %bb.0: 65; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 66; CHECK-NEXT: vfwadd.wf v8, v8, fa0 67; CHECK-NEXT: ret 68 %head = insertelement <vscale x 1 x float> poison, float %b, i32 0 69 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 70 %vc = fpext <vscale x 1 x float> %splat to <vscale x 1 x double> 71 %vd = fadd <vscale x 1 x double> %va, %vc 72 ret <vscale x 1 x double> %vd 73} 74 75define <vscale x 1 x double> @vfwadd_wf_nxv1f64_2(<vscale x 1 x double> %va, float %b) { 76; CHECK-LABEL: vfwadd_wf_nxv1f64_2: 77; CHECK: # %bb.0: 78; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 79; CHECK-NEXT: vfwadd.wf v8, v8, fa0 80; CHECK-NEXT: ret 81 %fpext = fpext float %b to double 82 %head = insertelement <vscale x 1 x double> poison, double %fpext, i32 0 83 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 84 %vd = fadd <vscale x 1 x double> %va, %splat 85 ret <vscale x 1 x double> %vd 86} 87 88define <vscale x 2 x double> @vfwadd_vv_nxv2f64(<vscale x 2 x float> %va, <vscale x 2 x float> %vb) { 89; CHECK-LABEL: vfwadd_vv_nxv2f64: 90; CHECK: # %bb.0: 91; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 92; CHECK-NEXT: vfwadd.vv v10, v8, v9 93; CHECK-NEXT: vmv2r.v v8, v10 94; CHECK-NEXT: ret 95 %vc = fpext <vscale x 2 x float> %va to <vscale x 2 x double> 96 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 97 %ve = fadd <vscale x 2 x double> %vc, %vd 98 ret <vscale x 2 x double> %ve 99} 100 101define <vscale x 2 x double> @vfwadd_vf_nxv2f64(<vscale x 2 x float> %va, float %b) { 102; CHECK-LABEL: vfwadd_vf_nxv2f64: 103; CHECK: # %bb.0: 104; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 105; CHECK-NEXT: vfwadd.vf v10, v8, fa0 106; CHECK-NEXT: vmv2r.v v8, v10 107; CHECK-NEXT: ret 108 %head = insertelement <vscale x 2 x float> poison, float %b, i32 0 109 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 110 %vc = fpext <vscale x 2 x float> %va to <vscale x 2 x double> 111 %vd = fpext <vscale x 2 x float> %splat to <vscale x 2 x double> 112 %ve = fadd <vscale x 2 x double> %vc, %vd 113 ret <vscale x 2 x double> %ve 114} 115 116define <vscale x 2 x double> @vfwadd_vf_nxv2f64_2(<vscale x 2 x float> %va, float %b) { 117; CHECK-LABEL: vfwadd_vf_nxv2f64_2: 118; CHECK: # %bb.0: 119; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 120; CHECK-NEXT: vfwadd.vf v10, v8, fa0 121; CHECK-NEXT: vmv2r.v v8, v10 122; CHECK-NEXT: ret 123 %fpext = fpext float %b to double 124 %head = insertelement <vscale x 2 x double> poison, double %fpext, i32 0 125 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer 126 %vc = fpext <vscale x 2 x float> %va to <vscale x 2 x double> 127 %ve = fadd <vscale x 2 x double> %vc, %splat 128 ret <vscale x 2 x double> %ve 129} 130 131define <vscale x 2 x double> @vfwadd_wv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb) { 132; CHECK-LABEL: vfwadd_wv_nxv2f64: 133; CHECK: # %bb.0: 134; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 135; CHECK-NEXT: vfwadd.wv v12, v8, v10 136; CHECK-NEXT: vmv2r.v v8, v12 137; CHECK-NEXT: ret 138 %vc = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 139 %vd = fadd <vscale x 2 x double> %va, %vc 140 ret <vscale x 2 x double> %vd 141} 142 143define <vscale x 2 x double> @vfwadd_wf_nxv2f64(<vscale x 2 x double> %va, float %b) { 144; CHECK-LABEL: vfwadd_wf_nxv2f64: 145; CHECK: # %bb.0: 146; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 147; CHECK-NEXT: vfwadd.wf v8, v8, fa0 148; CHECK-NEXT: ret 149 %head = insertelement <vscale x 2 x float> poison, float %b, i32 0 150 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 151 %vc = fpext <vscale x 2 x float> %splat to <vscale x 2 x double> 152 %vd = fadd <vscale x 2 x double> %va, %vc 153 ret <vscale x 2 x double> %vd 154} 155 156define <vscale x 2 x double> @vfwadd_wf_nxv2f64_2(<vscale x 2 x double> %va, float %b) { 157; CHECK-LABEL: vfwadd_wf_nxv2f64_2: 158; CHECK: # %bb.0: 159; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 160; CHECK-NEXT: vfwadd.wf v8, v8, fa0 161; CHECK-NEXT: ret 162 %fpext = fpext float %b to double 163 %head = insertelement <vscale x 2 x double> poison, double %fpext, i32 0 164 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer 165 %vd = fadd <vscale x 2 x double> %va, %splat 166 ret <vscale x 2 x double> %vd 167} 168 169define <vscale x 4 x double> @vfwadd_vv_nxv4f64(<vscale x 4 x float> %va, <vscale x 4 x float> %vb) { 170; CHECK-LABEL: vfwadd_vv_nxv4f64: 171; CHECK: # %bb.0: 172; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 173; CHECK-NEXT: vfwadd.vv v12, v8, v10 174; CHECK-NEXT: vmv4r.v v8, v12 175; CHECK-NEXT: ret 176 %vc = fpext <vscale x 4 x float> %va to <vscale x 4 x double> 177 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 178 %ve = fadd <vscale x 4 x double> %vc, %vd 179 ret <vscale x 4 x double> %ve 180} 181 182define <vscale x 4 x double> @vfwadd_vf_nxv4f64(<vscale x 4 x float> %va, float %b) { 183; CHECK-LABEL: vfwadd_vf_nxv4f64: 184; CHECK: # %bb.0: 185; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 186; CHECK-NEXT: vfwadd.vf v12, v8, fa0 187; CHECK-NEXT: vmv4r.v v8, v12 188; CHECK-NEXT: ret 189 %head = insertelement <vscale x 4 x float> poison, float %b, i32 0 190 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 191 %vc = fpext <vscale x 4 x float> %va to <vscale x 4 x double> 192 %vd = fpext <vscale x 4 x float> %splat to <vscale x 4 x double> 193 %ve = fadd <vscale x 4 x double> %vc, %vd 194 ret <vscale x 4 x double> %ve 195} 196 197define <vscale x 4 x double> @vfwadd_vf_nxv4f64_2(<vscale x 4 x float> %va, float %b) { 198; CHECK-LABEL: vfwadd_vf_nxv4f64_2: 199; CHECK: # %bb.0: 200; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 201; CHECK-NEXT: vfwadd.vf v12, v8, fa0 202; CHECK-NEXT: vmv4r.v v8, v12 203; CHECK-NEXT: ret 204 %fpext = fpext float %b to double 205 %head = insertelement <vscale x 4 x double> poison, double %fpext, i32 0 206 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer 207 %vc = fpext <vscale x 4 x float> %va to <vscale x 4 x double> 208 %ve = fadd <vscale x 4 x double> %vc, %splat 209 ret <vscale x 4 x double> %ve 210} 211 212define <vscale x 4 x double> @vfwadd_wv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb) { 213; CHECK-LABEL: vfwadd_wv_nxv4f64: 214; CHECK: # %bb.0: 215; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 216; CHECK-NEXT: vfwadd.wv v16, v8, v12 217; CHECK-NEXT: vmv4r.v v8, v16 218; CHECK-NEXT: ret 219 %vc = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 220 %vd = fadd <vscale x 4 x double> %va, %vc 221 ret <vscale x 4 x double> %vd 222} 223 224define <vscale x 4 x double> @vfwadd_wf_nxv4f64(<vscale x 4 x double> %va, float %b) { 225; CHECK-LABEL: vfwadd_wf_nxv4f64: 226; CHECK: # %bb.0: 227; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 228; CHECK-NEXT: vfwadd.wf v8, v8, fa0 229; CHECK-NEXT: ret 230 %head = insertelement <vscale x 4 x float> poison, float %b, i32 0 231 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 232 %vc = fpext <vscale x 4 x float> %splat to <vscale x 4 x double> 233 %vd = fadd <vscale x 4 x double> %va, %vc 234 ret <vscale x 4 x double> %vd 235} 236 237define <vscale x 4 x double> @vfwadd_wf_nxv4f64_2(<vscale x 4 x double> %va, float %b) { 238; CHECK-LABEL: vfwadd_wf_nxv4f64_2: 239; CHECK: # %bb.0: 240; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 241; CHECK-NEXT: vfwadd.wf v8, v8, fa0 242; CHECK-NEXT: ret 243 %fpext = fpext float %b to double 244 %head = insertelement <vscale x 4 x double> poison, double %fpext, i32 0 245 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer 246 %vd = fadd <vscale x 4 x double> %va, %splat 247 ret <vscale x 4 x double> %vd 248} 249 250define <vscale x 8 x double> @vfwadd_vv_nxv8f64(<vscale x 8 x float> %va, <vscale x 8 x float> %vb) { 251; CHECK-LABEL: vfwadd_vv_nxv8f64: 252; CHECK: # %bb.0: 253; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 254; CHECK-NEXT: vfwadd.vv v16, v8, v12 255; CHECK-NEXT: vmv8r.v v8, v16 256; CHECK-NEXT: ret 257 %vc = fpext <vscale x 8 x float> %va to <vscale x 8 x double> 258 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 259 %ve = fadd <vscale x 8 x double> %vc, %vd 260 ret <vscale x 8 x double> %ve 261} 262 263define <vscale x 8 x double> @vfwadd_vf_nxv8f64(<vscale x 8 x float> %va, float %b) { 264; CHECK-LABEL: vfwadd_vf_nxv8f64: 265; CHECK: # %bb.0: 266; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 267; CHECK-NEXT: vfwadd.vf v16, v8, fa0 268; CHECK-NEXT: vmv8r.v v8, v16 269; CHECK-NEXT: ret 270 %head = insertelement <vscale x 8 x float> poison, float %b, i32 0 271 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 272 %vc = fpext <vscale x 8 x float> %va to <vscale x 8 x double> 273 %vd = fpext <vscale x 8 x float> %splat to <vscale x 8 x double> 274 %ve = fadd <vscale x 8 x double> %vc, %vd 275 ret <vscale x 8 x double> %ve 276} 277 278define <vscale x 8 x double> @vfwadd_vf_nxv8f64_2(<vscale x 8 x float> %va, float %b) { 279; CHECK-LABEL: vfwadd_vf_nxv8f64_2: 280; CHECK: # %bb.0: 281; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 282; CHECK-NEXT: vfwadd.vf v16, v8, fa0 283; CHECK-NEXT: vmv8r.v v8, v16 284; CHECK-NEXT: ret 285 %fpext = fpext float %b to double 286 %head = insertelement <vscale x 8 x double> poison, double %fpext, i32 0 287 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 288 %vc = fpext <vscale x 8 x float> %va to <vscale x 8 x double> 289 %ve = fadd <vscale x 8 x double> %vc, %splat 290 ret <vscale x 8 x double> %ve 291} 292 293define <vscale x 8 x double> @vfwadd_wv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb) { 294; CHECK-LABEL: vfwadd_wv_nxv8f64: 295; CHECK: # %bb.0: 296; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 297; CHECK-NEXT: vfwadd.wv v24, v8, v16 298; CHECK-NEXT: vmv8r.v v8, v24 299; CHECK-NEXT: ret 300 %vc = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 301 %vd = fadd <vscale x 8 x double> %va, %vc 302 ret <vscale x 8 x double> %vd 303} 304 305define <vscale x 8 x double> @vfwadd_wf_nxv8f64(<vscale x 8 x double> %va, float %b) { 306; CHECK-LABEL: vfwadd_wf_nxv8f64: 307; CHECK: # %bb.0: 308; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 309; CHECK-NEXT: vfwadd.wf v8, v8, fa0 310; CHECK-NEXT: ret 311 %head = insertelement <vscale x 8 x float> poison, float %b, i32 0 312 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 313 %vc = fpext <vscale x 8 x float> %splat to <vscale x 8 x double> 314 %vd = fadd <vscale x 8 x double> %va, %vc 315 ret <vscale x 8 x double> %vd 316} 317 318define <vscale x 8 x double> @vfwadd_wf_nxv8f64_2(<vscale x 8 x double> %va, float %b) { 319; CHECK-LABEL: vfwadd_wf_nxv8f64_2: 320; CHECK: # %bb.0: 321; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 322; CHECK-NEXT: vfwadd.wf v8, v8, fa0 323; CHECK-NEXT: ret 324 %fpext = fpext float %b to double 325 %head = insertelement <vscale x 8 x double> poison, double %fpext, i32 0 326 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 327 %vd = fadd <vscale x 8 x double> %va, %splat 328 ret <vscale x 8 x double> %vd 329} 330