1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv64 -mattr=+experimental-v -verify-machineinstrs < %s | FileCheck %s 3 4define <vscale x 1 x i8> @vtrunc_nxv1i16_nxv1i8(<vscale x 1 x i16> %va) { 5; CHECK-LABEL: vtrunc_nxv1i16_nxv1i8: 6; CHECK: # %bb.0: 7; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, mu 8; CHECK-NEXT: vnsrl.wi v8, v8, 0 9; CHECK-NEXT: ret 10 %tvec = trunc <vscale x 1 x i16> %va to <vscale x 1 x i8> 11 ret <vscale x 1 x i8> %tvec 12} 13 14define <vscale x 2 x i8> @vtrunc_nxv2i16_nxv2i8(<vscale x 2 x i16> %va) { 15; CHECK-LABEL: vtrunc_nxv2i16_nxv2i8: 16; CHECK: # %bb.0: 17; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, mu 18; CHECK-NEXT: vnsrl.wi v8, v8, 0 19; CHECK-NEXT: ret 20 %tvec = trunc <vscale x 2 x i16> %va to <vscale x 2 x i8> 21 ret <vscale x 2 x i8> %tvec 22} 23 24define <vscale x 4 x i8> @vtrunc_nxv4i16_nxv4i8(<vscale x 4 x i16> %va) { 25; CHECK-LABEL: vtrunc_nxv4i16_nxv4i8: 26; CHECK: # %bb.0: 27; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, mu 28; CHECK-NEXT: vnsrl.wi v8, v8, 0 29; CHECK-NEXT: ret 30 %tvec = trunc <vscale x 4 x i16> %va to <vscale x 4 x i8> 31 ret <vscale x 4 x i8> %tvec 32} 33 34define <vscale x 8 x i8> @vtrunc_nxv8i16_nxv8i8(<vscale x 8 x i16> %va) { 35; CHECK-LABEL: vtrunc_nxv8i16_nxv8i8: 36; CHECK: # %bb.0: 37; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, mu 38; CHECK-NEXT: vnsrl.wi v25, v8, 0 39; CHECK-NEXT: vmv1r.v v8, v25 40; CHECK-NEXT: ret 41 %tvec = trunc <vscale x 8 x i16> %va to <vscale x 8 x i8> 42 ret <vscale x 8 x i8> %tvec 43} 44 45define <vscale x 16 x i8> @vtrunc_nxv16i16_nxv16i8(<vscale x 16 x i16> %va) { 46; CHECK-LABEL: vtrunc_nxv16i16_nxv16i8: 47; CHECK: # %bb.0: 48; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, mu 49; CHECK-NEXT: vnsrl.wi v26, v8, 0 50; CHECK-NEXT: vmv2r.v v8, v26 51; CHECK-NEXT: ret 52 %tvec = trunc <vscale x 16 x i16> %va to <vscale x 16 x i8> 53 ret <vscale x 16 x i8> %tvec 54} 55 56define <vscale x 1 x i8> @vtrunc_nxv1i32_nxv1i8(<vscale x 1 x i32> %va) { 57; CHECK-LABEL: vtrunc_nxv1i32_nxv1i8: 58; CHECK: # %bb.0: 59; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 60; CHECK-NEXT: vnsrl.wi v25, v8, 0 61; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 62; CHECK-NEXT: vnsrl.wi v8, v25, 0 63; CHECK-NEXT: ret 64 %tvec = trunc <vscale x 1 x i32> %va to <vscale x 1 x i8> 65 ret <vscale x 1 x i8> %tvec 66} 67 68define <vscale x 1 x i16> @vtrunc_nxv1i32_nxv1i16(<vscale x 1 x i32> %va) { 69; CHECK-LABEL: vtrunc_nxv1i32_nxv1i16: 70; CHECK: # %bb.0: 71; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 72; CHECK-NEXT: vnsrl.wi v8, v8, 0 73; CHECK-NEXT: ret 74 %tvec = trunc <vscale x 1 x i32> %va to <vscale x 1 x i16> 75 ret <vscale x 1 x i16> %tvec 76} 77 78define <vscale x 2 x i8> @vtrunc_nxv2i32_nxv2i8(<vscale x 2 x i32> %va) { 79; CHECK-LABEL: vtrunc_nxv2i32_nxv2i8: 80; CHECK: # %bb.0: 81; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 82; CHECK-NEXT: vnsrl.wi v25, v8, 0 83; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, mu 84; CHECK-NEXT: vnsrl.wi v8, v25, 0 85; CHECK-NEXT: ret 86 %tvec = trunc <vscale x 2 x i32> %va to <vscale x 2 x i8> 87 ret <vscale x 2 x i8> %tvec 88} 89 90define <vscale x 2 x i16> @vtrunc_nxv2i32_nxv2i16(<vscale x 2 x i32> %va) { 91; CHECK-LABEL: vtrunc_nxv2i32_nxv2i16: 92; CHECK: # %bb.0: 93; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 94; CHECK-NEXT: vnsrl.wi v8, v8, 0 95; CHECK-NEXT: ret 96 %tvec = trunc <vscale x 2 x i32> %va to <vscale x 2 x i16> 97 ret <vscale x 2 x i16> %tvec 98} 99 100define <vscale x 4 x i8> @vtrunc_nxv4i32_nxv4i8(<vscale x 4 x i32> %va) { 101; CHECK-LABEL: vtrunc_nxv4i32_nxv4i8: 102; CHECK: # %bb.0: 103; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, mu 104; CHECK-NEXT: vnsrl.wi v25, v8, 0 105; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, mu 106; CHECK-NEXT: vnsrl.wi v8, v25, 0 107; CHECK-NEXT: ret 108 %tvec = trunc <vscale x 4 x i32> %va to <vscale x 4 x i8> 109 ret <vscale x 4 x i8> %tvec 110} 111 112define <vscale x 4 x i16> @vtrunc_nxv4i32_nxv4i16(<vscale x 4 x i32> %va) { 113; CHECK-LABEL: vtrunc_nxv4i32_nxv4i16: 114; CHECK: # %bb.0: 115; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, mu 116; CHECK-NEXT: vnsrl.wi v25, v8, 0 117; CHECK-NEXT: vmv1r.v v8, v25 118; CHECK-NEXT: ret 119 %tvec = trunc <vscale x 4 x i32> %va to <vscale x 4 x i16> 120 ret <vscale x 4 x i16> %tvec 121} 122 123define <vscale x 8 x i8> @vtrunc_nxv8i32_nxv8i8(<vscale x 8 x i32> %va) { 124; CHECK-LABEL: vtrunc_nxv8i32_nxv8i8: 125; CHECK: # %bb.0: 126; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 127; CHECK-NEXT: vnsrl.wi v26, v8, 0 128; CHECK-NEXT: vsetvli zero, zero, e8, m1, ta, mu 129; CHECK-NEXT: vnsrl.wi v8, v26, 0 130; CHECK-NEXT: ret 131 %tvec = trunc <vscale x 8 x i32> %va to <vscale x 8 x i8> 132 ret <vscale x 8 x i8> %tvec 133} 134 135define <vscale x 8 x i16> @vtrunc_nxv8i32_nxv8i16(<vscale x 8 x i32> %va) { 136; CHECK-LABEL: vtrunc_nxv8i32_nxv8i16: 137; CHECK: # %bb.0: 138; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 139; CHECK-NEXT: vnsrl.wi v26, v8, 0 140; CHECK-NEXT: vmv2r.v v8, v26 141; CHECK-NEXT: ret 142 %tvec = trunc <vscale x 8 x i32> %va to <vscale x 8 x i16> 143 ret <vscale x 8 x i16> %tvec 144} 145 146define <vscale x 16 x i8> @vtrunc_nxv16i32_nxv16i8(<vscale x 16 x i32> %va) { 147; CHECK-LABEL: vtrunc_nxv16i32_nxv16i8: 148; CHECK: # %bb.0: 149; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, mu 150; CHECK-NEXT: vnsrl.wi v28, v8, 0 151; CHECK-NEXT: vsetvli zero, zero, e8, m2, ta, mu 152; CHECK-NEXT: vnsrl.wi v8, v28, 0 153; CHECK-NEXT: ret 154 %tvec = trunc <vscale x 16 x i32> %va to <vscale x 16 x i8> 155 ret <vscale x 16 x i8> %tvec 156} 157 158define <vscale x 16 x i16> @vtrunc_nxv16i32_nxv16i16(<vscale x 16 x i32> %va) { 159; CHECK-LABEL: vtrunc_nxv16i32_nxv16i16: 160; CHECK: # %bb.0: 161; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, mu 162; CHECK-NEXT: vnsrl.wi v28, v8, 0 163; CHECK-NEXT: vmv4r.v v8, v28 164; CHECK-NEXT: ret 165 %tvec = trunc <vscale x 16 x i32> %va to <vscale x 16 x i16> 166 ret <vscale x 16 x i16> %tvec 167} 168 169define <vscale x 1 x i8> @vtrunc_nxv1i64_nxv1i8(<vscale x 1 x i64> %va) { 170; CHECK-LABEL: vtrunc_nxv1i64_nxv1i8: 171; CHECK: # %bb.0: 172; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 173; CHECK-NEXT: vnsrl.wi v25, v8, 0 174; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 175; CHECK-NEXT: vnsrl.wi v25, v25, 0 176; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 177; CHECK-NEXT: vnsrl.wi v8, v25, 0 178; CHECK-NEXT: ret 179 %tvec = trunc <vscale x 1 x i64> %va to <vscale x 1 x i8> 180 ret <vscale x 1 x i8> %tvec 181} 182 183define <vscale x 1 x i16> @vtrunc_nxv1i64_nxv1i16(<vscale x 1 x i64> %va) { 184; CHECK-LABEL: vtrunc_nxv1i64_nxv1i16: 185; CHECK: # %bb.0: 186; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 187; CHECK-NEXT: vnsrl.wi v25, v8, 0 188; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 189; CHECK-NEXT: vnsrl.wi v8, v25, 0 190; CHECK-NEXT: ret 191 %tvec = trunc <vscale x 1 x i64> %va to <vscale x 1 x i16> 192 ret <vscale x 1 x i16> %tvec 193} 194 195define <vscale x 1 x i32> @vtrunc_nxv1i64_nxv1i32(<vscale x 1 x i64> %va) { 196; CHECK-LABEL: vtrunc_nxv1i64_nxv1i32: 197; CHECK: # %bb.0: 198; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 199; CHECK-NEXT: vnsrl.wi v8, v8, 0 200; CHECK-NEXT: ret 201 %tvec = trunc <vscale x 1 x i64> %va to <vscale x 1 x i32> 202 ret <vscale x 1 x i32> %tvec 203} 204 205define <vscale x 2 x i8> @vtrunc_nxv2i64_nxv2i8(<vscale x 2 x i64> %va) { 206; CHECK-LABEL: vtrunc_nxv2i64_nxv2i8: 207; CHECK: # %bb.0: 208; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 209; CHECK-NEXT: vnsrl.wi v25, v8, 0 210; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 211; CHECK-NEXT: vnsrl.wi v25, v25, 0 212; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, mu 213; CHECK-NEXT: vnsrl.wi v8, v25, 0 214; CHECK-NEXT: ret 215 %tvec = trunc <vscale x 2 x i64> %va to <vscale x 2 x i8> 216 ret <vscale x 2 x i8> %tvec 217} 218 219define <vscale x 2 x i16> @vtrunc_nxv2i64_nxv2i16(<vscale x 2 x i64> %va) { 220; CHECK-LABEL: vtrunc_nxv2i64_nxv2i16: 221; CHECK: # %bb.0: 222; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 223; CHECK-NEXT: vnsrl.wi v25, v8, 0 224; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 225; CHECK-NEXT: vnsrl.wi v8, v25, 0 226; CHECK-NEXT: ret 227 %tvec = trunc <vscale x 2 x i64> %va to <vscale x 2 x i16> 228 ret <vscale x 2 x i16> %tvec 229} 230 231define <vscale x 2 x i32> @vtrunc_nxv2i64_nxv2i32(<vscale x 2 x i64> %va) { 232; CHECK-LABEL: vtrunc_nxv2i64_nxv2i32: 233; CHECK: # %bb.0: 234; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 235; CHECK-NEXT: vnsrl.wi v25, v8, 0 236; CHECK-NEXT: vmv1r.v v8, v25 237; CHECK-NEXT: ret 238 %tvec = trunc <vscale x 2 x i64> %va to <vscale x 2 x i32> 239 ret <vscale x 2 x i32> %tvec 240} 241 242define <vscale x 4 x i8> @vtrunc_nxv4i64_nxv4i8(<vscale x 4 x i64> %va) { 243; CHECK-LABEL: vtrunc_nxv4i64_nxv4i8: 244; CHECK: # %bb.0: 245; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 246; CHECK-NEXT: vnsrl.wi v26, v8, 0 247; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu 248; CHECK-NEXT: vnsrl.wi v25, v26, 0 249; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, mu 250; CHECK-NEXT: vnsrl.wi v8, v25, 0 251; CHECK-NEXT: ret 252 %tvec = trunc <vscale x 4 x i64> %va to <vscale x 4 x i8> 253 ret <vscale x 4 x i8> %tvec 254} 255 256define <vscale x 4 x i16> @vtrunc_nxv4i64_nxv4i16(<vscale x 4 x i64> %va) { 257; CHECK-LABEL: vtrunc_nxv4i64_nxv4i16: 258; CHECK: # %bb.0: 259; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 260; CHECK-NEXT: vnsrl.wi v26, v8, 0 261; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu 262; CHECK-NEXT: vnsrl.wi v8, v26, 0 263; CHECK-NEXT: ret 264 %tvec = trunc <vscale x 4 x i64> %va to <vscale x 4 x i16> 265 ret <vscale x 4 x i16> %tvec 266} 267 268define <vscale x 4 x i32> @vtrunc_nxv4i64_nxv4i32(<vscale x 4 x i64> %va) { 269; CHECK-LABEL: vtrunc_nxv4i64_nxv4i32: 270; CHECK: # %bb.0: 271; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 272; CHECK-NEXT: vnsrl.wi v26, v8, 0 273; CHECK-NEXT: vmv2r.v v8, v26 274; CHECK-NEXT: ret 275 %tvec = trunc <vscale x 4 x i64> %va to <vscale x 4 x i32> 276 ret <vscale x 4 x i32> %tvec 277} 278 279define <vscale x 8 x i8> @vtrunc_nxv8i64_nxv8i8(<vscale x 8 x i64> %va) { 280; CHECK-LABEL: vtrunc_nxv8i64_nxv8i8: 281; CHECK: # %bb.0: 282; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 283; CHECK-NEXT: vnsrl.wi v28, v8, 0 284; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 285; CHECK-NEXT: vnsrl.wi v26, v28, 0 286; CHECK-NEXT: vsetvli zero, zero, e8, m1, ta, mu 287; CHECK-NEXT: vnsrl.wi v8, v26, 0 288; CHECK-NEXT: ret 289 %tvec = trunc <vscale x 8 x i64> %va to <vscale x 8 x i8> 290 ret <vscale x 8 x i8> %tvec 291} 292 293define <vscale x 8 x i16> @vtrunc_nxv8i64_nxv8i16(<vscale x 8 x i64> %va) { 294; CHECK-LABEL: vtrunc_nxv8i64_nxv8i16: 295; CHECK: # %bb.0: 296; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 297; CHECK-NEXT: vnsrl.wi v28, v8, 0 298; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 299; CHECK-NEXT: vnsrl.wi v8, v28, 0 300; CHECK-NEXT: ret 301 %tvec = trunc <vscale x 8 x i64> %va to <vscale x 8 x i16> 302 ret <vscale x 8 x i16> %tvec 303} 304 305define <vscale x 8 x i32> @vtrunc_nxv8i64_nxv8i32(<vscale x 8 x i64> %va) { 306; CHECK-LABEL: vtrunc_nxv8i64_nxv8i32: 307; CHECK: # %bb.0: 308; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 309; CHECK-NEXT: vnsrl.wi v28, v8, 0 310; CHECK-NEXT: vmv4r.v v8, v28 311; CHECK-NEXT: ret 312 %tvec = trunc <vscale x 8 x i64> %va to <vscale x 8 x i32> 313 ret <vscale x 8 x i32> %tvec 314} 315 316