11f342f94SPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 21f342f94SPhilip Reames; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV32 31f342f94SPhilip Reames; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV64 41f342f94SPhilip Reames 51f342f94SPhilip Reamesdefine i8 @extract_last_i8(<16 x i8> %data, <16 x i8> %mask, i8 %passthru) { 61f342f94SPhilip Reames; CHECK-LABEL: extract_last_i8: 71f342f94SPhilip Reames; CHECK: # %bb.0: 81f342f94SPhilip Reames; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, mu 91f342f94SPhilip Reames; CHECK-NEXT: vmsne.vi v0, v9, 0 101f342f94SPhilip Reames; CHECK-NEXT: vmv.v.i v9, 0 111f342f94SPhilip Reames; CHECK-NEXT: vcpop.m a1, v0 121f342f94SPhilip Reames; CHECK-NEXT: vid.v v9, v0.t 131f342f94SPhilip Reames; CHECK-NEXT: beqz a1, .LBB0_2 141f342f94SPhilip Reames; CHECK-NEXT: # %bb.1: 151f342f94SPhilip Reames; CHECK-NEXT: vredmaxu.vs v9, v9, v9 161f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v9 171f342f94SPhilip Reames; CHECK-NEXT: andi a0, a0, 255 181f342f94SPhilip Reames; CHECK-NEXT: vslidedown.vx v8, v8, a0 191f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v8 201f342f94SPhilip Reames; CHECK-NEXT: .LBB0_2: 211f342f94SPhilip Reames; CHECK-NEXT: ret 221f342f94SPhilip Reames %notzero = icmp ne <16 x i8> %mask, zeroinitializer 231f342f94SPhilip Reames %res = call i8 @llvm.experimental.vector.extract.last.active.v16i8(<16 x i8> %data, <16 x i1> %notzero, i8 %passthru) 241f342f94SPhilip Reames ret i8 %res 251f342f94SPhilip Reames} 261f342f94SPhilip Reames 271f342f94SPhilip Reamesdefine i16 @extract_last_i16(<8 x i16> %data, <8 x i16> %mask, i16 %passthru) { 281f342f94SPhilip Reames; CHECK-LABEL: extract_last_i16: 291f342f94SPhilip Reames; CHECK: # %bb.0: 301f342f94SPhilip Reames; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 311f342f94SPhilip Reames; CHECK-NEXT: vmsne.vi v0, v9, 0 321f342f94SPhilip Reames; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, mu 331f342f94SPhilip Reames; CHECK-NEXT: vmv.v.i v9, 0 341f342f94SPhilip Reames; CHECK-NEXT: vcpop.m a1, v0 351f342f94SPhilip Reames; CHECK-NEXT: vid.v v9, v0.t 361f342f94SPhilip Reames; CHECK-NEXT: beqz a1, .LBB1_2 371f342f94SPhilip Reames; CHECK-NEXT: # %bb.1: 381f342f94SPhilip Reames; CHECK-NEXT: vredmaxu.vs v9, v9, v9 391f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v9 401f342f94SPhilip Reames; CHECK-NEXT: andi a0, a0, 255 411f342f94SPhilip Reames; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 421f342f94SPhilip Reames; CHECK-NEXT: vslidedown.vx v8, v8, a0 431f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v8 441f342f94SPhilip Reames; CHECK-NEXT: .LBB1_2: 451f342f94SPhilip Reames; CHECK-NEXT: ret 461f342f94SPhilip Reames %notzero = icmp ne <8 x i16> %mask, zeroinitializer 471f342f94SPhilip Reames %res = call i16 @llvm.experimental.vector.extract.last.active.v8i16(<8 x i16> %data, <8 x i1> %notzero, i16 %passthru) 481f342f94SPhilip Reames ret i16 %res 491f342f94SPhilip Reames} 501f342f94SPhilip Reames 511f342f94SPhilip Reamesdefine i32 @extract_last_i32(<4 x i32> %data, <4 x i32> %mask, i32 %passthru) { 521f342f94SPhilip Reames; CHECK-LABEL: extract_last_i32: 531f342f94SPhilip Reames; CHECK: # %bb.0: 541f342f94SPhilip Reames; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 551f342f94SPhilip Reames; CHECK-NEXT: vmsne.vi v0, v9, 0 561f342f94SPhilip Reames; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, mu 571f342f94SPhilip Reames; CHECK-NEXT: vmv.v.i v9, 0 581f342f94SPhilip Reames; CHECK-NEXT: vcpop.m a1, v0 591f342f94SPhilip Reames; CHECK-NEXT: vid.v v9, v0.t 601f342f94SPhilip Reames; CHECK-NEXT: beqz a1, .LBB2_2 611f342f94SPhilip Reames; CHECK-NEXT: # %bb.1: 621f342f94SPhilip Reames; CHECK-NEXT: vredmaxu.vs v9, v9, v9 631f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v9 641f342f94SPhilip Reames; CHECK-NEXT: andi a0, a0, 255 651f342f94SPhilip Reames; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 661f342f94SPhilip Reames; CHECK-NEXT: vslidedown.vx v8, v8, a0 671f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v8 681f342f94SPhilip Reames; CHECK-NEXT: .LBB2_2: 691f342f94SPhilip Reames; CHECK-NEXT: ret 701f342f94SPhilip Reames %notzero = icmp ne <4 x i32> %mask, zeroinitializer 711f342f94SPhilip Reames %res = call i32 @llvm.experimental.vector.extract.last.active.v4i32(<4 x i32> %data, <4 x i1> %notzero, i32 %passthru) 721f342f94SPhilip Reames ret i32 %res 731f342f94SPhilip Reames} 741f342f94SPhilip Reames 751f342f94SPhilip Reamesdefine i64 @extract_last_i64(<2 x i64> %data, <2 x i64> %mask, i64 %passthru) { 761f342f94SPhilip Reames; RV32-LABEL: extract_last_i64: 771f342f94SPhilip Reames; RV32: # %bb.0: 781f342f94SPhilip Reames; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma 791f342f94SPhilip Reames; RV32-NEXT: vmsne.vi v0, v9, 0 801f342f94SPhilip Reames; RV32-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 811f342f94SPhilip Reames; RV32-NEXT: vmv.v.i v9, 0 821f342f94SPhilip Reames; RV32-NEXT: vcpop.m a2, v0 831f342f94SPhilip Reames; RV32-NEXT: vid.v v9, v0.t 841f342f94SPhilip Reames; RV32-NEXT: beqz a2, .LBB3_2 851f342f94SPhilip Reames; RV32-NEXT: # %bb.1: 861f342f94SPhilip Reames; RV32-NEXT: vredmaxu.vs v9, v9, v9 871f342f94SPhilip Reames; RV32-NEXT: li a1, 32 881f342f94SPhilip Reames; RV32-NEXT: vmv.x.s a0, v9 891f342f94SPhilip Reames; RV32-NEXT: andi a0, a0, 255 901f342f94SPhilip Reames; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma 911f342f94SPhilip Reames; RV32-NEXT: vslidedown.vx v8, v8, a0 921f342f94SPhilip Reames; RV32-NEXT: vmv.x.s a0, v8 931f342f94SPhilip Reames; RV32-NEXT: vsetivli zero, 1, e64, m1, ta, ma 941f342f94SPhilip Reames; RV32-NEXT: vsrl.vx v8, v8, a1 951f342f94SPhilip Reames; RV32-NEXT: vmv.x.s a1, v8 961f342f94SPhilip Reames; RV32-NEXT: .LBB3_2: 971f342f94SPhilip Reames; RV32-NEXT: ret 981f342f94SPhilip Reames; 991f342f94SPhilip Reames; RV64-LABEL: extract_last_i64: 1001f342f94SPhilip Reames; RV64: # %bb.0: 1011f342f94SPhilip Reames; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma 1021f342f94SPhilip Reames; RV64-NEXT: vmsne.vi v0, v9, 0 1031f342f94SPhilip Reames; RV64-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 1041f342f94SPhilip Reames; RV64-NEXT: vmv.v.i v9, 0 1051f342f94SPhilip Reames; RV64-NEXT: vcpop.m a1, v0 1061f342f94SPhilip Reames; RV64-NEXT: vid.v v9, v0.t 1071f342f94SPhilip Reames; RV64-NEXT: beqz a1, .LBB3_2 1081f342f94SPhilip Reames; RV64-NEXT: # %bb.1: 1091f342f94SPhilip Reames; RV64-NEXT: vredmaxu.vs v9, v9, v9 1101f342f94SPhilip Reames; RV64-NEXT: vmv.x.s a0, v9 1111f342f94SPhilip Reames; RV64-NEXT: andi a0, a0, 255 1121f342f94SPhilip Reames; RV64-NEXT: vsetvli zero, zero, e64, m1, ta, ma 1131f342f94SPhilip Reames; RV64-NEXT: vslidedown.vx v8, v8, a0 1141f342f94SPhilip Reames; RV64-NEXT: vmv.x.s a0, v8 1151f342f94SPhilip Reames; RV64-NEXT: .LBB3_2: 1161f342f94SPhilip Reames; RV64-NEXT: ret 1171f342f94SPhilip Reames %notzero = icmp ne <2 x i64> %mask, zeroinitializer 1181f342f94SPhilip Reames %res = call i64 @llvm.experimental.vector.extract.last.active.v2i64(<2 x i64> %data, <2 x i1> %notzero, i64 %passthru) 1191f342f94SPhilip Reames ret i64 %res 1201f342f94SPhilip Reames} 1211f342f94SPhilip Reames 1221f342f94SPhilip Reamesdefine float @extract_last_float(<4 x float> %data, <4 x i32> %mask, float %passthru) { 1231f342f94SPhilip Reames; CHECK-LABEL: extract_last_float: 1241f342f94SPhilip Reames; CHECK: # %bb.0: 1251f342f94SPhilip Reames; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 1261f342f94SPhilip Reames; CHECK-NEXT: vmsne.vi v0, v9, 0 1271f342f94SPhilip Reames; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, mu 1281f342f94SPhilip Reames; CHECK-NEXT: vmv.v.i v9, 0 1291f342f94SPhilip Reames; CHECK-NEXT: vcpop.m a0, v0 1301f342f94SPhilip Reames; CHECK-NEXT: vid.v v9, v0.t 1311f342f94SPhilip Reames; CHECK-NEXT: beqz a0, .LBB4_2 1321f342f94SPhilip Reames; CHECK-NEXT: # %bb.1: 1331f342f94SPhilip Reames; CHECK-NEXT: vredmaxu.vs v9, v9, v9 1341f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v9 1351f342f94SPhilip Reames; CHECK-NEXT: andi a0, a0, 255 1361f342f94SPhilip Reames; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 1371f342f94SPhilip Reames; CHECK-NEXT: vslidedown.vx v8, v8, a0 1381f342f94SPhilip Reames; CHECK-NEXT: vfmv.f.s fa0, v8 1391f342f94SPhilip Reames; CHECK-NEXT: .LBB4_2: 1401f342f94SPhilip Reames; CHECK-NEXT: ret 1411f342f94SPhilip Reames %notzero = icmp ne <4 x i32> %mask, zeroinitializer 1421f342f94SPhilip Reames %res = call float @llvm.experimental.vector.extract.last.active.v4f32(<4 x float> %data, <4 x i1> %notzero, float %passthru) 1431f342f94SPhilip Reames ret float %res 1441f342f94SPhilip Reames} 1451f342f94SPhilip Reames 1461f342f94SPhilip Reamesdefine double @extract_last_double(<2 x double> %data, <2 x i64> %mask, double %passthru) { 1471f342f94SPhilip Reames; CHECK-LABEL: extract_last_double: 1481f342f94SPhilip Reames; CHECK: # %bb.0: 1491f342f94SPhilip Reames; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 1501f342f94SPhilip Reames; CHECK-NEXT: vmsne.vi v0, v9, 0 1511f342f94SPhilip Reames; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 1521f342f94SPhilip Reames; CHECK-NEXT: vmv.v.i v9, 0 1531f342f94SPhilip Reames; CHECK-NEXT: vcpop.m a0, v0 1541f342f94SPhilip Reames; CHECK-NEXT: vid.v v9, v0.t 1551f342f94SPhilip Reames; CHECK-NEXT: beqz a0, .LBB5_2 1561f342f94SPhilip Reames; CHECK-NEXT: # %bb.1: 1571f342f94SPhilip Reames; CHECK-NEXT: vredmaxu.vs v9, v9, v9 1581f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v9 1591f342f94SPhilip Reames; CHECK-NEXT: andi a0, a0, 255 1601f342f94SPhilip Reames; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma 1611f342f94SPhilip Reames; CHECK-NEXT: vslidedown.vx v8, v8, a0 1621f342f94SPhilip Reames; CHECK-NEXT: vfmv.f.s fa0, v8 1631f342f94SPhilip Reames; CHECK-NEXT: .LBB5_2: 1641f342f94SPhilip Reames; CHECK-NEXT: ret 1651f342f94SPhilip Reames %notzero = icmp ne <2 x i64> %mask, zeroinitializer 1661f342f94SPhilip Reames %res = call double @llvm.experimental.vector.extract.last.active.v2f64(<2 x double> %data, <2 x i1> %notzero, double %passthru) 1671f342f94SPhilip Reames ret double %res 1681f342f94SPhilip Reames} 1691f342f94SPhilip Reames 1701f342f94SPhilip Reamesdefine i8 @extract_last_i8_scalable(<vscale x 16 x i8> %data, <vscale x 16 x i1> %mask, i8 %passthru) { 1711f342f94SPhilip Reames; CHECK-LABEL: extract_last_i8_scalable: 1721f342f94SPhilip Reames; CHECK: # %bb.0: 1731f342f94SPhilip Reames; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, mu 1741f342f94SPhilip Reames; CHECK-NEXT: vmv.v.i v10, 0 1751f342f94SPhilip Reames; CHECK-NEXT: vcpop.m a1, v0 1761f342f94SPhilip Reames; CHECK-NEXT: vid.v v10, v0.t 1771f342f94SPhilip Reames; CHECK-NEXT: beqz a1, .LBB6_2 1781f342f94SPhilip Reames; CHECK-NEXT: # %bb.1: 1791f342f94SPhilip Reames; CHECK-NEXT: vredmaxu.vs v10, v10, v10 1801f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v10 1811f342f94SPhilip Reames; CHECK-NEXT: andi a0, a0, 255 1821f342f94SPhilip Reames; CHECK-NEXT: vsetvli zero, zero, e8, m2, ta, ma 1831f342f94SPhilip Reames; CHECK-NEXT: vslidedown.vx v8, v8, a0 1841f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v8 1851f342f94SPhilip Reames; CHECK-NEXT: .LBB6_2: 1861f342f94SPhilip Reames; CHECK-NEXT: ret 1871f342f94SPhilip Reames %res = call i8 @llvm.experimental.vector.extract.last.active.nxv16i8(<vscale x 16 x i8> %data, <vscale x 16 x i1> %mask, i8 %passthru) 1881f342f94SPhilip Reames ret i8 %res 1891f342f94SPhilip Reames} 1901f342f94SPhilip Reames 1911f342f94SPhilip Reamesdefine i16 @extract_last_i16_scalable(<vscale x 8 x i16> %data, <vscale x 8 x i1> %mask, i16 %passthru) { 192*d9f165ddSGraham Hunter; CHECK-LABEL: extract_last_i16_scalable: 193*d9f165ddSGraham Hunter; CHECK: # %bb.0: 194*d9f165ddSGraham Hunter; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, mu 195*d9f165ddSGraham Hunter; CHECK-NEXT: vmv.v.i v10, 0 196*d9f165ddSGraham Hunter; CHECK-NEXT: vcpop.m a1, v0 197*d9f165ddSGraham Hunter; CHECK-NEXT: vid.v v10, v0.t 198*d9f165ddSGraham Hunter; CHECK-NEXT: beqz a1, .LBB7_2 199*d9f165ddSGraham Hunter; CHECK-NEXT: # %bb.1: 200*d9f165ddSGraham Hunter; CHECK-NEXT: vredmaxu.vs v10, v10, v10 201*d9f165ddSGraham Hunter; CHECK-NEXT: vmv.x.s a0, v10 202*d9f165ddSGraham Hunter; CHECK-NEXT: andi a0, a0, 255 203*d9f165ddSGraham Hunter; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 204*d9f165ddSGraham Hunter; CHECK-NEXT: vslidedown.vx v8, v8, a0 205*d9f165ddSGraham Hunter; CHECK-NEXT: vmv.x.s a0, v8 206*d9f165ddSGraham Hunter; CHECK-NEXT: .LBB7_2: 207*d9f165ddSGraham Hunter; CHECK-NEXT: ret 2081f342f94SPhilip Reames %res = call i16 @llvm.experimental.vector.extract.last.active.nxv8i16(<vscale x 8 x i16> %data, <vscale x 8 x i1> %mask, i16 %passthru) 2091f342f94SPhilip Reames ret i16 %res 2101f342f94SPhilip Reames} 2111f342f94SPhilip Reames 2121f342f94SPhilip Reamesdefine i32 @extract_last_i32_scalable(<vscale x 4 x i32> %data, <vscale x 4 x i1> %mask, i32 %passthru) { 213*d9f165ddSGraham Hunter; CHECK-LABEL: extract_last_i32_scalable: 214*d9f165ddSGraham Hunter; CHECK: # %bb.0: 215*d9f165ddSGraham Hunter; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, mu 216*d9f165ddSGraham Hunter; CHECK-NEXT: vmv.v.i v10, 0 217*d9f165ddSGraham Hunter; CHECK-NEXT: vcpop.m a1, v0 218*d9f165ddSGraham Hunter; CHECK-NEXT: vid.v v10, v0.t 219*d9f165ddSGraham Hunter; CHECK-NEXT: beqz a1, .LBB8_2 220*d9f165ddSGraham Hunter; CHECK-NEXT: # %bb.1: 221*d9f165ddSGraham Hunter; CHECK-NEXT: vredmaxu.vs v10, v10, v10 222*d9f165ddSGraham Hunter; CHECK-NEXT: vmv.x.s a0, v10 223*d9f165ddSGraham Hunter; CHECK-NEXT: andi a0, a0, 255 224*d9f165ddSGraham Hunter; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 225*d9f165ddSGraham Hunter; CHECK-NEXT: vslidedown.vx v8, v8, a0 226*d9f165ddSGraham Hunter; CHECK-NEXT: vmv.x.s a0, v8 227*d9f165ddSGraham Hunter; CHECK-NEXT: .LBB8_2: 228*d9f165ddSGraham Hunter; CHECK-NEXT: ret 2291f342f94SPhilip Reames %res = call i32 @llvm.experimental.vector.extract.last.active.nxv4i32(<vscale x 4 x i32> %data, <vscale x 4 x i1> %mask, i32 %passthru) 2301f342f94SPhilip Reames ret i32 %res 2311f342f94SPhilip Reames} 2321f342f94SPhilip Reames 2331f342f94SPhilip Reamesdefine i64 @extract_last_i64_scalable(<vscale x 2 x i64> %data, <vscale x 2 x i1> %mask, i64 %passthru) { 2341f342f94SPhilip Reames; RV32-LABEL: extract_last_i64_scalable: 2351f342f94SPhilip Reames; RV32: # %bb.0: 236*d9f165ddSGraham Hunter; RV32-NEXT: vsetvli a2, zero, e8, mf4, ta, mu 2371f342f94SPhilip Reames; RV32-NEXT: vmv.v.i v10, 0 2381f342f94SPhilip Reames; RV32-NEXT: vcpop.m a2, v0 2391f342f94SPhilip Reames; RV32-NEXT: vid.v v10, v0.t 2401f342f94SPhilip Reames; RV32-NEXT: beqz a2, .LBB9_2 2411f342f94SPhilip Reames; RV32-NEXT: # %bb.1: 2421f342f94SPhilip Reames; RV32-NEXT: vredmaxu.vs v10, v10, v10 2431f342f94SPhilip Reames; RV32-NEXT: li a1, 32 2441f342f94SPhilip Reames; RV32-NEXT: vmv.x.s a0, v10 245*d9f165ddSGraham Hunter; RV32-NEXT: andi a0, a0, 255 2461f342f94SPhilip Reames; RV32-NEXT: vsetvli zero, zero, e64, m2, ta, ma 2471f342f94SPhilip Reames; RV32-NEXT: vslidedown.vx v8, v8, a0 2481f342f94SPhilip Reames; RV32-NEXT: vmv.x.s a0, v8 2491f342f94SPhilip Reames; RV32-NEXT: vsetivli zero, 1, e64, m2, ta, ma 2501f342f94SPhilip Reames; RV32-NEXT: vsrl.vx v8, v8, a1 2511f342f94SPhilip Reames; RV32-NEXT: vmv.x.s a1, v8 2521f342f94SPhilip Reames; RV32-NEXT: .LBB9_2: 2531f342f94SPhilip Reames; RV32-NEXT: ret 2541f342f94SPhilip Reames; 2551f342f94SPhilip Reames; RV64-LABEL: extract_last_i64_scalable: 2561f342f94SPhilip Reames; RV64: # %bb.0: 257*d9f165ddSGraham Hunter; RV64-NEXT: vsetvli a1, zero, e8, mf4, ta, mu 2581f342f94SPhilip Reames; RV64-NEXT: vmv.v.i v10, 0 2591f342f94SPhilip Reames; RV64-NEXT: vcpop.m a1, v0 2601f342f94SPhilip Reames; RV64-NEXT: vid.v v10, v0.t 2611f342f94SPhilip Reames; RV64-NEXT: beqz a1, .LBB9_2 2621f342f94SPhilip Reames; RV64-NEXT: # %bb.1: 2631f342f94SPhilip Reames; RV64-NEXT: vredmaxu.vs v10, v10, v10 2641f342f94SPhilip Reames; RV64-NEXT: vmv.x.s a0, v10 265*d9f165ddSGraham Hunter; RV64-NEXT: andi a0, a0, 255 2661f342f94SPhilip Reames; RV64-NEXT: vsetvli zero, zero, e64, m2, ta, ma 2671f342f94SPhilip Reames; RV64-NEXT: vslidedown.vx v8, v8, a0 2681f342f94SPhilip Reames; RV64-NEXT: vmv.x.s a0, v8 2691f342f94SPhilip Reames; RV64-NEXT: .LBB9_2: 2701f342f94SPhilip Reames; RV64-NEXT: ret 2711f342f94SPhilip Reames %res = call i64 @llvm.experimental.vector.extract.last.active.nxv2i64(<vscale x 2 x i64> %data, <vscale x 2 x i1> %mask, i64 %passthru) 2721f342f94SPhilip Reames ret i64 %res 2731f342f94SPhilip Reames} 2741f342f94SPhilip Reames 2751f342f94SPhilip Reamesdefine float @extract_last_float_scalable(<vscale x 4 x float> %data, <vscale x 4 x i1> %mask, float %passthru) { 276*d9f165ddSGraham Hunter; CHECK-LABEL: extract_last_float_scalable: 277*d9f165ddSGraham Hunter; CHECK: # %bb.0: 278*d9f165ddSGraham Hunter; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, mu 279*d9f165ddSGraham Hunter; CHECK-NEXT: vmv.v.i v10, 0 280*d9f165ddSGraham Hunter; CHECK-NEXT: vcpop.m a0, v0 281*d9f165ddSGraham Hunter; CHECK-NEXT: vid.v v10, v0.t 282*d9f165ddSGraham Hunter; CHECK-NEXT: beqz a0, .LBB10_2 283*d9f165ddSGraham Hunter; CHECK-NEXT: # %bb.1: 284*d9f165ddSGraham Hunter; CHECK-NEXT: vredmaxu.vs v10, v10, v10 285*d9f165ddSGraham Hunter; CHECK-NEXT: vmv.x.s a0, v10 286*d9f165ddSGraham Hunter; CHECK-NEXT: andi a0, a0, 255 287*d9f165ddSGraham Hunter; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 288*d9f165ddSGraham Hunter; CHECK-NEXT: vslidedown.vx v8, v8, a0 289*d9f165ddSGraham Hunter; CHECK-NEXT: vfmv.f.s fa0, v8 290*d9f165ddSGraham Hunter; CHECK-NEXT: .LBB10_2: 291*d9f165ddSGraham Hunter; CHECK-NEXT: ret 2921f342f94SPhilip Reames %res = call float @llvm.experimental.vector.extract.last.active.nxv4f32(<vscale x 4 x float> %data, <vscale x 4 x i1> %mask, float %passthru) 2931f342f94SPhilip Reames ret float %res 2941f342f94SPhilip Reames} 2951f342f94SPhilip Reames 2961f342f94SPhilip Reamesdefine double @extract_last_double_scalable(<vscale x 2 x double> %data, <vscale x 2 x i1> %mask, double %passthru) { 2971f342f94SPhilip Reames; CHECK-LABEL: extract_last_double_scalable: 2981f342f94SPhilip Reames; CHECK: # %bb.0: 299*d9f165ddSGraham Hunter; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, mu 3001f342f94SPhilip Reames; CHECK-NEXT: vmv.v.i v10, 0 3011f342f94SPhilip Reames; CHECK-NEXT: vcpop.m a0, v0 3021f342f94SPhilip Reames; CHECK-NEXT: vid.v v10, v0.t 3031f342f94SPhilip Reames; CHECK-NEXT: beqz a0, .LBB11_2 3041f342f94SPhilip Reames; CHECK-NEXT: # %bb.1: 3051f342f94SPhilip Reames; CHECK-NEXT: vredmaxu.vs v10, v10, v10 3061f342f94SPhilip Reames; CHECK-NEXT: vmv.x.s a0, v10 307*d9f165ddSGraham Hunter; CHECK-NEXT: andi a0, a0, 255 3081f342f94SPhilip Reames; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 3091f342f94SPhilip Reames; CHECK-NEXT: vslidedown.vx v8, v8, a0 3101f342f94SPhilip Reames; CHECK-NEXT: vfmv.f.s fa0, v8 3111f342f94SPhilip Reames; CHECK-NEXT: .LBB11_2: 3121f342f94SPhilip Reames; CHECK-NEXT: ret 3131f342f94SPhilip Reames %res = call double @llvm.experimental.vector.extract.last.active.nxv2f64(<vscale x 2 x double> %data, <vscale x 2 x i1> %mask, double %passthru) 3141f342f94SPhilip Reames ret double %res 3151f342f94SPhilip Reames} 3161f342f94SPhilip Reames 3171f342f94SPhilip Reamesdeclare i8 @llvm.experimental.vector.extract.last.active.v16i8(<16 x i8>, <16 x i1>, i8) 3181f342f94SPhilip Reamesdeclare i16 @llvm.experimental.vector.extract.last.active.v8i16(<8 x i16>, <8 x i1>, i16) 3191f342f94SPhilip Reamesdeclare i32 @llvm.experimental.vector.extract.last.active.v4i32(<4 x i32>, <4 x i1>, i32) 3201f342f94SPhilip Reamesdeclare i64 @llvm.experimental.vector.extract.last.active.v2i64(<2 x i64>, <2 x i1>, i64) 3211f342f94SPhilip Reamesdeclare float @llvm.experimental.vector.extract.last.active.v4f32(<4 x float>, <4 x i1>, float) 3221f342f94SPhilip Reamesdeclare double @llvm.experimental.vector.extract.last.active.v2f64(<2 x double>, <2 x i1>, double) 3231f342f94SPhilip Reamesdeclare i8 @llvm.experimental.vector.extract.last.active.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i1>, i8) 3241f342f94SPhilip Reamesdeclare i16 @llvm.experimental.vector.extract.last.active.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i1>, i16) 3251f342f94SPhilip Reamesdeclare i32 @llvm.experimental.vector.extract.last.active.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i1>, i32) 3261f342f94SPhilip Reamesdeclare i64 @llvm.experimental.vector.extract.last.active.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i1>, i64) 3271f342f94SPhilip Reamesdeclare float @llvm.experimental.vector.extract.last.active.nxv4f32(<vscale x 4 x float>, <vscale x 4 x i1>, float) 3281f342f94SPhilip Reamesdeclare double @llvm.experimental.vector.extract.last.active.nxv2f64(<vscale x 2 x double>, <vscale x 2 x i1>, double) 329