1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v,+zvbb -riscv-enable-vl-optimizer=false -verify-machineinstrs | FileCheck %s --check-prefixes=NOVLOPT 3; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v,+zvbb -riscv-enable-vl-optimizer=false -verify-machineinstrs | FileCheck %s --check-prefixes=NOVLOPT 4; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v,+zvbb -riscv-enable-vl-optimizer -verify-machineinstrs | FileCheck %s --check-prefixes=VLOPT 5; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v,+zvbb -riscv-enable-vl-optimizer -verify-machineinstrs | FileCheck %s --check-prefixes=VLOPT 6 7; The purpose of this file is to check the behavior of specific instructions as it relates to the VL optimizer 8 9define <vscale x 4 x i32> @vadd_vi(<vscale x 4 x i32> %a, iXLen %vl) { 10; NOVLOPT-LABEL: vadd_vi: 11; NOVLOPT: # %bb.0: 12; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 13; NOVLOPT-NEXT: vadd.vi v10, v8, 5 14; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 15; NOVLOPT-NEXT: vadd.vv v8, v10, v8 16; NOVLOPT-NEXT: ret 17; 18; VLOPT-LABEL: vadd_vi: 19; VLOPT: # %bb.0: 20; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 21; VLOPT-NEXT: vadd.vi v10, v8, 5 22; VLOPT-NEXT: vadd.vv v8, v10, v8 23; VLOPT-NEXT: ret 24 %1 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1) 25 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 26 ret <vscale x 4 x i32> %2 27} 28 29define <vscale x 4 x i32> @vadd_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 30; NOVLOPT-LABEL: vadd_vv: 31; NOVLOPT: # %bb.0: 32; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 33; NOVLOPT-NEXT: vadd.vv v8, v8, v10 34; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 35; NOVLOPT-NEXT: vadd.vv v8, v8, v10 36; NOVLOPT-NEXT: ret 37; 38; VLOPT-LABEL: vadd_vv: 39; VLOPT: # %bb.0: 40; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 41; VLOPT-NEXT: vadd.vv v8, v8, v10 42; VLOPT-NEXT: vadd.vv v8, v8, v10 43; VLOPT-NEXT: ret 44 %1 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 45 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 46 ret <vscale x 4 x i32> %2 47} 48 49define <vscale x 4 x i32> @vadd_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 50; NOVLOPT-LABEL: vadd_vx: 51; NOVLOPT: # %bb.0: 52; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 53; NOVLOPT-NEXT: vadd.vx v10, v8, a0 54; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 55; NOVLOPT-NEXT: vadd.vv v8, v10, v8 56; NOVLOPT-NEXT: ret 57; 58; VLOPT-LABEL: vadd_vx: 59; VLOPT: # %bb.0: 60; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 61; VLOPT-NEXT: vadd.vx v10, v8, a0 62; VLOPT-NEXT: vadd.vv v8, v10, v8 63; VLOPT-NEXT: ret 64 %1 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 65 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 66 ret <vscale x 4 x i32> %2 67} 68 69define <vscale x 4 x i32> @vsub_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 70; NOVLOPT-LABEL: vsub_vv: 71; NOVLOPT: # %bb.0: 72; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 73; NOVLOPT-NEXT: vsub.vv v8, v8, v10 74; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 75; NOVLOPT-NEXT: vadd.vv v8, v8, v10 76; NOVLOPT-NEXT: ret 77; 78; VLOPT-LABEL: vsub_vv: 79; VLOPT: # %bb.0: 80; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 81; VLOPT-NEXT: vsub.vv v8, v8, v10 82; VLOPT-NEXT: vadd.vv v8, v8, v10 83; VLOPT-NEXT: ret 84 %1 = call <vscale x 4 x i32> @llvm.riscv.vsub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 85 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 86 ret <vscale x 4 x i32> %2 87} 88 89define <vscale x 4 x i32> @vsub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 90; NOVLOPT-LABEL: vsub_vx: 91; NOVLOPT: # %bb.0: 92; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 93; NOVLOPT-NEXT: vsub.vx v10, v8, a0 94; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 95; NOVLOPT-NEXT: vadd.vv v8, v10, v8 96; NOVLOPT-NEXT: ret 97; 98; VLOPT-LABEL: vsub_vx: 99; VLOPT: # %bb.0: 100; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 101; VLOPT-NEXT: vsub.vx v10, v8, a0 102; VLOPT-NEXT: vadd.vv v8, v10, v8 103; VLOPT-NEXT: ret 104 %1 = call <vscale x 4 x i32> @llvm.riscv.vsub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 105 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 106 ret <vscale x 4 x i32> %2 107} 108 109define <vscale x 4 x i32> @vrsub_vi(<vscale x 4 x i32> %a, iXLen %vl) { 110; NOVLOPT-LABEL: vrsub_vi: 111; NOVLOPT: # %bb.0: 112; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 113; NOVLOPT-NEXT: vrsub.vi v10, v8, 5 114; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 115; NOVLOPT-NEXT: vadd.vv v8, v10, v8 116; NOVLOPT-NEXT: ret 117; 118; VLOPT-LABEL: vrsub_vi: 119; VLOPT: # %bb.0: 120; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 121; VLOPT-NEXT: vrsub.vi v10, v8, 5 122; VLOPT-NEXT: vadd.vv v8, v10, v8 123; VLOPT-NEXT: ret 124 %1 = call <vscale x 4 x i32> @llvm.riscv.vrsub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1) 125 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 126 ret <vscale x 4 x i32> %2 127} 128 129define <vscale x 4 x i32> @vrsub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 130; NOVLOPT-LABEL: vrsub_vx: 131; NOVLOPT: # %bb.0: 132; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 133; NOVLOPT-NEXT: vrsub.vx v10, v8, a0 134; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 135; NOVLOPT-NEXT: vadd.vv v8, v10, v8 136; NOVLOPT-NEXT: ret 137; 138; VLOPT-LABEL: vrsub_vx: 139; VLOPT: # %bb.0: 140; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 141; VLOPT-NEXT: vrsub.vx v10, v8, a0 142; VLOPT-NEXT: vadd.vv v8, v10, v8 143; VLOPT-NEXT: ret 144 %1 = call <vscale x 4 x i32> @llvm.riscv.vrsub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 145 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 146 ret <vscale x 4 x i32> %2 147} 148 149define <vscale x 4 x i32> @vand_vi(<vscale x 4 x i32> %a, iXLen %vl) { 150; NOVLOPT-LABEL: vand_vi: 151; NOVLOPT: # %bb.0: 152; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 153; NOVLOPT-NEXT: vand.vi v10, v8, 5 154; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 155; NOVLOPT-NEXT: vadd.vv v8, v10, v8 156; NOVLOPT-NEXT: ret 157; 158; VLOPT-LABEL: vand_vi: 159; VLOPT: # %bb.0: 160; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 161; VLOPT-NEXT: vand.vi v10, v8, 5 162; VLOPT-NEXT: vadd.vv v8, v10, v8 163; VLOPT-NEXT: ret 164 %1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1) 165 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 166 ret <vscale x 4 x i32> %2 167} 168 169define <vscale x 4 x i32> @vand_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 170; NOVLOPT-LABEL: vand_vv: 171; NOVLOPT: # %bb.0: 172; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 173; NOVLOPT-NEXT: vand.vv v8, v8, v10 174; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 175; NOVLOPT-NEXT: vadd.vv v8, v8, v10 176; NOVLOPT-NEXT: ret 177; 178; VLOPT-LABEL: vand_vv: 179; VLOPT: # %bb.0: 180; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 181; VLOPT-NEXT: vand.vv v8, v8, v10 182; VLOPT-NEXT: vadd.vv v8, v8, v10 183; VLOPT-NEXT: ret 184 %1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 185 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 186 ret <vscale x 4 x i32> %2 187} 188 189define <vscale x 4 x i32> @vand_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 190; NOVLOPT-LABEL: vand_vx: 191; NOVLOPT: # %bb.0: 192; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 193; NOVLOPT-NEXT: vand.vx v10, v8, a0 194; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 195; NOVLOPT-NEXT: vadd.vv v8, v10, v8 196; NOVLOPT-NEXT: ret 197; 198; VLOPT-LABEL: vand_vx: 199; VLOPT: # %bb.0: 200; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 201; VLOPT-NEXT: vand.vx v10, v8, a0 202; VLOPT-NEXT: vadd.vv v8, v10, v8 203; VLOPT-NEXT: ret 204 %1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 205 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 206 ret <vscale x 4 x i32> %2 207} 208 209define <vscale x 4 x i32> @vor_vi(<vscale x 4 x i32> %a, iXLen %vl) { 210; NOVLOPT-LABEL: vor_vi: 211; NOVLOPT: # %bb.0: 212; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 213; NOVLOPT-NEXT: vor.vi v10, v8, 5 214; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 215; NOVLOPT-NEXT: vadd.vv v8, v10, v8 216; NOVLOPT-NEXT: ret 217; 218; VLOPT-LABEL: vor_vi: 219; VLOPT: # %bb.0: 220; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 221; VLOPT-NEXT: vor.vi v10, v8, 5 222; VLOPT-NEXT: vadd.vv v8, v10, v8 223; VLOPT-NEXT: ret 224 %1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1) 225 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 226 ret <vscale x 4 x i32> %2 227} 228 229define <vscale x 4 x i32> @vor_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 230; NOVLOPT-LABEL: vor_vv: 231; NOVLOPT: # %bb.0: 232; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 233; NOVLOPT-NEXT: vor.vv v8, v8, v10 234; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 235; NOVLOPT-NEXT: vadd.vv v8, v8, v10 236; NOVLOPT-NEXT: ret 237; 238; VLOPT-LABEL: vor_vv: 239; VLOPT: # %bb.0: 240; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 241; VLOPT-NEXT: vor.vv v8, v8, v10 242; VLOPT-NEXT: vadd.vv v8, v8, v10 243; VLOPT-NEXT: ret 244 %1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 245 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 246 ret <vscale x 4 x i32> %2 247} 248 249define <vscale x 4 x i32> @vor_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 250; NOVLOPT-LABEL: vor_vx: 251; NOVLOPT: # %bb.0: 252; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 253; NOVLOPT-NEXT: vor.vx v10, v8, a0 254; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 255; NOVLOPT-NEXT: vadd.vv v8, v10, v8 256; NOVLOPT-NEXT: ret 257; 258; VLOPT-LABEL: vor_vx: 259; VLOPT: # %bb.0: 260; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 261; VLOPT-NEXT: vor.vx v10, v8, a0 262; VLOPT-NEXT: vadd.vv v8, v10, v8 263; VLOPT-NEXT: ret 264 %1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 265 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 266 ret <vscale x 4 x i32> %2 267} 268 269define <vscale x 4 x i32> @vxor_vi(<vscale x 4 x i32> %a, iXLen %vl) { 270; NOVLOPT-LABEL: vxor_vi: 271; NOVLOPT: # %bb.0: 272; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 273; NOVLOPT-NEXT: vxor.vi v10, v8, 5 274; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 275; NOVLOPT-NEXT: vadd.vv v8, v10, v8 276; NOVLOPT-NEXT: ret 277; 278; VLOPT-LABEL: vxor_vi: 279; VLOPT: # %bb.0: 280; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 281; VLOPT-NEXT: vxor.vi v10, v8, 5 282; VLOPT-NEXT: vadd.vv v8, v10, v8 283; VLOPT-NEXT: ret 284 %1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1) 285 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 286 ret <vscale x 4 x i32> %2 287} 288 289define <vscale x 4 x i32> @vxor_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 290; NOVLOPT-LABEL: vxor_vv: 291; NOVLOPT: # %bb.0: 292; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 293; NOVLOPT-NEXT: vxor.vv v8, v8, v10 294; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 295; NOVLOPT-NEXT: vadd.vv v8, v8, v10 296; NOVLOPT-NEXT: ret 297; 298; VLOPT-LABEL: vxor_vv: 299; VLOPT: # %bb.0: 300; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 301; VLOPT-NEXT: vxor.vv v8, v8, v10 302; VLOPT-NEXT: vadd.vv v8, v8, v10 303; VLOPT-NEXT: ret 304 %1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 305 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 306 ret <vscale x 4 x i32> %2 307} 308 309define <vscale x 4 x i32> @vxor_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 310; NOVLOPT-LABEL: vxor_vx: 311; NOVLOPT: # %bb.0: 312; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 313; NOVLOPT-NEXT: vxor.vx v10, v8, a0 314; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 315; NOVLOPT-NEXT: vadd.vv v8, v10, v8 316; NOVLOPT-NEXT: ret 317; 318; VLOPT-LABEL: vxor_vx: 319; VLOPT: # %bb.0: 320; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 321; VLOPT-NEXT: vxor.vx v10, v8, a0 322; VLOPT-NEXT: vadd.vv v8, v10, v8 323; VLOPT-NEXT: ret 324 %1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 325 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 326 ret <vscale x 4 x i32> %2 327} 328 329define <vscale x 4 x i32> @vsll_vi(<vscale x 4 x i32> %a, iXLen %vl) { 330; NOVLOPT-LABEL: vsll_vi: 331; NOVLOPT: # %bb.0: 332; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 333; NOVLOPT-NEXT: vsll.vi v10, v8, 5 334; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 335; NOVLOPT-NEXT: vadd.vv v8, v10, v8 336; NOVLOPT-NEXT: ret 337; 338; VLOPT-LABEL: vsll_vi: 339; VLOPT: # %bb.0: 340; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 341; VLOPT-NEXT: vsll.vi v10, v8, 5 342; VLOPT-NEXT: vadd.vv v8, v10, v8 343; VLOPT-NEXT: ret 344 %1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1) 345 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 346 ret <vscale x 4 x i32> %2 347} 348 349define <vscale x 4 x i32> @vsll_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 350; NOVLOPT-LABEL: vsll_vv: 351; NOVLOPT: # %bb.0: 352; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 353; NOVLOPT-NEXT: vsll.vv v8, v8, v10 354; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 355; NOVLOPT-NEXT: vadd.vv v8, v8, v10 356; NOVLOPT-NEXT: ret 357; 358; VLOPT-LABEL: vsll_vv: 359; VLOPT: # %bb.0: 360; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 361; VLOPT-NEXT: vsll.vv v8, v8, v10 362; VLOPT-NEXT: vadd.vv v8, v8, v10 363; VLOPT-NEXT: ret 364 %1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 365 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 366 ret <vscale x 4 x i32> %2 367} 368 369define <vscale x 4 x i32> @vsll_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) { 370; NOVLOPT-LABEL: vsll_vx: 371; NOVLOPT: # %bb.0: 372; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 373; NOVLOPT-NEXT: vsll.vx v10, v8, a0 374; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 375; NOVLOPT-NEXT: vadd.vv v8, v10, v8 376; NOVLOPT-NEXT: ret 377; 378; VLOPT-LABEL: vsll_vx: 379; VLOPT: # %bb.0: 380; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 381; VLOPT-NEXT: vsll.vx v10, v8, a0 382; VLOPT-NEXT: vadd.vv v8, v10, v8 383; VLOPT-NEXT: ret 384 %1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1) 385 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 386 ret <vscale x 4 x i32> %2 387} 388 389define <vscale x 4 x i64> @vwaddu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 390; NOVLOPT-LABEL: vwaddu_vv: 391; NOVLOPT: # %bb.0: 392; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 393; NOVLOPT-NEXT: vwaddu.vv v12, v8, v10 394; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 395; NOVLOPT-NEXT: vadd.vv v8, v12, v12 396; NOVLOPT-NEXT: ret 397; 398; VLOPT-LABEL: vwaddu_vv: 399; VLOPT: # %bb.0: 400; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 401; VLOPT-NEXT: vwaddu.vv v12, v8, v10 402; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 403; VLOPT-NEXT: vadd.vv v8, v12, v12 404; VLOPT-NEXT: ret 405 %1 = call <vscale x 4 x i64> @llvm.riscv.vwaddu.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 406 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 407 ret <vscale x 4 x i64> %2 408} 409 410define <vscale x 4 x i32> @vsrl_vi(<vscale x 4 x i32> %a, iXLen %vl) { 411; NOVLOPT-LABEL: vsrl_vi: 412; NOVLOPT: # %bb.0: 413; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 414; NOVLOPT-NEXT: vsrl.vi v10, v8, 5 415; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 416; NOVLOPT-NEXT: vadd.vv v8, v10, v8 417; NOVLOPT-NEXT: ret 418; 419; VLOPT-LABEL: vsrl_vi: 420; VLOPT: # %bb.0: 421; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 422; VLOPT-NEXT: vsrl.vi v10, v8, 5 423; VLOPT-NEXT: vadd.vv v8, v10, v8 424; VLOPT-NEXT: ret 425 %1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1) 426 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 427 ret <vscale x 4 x i32> %2 428} 429 430define <vscale x 4 x i32> @vsrl_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 431; NOVLOPT-LABEL: vsrl_vv: 432; NOVLOPT: # %bb.0: 433; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 434; NOVLOPT-NEXT: vsrl.vv v8, v8, v10 435; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 436; NOVLOPT-NEXT: vadd.vv v8, v8, v10 437; NOVLOPT-NEXT: ret 438; 439; VLOPT-LABEL: vsrl_vv: 440; VLOPT: # %bb.0: 441; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 442; VLOPT-NEXT: vsrl.vv v8, v8, v10 443; VLOPT-NEXT: vadd.vv v8, v8, v10 444; VLOPT-NEXT: ret 445 %1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 446 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 447 ret <vscale x 4 x i32> %2 448} 449 450define <vscale x 4 x i32> @vsrl_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) { 451; NOVLOPT-LABEL: vsrl_vx: 452; NOVLOPT: # %bb.0: 453; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 454; NOVLOPT-NEXT: vsrl.vx v10, v8, a0 455; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 456; NOVLOPT-NEXT: vadd.vv v8, v10, v8 457; NOVLOPT-NEXT: ret 458; 459; VLOPT-LABEL: vsrl_vx: 460; VLOPT: # %bb.0: 461; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 462; VLOPT-NEXT: vsrl.vx v10, v8, a0 463; VLOPT-NEXT: vadd.vv v8, v10, v8 464; VLOPT-NEXT: ret 465 %1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1) 466 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 467 ret <vscale x 4 x i32> %2 468} 469 470define <vscale x 4 x i32> @vsra_vi(<vscale x 4 x i32> %a, iXLen %vl) { 471; NOVLOPT-LABEL: vsra_vi: 472; NOVLOPT: # %bb.0: 473; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 474; NOVLOPT-NEXT: vsra.vi v10, v8, 5 475; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 476; NOVLOPT-NEXT: vadd.vv v8, v10, v8 477; NOVLOPT-NEXT: ret 478; 479; VLOPT-LABEL: vsra_vi: 480; VLOPT: # %bb.0: 481; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 482; VLOPT-NEXT: vsra.vi v10, v8, 5 483; VLOPT-NEXT: vadd.vv v8, v10, v8 484; VLOPT-NEXT: ret 485 %1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1) 486 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 487 ret <vscale x 4 x i32> %2 488} 489 490define <vscale x 4 x i32> @vsra_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 491; NOVLOPT-LABEL: vsra_vv: 492; NOVLOPT: # %bb.0: 493; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 494; NOVLOPT-NEXT: vsra.vv v8, v8, v10 495; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 496; NOVLOPT-NEXT: vadd.vv v8, v8, v10 497; NOVLOPT-NEXT: ret 498; 499; VLOPT-LABEL: vsra_vv: 500; VLOPT: # %bb.0: 501; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 502; VLOPT-NEXT: vsra.vv v8, v8, v10 503; VLOPT-NEXT: vadd.vv v8, v8, v10 504; VLOPT-NEXT: ret 505 %1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 506 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 507 ret <vscale x 4 x i32> %2 508} 509 510define <vscale x 4 x i32> @vsra_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) { 511; NOVLOPT-LABEL: vsra_vx: 512; NOVLOPT: # %bb.0: 513; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 514; NOVLOPT-NEXT: vsra.vx v10, v8, a0 515; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 516; NOVLOPT-NEXT: vadd.vv v8, v10, v8 517; NOVLOPT-NEXT: ret 518; 519; VLOPT-LABEL: vsra_vx: 520; VLOPT: # %bb.0: 521; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 522; VLOPT-NEXT: vsra.vx v10, v8, a0 523; VLOPT-NEXT: vadd.vv v8, v10, v8 524; VLOPT-NEXT: ret 525 %1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1) 526 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 527 ret <vscale x 4 x i32> %2 528} 529 530define <vscale x 4 x i64> @vwaddu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 531; NOVLOPT-LABEL: vwaddu_vx: 532; NOVLOPT: # %bb.0: 533; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 534; NOVLOPT-NEXT: vwaddu.vx v12, v8, a0 535; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma 536; NOVLOPT-NEXT: vadd.vv v8, v12, v12 537; NOVLOPT-NEXT: ret 538; 539; VLOPT-LABEL: vwaddu_vx: 540; VLOPT: # %bb.0: 541; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 542; VLOPT-NEXT: vwaddu.vx v12, v8, a0 543; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 544; VLOPT-NEXT: vadd.vv v8, v12, v12 545; VLOPT-NEXT: ret 546 %1 = call <vscale x 4 x i64> @llvm.riscv.vwaddu.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 547 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 548 ret <vscale x 4 x i64> %2 549} 550 551define <vscale x 4 x i64> @vwsubu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 552; NOVLOPT-LABEL: vwsubu_vv: 553; NOVLOPT: # %bb.0: 554; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 555; NOVLOPT-NEXT: vwsubu.vv v12, v8, v10 556; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 557; NOVLOPT-NEXT: vadd.vv v8, v12, v12 558; NOVLOPT-NEXT: ret 559; 560; VLOPT-LABEL: vwsubu_vv: 561; VLOPT: # %bb.0: 562; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 563; VLOPT-NEXT: vwsubu.vv v12, v8, v10 564; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 565; VLOPT-NEXT: vadd.vv v8, v12, v12 566; VLOPT-NEXT: ret 567 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsubu.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 568 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 569 ret <vscale x 4 x i64> %2 570} 571 572define <vscale x 4 x i64> @vwsubu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 573; NOVLOPT-LABEL: vwsubu_vx: 574; NOVLOPT: # %bb.0: 575; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 576; NOVLOPT-NEXT: vwsubu.vx v12, v8, a0 577; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma 578; NOVLOPT-NEXT: vadd.vv v8, v12, v12 579; NOVLOPT-NEXT: ret 580; 581; VLOPT-LABEL: vwsubu_vx: 582; VLOPT: # %bb.0: 583; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 584; VLOPT-NEXT: vwsubu.vx v12, v8, a0 585; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 586; VLOPT-NEXT: vadd.vv v8, v12, v12 587; VLOPT-NEXT: ret 588 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsubu.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 589 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 590 ret <vscale x 4 x i64> %2 591} 592 593define <vscale x 4 x i64> @vwadd_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 594; NOVLOPT-LABEL: vwadd_vv: 595; NOVLOPT: # %bb.0: 596; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 597; NOVLOPT-NEXT: vwadd.vv v12, v8, v10 598; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 599; NOVLOPT-NEXT: vadd.vv v8, v12, v12 600; NOVLOPT-NEXT: ret 601; 602; VLOPT-LABEL: vwadd_vv: 603; VLOPT: # %bb.0: 604; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 605; VLOPT-NEXT: vwadd.vv v12, v8, v10 606; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 607; VLOPT-NEXT: vadd.vv v8, v12, v12 608; VLOPT-NEXT: ret 609 %1 = call <vscale x 4 x i64> @llvm.riscv.vwadd.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 610 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 611 ret <vscale x 4 x i64> %2 612} 613 614define <vscale x 4 x i64> @vwadd_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 615; NOVLOPT-LABEL: vwadd_vx: 616; NOVLOPT: # %bb.0: 617; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 618; NOVLOPT-NEXT: vwadd.vx v12, v8, a0 619; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma 620; NOVLOPT-NEXT: vadd.vv v8, v12, v12 621; NOVLOPT-NEXT: ret 622; 623; VLOPT-LABEL: vwadd_vx: 624; VLOPT: # %bb.0: 625; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 626; VLOPT-NEXT: vwadd.vx v12, v8, a0 627; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 628; VLOPT-NEXT: vadd.vv v8, v12, v12 629; VLOPT-NEXT: ret 630 %1 = call <vscale x 4 x i64> @llvm.riscv.vwadd.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 631 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 632 ret <vscale x 4 x i64> %2 633} 634 635define <vscale x 4 x i64> @vwsub_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 636; NOVLOPT-LABEL: vwsub_vv: 637; NOVLOPT: # %bb.0: 638; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 639; NOVLOPT-NEXT: vwsub.vv v12, v8, v10 640; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 641; NOVLOPT-NEXT: vadd.vv v8, v12, v12 642; NOVLOPT-NEXT: ret 643; 644; VLOPT-LABEL: vwsub_vv: 645; VLOPT: # %bb.0: 646; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 647; VLOPT-NEXT: vwsub.vv v12, v8, v10 648; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 649; VLOPT-NEXT: vadd.vv v8, v12, v12 650; VLOPT-NEXT: ret 651 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsub.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 652 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 653 ret <vscale x 4 x i64> %2 654} 655 656define <vscale x 4 x i64> @vwsub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 657; NOVLOPT-LABEL: vwsub_vx: 658; NOVLOPT: # %bb.0: 659; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 660; NOVLOPT-NEXT: vwsub.vx v12, v8, a0 661; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma 662; NOVLOPT-NEXT: vadd.vv v8, v12, v12 663; NOVLOPT-NEXT: ret 664; 665; VLOPT-LABEL: vwsub_vx: 666; VLOPT: # %bb.0: 667; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 668; VLOPT-NEXT: vwsub.vx v12, v8, a0 669; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 670; VLOPT-NEXT: vadd.vv v8, v12, v12 671; VLOPT-NEXT: ret 672 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsub.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 673 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 674 ret <vscale x 4 x i64> %2 675} 676 677define <vscale x 4 x i64> @vwaddu_wv(<vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen %vl) { 678; NOVLOPT-LABEL: vwaddu_wv: 679; NOVLOPT: # %bb.0: 680; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 681; NOVLOPT-NEXT: vwaddu.wv v8, v8, v12 682; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 683; NOVLOPT-NEXT: vadd.vv v8, v8, v8 684; NOVLOPT-NEXT: ret 685; 686; VLOPT-LABEL: vwaddu_wv: 687; VLOPT: # %bb.0: 688; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 689; VLOPT-NEXT: vwaddu.wv v8, v8, v12 690; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 691; VLOPT-NEXT: vadd.vv v8, v8, v8 692; VLOPT-NEXT: ret 693 %1 = call <vscale x 4 x i64> @llvm.riscv.vwaddu.w.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen -1) 694 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 695 ret <vscale x 4 x i64> %2 696} 697 698define <vscale x 4 x i64> @vwaddu_wx(<vscale x 4 x i64> %a, i32 %b, iXLen %vl) { 699; NOVLOPT-LABEL: vwaddu_wx: 700; NOVLOPT: # %bb.0: 701; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 702; NOVLOPT-NEXT: vwaddu.wx v8, v8, a0 703; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma 704; NOVLOPT-NEXT: vadd.vv v8, v8, v8 705; NOVLOPT-NEXT: ret 706; 707; VLOPT-LABEL: vwaddu_wx: 708; VLOPT: # %bb.0: 709; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 710; VLOPT-NEXT: vwaddu.wx v8, v8, a0 711; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 712; VLOPT-NEXT: vadd.vv v8, v8, v8 713; VLOPT-NEXT: ret 714 %1 = call <vscale x 4 x i64> @llvm.riscv.vwaddu.w.xv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, i32 %b, iXLen -1) 715 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 716 ret <vscale x 4 x i64> %2 717} 718 719define <vscale x 4 x i64> @vwsubu_wv(<vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen %vl) { 720; NOVLOPT-LABEL: vwsubu_wv: 721; NOVLOPT: # %bb.0: 722; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 723; NOVLOPT-NEXT: vwsubu.wv v8, v8, v12 724; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 725; NOVLOPT-NEXT: vadd.vv v8, v8, v8 726; NOVLOPT-NEXT: ret 727; 728; VLOPT-LABEL: vwsubu_wv: 729; VLOPT: # %bb.0: 730; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 731; VLOPT-NEXT: vwsubu.wv v8, v8, v12 732; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 733; VLOPT-NEXT: vadd.vv v8, v8, v8 734; VLOPT-NEXT: ret 735 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsubu.w.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen -1) 736 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 737 ret <vscale x 4 x i64> %2 738} 739 740define <vscale x 4 x i64> @vwsubu_wx(<vscale x 4 x i64> %a, i32 %b, iXLen %vl) { 741; NOVLOPT-LABEL: vwsubu_wx: 742; NOVLOPT: # %bb.0: 743; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 744; NOVLOPT-NEXT: vwsubu.wx v8, v8, a0 745; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma 746; NOVLOPT-NEXT: vadd.vv v8, v8, v8 747; NOVLOPT-NEXT: ret 748; 749; VLOPT-LABEL: vwsubu_wx: 750; VLOPT: # %bb.0: 751; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 752; VLOPT-NEXT: vwsubu.wx v8, v8, a0 753; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 754; VLOPT-NEXT: vadd.vv v8, v8, v8 755; VLOPT-NEXT: ret 756 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsubu.w.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, i32 %b, iXLen -1) 757 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 758 ret <vscale x 4 x i64> %2 759} 760 761define <vscale x 4 x i64> @vwadd_wv(<vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen %vl) { 762; NOVLOPT-LABEL: vwadd_wv: 763; NOVLOPT: # %bb.0: 764; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 765; NOVLOPT-NEXT: vwadd.wv v8, v8, v12 766; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 767; NOVLOPT-NEXT: vadd.vv v8, v8, v8 768; NOVLOPT-NEXT: ret 769; 770; VLOPT-LABEL: vwadd_wv: 771; VLOPT: # %bb.0: 772; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 773; VLOPT-NEXT: vwadd.wv v8, v8, v12 774; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 775; VLOPT-NEXT: vadd.vv v8, v8, v8 776; VLOPT-NEXT: ret 777 %1 = call <vscale x 4 x i64> @llvm.riscv.vwadd.w.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen -1) 778 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 779 ret <vscale x 4 x i64> %2 780} 781 782define <vscale x 4 x i64> @vwadd_wx(<vscale x 4 x i64> %a, i32 %b, iXLen %vl) { 783; NOVLOPT-LABEL: vwadd_wx: 784; NOVLOPT: # %bb.0: 785; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 786; NOVLOPT-NEXT: vwadd.wx v8, v8, a0 787; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma 788; NOVLOPT-NEXT: vadd.vv v8, v8, v8 789; NOVLOPT-NEXT: ret 790; 791; VLOPT-LABEL: vwadd_wx: 792; VLOPT: # %bb.0: 793; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 794; VLOPT-NEXT: vwadd.wx v8, v8, a0 795; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 796; VLOPT-NEXT: vadd.vv v8, v8, v8 797; VLOPT-NEXT: ret 798 %1 = call <vscale x 4 x i64> @llvm.riscv.vwadd.w.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, i32 %b, iXLen -1) 799 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 800 ret <vscale x 4 x i64> %2 801} 802 803define <vscale x 4 x i64> @vwsub_wv(<vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen %vl) { 804; NOVLOPT-LABEL: vwsub_wv: 805; NOVLOPT: # %bb.0: 806; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 807; NOVLOPT-NEXT: vwsub.wv v8, v8, v12 808; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 809; NOVLOPT-NEXT: vadd.vv v8, v8, v8 810; NOVLOPT-NEXT: ret 811; 812; VLOPT-LABEL: vwsub_wv: 813; VLOPT: # %bb.0: 814; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 815; VLOPT-NEXT: vwsub.wv v8, v8, v12 816; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 817; VLOPT-NEXT: vadd.vv v8, v8, v8 818; VLOPT-NEXT: ret 819 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsub.w.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen -1) 820 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 821 ret <vscale x 4 x i64> %2 822} 823 824define <vscale x 4 x i64> @vwsub_wx(<vscale x 4 x i64> %a, i32 %b, iXLen %vl) { 825; NOVLOPT-LABEL: vwsub_wx: 826; NOVLOPT: # %bb.0: 827; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 828; NOVLOPT-NEXT: vwsub.wx v8, v8, a0 829; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma 830; NOVLOPT-NEXT: vadd.vv v8, v8, v8 831; NOVLOPT-NEXT: ret 832; 833; VLOPT-LABEL: vwsub_wx: 834; VLOPT: # %bb.0: 835; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 836; VLOPT-NEXT: vwsub.wx v8, v8, a0 837; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 838; VLOPT-NEXT: vadd.vv v8, v8, v8 839; VLOPT-NEXT: ret 840 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsub.w.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, i32 %b, iXLen -1) 841 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 842 ret <vscale x 4 x i64> %2 843} 844 845define <vscale x 4 x i32> @vsext_vf2(<vscale x 4 x i16> %a, <vscale x 4 x i32> %b, iXLen %vl) { 846; NOVLOPT-LABEL: vsext_vf2: 847; NOVLOPT: # %bb.0: 848; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 849; NOVLOPT-NEXT: vsext.vf2 v12, v8 850; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 851; NOVLOPT-NEXT: vadd.vv v8, v12, v10 852; NOVLOPT-NEXT: ret 853; 854; VLOPT-LABEL: vsext_vf2: 855; VLOPT: # %bb.0: 856; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 857; VLOPT-NEXT: vsext.vf2 v12, v8 858; VLOPT-NEXT: vadd.vv v8, v12, v10 859; VLOPT-NEXT: ret 860 %1 = call <vscale x 4 x i32> @llvm.riscv.vsext.nxv4i32.nxv4i16(<vscale x 4 x i32> poison, <vscale x 4 x i16> %a, iXLen -1) 861 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 862 ret <vscale x 4 x i32> %2 863} 864 865define <vscale x 4 x i32> @vsext_vf4(<vscale x 4 x i8> %a, <vscale x 4 x i32> %b, iXLen %vl) { 866; NOVLOPT-LABEL: vsext_vf4: 867; NOVLOPT: # %bb.0: 868; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 869; NOVLOPT-NEXT: vsext.vf4 v12, v8 870; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 871; NOVLOPT-NEXT: vadd.vv v8, v12, v10 872; NOVLOPT-NEXT: ret 873; 874; VLOPT-LABEL: vsext_vf4: 875; VLOPT: # %bb.0: 876; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 877; VLOPT-NEXT: vsext.vf4 v12, v8 878; VLOPT-NEXT: vadd.vv v8, v12, v10 879; VLOPT-NEXT: ret 880 %1 = call <vscale x 4 x i32> @llvm.riscv.vsext.nxv4i32.nxv4i8(<vscale x 4 x i32> poison, <vscale x 4 x i8> %a, iXLen -1) 881 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 882 ret <vscale x 4 x i32> %2 883} 884 885define <vscale x 4 x i64> @vsext_vf8(<vscale x 4 x i8> %a, <vscale x 4 x i64> %b, iXLen %vl) { 886; NOVLOPT-LABEL: vsext_vf8: 887; NOVLOPT: # %bb.0: 888; NOVLOPT-NEXT: vsetvli a1, zero, e64, m4, ta, ma 889; NOVLOPT-NEXT: vsext.vf8 v16, v8 890; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 891; NOVLOPT-NEXT: vadd.vv v8, v16, v12 892; NOVLOPT-NEXT: ret 893; 894; VLOPT-LABEL: vsext_vf8: 895; VLOPT: # %bb.0: 896; VLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 897; VLOPT-NEXT: vsext.vf8 v16, v8 898; VLOPT-NEXT: vadd.vv v8, v16, v12 899; VLOPT-NEXT: ret 900 %1 = call <vscale x 4 x i64> @llvm.riscv.vsext.nxv4i32.nxv4i8(<vscale x 4 x i64> poison, <vscale x 4 x i8> %a, iXLen -1) 901 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %b, iXLen %vl) 902 ret <vscale x 4 x i64> %2 903} 904 905define <vscale x 4 x i32> @vzext_vf2(<vscale x 4 x i16> %a, <vscale x 4 x i32> %b, iXLen %vl) { 906; NOVLOPT-LABEL: vzext_vf2: 907; NOVLOPT: # %bb.0: 908; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 909; NOVLOPT-NEXT: vzext.vf2 v12, v8 910; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 911; NOVLOPT-NEXT: vadd.vv v8, v12, v10 912; NOVLOPT-NEXT: ret 913; 914; VLOPT-LABEL: vzext_vf2: 915; VLOPT: # %bb.0: 916; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 917; VLOPT-NEXT: vzext.vf2 v12, v8 918; VLOPT-NEXT: vadd.vv v8, v12, v10 919; VLOPT-NEXT: ret 920 %1 = call <vscale x 4 x i32> @llvm.riscv.vzext.nxv4i32.nxv4i16(<vscale x 4 x i32> poison, <vscale x 4 x i16> %a, iXLen -1) 921 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 922 ret <vscale x 4 x i32> %2 923} 924 925define <vscale x 4 x i32> @vzext_vf4(<vscale x 4 x i8> %a, <vscale x 4 x i32> %b, iXLen %vl) { 926; NOVLOPT-LABEL: vzext_vf4: 927; NOVLOPT: # %bb.0: 928; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 929; NOVLOPT-NEXT: vzext.vf4 v12, v8 930; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 931; NOVLOPT-NEXT: vadd.vv v8, v12, v10 932; NOVLOPT-NEXT: ret 933; 934; VLOPT-LABEL: vzext_vf4: 935; VLOPT: # %bb.0: 936; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 937; VLOPT-NEXT: vzext.vf4 v12, v8 938; VLOPT-NEXT: vadd.vv v8, v12, v10 939; VLOPT-NEXT: ret 940 %1 = call <vscale x 4 x i32> @llvm.riscv.vzext.nxv4i32.nxv4i8(<vscale x 4 x i32> poison, <vscale x 4 x i8> %a, iXLen -1) 941 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 942 ret <vscale x 4 x i32> %2 943} 944 945define <vscale x 4 x i64> @vzext_vf8(<vscale x 4 x i8> %a, <vscale x 4 x i64> %b, iXLen %vl) { 946; NOVLOPT-LABEL: vzext_vf8: 947; NOVLOPT: # %bb.0: 948; NOVLOPT-NEXT: vsetvli a1, zero, e64, m4, ta, ma 949; NOVLOPT-NEXT: vzext.vf8 v16, v8 950; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 951; NOVLOPT-NEXT: vadd.vv v8, v16, v12 952; NOVLOPT-NEXT: ret 953; 954; VLOPT-LABEL: vzext_vf8: 955; VLOPT: # %bb.0: 956; VLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 957; VLOPT-NEXT: vzext.vf8 v16, v8 958; VLOPT-NEXT: vadd.vv v8, v16, v12 959; VLOPT-NEXT: ret 960 %1 = call <vscale x 4 x i64> @llvm.riscv.vzext.nxv4i32.nxv4i8(<vscale x 4 x i64> poison, <vscale x 4 x i8> %a, iXLen -1) 961 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %b, iXLen %vl) 962 ret <vscale x 4 x i64> %2 963} 964 965define <vscale x 4 x i1> @vmadc_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) { 966; NOVLOPT-LABEL: vmadc_vi: 967; NOVLOPT: # %bb.0: 968; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 969; NOVLOPT-NEXT: vmadc.vi v10, v8, 5 970; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 971; NOVLOPT-NEXT: vmand.mm v0, v10, v0 972; NOVLOPT-NEXT: ret 973; 974; VLOPT-LABEL: vmadc_vi: 975; VLOPT: # %bb.0: 976; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 977; VLOPT-NEXT: vmadc.vi v10, v8, 5 978; VLOPT-NEXT: vmand.mm v0, v10, v0 979; VLOPT-NEXT: ret 980 %1 = call <vscale x 4 x i1> @llvm.riscv.vmadc.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1) 981 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 982 ret <vscale x 4 x i1> %2 983} 984 985define <vscale x 4 x i1> @vmadc_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) { 986; NOVLOPT-LABEL: vmadc_vx: 987; NOVLOPT: # %bb.0: 988; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 989; NOVLOPT-NEXT: vmadc.vx v10, v8, a0 990; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 991; NOVLOPT-NEXT: vmand.mm v0, v10, v0 992; NOVLOPT-NEXT: ret 993; 994; VLOPT-LABEL: vmadc_vx: 995; VLOPT: # %bb.0: 996; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 997; VLOPT-NEXT: vmadc.vx v10, v8, a0 998; VLOPT-NEXT: vmand.mm v0, v10, v0 999; VLOPT-NEXT: ret 1000 %1 = call <vscale x 4 x i1> @llvm.riscv.vmadc.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1) 1001 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1002 ret <vscale x 4 x i1> %2 1003} 1004 1005define <vscale x 4 x i1> @vmadc_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) { 1006; NOVLOPT-LABEL: vmadc_vv: 1007; NOVLOPT: # %bb.0: 1008; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1009; NOVLOPT-NEXT: vmadc.vv v12, v8, v10 1010; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1011; NOVLOPT-NEXT: vmand.mm v0, v12, v0 1012; NOVLOPT-NEXT: ret 1013; 1014; VLOPT-LABEL: vmadc_vv: 1015; VLOPT: # %bb.0: 1016; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1017; VLOPT-NEXT: vmadc.vv v12, v8, v10 1018; VLOPT-NEXT: vmand.mm v0, v12, v0 1019; VLOPT-NEXT: ret 1020 %1 = call <vscale x 4 x i1> @llvm.riscv.vmadc.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1) 1021 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1022 ret <vscale x 4 x i1> %2 1023} 1024 1025define <vscale x 4 x i1> @vmsbc_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) { 1026; NOVLOPT-LABEL: vmsbc_vx: 1027; NOVLOPT: # %bb.0: 1028; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1029; NOVLOPT-NEXT: vmsbc.vx v10, v8, a0 1030; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 1031; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1032; NOVLOPT-NEXT: ret 1033; 1034; VLOPT-LABEL: vmsbc_vx: 1035; VLOPT: # %bb.0: 1036; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1037; VLOPT-NEXT: vmsbc.vx v10, v8, a0 1038; VLOPT-NEXT: vmand.mm v0, v10, v0 1039; VLOPT-NEXT: ret 1040 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsbc.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1) 1041 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1042 ret <vscale x 4 x i1> %2 1043} 1044 1045define <vscale x 4 x i1> @vmsbc_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) { 1046; NOVLOPT-LABEL: vmsbc_vv: 1047; NOVLOPT: # %bb.0: 1048; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1049; NOVLOPT-NEXT: vmsbc.vv v12, v8, v10 1050; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1051; NOVLOPT-NEXT: vmand.mm v0, v12, v0 1052; NOVLOPT-NEXT: ret 1053; 1054; VLOPT-LABEL: vmsbc_vv: 1055; VLOPT: # %bb.0: 1056; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1057; VLOPT-NEXT: vmsbc.vv v12, v8, v10 1058; VLOPT-NEXT: vmand.mm v0, v12, v0 1059; VLOPT-NEXT: ret 1060 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsbc.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1) 1061 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1062 ret <vscale x 4 x i1> %2 1063} 1064 1065define <vscale x 4 x i16> @vnsrl_wi(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %vl) { 1066; NOVLOPT-LABEL: vnsrl_wi: 1067; NOVLOPT: # %bb.0: 1068; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma 1069; NOVLOPT-NEXT: vnsrl.wi v11, v8, 5 1070; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma 1071; NOVLOPT-NEXT: vadd.vv v8, v11, v10 1072; NOVLOPT-NEXT: ret 1073; 1074; VLOPT-LABEL: vnsrl_wi: 1075; VLOPT: # %bb.0: 1076; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma 1077; VLOPT-NEXT: vnsrl.wi v11, v8, 5 1078; VLOPT-NEXT: vadd.vv v8, v11, v10 1079; VLOPT-NEXT: ret 1080 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsrl.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1) 1081 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl) 1082 ret <vscale x 4 x i16> %2 1083} 1084 1085define <vscale x 4 x i16> @vnsrl_wx(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %c, iXLen %vl) { 1086; NOVLOPT-LABEL: vnsrl_wx: 1087; NOVLOPT: # %bb.0: 1088; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, ta, ma 1089; NOVLOPT-NEXT: vnsrl.wx v11, v8, a0 1090; NOVLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma 1091; NOVLOPT-NEXT: vadd.vv v8, v11, v10 1092; NOVLOPT-NEXT: ret 1093; 1094; VLOPT-LABEL: vnsrl_wx: 1095; VLOPT: # %bb.0: 1096; VLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma 1097; VLOPT-NEXT: vnsrl.wx v11, v8, a0 1098; VLOPT-NEXT: vadd.vv v8, v11, v10 1099; VLOPT-NEXT: ret 1100 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsrl.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen %c, iXLen -1) 1101 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl) 1102 ret <vscale x 4 x i16> %2 1103} 1104 1105define <vscale x 4 x i16> @vnsrl_wv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen %vl) { 1106; NOVLOPT-LABEL: vnsrl_wv: 1107; NOVLOPT: # %bb.0: 1108; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma 1109; NOVLOPT-NEXT: vnsrl.wv v12, v8, v11 1110; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma 1111; NOVLOPT-NEXT: vadd.vv v8, v12, v10 1112; NOVLOPT-NEXT: ret 1113; 1114; VLOPT-LABEL: vnsrl_wv: 1115; VLOPT: # %bb.0: 1116; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma 1117; VLOPT-NEXT: vnsrl.wv v12, v8, v11 1118; VLOPT-NEXT: vadd.vv v8, v12, v10 1119; VLOPT-NEXT: ret 1120 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsrl.nxv4i16.nxv4i32.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, <vscale x 4 x i16> %c, iXLen -1) 1121 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl) 1122 ret <vscale x 4 x i16> %2 1123} 1124 1125define <vscale x 4 x i16> @vnsra_wi(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %vl) { 1126; NOVLOPT-LABEL: vnsra_wi: 1127; NOVLOPT: # %bb.0: 1128; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma 1129; NOVLOPT-NEXT: vnsra.wi v11, v8, 5 1130; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma 1131; NOVLOPT-NEXT: vadd.vv v8, v11, v10 1132; NOVLOPT-NEXT: ret 1133; 1134; VLOPT-LABEL: vnsra_wi: 1135; VLOPT: # %bb.0: 1136; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma 1137; VLOPT-NEXT: vnsra.wi v11, v8, 5 1138; VLOPT-NEXT: vadd.vv v8, v11, v10 1139; VLOPT-NEXT: ret 1140 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsra.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1) 1141 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl) 1142 ret <vscale x 4 x i16> %2 1143} 1144 1145define <vscale x 4 x i16> @vnsra_wx(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %c, iXLen %vl) { 1146; NOVLOPT-LABEL: vnsra_wx: 1147; NOVLOPT: # %bb.0: 1148; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, ta, ma 1149; NOVLOPT-NEXT: vnsra.wx v11, v8, a0 1150; NOVLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma 1151; NOVLOPT-NEXT: vadd.vv v8, v11, v10 1152; NOVLOPT-NEXT: ret 1153; 1154; VLOPT-LABEL: vnsra_wx: 1155; VLOPT: # %bb.0: 1156; VLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma 1157; VLOPT-NEXT: vnsra.wx v11, v8, a0 1158; VLOPT-NEXT: vadd.vv v8, v11, v10 1159; VLOPT-NEXT: ret 1160 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsra.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen %c, iXLen -1) 1161 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl) 1162 ret <vscale x 4 x i16> %2 1163} 1164 1165define <vscale x 4 x i16> @vnsra_wv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen %vl) { 1166; NOVLOPT-LABEL: vnsra_wv: 1167; NOVLOPT: # %bb.0: 1168; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma 1169; NOVLOPT-NEXT: vnsra.wv v12, v8, v11 1170; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma 1171; NOVLOPT-NEXT: vadd.vv v8, v12, v10 1172; NOVLOPT-NEXT: ret 1173; 1174; VLOPT-LABEL: vnsra_wv: 1175; VLOPT: # %bb.0: 1176; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma 1177; VLOPT-NEXT: vnsra.wv v12, v8, v11 1178; VLOPT-NEXT: vadd.vv v8, v12, v10 1179; VLOPT-NEXT: ret 1180 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsra.nxv4i16.nxv4i32.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, <vscale x 4 x i16> %c, iXLen -1) 1181 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl) 1182 ret <vscale x 4 x i16> %2 1183} 1184 1185define <vscale x 4 x i1> @vmseq_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) { 1186; NOVLOPT-LABEL: vmseq_vi: 1187; NOVLOPT: # %bb.0: 1188; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1189; NOVLOPT-NEXT: vmseq.vi v10, v8, 5 1190; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1191; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1192; NOVLOPT-NEXT: ret 1193; 1194; VLOPT-LABEL: vmseq_vi: 1195; VLOPT: # %bb.0: 1196; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1197; VLOPT-NEXT: vmseq.vi v10, v8, 5 1198; VLOPT-NEXT: vmand.mm v0, v10, v0 1199; VLOPT-NEXT: ret 1200 %1 = call <vscale x 4 x i1> @llvm.riscv.vmseq.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1) 1201 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1202 ret <vscale x 4 x i1> %2 1203} 1204 1205define <vscale x 4 x i1> @vmseq_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) { 1206; NOVLOPT-LABEL: vmseq_vx: 1207; NOVLOPT: # %bb.0: 1208; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1209; NOVLOPT-NEXT: vmseq.vx v10, v8, a0 1210; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 1211; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1212; NOVLOPT-NEXT: ret 1213; 1214; VLOPT-LABEL: vmseq_vx: 1215; VLOPT: # %bb.0: 1216; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1217; VLOPT-NEXT: vmseq.vx v10, v8, a0 1218; VLOPT-NEXT: vmand.mm v0, v10, v0 1219; VLOPT-NEXT: ret 1220 %1 = call <vscale x 4 x i1> @llvm.riscv.vmseq.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1) 1221 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1222 ret <vscale x 4 x i1> %2 1223} 1224 1225define <vscale x 4 x i1> @vmseq_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) { 1226; NOVLOPT-LABEL: vmseq_vv: 1227; NOVLOPT: # %bb.0: 1228; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1229; NOVLOPT-NEXT: vmseq.vv v12, v8, v10 1230; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1231; NOVLOPT-NEXT: vmand.mm v0, v12, v0 1232; NOVLOPT-NEXT: ret 1233; 1234; VLOPT-LABEL: vmseq_vv: 1235; VLOPT: # %bb.0: 1236; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1237; VLOPT-NEXT: vmseq.vv v12, v8, v10 1238; VLOPT-NEXT: vmand.mm v0, v12, v0 1239; VLOPT-NEXT: ret 1240 %1 = call <vscale x 4 x i1> @llvm.riscv.vmseq.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1) 1241 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1242 ret <vscale x 4 x i1> %2 1243} 1244 1245define <vscale x 4 x i1> @vmsne_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) { 1246; NOVLOPT-LABEL: vmsne_vi: 1247; NOVLOPT: # %bb.0: 1248; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1249; NOVLOPT-NEXT: vmsne.vi v10, v8, 5 1250; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1251; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1252; NOVLOPT-NEXT: ret 1253; 1254; VLOPT-LABEL: vmsne_vi: 1255; VLOPT: # %bb.0: 1256; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1257; VLOPT-NEXT: vmsne.vi v10, v8, 5 1258; VLOPT-NEXT: vmand.mm v0, v10, v0 1259; VLOPT-NEXT: ret 1260 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsne.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1) 1261 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1262 ret <vscale x 4 x i1> %2 1263} 1264 1265define <vscale x 4 x i1> @vmsne_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) { 1266; NOVLOPT-LABEL: vmsne_vx: 1267; NOVLOPT: # %bb.0: 1268; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1269; NOVLOPT-NEXT: vmsne.vx v10, v8, a0 1270; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 1271; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1272; NOVLOPT-NEXT: ret 1273; 1274; VLOPT-LABEL: vmsne_vx: 1275; VLOPT: # %bb.0: 1276; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1277; VLOPT-NEXT: vmsne.vx v10, v8, a0 1278; VLOPT-NEXT: vmand.mm v0, v10, v0 1279; VLOPT-NEXT: ret 1280 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsne.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1) 1281 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1282 ret <vscale x 4 x i1> %2 1283} 1284 1285define <vscale x 4 x i1> @vmsne_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) { 1286; NOVLOPT-LABEL: vmsne_vv: 1287; NOVLOPT: # %bb.0: 1288; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1289; NOVLOPT-NEXT: vmsne.vv v12, v8, v10 1290; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1291; NOVLOPT-NEXT: vmand.mm v0, v12, v0 1292; NOVLOPT-NEXT: ret 1293; 1294; VLOPT-LABEL: vmsne_vv: 1295; VLOPT: # %bb.0: 1296; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1297; VLOPT-NEXT: vmsne.vv v12, v8, v10 1298; VLOPT-NEXT: vmand.mm v0, v12, v0 1299; VLOPT-NEXT: ret 1300 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsne.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1) 1301 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1302 ret <vscale x 4 x i1> %2 1303} 1304 1305define <vscale x 4 x i1> @vmsltu_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) { 1306; NOVLOPT-LABEL: vmsltu_vx: 1307; NOVLOPT: # %bb.0: 1308; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1309; NOVLOPT-NEXT: vmsltu.vx v10, v8, a0 1310; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 1311; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1312; NOVLOPT-NEXT: ret 1313; 1314; VLOPT-LABEL: vmsltu_vx: 1315; VLOPT: # %bb.0: 1316; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1317; VLOPT-NEXT: vmsltu.vx v10, v8, a0 1318; VLOPT-NEXT: vmand.mm v0, v10, v0 1319; VLOPT-NEXT: ret 1320 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsltu.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1) 1321 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1322 ret <vscale x 4 x i1> %2 1323} 1324 1325define <vscale x 4 x i1> @vmsltu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) { 1326; NOVLOPT-LABEL: vmsltu_vv: 1327; NOVLOPT: # %bb.0: 1328; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1329; NOVLOPT-NEXT: vmsltu.vv v12, v8, v10 1330; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1331; NOVLOPT-NEXT: vmand.mm v0, v12, v0 1332; NOVLOPT-NEXT: ret 1333; 1334; VLOPT-LABEL: vmsltu_vv: 1335; VLOPT: # %bb.0: 1336; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1337; VLOPT-NEXT: vmsltu.vv v12, v8, v10 1338; VLOPT-NEXT: vmand.mm v0, v12, v0 1339; VLOPT-NEXT: ret 1340 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsltu.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1) 1341 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1342 ret <vscale x 4 x i1> %2 1343} 1344 1345define <vscale x 4 x i1> @vmslt_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) { 1346; NOVLOPT-LABEL: vmslt_vx: 1347; NOVLOPT: # %bb.0: 1348; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1349; NOVLOPT-NEXT: vmslt.vx v10, v8, a0 1350; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 1351; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1352; NOVLOPT-NEXT: ret 1353; 1354; VLOPT-LABEL: vmslt_vx: 1355; VLOPT: # %bb.0: 1356; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1357; VLOPT-NEXT: vmslt.vx v10, v8, a0 1358; VLOPT-NEXT: vmand.mm v0, v10, v0 1359; VLOPT-NEXT: ret 1360 %1 = call <vscale x 4 x i1> @llvm.riscv.vmslt.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1) 1361 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1362 ret <vscale x 4 x i1> %2 1363} 1364 1365define <vscale x 4 x i1> @vmslt_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) { 1366; NOVLOPT-LABEL: vmslt_vv: 1367; NOVLOPT: # %bb.0: 1368; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1369; NOVLOPT-NEXT: vmslt.vv v12, v8, v10 1370; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1371; NOVLOPT-NEXT: vmand.mm v0, v12, v0 1372; NOVLOPT-NEXT: ret 1373; 1374; VLOPT-LABEL: vmslt_vv: 1375; VLOPT: # %bb.0: 1376; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1377; VLOPT-NEXT: vmslt.vv v12, v8, v10 1378; VLOPT-NEXT: vmand.mm v0, v12, v0 1379; VLOPT-NEXT: ret 1380 %1 = call <vscale x 4 x i1> @llvm.riscv.vmslt.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1) 1381 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1382 ret <vscale x 4 x i1> %2 1383} 1384 1385define <vscale x 4 x i1> @vmsleu_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) { 1386; NOVLOPT-LABEL: vmsleu_vi: 1387; NOVLOPT: # %bb.0: 1388; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1389; NOVLOPT-NEXT: vmsleu.vi v10, v8, 5 1390; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1391; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1392; NOVLOPT-NEXT: ret 1393; 1394; VLOPT-LABEL: vmsleu_vi: 1395; VLOPT: # %bb.0: 1396; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1397; VLOPT-NEXT: vmsleu.vi v10, v8, 5 1398; VLOPT-NEXT: vmand.mm v0, v10, v0 1399; VLOPT-NEXT: ret 1400 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsleu.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1) 1401 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1402 ret <vscale x 4 x i1> %2 1403} 1404 1405define <vscale x 4 x i1> @vmsleu_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) { 1406; NOVLOPT-LABEL: vmsleu_vx: 1407; NOVLOPT: # %bb.0: 1408; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1409; NOVLOPT-NEXT: vmsleu.vx v10, v8, a0 1410; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 1411; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1412; NOVLOPT-NEXT: ret 1413; 1414; VLOPT-LABEL: vmsleu_vx: 1415; VLOPT: # %bb.0: 1416; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1417; VLOPT-NEXT: vmsleu.vx v10, v8, a0 1418; VLOPT-NEXT: vmand.mm v0, v10, v0 1419; VLOPT-NEXT: ret 1420 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsleu.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1) 1421 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1422 ret <vscale x 4 x i1> %2 1423} 1424 1425define <vscale x 4 x i1> @vmsleu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) { 1426; NOVLOPT-LABEL: vmsleu_vv: 1427; NOVLOPT: # %bb.0: 1428; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1429; NOVLOPT-NEXT: vmsleu.vv v12, v8, v10 1430; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1431; NOVLOPT-NEXT: vmand.mm v0, v12, v0 1432; NOVLOPT-NEXT: ret 1433; 1434; VLOPT-LABEL: vmsleu_vv: 1435; VLOPT: # %bb.0: 1436; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1437; VLOPT-NEXT: vmsleu.vv v12, v8, v10 1438; VLOPT-NEXT: vmand.mm v0, v12, v0 1439; VLOPT-NEXT: ret 1440 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsleu.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1) 1441 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1442 ret <vscale x 4 x i1> %2 1443} 1444 1445define <vscale x 4 x i1> @vmsle_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) { 1446; NOVLOPT-LABEL: vmsle_vi: 1447; NOVLOPT: # %bb.0: 1448; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1449; NOVLOPT-NEXT: vmsle.vi v10, v8, 5 1450; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1451; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1452; NOVLOPT-NEXT: ret 1453; 1454; VLOPT-LABEL: vmsle_vi: 1455; VLOPT: # %bb.0: 1456; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1457; VLOPT-NEXT: vmsle.vi v10, v8, 5 1458; VLOPT-NEXT: vmand.mm v0, v10, v0 1459; VLOPT-NEXT: ret 1460 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsle.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1) 1461 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1462 ret <vscale x 4 x i1> %2 1463} 1464 1465define <vscale x 4 x i1> @vmsle_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) { 1466; NOVLOPT-LABEL: vmsle_vx: 1467; NOVLOPT: # %bb.0: 1468; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1469; NOVLOPT-NEXT: vmsle.vx v10, v8, a0 1470; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 1471; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1472; NOVLOPT-NEXT: ret 1473; 1474; VLOPT-LABEL: vmsle_vx: 1475; VLOPT: # %bb.0: 1476; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1477; VLOPT-NEXT: vmsle.vx v10, v8, a0 1478; VLOPT-NEXT: vmand.mm v0, v10, v0 1479; VLOPT-NEXT: ret 1480 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsle.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1) 1481 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1482 ret <vscale x 4 x i1> %2 1483} 1484 1485define <vscale x 4 x i1> @vmsle_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) { 1486; NOVLOPT-LABEL: vmsle_vv: 1487; NOVLOPT: # %bb.0: 1488; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1489; NOVLOPT-NEXT: vmsle.vv v12, v8, v10 1490; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1491; NOVLOPT-NEXT: vmand.mm v0, v12, v0 1492; NOVLOPT-NEXT: ret 1493; 1494; VLOPT-LABEL: vmsle_vv: 1495; VLOPT: # %bb.0: 1496; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1497; VLOPT-NEXT: vmsle.vv v12, v8, v10 1498; VLOPT-NEXT: vmand.mm v0, v12, v0 1499; VLOPT-NEXT: ret 1500 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsle.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1) 1501 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1502 ret <vscale x 4 x i1> %2 1503} 1504 1505define <vscale x 4 x i1> @vmsgtu_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) { 1506; NOVLOPT-LABEL: vmsgtu_vi: 1507; NOVLOPT: # %bb.0: 1508; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1509; NOVLOPT-NEXT: vmsgtu.vi v10, v8, 5 1510; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1511; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1512; NOVLOPT-NEXT: ret 1513; 1514; VLOPT-LABEL: vmsgtu_vi: 1515; VLOPT: # %bb.0: 1516; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1517; VLOPT-NEXT: vmsgtu.vi v10, v8, 5 1518; VLOPT-NEXT: vmand.mm v0, v10, v0 1519; VLOPT-NEXT: ret 1520 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsgtu.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1) 1521 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1522 ret <vscale x 4 x i1> %2 1523} 1524 1525define <vscale x 4 x i1> @vmsgtu_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) { 1526; NOVLOPT-LABEL: vmsgtu_vx: 1527; NOVLOPT: # %bb.0: 1528; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1529; NOVLOPT-NEXT: vmsgtu.vx v10, v8, a0 1530; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 1531; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1532; NOVLOPT-NEXT: ret 1533; 1534; VLOPT-LABEL: vmsgtu_vx: 1535; VLOPT: # %bb.0: 1536; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1537; VLOPT-NEXT: vmsgtu.vx v10, v8, a0 1538; VLOPT-NEXT: vmand.mm v0, v10, v0 1539; VLOPT-NEXT: ret 1540 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsgtu.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1) 1541 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1542 ret <vscale x 4 x i1> %2 1543} 1544 1545define <vscale x 4 x i1> @vmsgt_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) { 1546; NOVLOPT-LABEL: vmsgt_vi: 1547; NOVLOPT: # %bb.0: 1548; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1549; NOVLOPT-NEXT: vmsgt.vi v10, v8, 5 1550; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 1551; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1552; NOVLOPT-NEXT: ret 1553; 1554; VLOPT-LABEL: vmsgt_vi: 1555; VLOPT: # %bb.0: 1556; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1557; VLOPT-NEXT: vmsgt.vi v10, v8, 5 1558; VLOPT-NEXT: vmand.mm v0, v10, v0 1559; VLOPT-NEXT: ret 1560 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsgt.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1) 1561 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1562 ret <vscale x 4 x i1> %2 1563} 1564 1565define <vscale x 4 x i1> @vmsgt_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) { 1566; NOVLOPT-LABEL: vmsgt_vx: 1567; NOVLOPT: # %bb.0: 1568; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1569; NOVLOPT-NEXT: vmsgt.vx v10, v8, a0 1570; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 1571; NOVLOPT-NEXT: vmand.mm v0, v10, v0 1572; NOVLOPT-NEXT: ret 1573; 1574; VLOPT-LABEL: vmsgt_vx: 1575; VLOPT: # %bb.0: 1576; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1577; VLOPT-NEXT: vmsgt.vx v10, v8, a0 1578; VLOPT-NEXT: vmand.mm v0, v10, v0 1579; VLOPT-NEXT: ret 1580 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsgt.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1) 1581 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 1582 ret <vscale x 4 x i1> %2 1583} 1584 1585define <vscale x 4 x i32> @vminu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1586; NOVLOPT-LABEL: vminu_vv: 1587; NOVLOPT: # %bb.0: 1588; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1589; NOVLOPT-NEXT: vminu.vv v8, v8, v10 1590; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1591; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1592; NOVLOPT-NEXT: ret 1593; 1594; VLOPT-LABEL: vminu_vv: 1595; VLOPT: # %bb.0: 1596; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1597; VLOPT-NEXT: vminu.vv v8, v8, v10 1598; VLOPT-NEXT: vadd.vv v8, v8, v10 1599; VLOPT-NEXT: ret 1600 %1 = call <vscale x 4 x i32> @llvm.riscv.vminu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 1601 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 1602 ret <vscale x 4 x i32> %2 1603} 1604 1605define <vscale x 4 x i32> @vminu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 1606; NOVLOPT-LABEL: vminu_vx: 1607; NOVLOPT: # %bb.0: 1608; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1609; NOVLOPT-NEXT: vminu.vx v10, v8, a0 1610; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1611; NOVLOPT-NEXT: vadd.vv v8, v10, v8 1612; NOVLOPT-NEXT: ret 1613; 1614; VLOPT-LABEL: vminu_vx: 1615; VLOPT: # %bb.0: 1616; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1617; VLOPT-NEXT: vminu.vx v10, v8, a0 1618; VLOPT-NEXT: vadd.vv v8, v10, v8 1619; VLOPT-NEXT: ret 1620 %1 = call <vscale x 4 x i32> @llvm.riscv.vminu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 1621 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 1622 ret <vscale x 4 x i32> %2 1623} 1624 1625define <vscale x 4 x i32> @vmin_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1626; NOVLOPT-LABEL: vmin_vv: 1627; NOVLOPT: # %bb.0: 1628; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1629; NOVLOPT-NEXT: vmin.vv v8, v8, v10 1630; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1631; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1632; NOVLOPT-NEXT: ret 1633; 1634; VLOPT-LABEL: vmin_vv: 1635; VLOPT: # %bb.0: 1636; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1637; VLOPT-NEXT: vmin.vv v8, v8, v10 1638; VLOPT-NEXT: vadd.vv v8, v8, v10 1639; VLOPT-NEXT: ret 1640 %1 = call <vscale x 4 x i32> @llvm.riscv.vmin.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 1641 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 1642 ret <vscale x 4 x i32> %2 1643} 1644 1645define <vscale x 4 x i32> @vmin_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 1646; NOVLOPT-LABEL: vmin_vx: 1647; NOVLOPT: # %bb.0: 1648; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1649; NOVLOPT-NEXT: vmin.vx v10, v8, a0 1650; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1651; NOVLOPT-NEXT: vadd.vv v8, v10, v8 1652; NOVLOPT-NEXT: ret 1653; 1654; VLOPT-LABEL: vmin_vx: 1655; VLOPT: # %bb.0: 1656; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1657; VLOPT-NEXT: vmin.vx v10, v8, a0 1658; VLOPT-NEXT: vadd.vv v8, v10, v8 1659; VLOPT-NEXT: ret 1660 %1 = call <vscale x 4 x i32> @llvm.riscv.vmin.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 1661 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 1662 ret <vscale x 4 x i32> %2 1663} 1664 1665define <vscale x 4 x i32> @vmaxu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1666; NOVLOPT-LABEL: vmaxu_vv: 1667; NOVLOPT: # %bb.0: 1668; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1669; NOVLOPT-NEXT: vmaxu.vv v8, v8, v10 1670; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1671; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1672; NOVLOPT-NEXT: ret 1673; 1674; VLOPT-LABEL: vmaxu_vv: 1675; VLOPT: # %bb.0: 1676; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1677; VLOPT-NEXT: vmaxu.vv v8, v8, v10 1678; VLOPT-NEXT: vadd.vv v8, v8, v10 1679; VLOPT-NEXT: ret 1680 %1 = call <vscale x 4 x i32> @llvm.riscv.vmaxu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 1681 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 1682 ret <vscale x 4 x i32> %2 1683} 1684 1685define <vscale x 4 x i32> @vmaxu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 1686; NOVLOPT-LABEL: vmaxu_vx: 1687; NOVLOPT: # %bb.0: 1688; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1689; NOVLOPT-NEXT: vmaxu.vx v10, v8, a0 1690; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1691; NOVLOPT-NEXT: vadd.vv v8, v10, v8 1692; NOVLOPT-NEXT: ret 1693; 1694; VLOPT-LABEL: vmaxu_vx: 1695; VLOPT: # %bb.0: 1696; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1697; VLOPT-NEXT: vmaxu.vx v10, v8, a0 1698; VLOPT-NEXT: vadd.vv v8, v10, v8 1699; VLOPT-NEXT: ret 1700 %1 = call <vscale x 4 x i32> @llvm.riscv.vmaxu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 1701 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 1702 ret <vscale x 4 x i32> %2 1703} 1704 1705define <vscale x 4 x i32> @vmax_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1706; NOVLOPT-LABEL: vmax_vv: 1707; NOVLOPT: # %bb.0: 1708; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1709; NOVLOPT-NEXT: vmax.vv v8, v8, v10 1710; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1711; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1712; NOVLOPT-NEXT: ret 1713; 1714; VLOPT-LABEL: vmax_vv: 1715; VLOPT: # %bb.0: 1716; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1717; VLOPT-NEXT: vmax.vv v8, v8, v10 1718; VLOPT-NEXT: vadd.vv v8, v8, v10 1719; VLOPT-NEXT: ret 1720 %1 = call <vscale x 4 x i32> @llvm.riscv.vmax.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 1721 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 1722 ret <vscale x 4 x i32> %2 1723} 1724 1725define <vscale x 4 x i32> @vmax_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 1726; NOVLOPT-LABEL: vmax_vx: 1727; NOVLOPT: # %bb.0: 1728; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1729; NOVLOPT-NEXT: vmax.vx v10, v8, a0 1730; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1731; NOVLOPT-NEXT: vadd.vv v8, v10, v8 1732; NOVLOPT-NEXT: ret 1733; 1734; VLOPT-LABEL: vmax_vx: 1735; VLOPT: # %bb.0: 1736; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1737; VLOPT-NEXT: vmax.vx v10, v8, a0 1738; VLOPT-NEXT: vadd.vv v8, v10, v8 1739; VLOPT-NEXT: ret 1740 %1 = call <vscale x 4 x i32> @llvm.riscv.vmax.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 1741 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 1742 ret <vscale x 4 x i32> %2 1743} 1744 1745define <vscale x 4 x i32> @vmul_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1746; NOVLOPT-LABEL: vmul_vv: 1747; NOVLOPT: # %bb.0: 1748; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1749; NOVLOPT-NEXT: vmul.vv v8, v8, v10 1750; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1751; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1752; NOVLOPT-NEXT: ret 1753; 1754; VLOPT-LABEL: vmul_vv: 1755; VLOPT: # %bb.0: 1756; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1757; VLOPT-NEXT: vmul.vv v8, v8, v10 1758; VLOPT-NEXT: vadd.vv v8, v8, v10 1759; VLOPT-NEXT: ret 1760 %1 = call <vscale x 4 x i32> @llvm.riscv.vmul.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 1761 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 1762 ret <vscale x 4 x i32> %2 1763} 1764 1765define <vscale x 4 x i32> @vmul_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 1766; NOVLOPT-LABEL: vmul_vx: 1767; NOVLOPT: # %bb.0: 1768; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1769; NOVLOPT-NEXT: vmul.vx v10, v8, a0 1770; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1771; NOVLOPT-NEXT: vadd.vv v8, v10, v8 1772; NOVLOPT-NEXT: ret 1773; 1774; VLOPT-LABEL: vmul_vx: 1775; VLOPT: # %bb.0: 1776; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1777; VLOPT-NEXT: vmul.vx v10, v8, a0 1778; VLOPT-NEXT: vadd.vv v8, v10, v8 1779; VLOPT-NEXT: ret 1780 %1 = call <vscale x 4 x i32> @llvm.riscv.vmul.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 1781 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 1782 ret <vscale x 4 x i32> %2 1783} 1784 1785define <vscale x 4 x i32> @vmulh_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1786; NOVLOPT-LABEL: vmulh_vv: 1787; NOVLOPT: # %bb.0: 1788; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1789; NOVLOPT-NEXT: vmulh.vv v8, v8, v10 1790; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1791; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1792; NOVLOPT-NEXT: ret 1793; 1794; VLOPT-LABEL: vmulh_vv: 1795; VLOPT: # %bb.0: 1796; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1797; VLOPT-NEXT: vmulh.vv v8, v8, v10 1798; VLOPT-NEXT: vadd.vv v8, v8, v10 1799; VLOPT-NEXT: ret 1800 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulh.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 1801 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 1802 ret <vscale x 4 x i32> %2 1803} 1804 1805define <vscale x 4 x i32> @vmulh_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 1806; NOVLOPT-LABEL: vmulh_vx: 1807; NOVLOPT: # %bb.0: 1808; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1809; NOVLOPT-NEXT: vmulh.vx v10, v8, a0 1810; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1811; NOVLOPT-NEXT: vadd.vv v8, v10, v8 1812; NOVLOPT-NEXT: ret 1813; 1814; VLOPT-LABEL: vmulh_vx: 1815; VLOPT: # %bb.0: 1816; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1817; VLOPT-NEXT: vmulh.vx v10, v8, a0 1818; VLOPT-NEXT: vadd.vv v8, v10, v8 1819; VLOPT-NEXT: ret 1820 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulh.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 1821 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 1822 ret <vscale x 4 x i32> %2 1823} 1824 1825define <vscale x 4 x i32> @vmulhu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1826; NOVLOPT-LABEL: vmulhu_vv: 1827; NOVLOPT: # %bb.0: 1828; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1829; NOVLOPT-NEXT: vmulhu.vv v8, v8, v10 1830; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1831; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1832; NOVLOPT-NEXT: ret 1833; 1834; VLOPT-LABEL: vmulhu_vv: 1835; VLOPT: # %bb.0: 1836; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1837; VLOPT-NEXT: vmulhu.vv v8, v8, v10 1838; VLOPT-NEXT: vadd.vv v8, v8, v10 1839; VLOPT-NEXT: ret 1840 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulhu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 1841 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 1842 ret <vscale x 4 x i32> %2 1843} 1844 1845define <vscale x 4 x i32> @vmulhu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 1846; NOVLOPT-LABEL: vmulhu_vx: 1847; NOVLOPT: # %bb.0: 1848; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1849; NOVLOPT-NEXT: vmulhu.vx v10, v8, a0 1850; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1851; NOVLOPT-NEXT: vadd.vv v8, v10, v8 1852; NOVLOPT-NEXT: ret 1853; 1854; VLOPT-LABEL: vmulhu_vx: 1855; VLOPT: # %bb.0: 1856; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1857; VLOPT-NEXT: vmulhu.vx v10, v8, a0 1858; VLOPT-NEXT: vadd.vv v8, v10, v8 1859; VLOPT-NEXT: ret 1860 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulhu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 1861 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 1862 ret <vscale x 4 x i32> %2 1863} 1864 1865define <vscale x 4 x i32> @vmulhsu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1866; NOVLOPT-LABEL: vmulhsu_vv: 1867; NOVLOPT: # %bb.0: 1868; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1869; NOVLOPT-NEXT: vmulhsu.vv v8, v8, v10 1870; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1871; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1872; NOVLOPT-NEXT: ret 1873; 1874; VLOPT-LABEL: vmulhsu_vv: 1875; VLOPT: # %bb.0: 1876; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1877; VLOPT-NEXT: vmulhsu.vv v8, v8, v10 1878; VLOPT-NEXT: vadd.vv v8, v8, v10 1879; VLOPT-NEXT: ret 1880 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulhsu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 1881 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 1882 ret <vscale x 4 x i32> %2 1883} 1884 1885define <vscale x 4 x i32> @vmulhsu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 1886; NOVLOPT-LABEL: vmulhsu_vx: 1887; NOVLOPT: # %bb.0: 1888; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1889; NOVLOPT-NEXT: vmulhsu.vx v10, v8, a0 1890; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1891; NOVLOPT-NEXT: vadd.vv v8, v10, v8 1892; NOVLOPT-NEXT: ret 1893; 1894; VLOPT-LABEL: vmulhsu_vx: 1895; VLOPT: # %bb.0: 1896; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1897; VLOPT-NEXT: vmulhsu.vx v10, v8, a0 1898; VLOPT-NEXT: vadd.vv v8, v10, v8 1899; VLOPT-NEXT: ret 1900 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulhsu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 1901 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 1902 ret <vscale x 4 x i32> %2 1903} 1904 1905define <vscale x 4 x i32> @vdivu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1906; NOVLOPT-LABEL: vdivu_vv: 1907; NOVLOPT: # %bb.0: 1908; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1909; NOVLOPT-NEXT: vdivu.vv v8, v8, v10 1910; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1911; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1912; NOVLOPT-NEXT: ret 1913; 1914; VLOPT-LABEL: vdivu_vv: 1915; VLOPT: # %bb.0: 1916; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1917; VLOPT-NEXT: vdivu.vv v8, v8, v10 1918; VLOPT-NEXT: vadd.vv v8, v8, v10 1919; VLOPT-NEXT: ret 1920 %1 = call <vscale x 4 x i32> @llvm.riscv.vdivu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 1921 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 1922 ret <vscale x 4 x i32> %2 1923} 1924 1925define <vscale x 4 x i32> @vdivu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 1926; NOVLOPT-LABEL: vdivu_vx: 1927; NOVLOPT: # %bb.0: 1928; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1929; NOVLOPT-NEXT: vdivu.vx v10, v8, a0 1930; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1931; NOVLOPT-NEXT: vadd.vv v8, v10, v8 1932; NOVLOPT-NEXT: ret 1933; 1934; VLOPT-LABEL: vdivu_vx: 1935; VLOPT: # %bb.0: 1936; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1937; VLOPT-NEXT: vdivu.vx v10, v8, a0 1938; VLOPT-NEXT: vadd.vv v8, v10, v8 1939; VLOPT-NEXT: ret 1940 %1 = call <vscale x 4 x i32> @llvm.riscv.vdivu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 1941 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 1942 ret <vscale x 4 x i32> %2 1943} 1944 1945define <vscale x 4 x i32> @vdiv_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1946; NOVLOPT-LABEL: vdiv_vv: 1947; NOVLOPT: # %bb.0: 1948; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1949; NOVLOPT-NEXT: vdiv.vv v8, v8, v10 1950; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1951; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1952; NOVLOPT-NEXT: ret 1953; 1954; VLOPT-LABEL: vdiv_vv: 1955; VLOPT: # %bb.0: 1956; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1957; VLOPT-NEXT: vdiv.vv v8, v8, v10 1958; VLOPT-NEXT: vadd.vv v8, v8, v10 1959; VLOPT-NEXT: ret 1960 %1 = call <vscale x 4 x i32> @llvm.riscv.vdiv.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 1961 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 1962 ret <vscale x 4 x i32> %2 1963} 1964 1965define <vscale x 4 x i32> @vdiv_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 1966; NOVLOPT-LABEL: vdiv_vx: 1967; NOVLOPT: # %bb.0: 1968; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1969; NOVLOPT-NEXT: vdiv.vx v10, v8, a0 1970; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1971; NOVLOPT-NEXT: vadd.vv v8, v10, v8 1972; NOVLOPT-NEXT: ret 1973; 1974; VLOPT-LABEL: vdiv_vx: 1975; VLOPT: # %bb.0: 1976; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1977; VLOPT-NEXT: vdiv.vx v10, v8, a0 1978; VLOPT-NEXT: vadd.vv v8, v10, v8 1979; VLOPT-NEXT: ret 1980 %1 = call <vscale x 4 x i32> @llvm.riscv.vdiv.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 1981 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 1982 ret <vscale x 4 x i32> %2 1983} 1984 1985define <vscale x 4 x i32> @vremu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 1986; NOVLOPT-LABEL: vremu_vv: 1987; NOVLOPT: # %bb.0: 1988; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1989; NOVLOPT-NEXT: vremu.vv v8, v8, v10 1990; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1991; NOVLOPT-NEXT: vadd.vv v8, v8, v10 1992; NOVLOPT-NEXT: ret 1993; 1994; VLOPT-LABEL: vremu_vv: 1995; VLOPT: # %bb.0: 1996; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1997; VLOPT-NEXT: vremu.vv v8, v8, v10 1998; VLOPT-NEXT: vadd.vv v8, v8, v10 1999; VLOPT-NEXT: ret 2000 %1 = call <vscale x 4 x i32> @llvm.riscv.vremu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 2001 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 2002 ret <vscale x 4 x i32> %2 2003} 2004 2005define <vscale x 4 x i32> @vremu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 2006; NOVLOPT-LABEL: vremu_vx: 2007; NOVLOPT: # %bb.0: 2008; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 2009; NOVLOPT-NEXT: vremu.vx v10, v8, a0 2010; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2011; NOVLOPT-NEXT: vadd.vv v8, v10, v8 2012; NOVLOPT-NEXT: ret 2013; 2014; VLOPT-LABEL: vremu_vx: 2015; VLOPT: # %bb.0: 2016; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2017; VLOPT-NEXT: vremu.vx v10, v8, a0 2018; VLOPT-NEXT: vadd.vv v8, v10, v8 2019; VLOPT-NEXT: ret 2020 %1 = call <vscale x 4 x i32> @llvm.riscv.vremu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 2021 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 2022 ret <vscale x 4 x i32> %2 2023} 2024 2025define <vscale x 4 x i32> @vrem_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 2026; NOVLOPT-LABEL: vrem_vv: 2027; NOVLOPT: # %bb.0: 2028; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 2029; NOVLOPT-NEXT: vrem.vv v8, v8, v10 2030; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2031; NOVLOPT-NEXT: vadd.vv v8, v8, v10 2032; NOVLOPT-NEXT: ret 2033; 2034; VLOPT-LABEL: vrem_vv: 2035; VLOPT: # %bb.0: 2036; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2037; VLOPT-NEXT: vrem.vv v8, v8, v10 2038; VLOPT-NEXT: vadd.vv v8, v8, v10 2039; VLOPT-NEXT: ret 2040 %1 = call <vscale x 4 x i32> @llvm.riscv.vrem.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 2041 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 2042 ret <vscale x 4 x i32> %2 2043} 2044 2045define <vscale x 4 x i32> @vrem_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 2046; NOVLOPT-LABEL: vrem_vx: 2047; NOVLOPT: # %bb.0: 2048; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 2049; NOVLOPT-NEXT: vrem.vx v10, v8, a0 2050; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2051; NOVLOPT-NEXT: vadd.vv v8, v10, v8 2052; NOVLOPT-NEXT: ret 2053; 2054; VLOPT-LABEL: vrem_vx: 2055; VLOPT: # %bb.0: 2056; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2057; VLOPT-NEXT: vrem.vx v10, v8, a0 2058; VLOPT-NEXT: vadd.vv v8, v10, v8 2059; VLOPT-NEXT: ret 2060 %1 = call <vscale x 4 x i32> @llvm.riscv.vrem.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 2061 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 2062 ret <vscale x 4 x i32> %2 2063} 2064 2065define <vscale x 4 x i64> @vwmul_vv(<vscale x 4 x i16> %a, <vscale x 4 x i16> %b, iXLen %vl) { 2066; NOVLOPT-LABEL: vwmul_vv: 2067; NOVLOPT: # %bb.0: 2068; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma 2069; NOVLOPT-NEXT: vwmul.vv v12, v8, v9 2070; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2071; NOVLOPT-NEXT: vwmul.vv v8, v12, v12 2072; NOVLOPT-NEXT: ret 2073; 2074; VLOPT-LABEL: vwmul_vv: 2075; VLOPT: # %bb.0: 2076; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma 2077; VLOPT-NEXT: vwmul.vv v12, v8, v9 2078; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2079; VLOPT-NEXT: vwmul.vv v8, v12, v12 2080; VLOPT-NEXT: ret 2081 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmul.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i16> %a, <vscale x 4 x i16> %b, iXLen -1) 2082 %2 = call <vscale x 4 x i64> @llvm.riscv.vwmul.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl) 2083 ret <vscale x 4 x i64> %2 2084} 2085 2086define <vscale x 4 x i64> @vwmul_vx(<vscale x 4 x i16> %a, i16 %b, i32 %c, iXLen %vl) { 2087; NOVLOPT-LABEL: vwmul_vx: 2088; NOVLOPT: # %bb.0: 2089; NOVLOPT-NEXT: vsetvli a3, zero, e16, m1, ta, ma 2090; NOVLOPT-NEXT: vwmul.vx v12, v8, a0 2091; NOVLOPT-NEXT: vsetvli zero, a2, e32, m2, ta, ma 2092; NOVLOPT-NEXT: vwmul.vx v8, v12, a1 2093; NOVLOPT-NEXT: ret 2094; 2095; VLOPT-LABEL: vwmul_vx: 2096; VLOPT: # %bb.0: 2097; VLOPT-NEXT: vsetvli zero, a2, e16, m1, ta, ma 2098; VLOPT-NEXT: vwmul.vx v12, v8, a0 2099; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2100; VLOPT-NEXT: vwmul.vx v8, v12, a1 2101; VLOPT-NEXT: ret 2102 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmul.nxv4i32.nxv4i16.i16(<vscale x 4 x i32> poison, <vscale x 4 x i16> %a, i16 %b, iXLen -1) 2103 %2 = call <vscale x 4 x i64> @llvm.riscv.vwmul.nxv4i64.nxv4i64.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %1, i32 %c, iXLen %vl) 2104 ret <vscale x 4 x i64> %2 2105} 2106 2107define <vscale x 4 x i64> @vwmulsu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 2108; NOVLOPT-LABEL: vwmulsu_vv: 2109; NOVLOPT: # %bb.0: 2110; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 2111; NOVLOPT-NEXT: vwmulsu.vv v12, v8, v10 2112; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 2113; NOVLOPT-NEXT: vadd.vv v8, v12, v12 2114; NOVLOPT-NEXT: ret 2115; 2116; VLOPT-LABEL: vwmulsu_vv: 2117; VLOPT: # %bb.0: 2118; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2119; VLOPT-NEXT: vwmulsu.vv v12, v8, v10 2120; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 2121; VLOPT-NEXT: vadd.vv v8, v12, v12 2122; VLOPT-NEXT: ret 2123 %1 = call <vscale x 4 x i64> @llvm.riscv.vwmulsu.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 2124 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 2125 ret <vscale x 4 x i64> %2 2126} 2127 2128define <vscale x 4 x i64> @vwmulsu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 2129; NOVLOPT-LABEL: vwmulsu_vx: 2130; NOVLOPT: # %bb.0: 2131; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 2132; NOVLOPT-NEXT: vwmulsu.vx v12, v8, a0 2133; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma 2134; NOVLOPT-NEXT: vadd.vv v8, v12, v12 2135; NOVLOPT-NEXT: ret 2136; 2137; VLOPT-LABEL: vwmulsu_vx: 2138; VLOPT: # %bb.0: 2139; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2140; VLOPT-NEXT: vwmulsu.vx v12, v8, a0 2141; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 2142; VLOPT-NEXT: vadd.vv v8, v12, v12 2143; VLOPT-NEXT: ret 2144 %1 = call <vscale x 4 x i64> @llvm.riscv.vwmulsu.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 2145 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 2146 ret <vscale x 4 x i64> %2 2147} 2148 2149define <vscale x 4 x i64> @vwmulu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 2150; NOVLOPT-LABEL: vwmulu_vv: 2151; NOVLOPT: # %bb.0: 2152; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 2153; NOVLOPT-NEXT: vwmulu.vv v12, v8, v10 2154; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 2155; NOVLOPT-NEXT: vadd.vv v8, v12, v12 2156; NOVLOPT-NEXT: ret 2157; 2158; VLOPT-LABEL: vwmulu_vv: 2159; VLOPT: # %bb.0: 2160; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2161; VLOPT-NEXT: vwmulu.vv v12, v8, v10 2162; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 2163; VLOPT-NEXT: vadd.vv v8, v12, v12 2164; VLOPT-NEXT: ret 2165 %1 = call <vscale x 4 x i64> @llvm.riscv.vwmulu.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1) 2166 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 2167 ret <vscale x 4 x i64> %2 2168} 2169 2170define <vscale x 4 x i64> @vwmulu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 2171; NOVLOPT-LABEL: vwmulu_vx: 2172; NOVLOPT: # %bb.0: 2173; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 2174; NOVLOPT-NEXT: vwmulu.vx v12, v8, a0 2175; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma 2176; NOVLOPT-NEXT: vadd.vv v8, v12, v12 2177; NOVLOPT-NEXT: ret 2178; 2179; VLOPT-LABEL: vwmulu_vx: 2180; VLOPT: # %bb.0: 2181; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2182; VLOPT-NEXT: vwmulu.vx v12, v8, a0 2183; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 2184; VLOPT-NEXT: vadd.vv v8, v12, v12 2185; VLOPT-NEXT: ret 2186 %1 = call <vscale x 4 x i64> @llvm.riscv.vwmulu.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1) 2187 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl) 2188 ret <vscale x 4 x i64> %2 2189} 2190 2191define <vscale x 4 x i32> @vwmacc_vv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, <vscale x 4 x i32> %d, iXLen %vl) { 2192; NOVLOPT-LABEL: vwmacc_vv: 2193; NOVLOPT: # %bb.0: 2194; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, tu, ma 2195; NOVLOPT-NEXT: vwmacc.vv v8, v10, v11 2196; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2197; NOVLOPT-NEXT: vadd.vv v8, v8, v12 2198; NOVLOPT-NEXT: ret 2199; 2200; VLOPT-LABEL: vwmacc_vv: 2201; VLOPT: # %bb.0: 2202; VLOPT-NEXT: vsetvli zero, a0, e16, m1, tu, ma 2203; VLOPT-NEXT: vwmacc.vv v8, v10, v11 2204; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2205; VLOPT-NEXT: vadd.vv v8, v8, v12 2206; VLOPT-NEXT: ret 2207 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmacc.nxv4i32.nxv4i16(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0) 2208 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %d, iXLen %vl) 2209 ret <vscale x 4 x i32> %2 2210} 2211 2212define <vscale x 4 x i32> @vmacc_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 2213; NOVLOPT-LABEL: vmacc_vv: 2214; NOVLOPT: # %bb.0: 2215; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, tu, ma 2216; NOVLOPT-NEXT: vmacc.vv v8, v8, v10 2217; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2218; NOVLOPT-NEXT: vadd.vv v8, v8, v10 2219; NOVLOPT-NEXT: ret 2220; 2221; VLOPT-LABEL: vmacc_vv: 2222; VLOPT: # %bb.0: 2223; VLOPT-NEXT: vsetvli zero, a0, e32, m2, tu, ma 2224; VLOPT-NEXT: vmacc.vv v8, v8, v10 2225; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2226; VLOPT-NEXT: vadd.vv v8, v8, v10 2227; VLOPT-NEXT: ret 2228 %1 = call <vscale x 4 x i32> @llvm.riscv.vmacc.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1, iXLen 0) 2229 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 2230 ret <vscale x 4 x i32> %2 2231} 2232 2233define <vscale x 4 x i32> @vmacc_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 2234; NOVLOPT-LABEL: vmacc_vx: 2235; NOVLOPT: # %bb.0: 2236; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, tu, ma 2237; NOVLOPT-NEXT: vmv2r.v v10, v8 2238; NOVLOPT-NEXT: vmacc.vx v10, a0, v8 2239; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2240; NOVLOPT-NEXT: vadd.vv v8, v10, v8 2241; NOVLOPT-NEXT: ret 2242; 2243; VLOPT-LABEL: vmacc_vx: 2244; VLOPT: # %bb.0: 2245; VLOPT-NEXT: vsetvli zero, a1, e32, m2, tu, ma 2246; VLOPT-NEXT: vmv2r.v v10, v8 2247; VLOPT-NEXT: vmacc.vx v10, a0, v8 2248; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2249; VLOPT-NEXT: vadd.vv v8, v10, v8 2250; VLOPT-NEXT: ret 2251 %1 = call <vscale x 4 x i32> @llvm.riscv.vmacc.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i32> %a, iXLen -1, iXLen 0) 2252 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 2253 ret <vscale x 4 x i32> %2 2254} 2255 2256define <vscale x 4 x i32> @vmadd_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 2257; NOVLOPT-LABEL: vmadd_vv: 2258; NOVLOPT: # %bb.0: 2259; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, tu, ma 2260; NOVLOPT-NEXT: vmadd.vv v8, v8, v10 2261; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2262; NOVLOPT-NEXT: vadd.vv v8, v8, v10 2263; NOVLOPT-NEXT: ret 2264; 2265; VLOPT-LABEL: vmadd_vv: 2266; VLOPT: # %bb.0: 2267; VLOPT-NEXT: vsetvli zero, a0, e32, m2, tu, ma 2268; VLOPT-NEXT: vmadd.vv v8, v8, v10 2269; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2270; VLOPT-NEXT: vadd.vv v8, v8, v10 2271; VLOPT-NEXT: ret 2272 %1 = call <vscale x 4 x i32> @llvm.riscv.vmadd.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1, iXLen 0) 2273 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 2274 ret <vscale x 4 x i32> %2 2275} 2276 2277define <vscale x 4 x i32> @vmadd_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 2278; NOVLOPT-LABEL: vmadd_vx: 2279; NOVLOPT: # %bb.0: 2280; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, tu, ma 2281; NOVLOPT-NEXT: vmv2r.v v10, v8 2282; NOVLOPT-NEXT: vmadd.vx v10, a0, v8 2283; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2284; NOVLOPT-NEXT: vadd.vv v8, v10, v8 2285; NOVLOPT-NEXT: ret 2286; 2287; VLOPT-LABEL: vmadd_vx: 2288; VLOPT: # %bb.0: 2289; VLOPT-NEXT: vsetvli zero, a1, e32, m2, tu, ma 2290; VLOPT-NEXT: vmv2r.v v10, v8 2291; VLOPT-NEXT: vmadd.vx v10, a0, v8 2292; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2293; VLOPT-NEXT: vadd.vv v8, v10, v8 2294; VLOPT-NEXT: ret 2295 %1 = call <vscale x 4 x i32> @llvm.riscv.vmadd.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i32> %a, iXLen -1, iXLen 0) 2296 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 2297 ret <vscale x 4 x i32> %2 2298} 2299 2300define <vscale x 4 x i32> @vnmsac_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 2301; NOVLOPT-LABEL: vnmsac_vv: 2302; NOVLOPT: # %bb.0: 2303; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, tu, ma 2304; NOVLOPT-NEXT: vnmsac.vv v8, v8, v10 2305; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2306; NOVLOPT-NEXT: vadd.vv v8, v8, v10 2307; NOVLOPT-NEXT: ret 2308; 2309; VLOPT-LABEL: vnmsac_vv: 2310; VLOPT: # %bb.0: 2311; VLOPT-NEXT: vsetvli zero, a0, e32, m2, tu, ma 2312; VLOPT-NEXT: vnmsac.vv v8, v8, v10 2313; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2314; VLOPT-NEXT: vadd.vv v8, v8, v10 2315; VLOPT-NEXT: ret 2316 %1 = call <vscale x 4 x i32> @llvm.riscv.vnmsac.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1, iXLen 0) 2317 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 2318 ret <vscale x 4 x i32> %2 2319} 2320 2321define <vscale x 4 x i32> @vnmsac_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 2322; NOVLOPT-LABEL: vnmsac_vx: 2323; NOVLOPT: # %bb.0: 2324; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, tu, ma 2325; NOVLOPT-NEXT: vmv2r.v v10, v8 2326; NOVLOPT-NEXT: vnmsac.vx v10, a0, v8 2327; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2328; NOVLOPT-NEXT: vadd.vv v8, v10, v8 2329; NOVLOPT-NEXT: ret 2330; 2331; VLOPT-LABEL: vnmsac_vx: 2332; VLOPT: # %bb.0: 2333; VLOPT-NEXT: vsetvli zero, a1, e32, m2, tu, ma 2334; VLOPT-NEXT: vmv2r.v v10, v8 2335; VLOPT-NEXT: vnmsac.vx v10, a0, v8 2336; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2337; VLOPT-NEXT: vadd.vv v8, v10, v8 2338; VLOPT-NEXT: ret 2339 %1 = call <vscale x 4 x i32> @llvm.riscv.vnmsac.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i32> %a, iXLen -1, iXLen 0) 2340 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 2341 ret <vscale x 4 x i32> %2 2342} 2343 2344define <vscale x 4 x i32> @vnmsub_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 2345; NOVLOPT-LABEL: vnmsub_vv: 2346; NOVLOPT: # %bb.0: 2347; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, tu, ma 2348; NOVLOPT-NEXT: vnmsub.vv v8, v8, v10 2349; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2350; NOVLOPT-NEXT: vadd.vv v8, v8, v10 2351; NOVLOPT-NEXT: ret 2352; 2353; VLOPT-LABEL: vnmsub_vv: 2354; VLOPT: # %bb.0: 2355; VLOPT-NEXT: vsetvli zero, a0, e32, m2, tu, ma 2356; VLOPT-NEXT: vnmsub.vv v8, v8, v10 2357; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2358; VLOPT-NEXT: vadd.vv v8, v8, v10 2359; VLOPT-NEXT: ret 2360 %1 = call <vscale x 4 x i32> @llvm.riscv.vnmsub.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1, iXLen 0) 2361 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 2362 ret <vscale x 4 x i32> %2 2363} 2364 2365define <vscale x 4 x i32> @vnmsub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 2366; NOVLOPT-LABEL: vnmsub_vx: 2367; NOVLOPT: # %bb.0: 2368; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, tu, ma 2369; NOVLOPT-NEXT: vmv2r.v v10, v8 2370; NOVLOPT-NEXT: vnmsub.vx v10, a0, v8 2371; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2372; NOVLOPT-NEXT: vadd.vv v8, v10, v8 2373; NOVLOPT-NEXT: ret 2374; 2375; VLOPT-LABEL: vnmsub_vx: 2376; VLOPT: # %bb.0: 2377; VLOPT-NEXT: vsetvli zero, a1, e32, m2, tu, ma 2378; VLOPT-NEXT: vmv2r.v v10, v8 2379; VLOPT-NEXT: vnmsub.vx v10, a0, v8 2380; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2381; VLOPT-NEXT: vadd.vv v8, v10, v8 2382; VLOPT-NEXT: ret 2383 %1 = call <vscale x 4 x i32> @llvm.riscv.vnmsub.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i32> %a, iXLen -1, iXLen 0) 2384 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 2385 ret <vscale x 4 x i32> %2 2386} 2387 2388define <vscale x 4 x i32> @vwmacc_vx(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen %vl) { 2389; NOVLOPT-LABEL: vwmacc_vx: 2390; NOVLOPT: # %bb.0: 2391; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, tu, ma 2392; NOVLOPT-NEXT: vwmacc.vx v8, a0, v10 2393; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2394; NOVLOPT-NEXT: vadd.vv v8, v8, v8 2395; NOVLOPT-NEXT: ret 2396; 2397; VLOPT-LABEL: vwmacc_vx: 2398; VLOPT: # %bb.0: 2399; VLOPT-NEXT: vsetvli zero, a1, e16, m1, tu, ma 2400; VLOPT-NEXT: vwmacc.vx v8, a0, v10 2401; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2402; VLOPT-NEXT: vadd.vv v8, v8, v8 2403; VLOPT-NEXT: ret 2404 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmacc.nxv4i32.i16(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0) 2405 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl) 2406 ret <vscale x 4 x i32> %2 2407} 2408 2409define <vscale x 4 x i32> @vwmaccu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, <vscale x 4 x i32> %d, iXLen %vl) { 2410; NOVLOPT-LABEL: vwmaccu_vv: 2411; NOVLOPT: # %bb.0: 2412; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, tu, ma 2413; NOVLOPT-NEXT: vwmaccu.vv v8, v10, v11 2414; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2415; NOVLOPT-NEXT: vadd.vv v8, v8, v12 2416; NOVLOPT-NEXT: ret 2417; 2418; VLOPT-LABEL: vwmaccu_vv: 2419; VLOPT: # %bb.0: 2420; VLOPT-NEXT: vsetvli zero, a0, e16, m1, tu, ma 2421; VLOPT-NEXT: vwmaccu.vv v8, v10, v11 2422; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2423; VLOPT-NEXT: vadd.vv v8, v8, v12 2424; VLOPT-NEXT: ret 2425 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmaccu.nxv4i32.nxv4i16(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0) 2426 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %d, iXLen %vl) 2427 ret <vscale x 4 x i32> %2 2428} 2429 2430define <vscale x 4 x i32> @vwmaccu_vx(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, <vscale x 4 x i32> %d, i32 %e, iXLen %vl) { 2431; NOVLOPT-LABEL: vwmaccu_vx: 2432; NOVLOPT: # %bb.0: 2433; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, tu, ma 2434; NOVLOPT-NEXT: vwmaccu.vx v8, a0, v10 2435; NOVLOPT-NEXT: vsetvli zero, a2, e32, m2, ta, ma 2436; NOVLOPT-NEXT: vadd.vv v8, v8, v12 2437; NOVLOPT-NEXT: ret 2438; 2439; VLOPT-LABEL: vwmaccu_vx: 2440; VLOPT: # %bb.0: 2441; VLOPT-NEXT: vsetvli zero, a2, e16, m1, tu, ma 2442; VLOPT-NEXT: vwmaccu.vx v8, a0, v10 2443; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2444; VLOPT-NEXT: vadd.vv v8, v8, v12 2445; VLOPT-NEXT: ret 2446 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmaccu.nxv4i32.i16(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0) 2447 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %d, iXLen %vl) 2448 ret <vscale x 4 x i32> %2 2449} 2450 2451define <vscale x 4 x i32> @vwmaccsu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen %vl) { 2452; NOVLOPT-LABEL: vwmaccsu_vv: 2453; NOVLOPT: # %bb.0: 2454; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, tu, ma 2455; NOVLOPT-NEXT: vwmaccsu.vv v8, v10, v11 2456; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2457; NOVLOPT-NEXT: vadd.vv v8, v8, v8 2458; NOVLOPT-NEXT: ret 2459; 2460; VLOPT-LABEL: vwmaccsu_vv: 2461; VLOPT: # %bb.0: 2462; VLOPT-NEXT: vsetvli zero, a0, e16, m1, tu, ma 2463; VLOPT-NEXT: vwmaccsu.vv v8, v10, v11 2464; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2465; VLOPT-NEXT: vadd.vv v8, v8, v8 2466; VLOPT-NEXT: ret 2467 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmaccsu.nxv4i32.nxv4i16(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0) 2468 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl) 2469 ret <vscale x 4 x i32> %2 2470} 2471 2472define <vscale x 4 x i32> @vwmaccsu_vx(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen %vl) { 2473; NOVLOPT-LABEL: vwmaccsu_vx: 2474; NOVLOPT: # %bb.0: 2475; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, tu, ma 2476; NOVLOPT-NEXT: vwmaccsu.vx v8, a0, v10 2477; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2478; NOVLOPT-NEXT: vadd.vv v8, v8, v8 2479; NOVLOPT-NEXT: ret 2480; 2481; VLOPT-LABEL: vwmaccsu_vx: 2482; VLOPT: # %bb.0: 2483; VLOPT-NEXT: vsetvli zero, a1, e16, m1, tu, ma 2484; VLOPT-NEXT: vwmaccsu.vx v8, a0, v10 2485; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2486; VLOPT-NEXT: vadd.vv v8, v8, v8 2487; VLOPT-NEXT: ret 2488 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmaccsu.nxv4i32.i16(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0) 2489 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl) 2490 ret <vscale x 4 x i32> %2 2491} 2492 2493define <vscale x 4 x i32> @vwmaccus_vx(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen %vl) { 2494; NOVLOPT-LABEL: vwmaccus_vx: 2495; NOVLOPT: # %bb.0: 2496; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, tu, ma 2497; NOVLOPT-NEXT: vwmaccus.vx v8, a0, v10 2498; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2499; NOVLOPT-NEXT: vadd.vv v8, v8, v8 2500; NOVLOPT-NEXT: ret 2501; 2502; VLOPT-LABEL: vwmaccus_vx: 2503; VLOPT: # %bb.0: 2504; VLOPT-NEXT: vsetvli zero, a1, e16, m1, tu, ma 2505; VLOPT-NEXT: vwmaccus.vx v8, a0, v10 2506; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2507; VLOPT-NEXT: vadd.vv v8, v8, v8 2508; VLOPT-NEXT: ret 2509 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmaccus.nxv4i32.i16(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0) 2510 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl) 2511 ret <vscale x 4 x i32> %2 2512} 2513 2514define <vscale x 4 x i32> @vmv_v_i(<vscale x 4 x i32> %a, i32 %x, iXLen %vl) { 2515; NOVLOPT-LABEL: vmv_v_i: 2516; NOVLOPT: # %bb.0: 2517; NOVLOPT-NEXT: vsetvli a0, zero, e32, m2, ta, ma 2518; NOVLOPT-NEXT: vmv.v.i v10, 5 2519; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2520; NOVLOPT-NEXT: vadd.vv v8, v10, v8 2521; NOVLOPT-NEXT: ret 2522; 2523; VLOPT-LABEL: vmv_v_i: 2524; VLOPT: # %bb.0: 2525; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2526; VLOPT-NEXT: vmv.v.i v10, 5 2527; VLOPT-NEXT: vadd.vv v8, v10, v8 2528; VLOPT-NEXT: ret 2529 %1 = call <vscale x 4 x i32> @llvm.riscv.vmv.v.x.nxv4i32(<vscale x 4 x i32> poison, i32 5, iXLen -1) 2530 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 2531 ret <vscale x 4 x i32> %2 2532} 2533 2534define <vscale x 4 x i32> @vmv_v_x(<vscale x 4 x i32> %a, i32 %x, iXLen %vl) { 2535; NOVLOPT-LABEL: vmv_v_x: 2536; NOVLOPT: # %bb.0: 2537; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 2538; NOVLOPT-NEXT: vmv.v.x v10, a0 2539; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2540; NOVLOPT-NEXT: vadd.vv v8, v10, v8 2541; NOVLOPT-NEXT: ret 2542; 2543; VLOPT-LABEL: vmv_v_x: 2544; VLOPT: # %bb.0: 2545; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 2546; VLOPT-NEXT: vmv.v.x v10, a0 2547; VLOPT-NEXT: vadd.vv v8, v10, v8 2548; VLOPT-NEXT: ret 2549 %1 = call <vscale x 4 x i32> @llvm.riscv.vmv.v.x.nxv4i32(<vscale x 4 x i32> poison, i32 %x, iXLen -1) 2550 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 2551 ret <vscale x 4 x i32> %2 2552} 2553 2554; The vmv.v.v is optimized away if we use a vadd as the user. 2555define <vscale x 1 x i8> @vmv_v_v(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, iXLen %vl) { 2556; NOVLOPT-LABEL: vmv_v_v: 2557; NOVLOPT: # %bb.0: 2558; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, tu, ma 2559; NOVLOPT-NEXT: vmv.v.v v8, v9 2560; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2561; NOVLOPT-NEXT: vmerge.vvm v8, v8, v10, v0 2562; NOVLOPT-NEXT: ret 2563; 2564; VLOPT-LABEL: vmv_v_v: 2565; VLOPT: # %bb.0: 2566; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, tu, ma 2567; VLOPT-NEXT: vmv.v.v v8, v9 2568; VLOPT-NEXT: vsetvli zero, zero, e8, mf8, ta, ma 2569; VLOPT-NEXT: vmerge.vvm v8, v8, v10, v0 2570; VLOPT-NEXT: ret 2571 %2 = call <vscale x 1 x i8> @llvm.riscv.vmv.v.v.nxv1i8.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, iXLen -1) 2572 %3 = call <vscale x 1 x i8> @llvm.riscv.vmerge.nxv1i8.nxv1i8(<vscale x 1 x i8> undef, <vscale x 1 x i8> %2, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, iXLen %vl) 2573 ret <vscale x 1 x i8> %3 2574} 2575 2576define <vscale x 4 x i32> @vwsll_vi(<vscale x 4 x i16> %a, <vscale x 4 x i32> %b, iXLen %vl) { 2577; NOVLOPT-LABEL: vwsll_vi: 2578; NOVLOPT: # %bb.0: 2579; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma 2580; NOVLOPT-NEXT: vwsll.vi v12, v8, 1 2581; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2582; NOVLOPT-NEXT: vadd.vv v8, v12, v10 2583; NOVLOPT-NEXT: ret 2584; 2585; VLOPT-LABEL: vwsll_vi: 2586; VLOPT: # %bb.0: 2587; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma 2588; VLOPT-NEXT: vwsll.vi v12, v8, 1 2589; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma 2590; VLOPT-NEXT: vadd.vv v8, v12, v10 2591; VLOPT-NEXT: ret 2592 %1 = call <vscale x 4 x i32> @llvm.riscv.vwsll.nxv4i32.nxv4i16(<vscale x 4 x i32> poison, <vscale x 4 x i16> %a,iXLen 1, iXLen -1) 2593 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 2594 ret <vscale x 4 x i32> %2 2595} 2596 2597define <vscale x 1 x i32> @vmand_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) { 2598; NOVLOPT-LABEL: vmand_mm: 2599; NOVLOPT: # %bb.0: 2600; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2601; NOVLOPT-NEXT: vmand.mm v8, v0, v8 2602; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2603; NOVLOPT-NEXT: vmand.mm v0, v0, v8 2604; NOVLOPT-NEXT: vmv1r.v v8, v9 2605; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2606; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2607; NOVLOPT-NEXT: ret 2608; 2609; VLOPT-LABEL: vmand_mm: 2610; VLOPT: # %bb.0: 2611; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2612; VLOPT-NEXT: vmand.mm v8, v0, v8 2613; VLOPT-NEXT: vmand.mm v0, v0, v8 2614; VLOPT-NEXT: vmv1r.v v8, v9 2615; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2616; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2617; VLOPT-NEXT: ret 2618 %1 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1) 2619 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2620 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2621 ret <vscale x 1 x i32> %3 2622} 2623 2624define <vscale x 1 x i32> @vmnand_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) { 2625; NOVLOPT-LABEL: vmnand_mm: 2626; NOVLOPT: # %bb.0: 2627; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2628; NOVLOPT-NEXT: vmnand.mm v8, v0, v8 2629; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2630; NOVLOPT-NEXT: vmand.mm v0, v0, v8 2631; NOVLOPT-NEXT: vmv1r.v v8, v9 2632; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2633; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2634; NOVLOPT-NEXT: ret 2635; 2636; VLOPT-LABEL: vmnand_mm: 2637; VLOPT: # %bb.0: 2638; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2639; VLOPT-NEXT: vmnand.mm v8, v0, v8 2640; VLOPT-NEXT: vmand.mm v0, v0, v8 2641; VLOPT-NEXT: vmv1r.v v8, v9 2642; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2643; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2644; VLOPT-NEXT: ret 2645 %1 = call <vscale x 1 x i1> @llvm.riscv.vmnand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1) 2646 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2647 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2648 ret <vscale x 1 x i32> %3 2649} 2650 2651define <vscale x 1 x i32> @vmandn_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) { 2652; NOVLOPT-LABEL: vmandn_mm: 2653; NOVLOPT: # %bb.0: 2654; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2655; NOVLOPT-NEXT: vmandn.mm v8, v0, v8 2656; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2657; NOVLOPT-NEXT: vmand.mm v0, v0, v8 2658; NOVLOPT-NEXT: vmv1r.v v8, v9 2659; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2660; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2661; NOVLOPT-NEXT: ret 2662; 2663; VLOPT-LABEL: vmandn_mm: 2664; VLOPT: # %bb.0: 2665; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2666; VLOPT-NEXT: vmandn.mm v8, v0, v8 2667; VLOPT-NEXT: vmand.mm v0, v0, v8 2668; VLOPT-NEXT: vmv1r.v v8, v9 2669; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2670; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2671; VLOPT-NEXT: ret 2672 %1 = call <vscale x 1 x i1> @llvm.riscv.vmandn.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1) 2673 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2674 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2675 ret <vscale x 1 x i32> %3 2676} 2677 2678define <vscale x 1 x i32> @vmxor_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) { 2679; NOVLOPT-LABEL: vmxor_mm: 2680; NOVLOPT: # %bb.0: 2681; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2682; NOVLOPT-NEXT: vmxor.mm v8, v0, v8 2683; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2684; NOVLOPT-NEXT: vmand.mm v0, v0, v8 2685; NOVLOPT-NEXT: vmv1r.v v8, v9 2686; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2687; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2688; NOVLOPT-NEXT: ret 2689; 2690; VLOPT-LABEL: vmxor_mm: 2691; VLOPT: # %bb.0: 2692; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2693; VLOPT-NEXT: vmxor.mm v8, v0, v8 2694; VLOPT-NEXT: vmand.mm v0, v0, v8 2695; VLOPT-NEXT: vmv1r.v v8, v9 2696; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2697; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2698; VLOPT-NEXT: ret 2699 %1 = call <vscale x 1 x i1> @llvm.riscv.vmxor.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1) 2700 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2701 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2702 ret <vscale x 1 x i32> %3 2703} 2704 2705define <vscale x 1 x i32> @vmor_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) { 2706; NOVLOPT-LABEL: vmor_mm: 2707; NOVLOPT: # %bb.0: 2708; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2709; NOVLOPT-NEXT: vmor.mm v8, v0, v8 2710; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2711; NOVLOPT-NEXT: vmand.mm v0, v0, v8 2712; NOVLOPT-NEXT: vmv1r.v v8, v9 2713; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2714; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2715; NOVLOPT-NEXT: ret 2716; 2717; VLOPT-LABEL: vmor_mm: 2718; VLOPT: # %bb.0: 2719; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2720; VLOPT-NEXT: vmor.mm v8, v0, v8 2721; VLOPT-NEXT: vmand.mm v0, v0, v8 2722; VLOPT-NEXT: vmv1r.v v8, v9 2723; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2724; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2725; VLOPT-NEXT: ret 2726 %1 = call <vscale x 1 x i1> @llvm.riscv.vmor.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1) 2727 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2728 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2729 ret <vscale x 1 x i32> %3 2730} 2731 2732 2733define <vscale x 1 x i32> @vmnor_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) { 2734; NOVLOPT-LABEL: vmnor_mm: 2735; NOVLOPT: # %bb.0: 2736; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2737; NOVLOPT-NEXT: vmnor.mm v8, v0, v8 2738; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2739; NOVLOPT-NEXT: vmand.mm v0, v0, v8 2740; NOVLOPT-NEXT: vmv1r.v v8, v9 2741; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2742; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2743; NOVLOPT-NEXT: ret 2744; 2745; VLOPT-LABEL: vmnor_mm: 2746; VLOPT: # %bb.0: 2747; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2748; VLOPT-NEXT: vmnor.mm v8, v0, v8 2749; VLOPT-NEXT: vmand.mm v0, v0, v8 2750; VLOPT-NEXT: vmv1r.v v8, v9 2751; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2752; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2753; VLOPT-NEXT: ret 2754 %1 = call <vscale x 1 x i1> @llvm.riscv.vmnor.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1) 2755 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2756 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2757 ret <vscale x 1 x i32> %3 2758} 2759 2760define <vscale x 1 x i32> @vmorn_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) { 2761; NOVLOPT-LABEL: vmorn_mm: 2762; NOVLOPT: # %bb.0: 2763; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2764; NOVLOPT-NEXT: vmorn.mm v8, v0, v8 2765; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2766; NOVLOPT-NEXT: vmand.mm v0, v0, v8 2767; NOVLOPT-NEXT: vmv1r.v v8, v9 2768; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2769; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2770; NOVLOPT-NEXT: ret 2771; 2772; VLOPT-LABEL: vmorn_mm: 2773; VLOPT: # %bb.0: 2774; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2775; VLOPT-NEXT: vmorn.mm v8, v0, v8 2776; VLOPT-NEXT: vmand.mm v0, v0, v8 2777; VLOPT-NEXT: vmv1r.v v8, v9 2778; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2779; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2780; VLOPT-NEXT: ret 2781 %1 = call <vscale x 1 x i1> @llvm.riscv.vmorn.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1) 2782 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2783 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2784 ret <vscale x 1 x i32> %3 2785} 2786 2787define <vscale x 1 x i32> @vmxnor_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) { 2788; NOVLOPT-LABEL: vmxnor_mm: 2789; NOVLOPT: # %bb.0: 2790; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2791; NOVLOPT-NEXT: vmxnor.mm v8, v0, v8 2792; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2793; NOVLOPT-NEXT: vmand.mm v0, v0, v8 2794; NOVLOPT-NEXT: vmv1r.v v8, v9 2795; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2796; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2797; NOVLOPT-NEXT: ret 2798; 2799; VLOPT-LABEL: vmxnor_mm: 2800; VLOPT: # %bb.0: 2801; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2802; VLOPT-NEXT: vmxnor.mm v8, v0, v8 2803; VLOPT-NEXT: vmand.mm v0, v0, v8 2804; VLOPT-NEXT: vmv1r.v v8, v9 2805; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2806; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t 2807; VLOPT-NEXT: ret 2808 %1 = call <vscale x 1 x i1> @llvm.riscv.vmxnor.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1) 2809 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2810 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2811 ret <vscale x 1 x i32> %3 2812} 2813 2814define <vscale x 1 x i32> @vmsbf_m(<vscale x 1 x i1> %a, <vscale x 1 x i32> %c, iXLen %vl) { 2815; NOVLOPT-LABEL: vmsbf_m: 2816; NOVLOPT: # %bb.0: 2817; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2818; NOVLOPT-NEXT: vmsbf.m v9, v0 2819; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2820; NOVLOPT-NEXT: vmand.mm v0, v0, v9 2821; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2822; NOVLOPT-NEXT: vadd.vv v8, v8, v8, v0.t 2823; NOVLOPT-NEXT: ret 2824; 2825; VLOPT-LABEL: vmsbf_m: 2826; VLOPT: # %bb.0: 2827; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2828; VLOPT-NEXT: vmsbf.m v9, v0 2829; VLOPT-NEXT: vmand.mm v0, v0, v9 2830; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2831; VLOPT-NEXT: vadd.vv v8, v8, v8, v0.t 2832; VLOPT-NEXT: ret 2833 %1 = call <vscale x 1 x i1> @llvm.riscv.vmsbf.nxv1i1(<vscale x 1 x i1> %a, iXLen -1) 2834 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2835 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2836 ret <vscale x 1 x i32> %3 2837} 2838 2839define <vscale x 1 x i32> @vmsif_m(<vscale x 1 x i1> %a, <vscale x 1 x i32> %c, iXLen %vl) { 2840; NOVLOPT-LABEL: vmsif_m: 2841; NOVLOPT: # %bb.0: 2842; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2843; NOVLOPT-NEXT: vmsif.m v9, v0 2844; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2845; NOVLOPT-NEXT: vmand.mm v0, v0, v9 2846; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2847; NOVLOPT-NEXT: vadd.vv v8, v8, v8, v0.t 2848; NOVLOPT-NEXT: ret 2849; 2850; VLOPT-LABEL: vmsif_m: 2851; VLOPT: # %bb.0: 2852; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2853; VLOPT-NEXT: vmsif.m v9, v0 2854; VLOPT-NEXT: vmand.mm v0, v0, v9 2855; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2856; VLOPT-NEXT: vadd.vv v8, v8, v8, v0.t 2857; VLOPT-NEXT: ret 2858 %1 = call <vscale x 1 x i1> @llvm.riscv.vmsif.nxv1i1(<vscale x 1 x i1> %a, iXLen -1) 2859 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2860 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2861 ret <vscale x 1 x i32> %3 2862} 2863 2864define <vscale x 1 x i32> @vmsof_m(<vscale x 1 x i1> %a, <vscale x 1 x i32> %c, iXLen %vl) { 2865; NOVLOPT-LABEL: vmsof_m: 2866; NOVLOPT: # %bb.0: 2867; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 2868; NOVLOPT-NEXT: vmsof.m v9, v0 2869; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2870; NOVLOPT-NEXT: vmand.mm v0, v0, v9 2871; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2872; NOVLOPT-NEXT: vadd.vv v8, v8, v8, v0.t 2873; NOVLOPT-NEXT: ret 2874; 2875; VLOPT-LABEL: vmsof_m: 2876; VLOPT: # %bb.0: 2877; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 2878; VLOPT-NEXT: vmsof.m v9, v0 2879; VLOPT-NEXT: vmand.mm v0, v0, v9 2880; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu 2881; VLOPT-NEXT: vadd.vv v8, v8, v8, v0.t 2882; VLOPT-NEXT: ret 2883 %1 = call <vscale x 1 x i1> @llvm.riscv.vmsof.nxv1i1(<vscale x 1 x i1> %a, iXLen -1) 2884 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl) 2885 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0) 2886 ret <vscale x 1 x i32> %3 2887} 2888 2889define <vscale x 4 x i32> @viota_m(<vscale x 4 x i1> %a, <vscale x 4 x i32> %c, iXLen %vl) { 2890; NOVLOPT-LABEL: viota_m: 2891; NOVLOPT: # %bb.0: 2892; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 2893; NOVLOPT-NEXT: viota.m v10, v0 2894; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2895; NOVLOPT-NEXT: vadd.vv v8, v10, v8 2896; NOVLOPT-NEXT: ret 2897; 2898; VLOPT-LABEL: viota_m: 2899; VLOPT: # %bb.0: 2900; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2901; VLOPT-NEXT: viota.m v10, v0 2902; VLOPT-NEXT: vadd.vv v8, v10, v8 2903; VLOPT-NEXT: ret 2904 %1 = call <vscale x 4 x i32> @llvm.riscv.viota.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %a, iXLen -1) 2905 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %c, iXLen %vl) 2906 ret <vscale x 4 x i32> %2 2907} 2908 2909define <vscale x 4 x i32> @vid.v(<vscale x 4 x i32> %c, iXLen %vl) { 2910; NOVLOPT-LABEL: vid.v: 2911; NOVLOPT: # %bb.0: 2912; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 2913; NOVLOPT-NEXT: vid.v v10 2914; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2915; NOVLOPT-NEXT: vadd.vv v8, v10, v8 2916; NOVLOPT-NEXT: ret 2917; 2918; VLOPT-LABEL: vid.v: 2919; VLOPT: # %bb.0: 2920; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2921; VLOPT-NEXT: vid.v v10 2922; VLOPT-NEXT: vadd.vv v8, v10, v8 2923; VLOPT-NEXT: ret 2924 %1 = call <vscale x 4 x i32> @llvm.riscv.vid.nxv4i32(<vscale x 4 x i32> poison, iXLen -1) 2925 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %c, iXLen %vl) 2926 ret <vscale x 4 x i32> %2 2927} 2928 2929define <vscale x 4 x float> @vfadd_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 2930; NOVLOPT-LABEL: vfadd_vv: 2931; NOVLOPT: # %bb.0: 2932; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 2933; NOVLOPT-NEXT: vfadd.vv v8, v8, v10 2934; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2935; NOVLOPT-NEXT: vfadd.vv v8, v8, v10 2936; NOVLOPT-NEXT: ret 2937; 2938; VLOPT-LABEL: vfadd_vv: 2939; VLOPT: # %bb.0: 2940; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2941; VLOPT-NEXT: vfadd.vv v8, v8, v10 2942; VLOPT-NEXT: vfadd.vv v8, v8, v10 2943; VLOPT-NEXT: ret 2944 %1 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1) 2945 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl) 2946 ret <vscale x 4 x float> %2 2947} 2948 2949define <vscale x 4 x float> @vfadd_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 2950; NOVLOPT-LABEL: vfadd_vf: 2951; NOVLOPT: # %bb.0: 2952; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 2953; NOVLOPT-NEXT: vfadd.vf v10, v8, fa0 2954; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2955; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 2956; NOVLOPT-NEXT: ret 2957; 2958; VLOPT-LABEL: vfadd_vf: 2959; VLOPT: # %bb.0: 2960; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2961; VLOPT-NEXT: vfadd.vf v10, v8, fa0 2962; VLOPT-NEXT: vfadd.vv v8, v10, v8 2963; VLOPT-NEXT: ret 2964 %1 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1) 2965 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 2966 ret <vscale x 4 x float> %2 2967} 2968 2969define <vscale x 4 x float> @vfsub_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 2970; NOVLOPT-LABEL: vfsub_vv: 2971; NOVLOPT: # %bb.0: 2972; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 2973; NOVLOPT-NEXT: vfsub.vv v8, v8, v10 2974; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2975; NOVLOPT-NEXT: vfadd.vv v8, v8, v10 2976; NOVLOPT-NEXT: ret 2977; 2978; VLOPT-LABEL: vfsub_vv: 2979; VLOPT: # %bb.0: 2980; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2981; VLOPT-NEXT: vfsub.vv v8, v8, v10 2982; VLOPT-NEXT: vfadd.vv v8, v8, v10 2983; VLOPT-NEXT: ret 2984 %1 = call <vscale x 4 x float> @llvm.riscv.vfsub.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1) 2985 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl) 2986 ret <vscale x 4 x float> %2 2987} 2988 2989define <vscale x 4 x float> @vfsub_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 2990; NOVLOPT-LABEL: vfsub_vf: 2991; NOVLOPT: # %bb.0: 2992; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 2993; NOVLOPT-NEXT: vfsub.vf v10, v8, fa0 2994; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 2995; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 2996; NOVLOPT-NEXT: ret 2997; 2998; VLOPT-LABEL: vfsub_vf: 2999; VLOPT: # %bb.0: 3000; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3001; VLOPT-NEXT: vfsub.vf v10, v8, fa0 3002; VLOPT-NEXT: vfadd.vv v8, v10, v8 3003; VLOPT-NEXT: ret 3004 %1 = call <vscale x 4 x float> @llvm.riscv.vfsub.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1) 3005 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 3006 ret <vscale x 4 x float> %2 3007} 3008 3009define <vscale x 4 x float> @vfrsub_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3010; NOVLOPT-LABEL: vfrsub_vf: 3011; NOVLOPT: # %bb.0: 3012; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3013; NOVLOPT-NEXT: vfrsub.vf v10, v8, fa0 3014; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3015; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 3016; NOVLOPT-NEXT: ret 3017; 3018; VLOPT-LABEL: vfrsub_vf: 3019; VLOPT: # %bb.0: 3020; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3021; VLOPT-NEXT: vfrsub.vf v10, v8, fa0 3022; VLOPT-NEXT: vfadd.vv v8, v10, v8 3023; VLOPT-NEXT: ret 3024 %1 = call <vscale x 4 x float> @llvm.riscv.vfrsub.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1) 3025 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 3026 ret <vscale x 4 x float> %2 3027} 3028 3029define <vscale x 4 x double> @vfwadd_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 3030; NOVLOPT-LABEL: vfwadd_vv: 3031; NOVLOPT: # %bb.0: 3032; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3033; NOVLOPT-NEXT: vfwadd.vv v12, v8, v10 3034; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 3035; NOVLOPT-NEXT: vfadd.vv v8, v12, v12 3036; NOVLOPT-NEXT: ret 3037; 3038; VLOPT-LABEL: vfwadd_vv: 3039; VLOPT: # %bb.0: 3040; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3041; VLOPT-NEXT: vfwadd.vv v12, v8, v10 3042; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 3043; VLOPT-NEXT: vfadd.vv v8, v12, v12 3044; VLOPT-NEXT: ret 3045 %1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1) 3046 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl) 3047 ret <vscale x 4 x double> %2 3048} 3049 3050define <vscale x 4 x double> @vfwadd_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3051; NOVLOPT-LABEL: vfwadd_vf: 3052; NOVLOPT: # %bb.0: 3053; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3054; NOVLOPT-NEXT: vfwadd.vf v12, v8, fa0 3055; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 3056; NOVLOPT-NEXT: vfadd.vv v8, v12, v12 3057; NOVLOPT-NEXT: ret 3058; 3059; VLOPT-LABEL: vfwadd_vf: 3060; VLOPT: # %bb.0: 3061; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3062; VLOPT-NEXT: vfwadd.vf v12, v8, fa0 3063; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 3064; VLOPT-NEXT: vfadd.vv v8, v12, v12 3065; VLOPT-NEXT: ret 3066 %1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1) 3067 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl) 3068 ret <vscale x 4 x double> %2 3069} 3070 3071define <vscale x 4 x double> @vfwsub_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 3072; NOVLOPT-LABEL: vfwsub_vv: 3073; NOVLOPT: # %bb.0: 3074; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3075; NOVLOPT-NEXT: vfwsub.vv v12, v8, v10 3076; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 3077; NOVLOPT-NEXT: vfadd.vv v8, v12, v12 3078; NOVLOPT-NEXT: ret 3079; 3080; VLOPT-LABEL: vfwsub_vv: 3081; VLOPT: # %bb.0: 3082; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3083; VLOPT-NEXT: vfwsub.vv v12, v8, v10 3084; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 3085; VLOPT-NEXT: vfadd.vv v8, v12, v12 3086; VLOPT-NEXT: ret 3087 %1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1) 3088 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl) 3089 ret <vscale x 4 x double> %2 3090} 3091 3092define <vscale x 4 x double> @vfwsub_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3093; NOVLOPT-LABEL: vfwsub_vf: 3094; NOVLOPT: # %bb.0: 3095; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3096; NOVLOPT-NEXT: vfwsub.vf v12, v8, fa0 3097; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 3098; NOVLOPT-NEXT: vfadd.vv v8, v12, v12 3099; NOVLOPT-NEXT: ret 3100; 3101; VLOPT-LABEL: vfwsub_vf: 3102; VLOPT: # %bb.0: 3103; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3104; VLOPT-NEXT: vfwsub.vf v12, v8, fa0 3105; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 3106; VLOPT-NEXT: vfadd.vv v8, v12, v12 3107; VLOPT-NEXT: ret 3108 %1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1) 3109 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl) 3110 ret <vscale x 4 x double> %2 3111} 3112 3113define <vscale x 4 x double> @vfwadd_wv(<vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen %vl) { 3114; NOVLOPT-LABEL: vfwadd_wv: 3115; NOVLOPT: # %bb.0: 3116; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3117; NOVLOPT-NEXT: vfwadd.wv v8, v8, v12 3118; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 3119; NOVLOPT-NEXT: vfadd.vv v8, v8, v8 3120; NOVLOPT-NEXT: ret 3121; 3122; VLOPT-LABEL: vfwadd_wv: 3123; VLOPT: # %bb.0: 3124; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3125; VLOPT-NEXT: vfwadd.wv v8, v8, v12 3126; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 3127; VLOPT-NEXT: vfadd.vv v8, v8, v8 3128; VLOPT-NEXT: ret 3129 %1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.w.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1) 3130 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl) 3131 ret <vscale x 4 x double> %2 3132} 3133 3134define <vscale x 4 x double> @vfwadd_wf(<vscale x 4 x double> %a, float %b, iXLen %vl) { 3135; NOVLOPT-LABEL: vfwadd_wf: 3136; NOVLOPT: # %bb.0: 3137; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3138; NOVLOPT-NEXT: vfwadd.wf v8, v8, fa0 3139; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 3140; NOVLOPT-NEXT: vfadd.vv v8, v8, v8 3141; NOVLOPT-NEXT: ret 3142; 3143; VLOPT-LABEL: vfwadd_wf: 3144; VLOPT: # %bb.0: 3145; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3146; VLOPT-NEXT: vfwadd.wf v8, v8, fa0 3147; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 3148; VLOPT-NEXT: vfadd.vv v8, v8, v8 3149; VLOPT-NEXT: ret 3150 %1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.w.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, float %b, iXLen 7, iXLen -1) 3151 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl) 3152 ret <vscale x 4 x double> %2 3153} 3154 3155define <vscale x 4 x double> @vfwsub_wv(<vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen %vl) { 3156; NOVLOPT-LABEL: vfwsub_wv: 3157; NOVLOPT: # %bb.0: 3158; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3159; NOVLOPT-NEXT: vfwsub.wv v8, v8, v12 3160; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 3161; NOVLOPT-NEXT: vfadd.vv v8, v8, v8 3162; NOVLOPT-NEXT: ret 3163; 3164; VLOPT-LABEL: vfwsub_wv: 3165; VLOPT: # %bb.0: 3166; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3167; VLOPT-NEXT: vfwsub.wv v8, v8, v12 3168; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 3169; VLOPT-NEXT: vfadd.vv v8, v8, v8 3170; VLOPT-NEXT: ret 3171 %1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.w.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1) 3172 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl) 3173 ret <vscale x 4 x double> %2 3174} 3175 3176define <vscale x 4 x double> @vfwsub_wf(<vscale x 4 x double> %a, float %b, iXLen %vl) { 3177; NOVLOPT-LABEL: vfwsub_wf: 3178; NOVLOPT: # %bb.0: 3179; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3180; NOVLOPT-NEXT: vfwsub.wf v8, v8, fa0 3181; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 3182; NOVLOPT-NEXT: vfadd.vv v8, v8, v8 3183; NOVLOPT-NEXT: ret 3184; 3185; VLOPT-LABEL: vfwsub_wf: 3186; VLOPT: # %bb.0: 3187; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3188; VLOPT-NEXT: vfwsub.wf v8, v8, fa0 3189; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 3190; VLOPT-NEXT: vfadd.vv v8, v8, v8 3191; VLOPT-NEXT: ret 3192 %1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.w.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, float %b, iXLen 7, iXLen -1) 3193 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl) 3194 ret <vscale x 4 x double> %2 3195} 3196 3197define <vscale x 4 x float> @vfmul_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 3198; NOVLOPT-LABEL: vfmul_vv: 3199; NOVLOPT: # %bb.0: 3200; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3201; NOVLOPT-NEXT: vfmul.vv v8, v8, v10 3202; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3203; NOVLOPT-NEXT: vfadd.vv v8, v8, v10 3204; NOVLOPT-NEXT: ret 3205; 3206; VLOPT-LABEL: vfmul_vv: 3207; VLOPT: # %bb.0: 3208; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3209; VLOPT-NEXT: vfmul.vv v8, v8, v10 3210; VLOPT-NEXT: vfadd.vv v8, v8, v10 3211; VLOPT-NEXT: ret 3212 %1 = call <vscale x 4 x float> @llvm.riscv.vfmul.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1) 3213 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl) 3214 ret <vscale x 4 x float> %2 3215} 3216 3217define <vscale x 4 x float> @vfmul_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3218; NOVLOPT-LABEL: vfmul_vf: 3219; NOVLOPT: # %bb.0: 3220; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3221; NOVLOPT-NEXT: vfmul.vf v10, v8, fa0 3222; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3223; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 3224; NOVLOPT-NEXT: ret 3225; 3226; VLOPT-LABEL: vfmul_vf: 3227; VLOPT: # %bb.0: 3228; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3229; VLOPT-NEXT: vfmul.vf v10, v8, fa0 3230; VLOPT-NEXT: vfadd.vv v8, v10, v8 3231; VLOPT-NEXT: ret 3232 %1 = call <vscale x 4 x float> @llvm.riscv.vfmul.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1) 3233 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 3234 ret <vscale x 4 x float> %2 3235} 3236 3237define <vscale x 4 x float> @vfdiv_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 3238; NOVLOPT-LABEL: vfdiv_vv: 3239; NOVLOPT: # %bb.0: 3240; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3241; NOVLOPT-NEXT: vfdiv.vv v8, v8, v10 3242; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3243; NOVLOPT-NEXT: vfadd.vv v8, v8, v10 3244; NOVLOPT-NEXT: ret 3245; 3246; VLOPT-LABEL: vfdiv_vv: 3247; VLOPT: # %bb.0: 3248; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3249; VLOPT-NEXT: vfdiv.vv v8, v8, v10 3250; VLOPT-NEXT: vfadd.vv v8, v8, v10 3251; VLOPT-NEXT: ret 3252 %1 = call <vscale x 4 x float> @llvm.riscv.vfdiv.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1) 3253 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl) 3254 ret <vscale x 4 x float> %2 3255} 3256 3257define <vscale x 4 x float> @vfdiv_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3258; NOVLOPT-LABEL: vfdiv_vf: 3259; NOVLOPT: # %bb.0: 3260; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3261; NOVLOPT-NEXT: vfdiv.vf v10, v8, fa0 3262; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3263; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 3264; NOVLOPT-NEXT: ret 3265; 3266; VLOPT-LABEL: vfdiv_vf: 3267; VLOPT: # %bb.0: 3268; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3269; VLOPT-NEXT: vfdiv.vf v10, v8, fa0 3270; VLOPT-NEXT: vfadd.vv v8, v10, v8 3271; VLOPT-NEXT: ret 3272 %1 = call <vscale x 4 x float> @llvm.riscv.vfdiv.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1) 3273 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 3274 ret <vscale x 4 x float> %2 3275} 3276 3277define <vscale x 4 x float> @vfrdiv_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3278; NOVLOPT-LABEL: vfrdiv_vf: 3279; NOVLOPT: # %bb.0: 3280; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3281; NOVLOPT-NEXT: vfrdiv.vf v10, v8, fa0 3282; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3283; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 3284; NOVLOPT-NEXT: ret 3285; 3286; VLOPT-LABEL: vfrdiv_vf: 3287; VLOPT: # %bb.0: 3288; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3289; VLOPT-NEXT: vfrdiv.vf v10, v8, fa0 3290; VLOPT-NEXT: vfadd.vv v8, v10, v8 3291; VLOPT-NEXT: ret 3292 %1 = call <vscale x 4 x float> @llvm.riscv.vfrdiv.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1) 3293 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 3294 ret <vscale x 4 x float> %2 3295} 3296 3297define <vscale x 4 x double> @vfwmul_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 3298; NOVLOPT-LABEL: vfwmul_vv: 3299; NOVLOPT: # %bb.0: 3300; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3301; NOVLOPT-NEXT: vfwmul.vv v12, v8, v10 3302; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 3303; NOVLOPT-NEXT: vfadd.vv v8, v12, v12 3304; NOVLOPT-NEXT: ret 3305; 3306; VLOPT-LABEL: vfwmul_vv: 3307; VLOPT: # %bb.0: 3308; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3309; VLOPT-NEXT: vfwmul.vv v12, v8, v10 3310; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 3311; VLOPT-NEXT: vfadd.vv v8, v12, v12 3312; VLOPT-NEXT: ret 3313 %1 = call <vscale x 4 x double> @llvm.riscv.vfwmul.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1) 3314 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl) 3315 ret <vscale x 4 x double> %2 3316} 3317 3318define <vscale x 4 x double> @vfwmul_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3319; NOVLOPT-LABEL: vfwmul_vf: 3320; NOVLOPT: # %bb.0: 3321; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3322; NOVLOPT-NEXT: vfwmul.vf v12, v8, fa0 3323; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma 3324; NOVLOPT-NEXT: vfadd.vv v8, v12, v12 3325; NOVLOPT-NEXT: ret 3326; 3327; VLOPT-LABEL: vfwmul_vf: 3328; VLOPT: # %bb.0: 3329; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3330; VLOPT-NEXT: vfwmul.vf v12, v8, fa0 3331; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma 3332; VLOPT-NEXT: vfadd.vv v8, v12, v12 3333; VLOPT-NEXT: ret 3334 %1 = call <vscale x 4 x double> @llvm.riscv.vfwmul.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1) 3335 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl) 3336 ret <vscale x 4 x double> %2 3337} 3338 3339define <vscale x 4 x i1> @vmfeq_vf(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, float%c, iXLen %vl) { 3340; NOVLOPT-LABEL: vmfeq_vf: 3341; NOVLOPT: # %bb.0: 3342; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3343; NOVLOPT-NEXT: vmfeq.vf v10, v8, fa0 3344; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 3345; NOVLOPT-NEXT: vmand.mm v0, v10, v0 3346; NOVLOPT-NEXT: ret 3347; 3348; VLOPT-LABEL: vmfeq_vf: 3349; VLOPT: # %bb.0: 3350; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3351; VLOPT-NEXT: vmfeq.vf v10, v8, fa0 3352; VLOPT-NEXT: vmand.mm v0, v10, v0 3353; VLOPT-NEXT: ret 3354 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfeq.nxv4f32.f32(<vscale x 4 x float> %a, float %c, iXLen -1) 3355 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 3356 ret <vscale x 4 x i1> %2 3357} 3358 3359define <vscale x 4 x i1> @vmfeq_vv(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, <vscale x 4 x float> %c, iXLen %vl) { 3360; NOVLOPT-LABEL: vmfeq_vv: 3361; NOVLOPT: # %bb.0: 3362; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3363; NOVLOPT-NEXT: vmfeq.vv v12, v8, v10 3364; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 3365; NOVLOPT-NEXT: vmand.mm v0, v12, v0 3366; NOVLOPT-NEXT: ret 3367; 3368; VLOPT-LABEL: vmfeq_vv: 3369; VLOPT: # %bb.0: 3370; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3371; VLOPT-NEXT: vmfeq.vv v12, v8, v10 3372; VLOPT-NEXT: vmand.mm v0, v12, v0 3373; VLOPT-NEXT: ret 3374 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfeq.nxv4f32.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %c, iXLen -1) 3375 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 3376 ret <vscale x 4 x i1> %2 3377} 3378 3379define <vscale x 4 x i1> @vmfne_vf(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, float%c, iXLen %vl) { 3380; NOVLOPT-LABEL: vmfne_vf: 3381; NOVLOPT: # %bb.0: 3382; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3383; NOVLOPT-NEXT: vmfne.vf v10, v8, fa0 3384; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 3385; NOVLOPT-NEXT: vmand.mm v0, v10, v0 3386; NOVLOPT-NEXT: ret 3387; 3388; VLOPT-LABEL: vmfne_vf: 3389; VLOPT: # %bb.0: 3390; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3391; VLOPT-NEXT: vmfne.vf v10, v8, fa0 3392; VLOPT-NEXT: vmand.mm v0, v10, v0 3393; VLOPT-NEXT: ret 3394 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfne.nxv4f32.f32(<vscale x 4 x float> %a, float %c, iXLen -1) 3395 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 3396 ret <vscale x 4 x i1> %2 3397} 3398 3399define <vscale x 4 x i1> @vmfne_vv(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, <vscale x 4 x float> %c, iXLen %vl) { 3400; NOVLOPT-LABEL: vmfne_vv: 3401; NOVLOPT: # %bb.0: 3402; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3403; NOVLOPT-NEXT: vmfne.vv v12, v8, v10 3404; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 3405; NOVLOPT-NEXT: vmand.mm v0, v12, v0 3406; NOVLOPT-NEXT: ret 3407; 3408; VLOPT-LABEL: vmfne_vv: 3409; VLOPT: # %bb.0: 3410; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3411; VLOPT-NEXT: vmfne.vv v12, v8, v10 3412; VLOPT-NEXT: vmand.mm v0, v12, v0 3413; VLOPT-NEXT: ret 3414 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfne.nxv4f32.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %c, iXLen -1) 3415 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 3416 ret <vscale x 4 x i1> %2 3417} 3418 3419define <vscale x 4 x i1> @vmflt_vf(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, float%c, iXLen %vl) { 3420; NOVLOPT-LABEL: vmflt_vf: 3421; NOVLOPT: # %bb.0: 3422; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3423; NOVLOPT-NEXT: vmflt.vf v10, v8, fa0 3424; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 3425; NOVLOPT-NEXT: vmand.mm v0, v10, v0 3426; NOVLOPT-NEXT: ret 3427; 3428; VLOPT-LABEL: vmflt_vf: 3429; VLOPT: # %bb.0: 3430; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3431; VLOPT-NEXT: vmflt.vf v10, v8, fa0 3432; VLOPT-NEXT: vmand.mm v0, v10, v0 3433; VLOPT-NEXT: ret 3434 %1 = call <vscale x 4 x i1> @llvm.riscv.vmflt.nxv4f32.f32(<vscale x 4 x float> %a, float %c, iXLen -1) 3435 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 3436 ret <vscale x 4 x i1> %2 3437} 3438 3439define <vscale x 4 x i1> @vmflt_vv(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, <vscale x 4 x float> %c, iXLen %vl) { 3440; NOVLOPT-LABEL: vmflt_vv: 3441; NOVLOPT: # %bb.0: 3442; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3443; NOVLOPT-NEXT: vmflt.vv v12, v8, v10 3444; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 3445; NOVLOPT-NEXT: vmand.mm v0, v12, v0 3446; NOVLOPT-NEXT: ret 3447; 3448; VLOPT-LABEL: vmflt_vv: 3449; VLOPT: # %bb.0: 3450; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3451; VLOPT-NEXT: vmflt.vv v12, v8, v10 3452; VLOPT-NEXT: vmand.mm v0, v12, v0 3453; VLOPT-NEXT: ret 3454 %1 = call <vscale x 4 x i1> @llvm.riscv.vmflt.nxv4f32.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %c, iXLen -1) 3455 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 3456 ret <vscale x 4 x i1> %2 3457} 3458 3459define <vscale x 4 x i1> @vmfle_vf(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, float%c, iXLen %vl) { 3460; NOVLOPT-LABEL: vmfle_vf: 3461; NOVLOPT: # %bb.0: 3462; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3463; NOVLOPT-NEXT: vmfle.vf v10, v8, fa0 3464; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 3465; NOVLOPT-NEXT: vmand.mm v0, v10, v0 3466; NOVLOPT-NEXT: ret 3467; 3468; VLOPT-LABEL: vmfle_vf: 3469; VLOPT: # %bb.0: 3470; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3471; VLOPT-NEXT: vmfle.vf v10, v8, fa0 3472; VLOPT-NEXT: vmand.mm v0, v10, v0 3473; VLOPT-NEXT: ret 3474 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfle.nxv4f32.f32(<vscale x 4 x float> %a, float %c, iXLen -1) 3475 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 3476 ret <vscale x 4 x i1> %2 3477} 3478 3479define <vscale x 4 x i1> @vmfle_vv(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, <vscale x 4 x float> %c, iXLen %vl) { 3480; NOVLOPT-LABEL: vmfle_vv: 3481; NOVLOPT: # %bb.0: 3482; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3483; NOVLOPT-NEXT: vmfle.vv v12, v8, v10 3484; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 3485; NOVLOPT-NEXT: vmand.mm v0, v12, v0 3486; NOVLOPT-NEXT: ret 3487; 3488; VLOPT-LABEL: vmfle_vv: 3489; VLOPT: # %bb.0: 3490; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3491; VLOPT-NEXT: vmfle.vv v12, v8, v10 3492; VLOPT-NEXT: vmand.mm v0, v12, v0 3493; VLOPT-NEXT: ret 3494 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfle.nxv4f32.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %c, iXLen -1) 3495 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 3496 ret <vscale x 4 x i1> %2 3497} 3498 3499define <vscale x 4 x i1> @vmfgt_vf(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, float%c, iXLen %vl) { 3500; NOVLOPT-LABEL: vmfgt_vf: 3501; NOVLOPT: # %bb.0: 3502; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3503; NOVLOPT-NEXT: vmfgt.vf v10, v8, fa0 3504; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 3505; NOVLOPT-NEXT: vmand.mm v0, v10, v0 3506; NOVLOPT-NEXT: ret 3507; 3508; VLOPT-LABEL: vmfgt_vf: 3509; VLOPT: # %bb.0: 3510; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3511; VLOPT-NEXT: vmfgt.vf v10, v8, fa0 3512; VLOPT-NEXT: vmand.mm v0, v10, v0 3513; VLOPT-NEXT: ret 3514 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfgt.nxv4f32.f32(<vscale x 4 x float> %a, float %c, iXLen -1) 3515 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 3516 ret <vscale x 4 x i1> %2 3517} 3518 3519define <vscale x 4 x i1> @vmfgt_vv(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, <vscale x 4 x float> %c, iXLen %vl) { 3520; NOVLOPT-LABEL: vmfgt_vv: 3521; NOVLOPT: # %bb.0: 3522; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3523; NOVLOPT-NEXT: vmflt.vv v12, v10, v8 3524; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 3525; NOVLOPT-NEXT: vmand.mm v0, v12, v0 3526; NOVLOPT-NEXT: ret 3527; 3528; VLOPT-LABEL: vmfgt_vv: 3529; VLOPT: # %bb.0: 3530; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3531; VLOPT-NEXT: vmflt.vv v12, v10, v8 3532; VLOPT-NEXT: vmand.mm v0, v12, v0 3533; VLOPT-NEXT: ret 3534 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfgt.nxv4f32.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %c, iXLen -1) 3535 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl) 3536 ret <vscale x 4 x i1> %2 3537} 3538 3539define <vscale x 4 x i32> @vmerge_vvm(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %c, iXLen %vl) { 3540; NOVLOPT-LABEL: vmerge_vvm: 3541; NOVLOPT: # %bb.0: 3542; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3543; NOVLOPT-NEXT: vmerge.vvm v8, v8, v10, v0 3544; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3545; NOVLOPT-NEXT: vadd.vv v8, v8, v10 3546; NOVLOPT-NEXT: ret 3547; 3548; VLOPT-LABEL: vmerge_vvm: 3549; VLOPT: # %bb.0: 3550; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3551; VLOPT-NEXT: vmerge.vvm v8, v8, v10, v0 3552; VLOPT-NEXT: vadd.vv v8, v8, v10 3553; VLOPT-NEXT: ret 3554 %1 = call <vscale x 4 x i32> @llvm.riscv.vmerge.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %c, iXLen -1) 3555 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 3556 ret <vscale x 4 x i32> %2 3557} 3558 3559define <vscale x 4 x i32> @vmerge_vxm(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i1> %c, iXLen %vl) { 3560; NOVLOPT-LABEL: vmerge_vxm: 3561; NOVLOPT: # %bb.0: 3562; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 3563; NOVLOPT-NEXT: vmerge.vxm v8, v8, a0, v0 3564; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3565; NOVLOPT-NEXT: vadd.vv v8, v8, v8 3566; NOVLOPT-NEXT: ret 3567; 3568; VLOPT-LABEL: vmerge_vxm: 3569; VLOPT: # %bb.0: 3570; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3571; VLOPT-NEXT: vmerge.vxm v8, v8, a0, v0 3572; VLOPT-NEXT: vadd.vv v8, v8, v8 3573; VLOPT-NEXT: ret 3574 %1 = call <vscale x 4 x i32> @llvm.riscv.vmerge.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i1> %c, iXLen -1) 3575 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl) 3576 ret <vscale x 4 x i32> %2 3577} 3578 3579define <vscale x 4 x i32> @vmerge_vim(<vscale x 4 x i32> %a, <vscale x 4 x i1> %c, iXLen %vl) { 3580; NOVLOPT-LABEL: vmerge_vim: 3581; NOVLOPT: # %bb.0: 3582; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3583; NOVLOPT-NEXT: vmerge.vim v8, v8, 9, v0 3584; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3585; NOVLOPT-NEXT: vadd.vv v8, v8, v8 3586; NOVLOPT-NEXT: ret 3587; 3588; VLOPT-LABEL: vmerge_vim: 3589; VLOPT: # %bb.0: 3590; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3591; VLOPT-NEXT: vmerge.vim v8, v8, 9, v0 3592; VLOPT-NEXT: vadd.vv v8, v8, v8 3593; VLOPT-NEXT: ret 3594 %1 = call <vscale x 4 x i32> @llvm.riscv.vmerge.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 9, <vscale x 4 x i1> %c, iXLen -1) 3595 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl) 3596 ret <vscale x 4 x i32> %2 3597} 3598 3599define <vscale x 4 x i32> @vadc_vvm(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %c, iXLen %vl) { 3600; NOVLOPT-LABEL: vadc_vvm: 3601; NOVLOPT: # %bb.0: 3602; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3603; NOVLOPT-NEXT: vadc.vvm v8, v8, v10, v0 3604; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3605; NOVLOPT-NEXT: vadd.vv v8, v8, v10 3606; NOVLOPT-NEXT: ret 3607; 3608; VLOPT-LABEL: vadc_vvm: 3609; VLOPT: # %bb.0: 3610; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3611; VLOPT-NEXT: vadc.vvm v8, v8, v10, v0 3612; VLOPT-NEXT: vadd.vv v8, v8, v10 3613; VLOPT-NEXT: ret 3614 %1 = call <vscale x 4 x i32> @llvm.riscv.vadc.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %c, iXLen -1) 3615 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 3616 ret <vscale x 4 x i32> %2 3617} 3618 3619define <vscale x 4 x i32> @vadc_vxm(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i1> %c, iXLen %vl) { 3620; NOVLOPT-LABEL: vadc_vxm: 3621; NOVLOPT: # %bb.0: 3622; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 3623; NOVLOPT-NEXT: vadc.vxm v8, v8, a0, v0 3624; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3625; NOVLOPT-NEXT: vadd.vv v8, v8, v8 3626; NOVLOPT-NEXT: ret 3627; 3628; VLOPT-LABEL: vadc_vxm: 3629; VLOPT: # %bb.0: 3630; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3631; VLOPT-NEXT: vadc.vxm v8, v8, a0, v0 3632; VLOPT-NEXT: vadd.vv v8, v8, v8 3633; VLOPT-NEXT: ret 3634 %1 = call <vscale x 4 x i32> @llvm.riscv.vadc.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i1> %c, iXLen -1) 3635 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl) 3636 ret <vscale x 4 x i32> %2 3637} 3638 3639define <vscale x 4 x i32> @vadc_vim(<vscale x 4 x i32> %a, <vscale x 4 x i1> %c, iXLen %vl) { 3640; NOVLOPT-LABEL: vadc_vim: 3641; NOVLOPT: # %bb.0: 3642; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3643; NOVLOPT-NEXT: vadc.vim v8, v8, 9, v0 3644; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3645; NOVLOPT-NEXT: vadd.vv v8, v8, v8 3646; NOVLOPT-NEXT: ret 3647; 3648; VLOPT-LABEL: vadc_vim: 3649; VLOPT: # %bb.0: 3650; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3651; VLOPT-NEXT: vadc.vim v8, v8, 9, v0 3652; VLOPT-NEXT: vadd.vv v8, v8, v8 3653; VLOPT-NEXT: ret 3654 %1 = call <vscale x 4 x i32> @llvm.riscv.vadc.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 9, <vscale x 4 x i1> %c, iXLen -1) 3655 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl) 3656 ret <vscale x 4 x i32> %2 3657} 3658 3659define <vscale x 4 x i32> @vaadd_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 3660; NOVLOPT-LABEL: vaadd_vv: 3661; NOVLOPT: # %bb.0: 3662; NOVLOPT-NEXT: csrwi vxrm, 0 3663; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3664; NOVLOPT-NEXT: vaadd.vv v8, v8, v10 3665; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3666; NOVLOPT-NEXT: vadd.vv v8, v8, v10 3667; NOVLOPT-NEXT: ret 3668; 3669; VLOPT-LABEL: vaadd_vv: 3670; VLOPT: # %bb.0: 3671; VLOPT-NEXT: csrwi vxrm, 0 3672; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3673; VLOPT-NEXT: vaadd.vv v8, v8, v10 3674; VLOPT-NEXT: vadd.vv v8, v8, v10 3675; VLOPT-NEXT: ret 3676 %1 = call <vscale x 4 x i32> @llvm.riscv.vaadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1) 3677 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 3678 ret <vscale x 4 x i32> %2 3679} 3680 3681define <vscale x 4 x i32> @vaadd_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 3682; NOVLOPT-LABEL: vaadd_vx: 3683; NOVLOPT: # %bb.0: 3684; NOVLOPT-NEXT: csrwi vxrm, 0 3685; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 3686; NOVLOPT-NEXT: vaadd.vx v10, v8, a0 3687; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3688; NOVLOPT-NEXT: vadd.vv v8, v10, v8 3689; NOVLOPT-NEXT: ret 3690; 3691; VLOPT-LABEL: vaadd_vx: 3692; VLOPT: # %bb.0: 3693; VLOPT-NEXT: csrwi vxrm, 0 3694; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3695; VLOPT-NEXT: vaadd.vx v10, v8, a0 3696; VLOPT-NEXT: vadd.vv v8, v10, v8 3697; VLOPT-NEXT: ret 3698 %1 = call <vscale x 4 x i32> @llvm.riscv.vaadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1) 3699 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 3700 ret <vscale x 4 x i32> %2 3701} 3702 3703define <vscale x 4 x i32> @vasub_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 3704; NOVLOPT-LABEL: vasub_vv: 3705; NOVLOPT: # %bb.0: 3706; NOVLOPT-NEXT: csrwi vxrm, 0 3707; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3708; NOVLOPT-NEXT: vasub.vv v8, v8, v10 3709; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3710; NOVLOPT-NEXT: vadd.vv v8, v8, v10 3711; NOVLOPT-NEXT: ret 3712; 3713; VLOPT-LABEL: vasub_vv: 3714; VLOPT: # %bb.0: 3715; VLOPT-NEXT: csrwi vxrm, 0 3716; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3717; VLOPT-NEXT: vasub.vv v8, v8, v10 3718; VLOPT-NEXT: vadd.vv v8, v8, v10 3719; VLOPT-NEXT: ret 3720 %1 = call <vscale x 4 x i32> @llvm.riscv.vasub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1) 3721 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 3722 ret <vscale x 4 x i32> %2 3723} 3724 3725define <vscale x 4 x i32> @vasub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 3726; NOVLOPT-LABEL: vasub_vx: 3727; NOVLOPT: # %bb.0: 3728; NOVLOPT-NEXT: csrwi vxrm, 0 3729; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 3730; NOVLOPT-NEXT: vasub.vx v10, v8, a0 3731; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3732; NOVLOPT-NEXT: vadd.vv v8, v10, v8 3733; NOVLOPT-NEXT: ret 3734; 3735; VLOPT-LABEL: vasub_vx: 3736; VLOPT: # %bb.0: 3737; VLOPT-NEXT: csrwi vxrm, 0 3738; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3739; VLOPT-NEXT: vasub.vx v10, v8, a0 3740; VLOPT-NEXT: vadd.vv v8, v10, v8 3741; VLOPT-NEXT: ret 3742 %1 = call <vscale x 4 x i32> @llvm.riscv.vasub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1) 3743 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 3744 ret <vscale x 4 x i32> %2 3745} 3746 3747define <vscale x 4 x i32> @vaaddu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 3748; NOVLOPT-LABEL: vaaddu_vv: 3749; NOVLOPT: # %bb.0: 3750; NOVLOPT-NEXT: csrwi vxrm, 0 3751; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3752; NOVLOPT-NEXT: vaaddu.vv v8, v8, v10 3753; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3754; NOVLOPT-NEXT: vadd.vv v8, v8, v10 3755; NOVLOPT-NEXT: ret 3756; 3757; VLOPT-LABEL: vaaddu_vv: 3758; VLOPT: # %bb.0: 3759; VLOPT-NEXT: csrwi vxrm, 0 3760; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3761; VLOPT-NEXT: vaaddu.vv v8, v8, v10 3762; VLOPT-NEXT: vadd.vv v8, v8, v10 3763; VLOPT-NEXT: ret 3764 %1 = call <vscale x 4 x i32> @llvm.riscv.vaaddu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1) 3765 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 3766 ret <vscale x 4 x i32> %2 3767} 3768 3769define <vscale x 4 x i32> @vaaddu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 3770; NOVLOPT-LABEL: vaaddu_vx: 3771; NOVLOPT: # %bb.0: 3772; NOVLOPT-NEXT: csrwi vxrm, 0 3773; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 3774; NOVLOPT-NEXT: vaaddu.vx v10, v8, a0 3775; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3776; NOVLOPT-NEXT: vadd.vv v8, v10, v8 3777; NOVLOPT-NEXT: ret 3778; 3779; VLOPT-LABEL: vaaddu_vx: 3780; VLOPT: # %bb.0: 3781; VLOPT-NEXT: csrwi vxrm, 0 3782; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3783; VLOPT-NEXT: vaaddu.vx v10, v8, a0 3784; VLOPT-NEXT: vadd.vv v8, v10, v8 3785; VLOPT-NEXT: ret 3786 %1 = call <vscale x 4 x i32> @llvm.riscv.vaaddu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1) 3787 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 3788 ret <vscale x 4 x i32> %2 3789} 3790 3791define <vscale x 4 x i32> @vasubu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) { 3792; NOVLOPT-LABEL: vasubu_vv: 3793; NOVLOPT: # %bb.0: 3794; NOVLOPT-NEXT: csrwi vxrm, 0 3795; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3796; NOVLOPT-NEXT: vasubu.vv v8, v8, v10 3797; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3798; NOVLOPT-NEXT: vadd.vv v8, v8, v10 3799; NOVLOPT-NEXT: ret 3800; 3801; VLOPT-LABEL: vasubu_vv: 3802; VLOPT: # %bb.0: 3803; VLOPT-NEXT: csrwi vxrm, 0 3804; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3805; VLOPT-NEXT: vasubu.vv v8, v8, v10 3806; VLOPT-NEXT: vadd.vv v8, v8, v10 3807; VLOPT-NEXT: ret 3808 %1 = call <vscale x 4 x i32> @llvm.riscv.vasubu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1) 3809 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl) 3810 ret <vscale x 4 x i32> %2 3811} 3812 3813define <vscale x 4 x i32> @vasubu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) { 3814; NOVLOPT-LABEL: vasubu_vx: 3815; NOVLOPT: # %bb.0: 3816; NOVLOPT-NEXT: csrwi vxrm, 0 3817; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma 3818; NOVLOPT-NEXT: vasubu.vx v10, v8, a0 3819; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3820; NOVLOPT-NEXT: vadd.vv v8, v10, v8 3821; NOVLOPT-NEXT: ret 3822; 3823; VLOPT-LABEL: vasubu_vx: 3824; VLOPT: # %bb.0: 3825; VLOPT-NEXT: csrwi vxrm, 0 3826; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma 3827; VLOPT-NEXT: vasubu.vx v10, v8, a0 3828; VLOPT-NEXT: vadd.vv v8, v10, v8 3829; VLOPT-NEXT: ret 3830 %1 = call <vscale x 4 x i32> @llvm.riscv.vasubu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1) 3831 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl) 3832 ret <vscale x 4 x i32> %2 3833} 3834 3835define <vscale x 4 x float> @vfmax_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 3836; NOVLOPT-LABEL: vfmax_vv: 3837; NOVLOPT: # %bb.0: 3838; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3839; NOVLOPT-NEXT: vfmax.vv v8, v8, v10 3840; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3841; NOVLOPT-NEXT: vfadd.vv v8, v8, v10 3842; NOVLOPT-NEXT: ret 3843; 3844; VLOPT-LABEL: vfmax_vv: 3845; VLOPT: # %bb.0: 3846; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3847; VLOPT-NEXT: vfmax.vv v8, v8, v10 3848; VLOPT-NEXT: vfadd.vv v8, v8, v10 3849; VLOPT-NEXT: ret 3850 %1 = call <vscale x 4 x float> @llvm.riscv.vfmax.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen -1) 3851 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl) 3852 ret <vscale x 4 x float> %2 3853} 3854 3855define <vscale x 4 x float> @vfmax_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3856; NOVLOPT-LABEL: vfmax_vf: 3857; NOVLOPT: # %bb.0: 3858; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3859; NOVLOPT-NEXT: vfmax.vf v10, v8, fa0 3860; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3861; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 3862; NOVLOPT-NEXT: ret 3863; 3864; VLOPT-LABEL: vfmax_vf: 3865; VLOPT: # %bb.0: 3866; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3867; VLOPT-NEXT: vfmax.vf v10, v8, fa0 3868; VLOPT-NEXT: vfadd.vv v8, v10, v8 3869; VLOPT-NEXT: ret 3870 %1 = call <vscale x 4 x float> @llvm.riscv.vfmax.nxv4f32.f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1) 3871 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 3872 ret <vscale x 4 x float> %2 3873} 3874 3875define <vscale x 4 x float> @vfmin_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 3876; NOVLOPT-LABEL: vfmin_vv: 3877; NOVLOPT: # %bb.0: 3878; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3879; NOVLOPT-NEXT: vfmin.vv v8, v8, v10 3880; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3881; NOVLOPT-NEXT: vfadd.vv v8, v8, v10 3882; NOVLOPT-NEXT: ret 3883; 3884; VLOPT-LABEL: vfmin_vv: 3885; VLOPT: # %bb.0: 3886; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3887; VLOPT-NEXT: vfmin.vv v8, v8, v10 3888; VLOPT-NEXT: vfadd.vv v8, v8, v10 3889; VLOPT-NEXT: ret 3890 %1 = call <vscale x 4 x float> @llvm.riscv.vfmin.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen -1) 3891 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl) 3892 ret <vscale x 4 x float> %2 3893} 3894 3895define <vscale x 4 x float> @vfmin_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3896; NOVLOPT-LABEL: vfmin_vf: 3897; NOVLOPT: # %bb.0: 3898; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3899; NOVLOPT-NEXT: vfmin.vf v10, v8, fa0 3900; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3901; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 3902; NOVLOPT-NEXT: ret 3903; 3904; VLOPT-LABEL: vfmin_vf: 3905; VLOPT: # %bb.0: 3906; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3907; VLOPT-NEXT: vfmin.vf v10, v8, fa0 3908; VLOPT-NEXT: vfadd.vv v8, v10, v8 3909; VLOPT-NEXT: ret 3910 %1 = call <vscale x 4 x float> @llvm.riscv.vfmin.nxv4f32.f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1) 3911 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 3912 ret <vscale x 4 x float> %2 3913} 3914 3915define <vscale x 4 x float> @vfsgnj_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 3916; NOVLOPT-LABEL: vfsgnj_vv: 3917; NOVLOPT: # %bb.0: 3918; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3919; NOVLOPT-NEXT: vfsgnj.vv v8, v8, v10 3920; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3921; NOVLOPT-NEXT: vfadd.vv v8, v8, v10 3922; NOVLOPT-NEXT: ret 3923; 3924; VLOPT-LABEL: vfsgnj_vv: 3925; VLOPT: # %bb.0: 3926; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3927; VLOPT-NEXT: vfsgnj.vv v8, v8, v10 3928; VLOPT-NEXT: vfadd.vv v8, v8, v10 3929; VLOPT-NEXT: ret 3930 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnj.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen -1) 3931 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl) 3932 ret <vscale x 4 x float> %2 3933} 3934 3935define <vscale x 4 x float> @vfsgnj_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3936; NOVLOPT-LABEL: vfsgnj_vf: 3937; NOVLOPT: # %bb.0: 3938; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3939; NOVLOPT-NEXT: vfsgnj.vf v10, v8, fa0 3940; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3941; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 3942; NOVLOPT-NEXT: ret 3943; 3944; VLOPT-LABEL: vfsgnj_vf: 3945; VLOPT: # %bb.0: 3946; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3947; VLOPT-NEXT: vfsgnj.vf v10, v8, fa0 3948; VLOPT-NEXT: vfadd.vv v8, v10, v8 3949; VLOPT-NEXT: ret 3950 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnj.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1) 3951 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 3952 ret <vscale x 4 x float> %2 3953} 3954 3955define <vscale x 4 x float> @vfsgnjn_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 3956; NOVLOPT-LABEL: vfsgnjn_vv: 3957; NOVLOPT: # %bb.0: 3958; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3959; NOVLOPT-NEXT: vfsgnjn.vv v8, v8, v10 3960; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3961; NOVLOPT-NEXT: vfadd.vv v8, v8, v10 3962; NOVLOPT-NEXT: ret 3963; 3964; VLOPT-LABEL: vfsgnjn_vv: 3965; VLOPT: # %bb.0: 3966; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3967; VLOPT-NEXT: vfsgnjn.vv v8, v8, v10 3968; VLOPT-NEXT: vfadd.vv v8, v8, v10 3969; VLOPT-NEXT: ret 3970 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnjn.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen -1) 3971 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl) 3972 ret <vscale x 4 x float> %2 3973} 3974 3975define <vscale x 4 x float> @vfsgnjn_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 3976; NOVLOPT-LABEL: vfsgnjn_vf: 3977; NOVLOPT: # %bb.0: 3978; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3979; NOVLOPT-NEXT: vfsgnjn.vf v10, v8, fa0 3980; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3981; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 3982; NOVLOPT-NEXT: ret 3983; 3984; VLOPT-LABEL: vfsgnjn_vf: 3985; VLOPT: # %bb.0: 3986; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 3987; VLOPT-NEXT: vfsgnjn.vf v10, v8, fa0 3988; VLOPT-NEXT: vfadd.vv v8, v10, v8 3989; VLOPT-NEXT: ret 3990 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnjn.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1) 3991 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 3992 ret <vscale x 4 x float> %2 3993} 3994 3995define <vscale x 4 x float> @vfsgnjx_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) { 3996; NOVLOPT-LABEL: vfsgnjx_vv: 3997; NOVLOPT: # %bb.0: 3998; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 3999; NOVLOPT-NEXT: vfsgnjx.vv v8, v8, v10 4000; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 4001; NOVLOPT-NEXT: vfadd.vv v8, v8, v10 4002; NOVLOPT-NEXT: ret 4003; 4004; VLOPT-LABEL: vfsgnjx_vv: 4005; VLOPT: # %bb.0: 4006; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 4007; VLOPT-NEXT: vfsgnjx.vv v8, v8, v10 4008; VLOPT-NEXT: vfadd.vv v8, v8, v10 4009; VLOPT-NEXT: ret 4010 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnjx.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen -1) 4011 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl) 4012 ret <vscale x 4 x float> %2 4013} 4014 4015define <vscale x 4 x float> @vfsgnjx_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) { 4016; NOVLOPT-LABEL: vfsgnjx_vf: 4017; NOVLOPT: # %bb.0: 4018; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma 4019; NOVLOPT-NEXT: vfsgnjx.vf v10, v8, fa0 4020; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 4021; NOVLOPT-NEXT: vfadd.vv v8, v10, v8 4022; NOVLOPT-NEXT: ret 4023; 4024; VLOPT-LABEL: vfsgnjx_vf: 4025; VLOPT: # %bb.0: 4026; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma 4027; VLOPT-NEXT: vfsgnjx.vf v10, v8, fa0 4028; VLOPT-NEXT: vfadd.vv v8, v10, v8 4029; VLOPT-NEXT: ret 4030 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnjx.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1) 4031 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl) 4032 ret <vscale x 4 x float> %2 4033} 4034