1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH 4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH 6; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfhmin,+v -target-abi=ilp32d \ 7; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN 8; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfhmin,+v -target-abi=lp64d \ 9; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN 10 11declare <2 x half> @llvm.vp.fsub.v2f16(<2 x half>, <2 x half>, <2 x i1>, i32) 12 13define <2 x half> @vfsub_vv_v2f16(<2 x half> %va, <2 x half> %b, <2 x i1> %m, i32 zeroext %evl) { 14; ZVFH-LABEL: vfsub_vv_v2f16: 15; ZVFH: # %bb.0: 16; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 17; ZVFH-NEXT: vfsub.vv v8, v8, v9, v0.t 18; ZVFH-NEXT: ret 19; 20; ZVFHMIN-LABEL: vfsub_vv_v2f16: 21; ZVFHMIN: # %bb.0: 22; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 23; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t 24; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8, v0.t 25; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 26; ZVFHMIN-NEXT: vfsub.vv v9, v9, v10, v0.t 27; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 28; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9, v0.t 29; ZVFHMIN-NEXT: ret 30 %v = call <2 x half> @llvm.vp.fsub.v2f16(<2 x half> %va, <2 x half> %b, <2 x i1> %m, i32 %evl) 31 ret <2 x half> %v 32} 33 34define <2 x half> @vfsub_vv_v2f16_unmasked(<2 x half> %va, <2 x half> %b, i32 zeroext %evl) { 35; ZVFH-LABEL: vfsub_vv_v2f16_unmasked: 36; ZVFH: # %bb.0: 37; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 38; ZVFH-NEXT: vfsub.vv v8, v8, v9 39; ZVFH-NEXT: ret 40; 41; ZVFHMIN-LABEL: vfsub_vv_v2f16_unmasked: 42; ZVFHMIN: # %bb.0: 43; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 44; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 45; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 46; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 47; ZVFHMIN-NEXT: vfsub.vv v9, v9, v10 48; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 49; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 50; ZVFHMIN-NEXT: ret 51 %v = call <2 x half> @llvm.vp.fsub.v2f16(<2 x half> %va, <2 x half> %b, <2 x i1> splat (i1 true), i32 %evl) 52 ret <2 x half> %v 53} 54 55define <2 x half> @vfsub_vf_v2f16(<2 x half> %va, half %b, <2 x i1> %m, i32 zeroext %evl) { 56; ZVFH-LABEL: vfsub_vf_v2f16: 57; ZVFH: # %bb.0: 58; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 59; ZVFH-NEXT: vfsub.vf v8, v8, fa0, v0.t 60; ZVFH-NEXT: ret 61; 62; ZVFHMIN-LABEL: vfsub_vf_v2f16: 63; ZVFHMIN: # %bb.0: 64; ZVFHMIN-NEXT: fmv.x.h a1, fa0 65; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 66; ZVFHMIN-NEXT: vmv.v.x v9, a1 67; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 68; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t 69; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9, v0.t 70; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 71; ZVFHMIN-NEXT: vfsub.vv v9, v10, v8, v0.t 72; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 73; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9, v0.t 74; ZVFHMIN-NEXT: ret 75 %elt.head = insertelement <2 x half> poison, half %b, i32 0 76 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer 77 %v = call <2 x half> @llvm.vp.fsub.v2f16(<2 x half> %va, <2 x half> %vb, <2 x i1> %m, i32 %evl) 78 ret <2 x half> %v 79} 80 81define <2 x half> @vfsub_vf_v2f16_unmasked(<2 x half> %va, half %b, i32 zeroext %evl) { 82; ZVFH-LABEL: vfsub_vf_v2f16_unmasked: 83; ZVFH: # %bb.0: 84; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 85; ZVFH-NEXT: vfsub.vf v8, v8, fa0 86; ZVFH-NEXT: ret 87; 88; ZVFHMIN-LABEL: vfsub_vf_v2f16_unmasked: 89; ZVFHMIN: # %bb.0: 90; ZVFHMIN-NEXT: fmv.x.h a1, fa0 91; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 92; ZVFHMIN-NEXT: vmv.v.x v9, a1 93; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 94; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 95; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 96; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 97; ZVFHMIN-NEXT: vfsub.vv v9, v10, v8 98; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 99; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 100; ZVFHMIN-NEXT: ret 101 %elt.head = insertelement <2 x half> poison, half %b, i32 0 102 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer 103 %v = call <2 x half> @llvm.vp.fsub.v2f16(<2 x half> %va, <2 x half> %vb, <2 x i1> splat (i1 true), i32 %evl) 104 ret <2 x half> %v 105} 106 107declare <3 x half> @llvm.vp.fsub.v3f16(<3 x half>, <3 x half>, <3 x i1>, i32) 108 109define <3 x half> @vfsub_vv_v3f16(<3 x half> %va, <3 x half> %b, <3 x i1> %m, i32 zeroext %evl) { 110; ZVFH-LABEL: vfsub_vv_v3f16: 111; ZVFH: # %bb.0: 112; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 113; ZVFH-NEXT: vfsub.vv v8, v8, v9, v0.t 114; ZVFH-NEXT: ret 115; 116; ZVFHMIN-LABEL: vfsub_vv_v3f16: 117; ZVFHMIN: # %bb.0: 118; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 119; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t 120; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8, v0.t 121; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 122; ZVFHMIN-NEXT: vfsub.vv v9, v9, v10, v0.t 123; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 124; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9, v0.t 125; ZVFHMIN-NEXT: ret 126 %v = call <3 x half> @llvm.vp.fsub.v3f16(<3 x half> %va, <3 x half> %b, <3 x i1> %m, i32 %evl) 127 ret <3 x half> %v 128} 129 130declare <4 x half> @llvm.vp.fsub.v4f16(<4 x half>, <4 x half>, <4 x i1>, i32) 131 132define <4 x half> @vfsub_vv_v4f16(<4 x half> %va, <4 x half> %b, <4 x i1> %m, i32 zeroext %evl) { 133; ZVFH-LABEL: vfsub_vv_v4f16: 134; ZVFH: # %bb.0: 135; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 136; ZVFH-NEXT: vfsub.vv v8, v8, v9, v0.t 137; ZVFH-NEXT: ret 138; 139; ZVFHMIN-LABEL: vfsub_vv_v4f16: 140; ZVFHMIN: # %bb.0: 141; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 142; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t 143; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8, v0.t 144; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 145; ZVFHMIN-NEXT: vfsub.vv v9, v9, v10, v0.t 146; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 147; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9, v0.t 148; ZVFHMIN-NEXT: ret 149 %v = call <4 x half> @llvm.vp.fsub.v4f16(<4 x half> %va, <4 x half> %b, <4 x i1> %m, i32 %evl) 150 ret <4 x half> %v 151} 152 153define <4 x half> @vfsub_vv_v4f16_unmasked(<4 x half> %va, <4 x half> %b, i32 zeroext %evl) { 154; ZVFH-LABEL: vfsub_vv_v4f16_unmasked: 155; ZVFH: # %bb.0: 156; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 157; ZVFH-NEXT: vfsub.vv v8, v8, v9 158; ZVFH-NEXT: ret 159; 160; ZVFHMIN-LABEL: vfsub_vv_v4f16_unmasked: 161; ZVFHMIN: # %bb.0: 162; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 163; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 164; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 165; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 166; ZVFHMIN-NEXT: vfsub.vv v9, v9, v10 167; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 168; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 169; ZVFHMIN-NEXT: ret 170 %v = call <4 x half> @llvm.vp.fsub.v4f16(<4 x half> %va, <4 x half> %b, <4 x i1> splat (i1 true), i32 %evl) 171 ret <4 x half> %v 172} 173 174define <4 x half> @vfsub_vf_v4f16(<4 x half> %va, half %b, <4 x i1> %m, i32 zeroext %evl) { 175; ZVFH-LABEL: vfsub_vf_v4f16: 176; ZVFH: # %bb.0: 177; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 178; ZVFH-NEXT: vfsub.vf v8, v8, fa0, v0.t 179; ZVFH-NEXT: ret 180; 181; ZVFHMIN-LABEL: vfsub_vf_v4f16: 182; ZVFHMIN: # %bb.0: 183; ZVFHMIN-NEXT: fmv.x.h a1, fa0 184; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 185; ZVFHMIN-NEXT: vmv.v.x v9, a1 186; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 187; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t 188; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9, v0.t 189; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 190; ZVFHMIN-NEXT: vfsub.vv v9, v10, v8, v0.t 191; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 192; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9, v0.t 193; ZVFHMIN-NEXT: ret 194 %elt.head = insertelement <4 x half> poison, half %b, i32 0 195 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer 196 %v = call <4 x half> @llvm.vp.fsub.v4f16(<4 x half> %va, <4 x half> %vb, <4 x i1> %m, i32 %evl) 197 ret <4 x half> %v 198} 199 200define <4 x half> @vfsub_vf_v4f16_unmasked(<4 x half> %va, half %b, i32 zeroext %evl) { 201; ZVFH-LABEL: vfsub_vf_v4f16_unmasked: 202; ZVFH: # %bb.0: 203; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 204; ZVFH-NEXT: vfsub.vf v8, v8, fa0 205; ZVFH-NEXT: ret 206; 207; ZVFHMIN-LABEL: vfsub_vf_v4f16_unmasked: 208; ZVFHMIN: # %bb.0: 209; ZVFHMIN-NEXT: fmv.x.h a1, fa0 210; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 211; ZVFHMIN-NEXT: vmv.v.x v9, a1 212; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 213; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 214; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 215; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 216; ZVFHMIN-NEXT: vfsub.vv v9, v10, v8 217; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 218; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 219; ZVFHMIN-NEXT: ret 220 %elt.head = insertelement <4 x half> poison, half %b, i32 0 221 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer 222 %v = call <4 x half> @llvm.vp.fsub.v4f16(<4 x half> %va, <4 x half> %vb, <4 x i1> splat (i1 true), i32 %evl) 223 ret <4 x half> %v 224} 225 226declare <8 x half> @llvm.vp.fsub.v8f16(<8 x half>, <8 x half>, <8 x i1>, i32) 227 228define <8 x half> @vfsub_vv_v8f16(<8 x half> %va, <8 x half> %b, <8 x i1> %m, i32 zeroext %evl) { 229; ZVFH-LABEL: vfsub_vv_v8f16: 230; ZVFH: # %bb.0: 231; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma 232; ZVFH-NEXT: vfsub.vv v8, v8, v9, v0.t 233; ZVFH-NEXT: ret 234; 235; ZVFHMIN-LABEL: vfsub_vv_v8f16: 236; ZVFHMIN: # %bb.0: 237; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 238; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t 239; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8, v0.t 240; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 241; ZVFHMIN-NEXT: vfsub.vv v10, v12, v10, v0.t 242; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 243; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10, v0.t 244; ZVFHMIN-NEXT: ret 245 %v = call <8 x half> @llvm.vp.fsub.v8f16(<8 x half> %va, <8 x half> %b, <8 x i1> %m, i32 %evl) 246 ret <8 x half> %v 247} 248 249define <8 x half> @vfsub_vv_v8f16_unmasked(<8 x half> %va, <8 x half> %b, i32 zeroext %evl) { 250; ZVFH-LABEL: vfsub_vv_v8f16_unmasked: 251; ZVFH: # %bb.0: 252; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma 253; ZVFH-NEXT: vfsub.vv v8, v8, v9 254; ZVFH-NEXT: ret 255; 256; ZVFHMIN-LABEL: vfsub_vv_v8f16_unmasked: 257; ZVFHMIN: # %bb.0: 258; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 259; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 260; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8 261; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 262; ZVFHMIN-NEXT: vfsub.vv v10, v12, v10 263; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 264; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10 265; ZVFHMIN-NEXT: ret 266 %v = call <8 x half> @llvm.vp.fsub.v8f16(<8 x half> %va, <8 x half> %b, <8 x i1> splat (i1 true), i32 %evl) 267 ret <8 x half> %v 268} 269 270define <8 x half> @vfsub_vf_v8f16(<8 x half> %va, half %b, <8 x i1> %m, i32 zeroext %evl) { 271; ZVFH-LABEL: vfsub_vf_v8f16: 272; ZVFH: # %bb.0: 273; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma 274; ZVFH-NEXT: vfsub.vf v8, v8, fa0, v0.t 275; ZVFH-NEXT: ret 276; 277; ZVFHMIN-LABEL: vfsub_vf_v8f16: 278; ZVFHMIN: # %bb.0: 279; ZVFHMIN-NEXT: fmv.x.h a1, fa0 280; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma 281; ZVFHMIN-NEXT: vmv.v.x v9, a1 282; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 283; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t 284; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9, v0.t 285; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 286; ZVFHMIN-NEXT: vfsub.vv v10, v10, v12, v0.t 287; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 288; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10, v0.t 289; ZVFHMIN-NEXT: ret 290 %elt.head = insertelement <8 x half> poison, half %b, i32 0 291 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer 292 %v = call <8 x half> @llvm.vp.fsub.v8f16(<8 x half> %va, <8 x half> %vb, <8 x i1> %m, i32 %evl) 293 ret <8 x half> %v 294} 295 296define <8 x half> @vfsub_vf_v8f16_unmasked(<8 x half> %va, half %b, i32 zeroext %evl) { 297; ZVFH-LABEL: vfsub_vf_v8f16_unmasked: 298; ZVFH: # %bb.0: 299; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma 300; ZVFH-NEXT: vfsub.vf v8, v8, fa0 301; ZVFH-NEXT: ret 302; 303; ZVFHMIN-LABEL: vfsub_vf_v8f16_unmasked: 304; ZVFHMIN: # %bb.0: 305; ZVFHMIN-NEXT: fmv.x.h a1, fa0 306; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma 307; ZVFHMIN-NEXT: vmv.v.x v9, a1 308; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 309; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 310; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9 311; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 312; ZVFHMIN-NEXT: vfsub.vv v10, v10, v12 313; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 314; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10 315; ZVFHMIN-NEXT: ret 316 %elt.head = insertelement <8 x half> poison, half %b, i32 0 317 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer 318 %v = call <8 x half> @llvm.vp.fsub.v8f16(<8 x half> %va, <8 x half> %vb, <8 x i1> splat (i1 true), i32 %evl) 319 ret <8 x half> %v 320} 321 322declare <16 x half> @llvm.vp.fsub.v16f16(<16 x half>, <16 x half>, <16 x i1>, i32) 323 324define <16 x half> @vfsub_vv_v16f16(<16 x half> %va, <16 x half> %b, <16 x i1> %m, i32 zeroext %evl) { 325; ZVFH-LABEL: vfsub_vv_v16f16: 326; ZVFH: # %bb.0: 327; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma 328; ZVFH-NEXT: vfsub.vv v8, v8, v10, v0.t 329; ZVFH-NEXT: ret 330; 331; ZVFHMIN-LABEL: vfsub_vv_v16f16: 332; ZVFHMIN: # %bb.0: 333; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 334; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10, v0.t 335; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8, v0.t 336; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 337; ZVFHMIN-NEXT: vfsub.vv v12, v16, v12, v0.t 338; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 339; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12, v0.t 340; ZVFHMIN-NEXT: ret 341 %v = call <16 x half> @llvm.vp.fsub.v16f16(<16 x half> %va, <16 x half> %b, <16 x i1> %m, i32 %evl) 342 ret <16 x half> %v 343} 344 345define <16 x half> @vfsub_vv_v16f16_unmasked(<16 x half> %va, <16 x half> %b, i32 zeroext %evl) { 346; ZVFH-LABEL: vfsub_vv_v16f16_unmasked: 347; ZVFH: # %bb.0: 348; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma 349; ZVFH-NEXT: vfsub.vv v8, v8, v10 350; ZVFH-NEXT: ret 351; 352; ZVFHMIN-LABEL: vfsub_vv_v16f16_unmasked: 353; ZVFHMIN: # %bb.0: 354; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 355; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 356; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 357; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 358; ZVFHMIN-NEXT: vfsub.vv v12, v16, v12 359; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 360; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 361; ZVFHMIN-NEXT: ret 362 %v = call <16 x half> @llvm.vp.fsub.v16f16(<16 x half> %va, <16 x half> %b, <16 x i1> splat (i1 true), i32 %evl) 363 ret <16 x half> %v 364} 365 366define <16 x half> @vfsub_vf_v16f16(<16 x half> %va, half %b, <16 x i1> %m, i32 zeroext %evl) { 367; ZVFH-LABEL: vfsub_vf_v16f16: 368; ZVFH: # %bb.0: 369; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma 370; ZVFH-NEXT: vfsub.vf v8, v8, fa0, v0.t 371; ZVFH-NEXT: ret 372; 373; ZVFHMIN-LABEL: vfsub_vf_v16f16: 374; ZVFHMIN: # %bb.0: 375; ZVFHMIN-NEXT: fmv.x.h a1, fa0 376; ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma 377; ZVFHMIN-NEXT: vmv.v.x v10, a1 378; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 379; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8, v0.t 380; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10, v0.t 381; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 382; ZVFHMIN-NEXT: vfsub.vv v12, v12, v16, v0.t 383; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 384; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12, v0.t 385; ZVFHMIN-NEXT: ret 386 %elt.head = insertelement <16 x half> poison, half %b, i32 0 387 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer 388 %v = call <16 x half> @llvm.vp.fsub.v16f16(<16 x half> %va, <16 x half> %vb, <16 x i1> %m, i32 %evl) 389 ret <16 x half> %v 390} 391 392define <16 x half> @vfsub_vf_v16f16_unmasked(<16 x half> %va, half %b, i32 zeroext %evl) { 393; ZVFH-LABEL: vfsub_vf_v16f16_unmasked: 394; ZVFH: # %bb.0: 395; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma 396; ZVFH-NEXT: vfsub.vf v8, v8, fa0 397; ZVFH-NEXT: ret 398; 399; ZVFHMIN-LABEL: vfsub_vf_v16f16_unmasked: 400; ZVFHMIN: # %bb.0: 401; ZVFHMIN-NEXT: fmv.x.h a1, fa0 402; ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma 403; ZVFHMIN-NEXT: vmv.v.x v10, a1 404; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 405; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8 406; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10 407; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 408; ZVFHMIN-NEXT: vfsub.vv v12, v12, v16 409; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 410; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 411; ZVFHMIN-NEXT: ret 412 %elt.head = insertelement <16 x half> poison, half %b, i32 0 413 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer 414 %v = call <16 x half> @llvm.vp.fsub.v16f16(<16 x half> %va, <16 x half> %vb, <16 x i1> splat (i1 true), i32 %evl) 415 ret <16 x half> %v 416} 417 418declare <2 x float> @llvm.vp.fsub.v2f32(<2 x float>, <2 x float>, <2 x i1>, i32) 419 420define <2 x float> @vfsub_vv_v2f32(<2 x float> %va, <2 x float> %b, <2 x i1> %m, i32 zeroext %evl) { 421; CHECK-LABEL: vfsub_vv_v2f32: 422; CHECK: # %bb.0: 423; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 424; CHECK-NEXT: vfsub.vv v8, v8, v9, v0.t 425; CHECK-NEXT: ret 426 %v = call <2 x float> @llvm.vp.fsub.v2f32(<2 x float> %va, <2 x float> %b, <2 x i1> %m, i32 %evl) 427 ret <2 x float> %v 428} 429 430define <2 x float> @vfsub_vv_v2f32_unmasked(<2 x float> %va, <2 x float> %b, i32 zeroext %evl) { 431; CHECK-LABEL: vfsub_vv_v2f32_unmasked: 432; CHECK: # %bb.0: 433; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 434; CHECK-NEXT: vfsub.vv v8, v8, v9 435; CHECK-NEXT: ret 436 %v = call <2 x float> @llvm.vp.fsub.v2f32(<2 x float> %va, <2 x float> %b, <2 x i1> splat (i1 true), i32 %evl) 437 ret <2 x float> %v 438} 439 440define <2 x float> @vfsub_vf_v2f32(<2 x float> %va, float %b, <2 x i1> %m, i32 zeroext %evl) { 441; CHECK-LABEL: vfsub_vf_v2f32: 442; CHECK: # %bb.0: 443; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 444; CHECK-NEXT: vfsub.vf v8, v8, fa0, v0.t 445; CHECK-NEXT: ret 446 %elt.head = insertelement <2 x float> poison, float %b, i32 0 447 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer 448 %v = call <2 x float> @llvm.vp.fsub.v2f32(<2 x float> %va, <2 x float> %vb, <2 x i1> %m, i32 %evl) 449 ret <2 x float> %v 450} 451 452define <2 x float> @vfsub_vf_v2f32_unmasked(<2 x float> %va, float %b, i32 zeroext %evl) { 453; CHECK-LABEL: vfsub_vf_v2f32_unmasked: 454; CHECK: # %bb.0: 455; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 456; CHECK-NEXT: vfsub.vf v8, v8, fa0 457; CHECK-NEXT: ret 458 %elt.head = insertelement <2 x float> poison, float %b, i32 0 459 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer 460 %v = call <2 x float> @llvm.vp.fsub.v2f32(<2 x float> %va, <2 x float> %vb, <2 x i1> splat (i1 true), i32 %evl) 461 ret <2 x float> %v 462} 463 464declare <4 x float> @llvm.vp.fsub.v4f32(<4 x float>, <4 x float>, <4 x i1>, i32) 465 466define <4 x float> @vfsub_vv_v4f32(<4 x float> %va, <4 x float> %b, <4 x i1> %m, i32 zeroext %evl) { 467; CHECK-LABEL: vfsub_vv_v4f32: 468; CHECK: # %bb.0: 469; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 470; CHECK-NEXT: vfsub.vv v8, v8, v9, v0.t 471; CHECK-NEXT: ret 472 %v = call <4 x float> @llvm.vp.fsub.v4f32(<4 x float> %va, <4 x float> %b, <4 x i1> %m, i32 %evl) 473 ret <4 x float> %v 474} 475 476define <4 x float> @vfsub_vv_v4f32_unmasked(<4 x float> %va, <4 x float> %b, i32 zeroext %evl) { 477; CHECK-LABEL: vfsub_vv_v4f32_unmasked: 478; CHECK: # %bb.0: 479; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 480; CHECK-NEXT: vfsub.vv v8, v8, v9 481; CHECK-NEXT: ret 482 %v = call <4 x float> @llvm.vp.fsub.v4f32(<4 x float> %va, <4 x float> %b, <4 x i1> splat (i1 true), i32 %evl) 483 ret <4 x float> %v 484} 485 486define <4 x float> @vfsub_vf_v4f32(<4 x float> %va, float %b, <4 x i1> %m, i32 zeroext %evl) { 487; CHECK-LABEL: vfsub_vf_v4f32: 488; CHECK: # %bb.0: 489; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 490; CHECK-NEXT: vfsub.vf v8, v8, fa0, v0.t 491; CHECK-NEXT: ret 492 %elt.head = insertelement <4 x float> poison, float %b, i32 0 493 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer 494 %v = call <4 x float> @llvm.vp.fsub.v4f32(<4 x float> %va, <4 x float> %vb, <4 x i1> %m, i32 %evl) 495 ret <4 x float> %v 496} 497 498define <4 x float> @vfsub_vf_v4f32_unmasked(<4 x float> %va, float %b, i32 zeroext %evl) { 499; CHECK-LABEL: vfsub_vf_v4f32_unmasked: 500; CHECK: # %bb.0: 501; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 502; CHECK-NEXT: vfsub.vf v8, v8, fa0 503; CHECK-NEXT: ret 504 %elt.head = insertelement <4 x float> poison, float %b, i32 0 505 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer 506 %v = call <4 x float> @llvm.vp.fsub.v4f32(<4 x float> %va, <4 x float> %vb, <4 x i1> splat (i1 true), i32 %evl) 507 ret <4 x float> %v 508} 509 510declare <8 x float> @llvm.vp.fsub.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) 511 512define <8 x float> @vfsub_vv_v8f32(<8 x float> %va, <8 x float> %b, <8 x i1> %m, i32 zeroext %evl) { 513; CHECK-LABEL: vfsub_vv_v8f32: 514; CHECK: # %bb.0: 515; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 516; CHECK-NEXT: vfsub.vv v8, v8, v10, v0.t 517; CHECK-NEXT: ret 518 %v = call <8 x float> @llvm.vp.fsub.v8f32(<8 x float> %va, <8 x float> %b, <8 x i1> %m, i32 %evl) 519 ret <8 x float> %v 520} 521 522define <8 x float> @vfsub_vv_v8f32_unmasked(<8 x float> %va, <8 x float> %b, i32 zeroext %evl) { 523; CHECK-LABEL: vfsub_vv_v8f32_unmasked: 524; CHECK: # %bb.0: 525; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 526; CHECK-NEXT: vfsub.vv v8, v8, v10 527; CHECK-NEXT: ret 528 %v = call <8 x float> @llvm.vp.fsub.v8f32(<8 x float> %va, <8 x float> %b, <8 x i1> splat (i1 true), i32 %evl) 529 ret <8 x float> %v 530} 531 532define <8 x float> @vfsub_vf_v8f32(<8 x float> %va, float %b, <8 x i1> %m, i32 zeroext %evl) { 533; CHECK-LABEL: vfsub_vf_v8f32: 534; CHECK: # %bb.0: 535; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 536; CHECK-NEXT: vfsub.vf v8, v8, fa0, v0.t 537; CHECK-NEXT: ret 538 %elt.head = insertelement <8 x float> poison, float %b, i32 0 539 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer 540 %v = call <8 x float> @llvm.vp.fsub.v8f32(<8 x float> %va, <8 x float> %vb, <8 x i1> %m, i32 %evl) 541 ret <8 x float> %v 542} 543 544define <8 x float> @vfsub_vf_v8f32_unmasked(<8 x float> %va, float %b, i32 zeroext %evl) { 545; CHECK-LABEL: vfsub_vf_v8f32_unmasked: 546; CHECK: # %bb.0: 547; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 548; CHECK-NEXT: vfsub.vf v8, v8, fa0 549; CHECK-NEXT: ret 550 %elt.head = insertelement <8 x float> poison, float %b, i32 0 551 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer 552 %v = call <8 x float> @llvm.vp.fsub.v8f32(<8 x float> %va, <8 x float> %vb, <8 x i1> splat (i1 true), i32 %evl) 553 ret <8 x float> %v 554} 555 556declare <16 x float> @llvm.vp.fsub.v16f32(<16 x float>, <16 x float>, <16 x i1>, i32) 557 558define <16 x float> @vfsub_vv_v16f32(<16 x float> %va, <16 x float> %b, <16 x i1> %m, i32 zeroext %evl) { 559; CHECK-LABEL: vfsub_vv_v16f32: 560; CHECK: # %bb.0: 561; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 562; CHECK-NEXT: vfsub.vv v8, v8, v12, v0.t 563; CHECK-NEXT: ret 564 %v = call <16 x float> @llvm.vp.fsub.v16f32(<16 x float> %va, <16 x float> %b, <16 x i1> %m, i32 %evl) 565 ret <16 x float> %v 566} 567 568define <16 x float> @vfsub_vv_v16f32_unmasked(<16 x float> %va, <16 x float> %b, i32 zeroext %evl) { 569; CHECK-LABEL: vfsub_vv_v16f32_unmasked: 570; CHECK: # %bb.0: 571; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 572; CHECK-NEXT: vfsub.vv v8, v8, v12 573; CHECK-NEXT: ret 574 %v = call <16 x float> @llvm.vp.fsub.v16f32(<16 x float> %va, <16 x float> %b, <16 x i1> splat (i1 true), i32 %evl) 575 ret <16 x float> %v 576} 577 578define <16 x float> @vfsub_vf_v16f32(<16 x float> %va, float %b, <16 x i1> %m, i32 zeroext %evl) { 579; CHECK-LABEL: vfsub_vf_v16f32: 580; CHECK: # %bb.0: 581; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 582; CHECK-NEXT: vfsub.vf v8, v8, fa0, v0.t 583; CHECK-NEXT: ret 584 %elt.head = insertelement <16 x float> poison, float %b, i32 0 585 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer 586 %v = call <16 x float> @llvm.vp.fsub.v16f32(<16 x float> %va, <16 x float> %vb, <16 x i1> %m, i32 %evl) 587 ret <16 x float> %v 588} 589 590define <16 x float> @vfsub_vf_v16f32_unmasked(<16 x float> %va, float %b, i32 zeroext %evl) { 591; CHECK-LABEL: vfsub_vf_v16f32_unmasked: 592; CHECK: # %bb.0: 593; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 594; CHECK-NEXT: vfsub.vf v8, v8, fa0 595; CHECK-NEXT: ret 596 %elt.head = insertelement <16 x float> poison, float %b, i32 0 597 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer 598 %v = call <16 x float> @llvm.vp.fsub.v16f32(<16 x float> %va, <16 x float> %vb, <16 x i1> splat (i1 true), i32 %evl) 599 ret <16 x float> %v 600} 601 602declare <2 x double> @llvm.vp.fsub.v2f64(<2 x double>, <2 x double>, <2 x i1>, i32) 603 604define <2 x double> @vfsub_vv_v2f64(<2 x double> %va, <2 x double> %b, <2 x i1> %m, i32 zeroext %evl) { 605; CHECK-LABEL: vfsub_vv_v2f64: 606; CHECK: # %bb.0: 607; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 608; CHECK-NEXT: vfsub.vv v8, v8, v9, v0.t 609; CHECK-NEXT: ret 610 %v = call <2 x double> @llvm.vp.fsub.v2f64(<2 x double> %va, <2 x double> %b, <2 x i1> %m, i32 %evl) 611 ret <2 x double> %v 612} 613 614define <2 x double> @vfsub_vv_v2f64_unmasked(<2 x double> %va, <2 x double> %b, i32 zeroext %evl) { 615; CHECK-LABEL: vfsub_vv_v2f64_unmasked: 616; CHECK: # %bb.0: 617; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 618; CHECK-NEXT: vfsub.vv v8, v8, v9 619; CHECK-NEXT: ret 620 %v = call <2 x double> @llvm.vp.fsub.v2f64(<2 x double> %va, <2 x double> %b, <2 x i1> splat (i1 true), i32 %evl) 621 ret <2 x double> %v 622} 623 624define <2 x double> @vfsub_vf_v2f64(<2 x double> %va, double %b, <2 x i1> %m, i32 zeroext %evl) { 625; CHECK-LABEL: vfsub_vf_v2f64: 626; CHECK: # %bb.0: 627; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 628; CHECK-NEXT: vfsub.vf v8, v8, fa0, v0.t 629; CHECK-NEXT: ret 630 %elt.head = insertelement <2 x double> poison, double %b, i32 0 631 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer 632 %v = call <2 x double> @llvm.vp.fsub.v2f64(<2 x double> %va, <2 x double> %vb, <2 x i1> %m, i32 %evl) 633 ret <2 x double> %v 634} 635 636define <2 x double> @vfsub_vf_v2f64_unmasked(<2 x double> %va, double %b, i32 zeroext %evl) { 637; CHECK-LABEL: vfsub_vf_v2f64_unmasked: 638; CHECK: # %bb.0: 639; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 640; CHECK-NEXT: vfsub.vf v8, v8, fa0 641; CHECK-NEXT: ret 642 %elt.head = insertelement <2 x double> poison, double %b, i32 0 643 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer 644 %v = call <2 x double> @llvm.vp.fsub.v2f64(<2 x double> %va, <2 x double> %vb, <2 x i1> splat (i1 true), i32 %evl) 645 ret <2 x double> %v 646} 647 648declare <4 x double> @llvm.vp.fsub.v4f64(<4 x double>, <4 x double>, <4 x i1>, i32) 649 650define <4 x double> @vfsub_vv_v4f64(<4 x double> %va, <4 x double> %b, <4 x i1> %m, i32 zeroext %evl) { 651; CHECK-LABEL: vfsub_vv_v4f64: 652; CHECK: # %bb.0: 653; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 654; CHECK-NEXT: vfsub.vv v8, v8, v10, v0.t 655; CHECK-NEXT: ret 656 %v = call <4 x double> @llvm.vp.fsub.v4f64(<4 x double> %va, <4 x double> %b, <4 x i1> %m, i32 %evl) 657 ret <4 x double> %v 658} 659 660define <4 x double> @vfsub_vv_v4f64_unmasked(<4 x double> %va, <4 x double> %b, i32 zeroext %evl) { 661; CHECK-LABEL: vfsub_vv_v4f64_unmasked: 662; CHECK: # %bb.0: 663; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 664; CHECK-NEXT: vfsub.vv v8, v8, v10 665; CHECK-NEXT: ret 666 %v = call <4 x double> @llvm.vp.fsub.v4f64(<4 x double> %va, <4 x double> %b, <4 x i1> splat (i1 true), i32 %evl) 667 ret <4 x double> %v 668} 669 670define <4 x double> @vfsub_vf_v4f64(<4 x double> %va, double %b, <4 x i1> %m, i32 zeroext %evl) { 671; CHECK-LABEL: vfsub_vf_v4f64: 672; CHECK: # %bb.0: 673; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 674; CHECK-NEXT: vfsub.vf v8, v8, fa0, v0.t 675; CHECK-NEXT: ret 676 %elt.head = insertelement <4 x double> poison, double %b, i32 0 677 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer 678 %v = call <4 x double> @llvm.vp.fsub.v4f64(<4 x double> %va, <4 x double> %vb, <4 x i1> %m, i32 %evl) 679 ret <4 x double> %v 680} 681 682define <4 x double> @vfsub_vf_v4f64_unmasked(<4 x double> %va, double %b, i32 zeroext %evl) { 683; CHECK-LABEL: vfsub_vf_v4f64_unmasked: 684; CHECK: # %bb.0: 685; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 686; CHECK-NEXT: vfsub.vf v8, v8, fa0 687; CHECK-NEXT: ret 688 %elt.head = insertelement <4 x double> poison, double %b, i32 0 689 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer 690 %v = call <4 x double> @llvm.vp.fsub.v4f64(<4 x double> %va, <4 x double> %vb, <4 x i1> splat (i1 true), i32 %evl) 691 ret <4 x double> %v 692} 693 694declare <8 x double> @llvm.vp.fsub.v8f64(<8 x double>, <8 x double>, <8 x i1>, i32) 695 696define <8 x double> @vfsub_vv_v8f64(<8 x double> %va, <8 x double> %b, <8 x i1> %m, i32 zeroext %evl) { 697; CHECK-LABEL: vfsub_vv_v8f64: 698; CHECK: # %bb.0: 699; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 700; CHECK-NEXT: vfsub.vv v8, v8, v12, v0.t 701; CHECK-NEXT: ret 702 %v = call <8 x double> @llvm.vp.fsub.v8f64(<8 x double> %va, <8 x double> %b, <8 x i1> %m, i32 %evl) 703 ret <8 x double> %v 704} 705 706define <8 x double> @vfsub_vv_v8f64_unmasked(<8 x double> %va, <8 x double> %b, i32 zeroext %evl) { 707; CHECK-LABEL: vfsub_vv_v8f64_unmasked: 708; CHECK: # %bb.0: 709; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 710; CHECK-NEXT: vfsub.vv v8, v8, v12 711; CHECK-NEXT: ret 712 %v = call <8 x double> @llvm.vp.fsub.v8f64(<8 x double> %va, <8 x double> %b, <8 x i1> splat (i1 true), i32 %evl) 713 ret <8 x double> %v 714} 715 716define <8 x double> @vfsub_vf_v8f64(<8 x double> %va, double %b, <8 x i1> %m, i32 zeroext %evl) { 717; CHECK-LABEL: vfsub_vf_v8f64: 718; CHECK: # %bb.0: 719; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 720; CHECK-NEXT: vfsub.vf v8, v8, fa0, v0.t 721; CHECK-NEXT: ret 722 %elt.head = insertelement <8 x double> poison, double %b, i32 0 723 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer 724 %v = call <8 x double> @llvm.vp.fsub.v8f64(<8 x double> %va, <8 x double> %vb, <8 x i1> %m, i32 %evl) 725 ret <8 x double> %v 726} 727 728define <8 x double> @vfsub_vf_v8f64_unmasked(<8 x double> %va, double %b, i32 zeroext %evl) { 729; CHECK-LABEL: vfsub_vf_v8f64_unmasked: 730; CHECK: # %bb.0: 731; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 732; CHECK-NEXT: vfsub.vf v8, v8, fa0 733; CHECK-NEXT: ret 734 %elt.head = insertelement <8 x double> poison, double %b, i32 0 735 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer 736 %v = call <8 x double> @llvm.vp.fsub.v8f64(<8 x double> %va, <8 x double> %vb, <8 x i1> splat (i1 true), i32 %evl) 737 ret <8 x double> %v 738} 739 740declare <16 x double> @llvm.vp.fsub.v16f64(<16 x double>, <16 x double>, <16 x i1>, i32) 741 742define <16 x double> @vfsub_vv_v16f64(<16 x double> %va, <16 x double> %b, <16 x i1> %m, i32 zeroext %evl) { 743; CHECK-LABEL: vfsub_vv_v16f64: 744; CHECK: # %bb.0: 745; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 746; CHECK-NEXT: vfsub.vv v8, v8, v16, v0.t 747; CHECK-NEXT: ret 748 %v = call <16 x double> @llvm.vp.fsub.v16f64(<16 x double> %va, <16 x double> %b, <16 x i1> %m, i32 %evl) 749 ret <16 x double> %v 750} 751 752define <16 x double> @vfsub_vv_v16f64_unmasked(<16 x double> %va, <16 x double> %b, i32 zeroext %evl) { 753; CHECK-LABEL: vfsub_vv_v16f64_unmasked: 754; CHECK: # %bb.0: 755; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 756; CHECK-NEXT: vfsub.vv v8, v8, v16 757; CHECK-NEXT: ret 758 %v = call <16 x double> @llvm.vp.fsub.v16f64(<16 x double> %va, <16 x double> %b, <16 x i1> splat (i1 true), i32 %evl) 759 ret <16 x double> %v 760} 761 762define <16 x double> @vfsub_vf_v16f64(<16 x double> %va, double %b, <16 x i1> %m, i32 zeroext %evl) { 763; CHECK-LABEL: vfsub_vf_v16f64: 764; CHECK: # %bb.0: 765; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 766; CHECK-NEXT: vfsub.vf v8, v8, fa0, v0.t 767; CHECK-NEXT: ret 768 %elt.head = insertelement <16 x double> poison, double %b, i32 0 769 %vb = shufflevector <16 x double> %elt.head, <16 x double> poison, <16 x i32> zeroinitializer 770 %v = call <16 x double> @llvm.vp.fsub.v16f64(<16 x double> %va, <16 x double> %vb, <16 x i1> %m, i32 %evl) 771 ret <16 x double> %v 772} 773 774define <16 x double> @vfsub_vf_v16f64_unmasked(<16 x double> %va, double %b, i32 zeroext %evl) { 775; CHECK-LABEL: vfsub_vf_v16f64_unmasked: 776; CHECK: # %bb.0: 777; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 778; CHECK-NEXT: vfsub.vf v8, v8, fa0 779; CHECK-NEXT: ret 780 %elt.head = insertelement <16 x double> poison, double %b, i32 0 781 %vb = shufflevector <16 x double> %elt.head, <16 x double> poison, <16 x i32> zeroinitializer 782 %v = call <16 x double> @llvm.vp.fsub.v16f64(<16 x double> %va, <16 x double> %vb, <16 x i1> splat (i1 true), i32 %evl) 783 ret <16 x double> %v 784} 785