1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc < %s -mtriple=riscv64 -mattr=+v | FileCheck %s 3; RUN: llc < %s -mtriple=riscv64 -mattr=+zve64x,+zvl128b | FileCheck %s 4 5define <4 x i8> @test_v4i16_v4i8(<4 x i16> %x) { 6; CHECK-LABEL: test_v4i16_v4i8: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 9; CHECK-NEXT: vmax.vx v8, v8, zero 10; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, ma 11; CHECK-NEXT: vnclipu.wi v8, v8, 0 12; CHECK-NEXT: ret 13 %a = icmp sgt <4 x i16> %x, zeroinitializer 14 %b = sext <4 x i1> %a to <4 x i16> 15 %c = icmp ult <4 x i16> %x, splat (i16 256) 16 %d = select <4 x i1> %c, <4 x i16> %x, <4 x i16> %b 17 %e = trunc <4 x i16> %d to <4 x i8> 18 ret <4 x i8> %e 19} 20 21define <4 x i8> @test_v4i32_v4i8(<4 x i32> %x) { 22; CHECK-LABEL: test_v4i32_v4i8: 23; CHECK: # %bb.0: 24; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 25; CHECK-NEXT: vmax.vx v8, v8, zero 26; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 27; CHECK-NEXT: vnclipu.wi v8, v8, 0 28; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, ma 29; CHECK-NEXT: vnclipu.wi v8, v8, 0 30; CHECK-NEXT: ret 31 %a = icmp sgt <4 x i32> %x, zeroinitializer 32 %b = sext <4 x i1> %a to <4 x i32> 33 %c = icmp ult <4 x i32> %x, splat (i32 256) 34 %d = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %b 35 %e = trunc <4 x i32> %d to <4 x i8> 36 ret <4 x i8> %e 37} 38 39define <4 x i8> @test_v4i64_v4i8(<4 x i64> %x) { 40; CHECK-LABEL: test_v4i64_v4i8: 41; CHECK: # %bb.0: 42; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 43; CHECK-NEXT: vmax.vx v8, v8, zero 44; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 45; CHECK-NEXT: vnclipu.wi v10, v8, 0 46; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 47; CHECK-NEXT: vnclipu.wi v8, v10, 0 48; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, ma 49; CHECK-NEXT: vnclipu.wi v8, v8, 0 50; CHECK-NEXT: ret 51 %a = icmp sgt <4 x i64> %x, zeroinitializer 52 %b = sext <4 x i1> %a to <4 x i64> 53 %c = icmp ult <4 x i64> %x, splat (i64 256) 54 %d = select <4 x i1> %c, <4 x i64> %x, <4 x i64> %b 55 %e = trunc <4 x i64> %d to <4 x i8> 56 ret <4 x i8> %e 57} 58 59define <4 x i16> @test_v4i32_v4i16(<4 x i32> %x) { 60; CHECK-LABEL: test_v4i32_v4i16: 61; CHECK: # %bb.0: 62; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 63; CHECK-NEXT: vmax.vx v8, v8, zero 64; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 65; CHECK-NEXT: vnclipu.wi v8, v8, 0 66; CHECK-NEXT: ret 67 %a = icmp sgt <4 x i32> %x, zeroinitializer 68 %b = sext <4 x i1> %a to <4 x i32> 69 %c = icmp ult <4 x i32> %x, splat (i32 65536) 70 %d = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %b 71 %e = trunc <4 x i32> %d to <4 x i16> 72 ret <4 x i16> %e 73} 74 75define <4 x i16> @test_v4i64_v4i16(<4 x i64> %x) { 76; CHECK-LABEL: test_v4i64_v4i16: 77; CHECK: # %bb.0: 78; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 79; CHECK-NEXT: vmax.vx v8, v8, zero 80; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 81; CHECK-NEXT: vnclipu.wi v10, v8, 0 82; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 83; CHECK-NEXT: vnclipu.wi v8, v10, 0 84; CHECK-NEXT: ret 85 %a = icmp sgt <4 x i64> %x, zeroinitializer 86 %b = sext <4 x i1> %a to <4 x i64> 87 %c = icmp ult <4 x i64> %x, splat (i64 65536) 88 %d = select <4 x i1> %c, <4 x i64> %x, <4 x i64> %b 89 %e = trunc <4 x i64> %d to <4 x i16> 90 ret <4 x i16> %e 91} 92 93define <4 x i32> @test_v4i64_v4i32(<4 x i64> %x) { 94; CHECK-LABEL: test_v4i64_v4i32: 95; CHECK: # %bb.0: 96; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 97; CHECK-NEXT: vmax.vx v10, v8, zero 98; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 99; CHECK-NEXT: vnclipu.wi v8, v10, 0 100; CHECK-NEXT: ret 101 %a = icmp sgt <4 x i64> %x, zeroinitializer 102 %b = sext <4 x i1> %a to <4 x i64> 103 %c = icmp ult <4 x i64> %x, splat (i64 4294967296) 104 %d = select <4 x i1> %c, <4 x i64> %x, <4 x i64> %b 105 %e = trunc <4 x i64> %d to <4 x i32> 106 ret <4 x i32> %e 107} 108 109define <vscale x 4 x i8> @test_nxv4i16_nxv4i8(<vscale x 4 x i16> %x) { 110; CHECK-LABEL: test_nxv4i16_nxv4i8: 111; CHECK: # %bb.0: 112; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 113; CHECK-NEXT: vmax.vx v8, v8, zero 114; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, ma 115; CHECK-NEXT: vnclipu.wi v8, v8, 0 116; CHECK-NEXT: ret 117 %a = icmp sgt <vscale x 4 x i16> %x, zeroinitializer 118 %b = sext <vscale x 4 x i1> %a to <vscale x 4 x i16> 119 %c = icmp ult <vscale x 4 x i16> %x, splat (i16 256) 120 %d = select <vscale x 4 x i1> %c, <vscale x 4 x i16> %x, <vscale x 4 x i16> %b 121 %e = trunc <vscale x 4 x i16> %d to <vscale x 4 x i8> 122 ret <vscale x 4 x i8> %e 123} 124 125define <vscale x 4 x i8> @test_nxv4i32_nxv4i8(<vscale x 4 x i32> %x) { 126; CHECK-LABEL: test_nxv4i32_nxv4i8: 127; CHECK: # %bb.0: 128; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 129; CHECK-NEXT: vmax.vx v8, v8, zero 130; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 131; CHECK-NEXT: vnclipu.wi v10, v8, 0 132; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, ma 133; CHECK-NEXT: vnclipu.wi v8, v10, 0 134; CHECK-NEXT: ret 135 %a = icmp sgt <vscale x 4 x i32> %x, zeroinitializer 136 %b = sext <vscale x 4 x i1> %a to <vscale x 4 x i32> 137 %c = icmp ult <vscale x 4 x i32> %x, splat (i32 256) 138 %d = select <vscale x 4 x i1> %c, <vscale x 4 x i32> %x, <vscale x 4 x i32> %b 139 %e = trunc <vscale x 4 x i32> %d to <vscale x 4 x i8> 140 ret <vscale x 4 x i8> %e 141} 142 143define <vscale x 4 x i8> @test_nxv4i64_nxv4i8(<vscale x 4 x i64> %x) { 144; CHECK-LABEL: test_nxv4i64_nxv4i8: 145; CHECK: # %bb.0: 146; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 147; CHECK-NEXT: vmax.vx v8, v8, zero 148; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 149; CHECK-NEXT: vnclipu.wi v12, v8, 0 150; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 151; CHECK-NEXT: vnclipu.wi v8, v12, 0 152; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, ma 153; CHECK-NEXT: vnclipu.wi v8, v8, 0 154; CHECK-NEXT: ret 155 %a = icmp sgt <vscale x 4 x i64> %x, zeroinitializer 156 %b = sext <vscale x 4 x i1> %a to <vscale x 4 x i64> 157 %c = icmp ult <vscale x 4 x i64> %x, splat (i64 256) 158 %d = select <vscale x 4 x i1> %c, <vscale x 4 x i64> %x, <vscale x 4 x i64> %b 159 %e = trunc <vscale x 4 x i64> %d to <vscale x 4 x i8> 160 ret <vscale x 4 x i8> %e 161} 162 163define <vscale x 4 x i16> @test_nxv4i32_nxv4i16(<vscale x 4 x i32> %x) { 164; CHECK-LABEL: test_nxv4i32_nxv4i16: 165; CHECK: # %bb.0: 166; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 167; CHECK-NEXT: vmax.vx v10, v8, zero 168; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 169; CHECK-NEXT: vnclipu.wi v8, v10, 0 170; CHECK-NEXT: ret 171 %a = icmp sgt <vscale x 4 x i32> %x, zeroinitializer 172 %b = sext <vscale x 4 x i1> %a to <vscale x 4 x i32> 173 %c = icmp ult <vscale x 4 x i32> %x, splat (i32 65536) 174 %d = select <vscale x 4 x i1> %c, <vscale x 4 x i32> %x, <vscale x 4 x i32> %b 175 %e = trunc <vscale x 4 x i32> %d to <vscale x 4 x i16> 176 ret <vscale x 4 x i16> %e 177} 178 179define <vscale x 4 x i16> @test_nxv4i64_nxv4i16(<vscale x 4 x i64> %x) { 180; CHECK-LABEL: test_nxv4i64_nxv4i16: 181; CHECK: # %bb.0: 182; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 183; CHECK-NEXT: vmax.vx v8, v8, zero 184; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 185; CHECK-NEXT: vnclipu.wi v12, v8, 0 186; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 187; CHECK-NEXT: vnclipu.wi v8, v12, 0 188; CHECK-NEXT: ret 189 %a = icmp sgt <vscale x 4 x i64> %x, zeroinitializer 190 %b = sext <vscale x 4 x i1> %a to <vscale x 4 x i64> 191 %c = icmp ult <vscale x 4 x i64> %x, splat (i64 65536) 192 %d = select <vscale x 4 x i1> %c, <vscale x 4 x i64> %x, <vscale x 4 x i64> %b 193 %e = trunc <vscale x 4 x i64> %d to <vscale x 4 x i16> 194 ret <vscale x 4 x i16> %e 195} 196 197define <vscale x 4 x i32> @test_nxv4i64_nxv4i32(<vscale x 4 x i64> %x) { 198; CHECK-LABEL: test_nxv4i64_nxv4i32: 199; CHECK: # %bb.0: 200; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 201; CHECK-NEXT: vmax.vx v12, v8, zero 202; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 203; CHECK-NEXT: vnclipu.wi v8, v12, 0 204; CHECK-NEXT: ret 205 %a = icmp sgt <vscale x 4 x i64> %x, zeroinitializer 206 %b = sext <vscale x 4 x i1> %a to <vscale x 4 x i64> 207 %c = icmp ult <vscale x 4 x i64> %x, splat (i64 4294967296) 208 %d = select <vscale x 4 x i1> %c, <vscale x 4 x i64> %x, <vscale x 4 x i64> %b 209 %e = trunc <vscale x 4 x i64> %d to <vscale x 4 x i32> 210 ret <vscale x 4 x i32> %e 211} 212