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