1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+experimental-zfh,+experimental-v -verify-machineinstrs < %s | FileCheck %s 3; RUN: llc -mtriple=riscv64 -mattr=+d,+experimental-zfh,+experimental-v -verify-machineinstrs < %s | FileCheck %s 4 5define <vscale x 1 x i8> @sextload_nxv1i1_nxv1i8(<vscale x 1 x i1>* %x) { 6; CHECK-LABEL: sextload_nxv1i1_nxv1i8: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, mu 9; CHECK-NEXT: vle1.v v0, (a0) 10; CHECK-NEXT: vmv.v.i v25, 0 11; CHECK-NEXT: vmerge.vim v8, v25, -1, v0 12; CHECK-NEXT: ret 13 %y = load <vscale x 1 x i1>, <vscale x 1 x i1>* %x 14 %z = sext <vscale x 1 x i1> %y to <vscale x 1 x i8> 15 ret <vscale x 1 x i8> %z 16} 17 18define <vscale x 1 x i16> @sextload_nxv1i8_nxv1i16(<vscale x 1 x i8>* %x) { 19; CHECK-LABEL: sextload_nxv1i8_nxv1i16: 20; CHECK: # %bb.0: 21; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, mu 22; CHECK-NEXT: vle8.v v25, (a0) 23; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 24; CHECK-NEXT: vsext.vf2 v8, v25 25; CHECK-NEXT: ret 26 %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x 27 %z = sext <vscale x 1 x i8> %y to <vscale x 1 x i16> 28 ret <vscale x 1 x i16> %z 29} 30 31define <vscale x 1 x i16> @zextload_nxv1i8_nxv1i16(<vscale x 1 x i8>* %x) { 32; CHECK-LABEL: zextload_nxv1i8_nxv1i16: 33; CHECK: # %bb.0: 34; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, mu 35; CHECK-NEXT: vle8.v v25, (a0) 36; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 37; CHECK-NEXT: vzext.vf2 v8, v25 38; CHECK-NEXT: ret 39 %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x 40 %z = zext <vscale x 1 x i8> %y to <vscale x 1 x i16> 41 ret <vscale x 1 x i16> %z 42} 43 44define <vscale x 1 x i32> @sextload_nxv1i8_nxv1i32(<vscale x 1 x i8>* %x) { 45; CHECK-LABEL: sextload_nxv1i8_nxv1i32: 46; CHECK: # %bb.0: 47; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, mu 48; CHECK-NEXT: vle8.v v25, (a0) 49; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 50; CHECK-NEXT: vsext.vf4 v8, v25 51; CHECK-NEXT: ret 52 %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x 53 %z = sext <vscale x 1 x i8> %y to <vscale x 1 x i32> 54 ret <vscale x 1 x i32> %z 55} 56 57define <vscale x 1 x i32> @zextload_nxv1i8_nxv1i32(<vscale x 1 x i8>* %x) { 58; CHECK-LABEL: zextload_nxv1i8_nxv1i32: 59; CHECK: # %bb.0: 60; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, mu 61; CHECK-NEXT: vle8.v v25, (a0) 62; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 63; CHECK-NEXT: vzext.vf4 v8, v25 64; CHECK-NEXT: ret 65 %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x 66 %z = zext <vscale x 1 x i8> %y to <vscale x 1 x i32> 67 ret <vscale x 1 x i32> %z 68} 69 70define <vscale x 1 x i64> @sextload_nxv1i8_nxv1i64(<vscale x 1 x i8>* %x) { 71; CHECK-LABEL: sextload_nxv1i8_nxv1i64: 72; CHECK: # %bb.0: 73; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, mu 74; CHECK-NEXT: vle8.v v25, (a0) 75; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 76; CHECK-NEXT: vsext.vf8 v8, v25 77; CHECK-NEXT: ret 78 %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x 79 %z = sext <vscale x 1 x i8> %y to <vscale x 1 x i64> 80 ret <vscale x 1 x i64> %z 81} 82 83define <vscale x 1 x i64> @zextload_nxv1i8_nxv1i64(<vscale x 1 x i8>* %x) { 84; CHECK-LABEL: zextload_nxv1i8_nxv1i64: 85; CHECK: # %bb.0: 86; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, mu 87; CHECK-NEXT: vle8.v v25, (a0) 88; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 89; CHECK-NEXT: vzext.vf8 v8, v25 90; CHECK-NEXT: ret 91 %y = load <vscale x 1 x i8>, <vscale x 1 x i8>* %x 92 %z = zext <vscale x 1 x i8> %y to <vscale x 1 x i64> 93 ret <vscale x 1 x i64> %z 94} 95 96define <vscale x 2 x i16> @sextload_nxv2i8_nxv2i16(<vscale x 2 x i8>* %x) { 97; CHECK-LABEL: sextload_nxv2i8_nxv2i16: 98; CHECK: # %bb.0: 99; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, mu 100; CHECK-NEXT: vle8.v v25, (a0) 101; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 102; CHECK-NEXT: vsext.vf2 v8, v25 103; CHECK-NEXT: ret 104 %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x 105 %z = sext <vscale x 2 x i8> %y to <vscale x 2 x i16> 106 ret <vscale x 2 x i16> %z 107} 108 109define <vscale x 2 x i16> @zextload_nxv2i8_nxv2i16(<vscale x 2 x i8>* %x) { 110; CHECK-LABEL: zextload_nxv2i8_nxv2i16: 111; CHECK: # %bb.0: 112; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, mu 113; CHECK-NEXT: vle8.v v25, (a0) 114; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 115; CHECK-NEXT: vzext.vf2 v8, v25 116; CHECK-NEXT: ret 117 %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x 118 %z = zext <vscale x 2 x i8> %y to <vscale x 2 x i16> 119 ret <vscale x 2 x i16> %z 120} 121 122define <vscale x 2 x i32> @sextload_nxv2i8_nxv2i32(<vscale x 2 x i8>* %x) { 123; CHECK-LABEL: sextload_nxv2i8_nxv2i32: 124; CHECK: # %bb.0: 125; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, mu 126; CHECK-NEXT: vle8.v v25, (a0) 127; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, mu 128; CHECK-NEXT: vsext.vf4 v8, v25 129; CHECK-NEXT: ret 130 %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x 131 %z = sext <vscale x 2 x i8> %y to <vscale x 2 x i32> 132 ret <vscale x 2 x i32> %z 133} 134 135define <vscale x 2 x i32> @zextload_nxv2i8_nxv2i32(<vscale x 2 x i8>* %x) { 136; CHECK-LABEL: zextload_nxv2i8_nxv2i32: 137; CHECK: # %bb.0: 138; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, mu 139; CHECK-NEXT: vle8.v v25, (a0) 140; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, mu 141; CHECK-NEXT: vzext.vf4 v8, v25 142; CHECK-NEXT: ret 143 %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x 144 %z = zext <vscale x 2 x i8> %y to <vscale x 2 x i32> 145 ret <vscale x 2 x i32> %z 146} 147 148define <vscale x 2 x i64> @sextload_nxv2i8_nxv2i64(<vscale x 2 x i8>* %x) { 149; CHECK-LABEL: sextload_nxv2i8_nxv2i64: 150; CHECK: # %bb.0: 151; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, mu 152; CHECK-NEXT: vle8.v v25, (a0) 153; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, mu 154; CHECK-NEXT: vsext.vf8 v8, v25 155; CHECK-NEXT: ret 156 %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x 157 %z = sext <vscale x 2 x i8> %y to <vscale x 2 x i64> 158 ret <vscale x 2 x i64> %z 159} 160 161define <vscale x 2 x i64> @zextload_nxv2i8_nxv2i64(<vscale x 2 x i8>* %x) { 162; CHECK-LABEL: zextload_nxv2i8_nxv2i64: 163; CHECK: # %bb.0: 164; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, mu 165; CHECK-NEXT: vle8.v v25, (a0) 166; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, mu 167; CHECK-NEXT: vzext.vf8 v8, v25 168; CHECK-NEXT: ret 169 %y = load <vscale x 2 x i8>, <vscale x 2 x i8>* %x 170 %z = zext <vscale x 2 x i8> %y to <vscale x 2 x i64> 171 ret <vscale x 2 x i64> %z 172} 173 174define <vscale x 4 x i16> @sextload_nxv4i8_nxv4i16(<vscale x 4 x i8>* %x) { 175; CHECK-LABEL: sextload_nxv4i8_nxv4i16: 176; CHECK: # %bb.0: 177; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, mu 178; CHECK-NEXT: vle8.v v25, (a0) 179; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu 180; CHECK-NEXT: vsext.vf2 v8, v25 181; CHECK-NEXT: ret 182 %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x 183 %z = sext <vscale x 4 x i8> %y to <vscale x 4 x i16> 184 ret <vscale x 4 x i16> %z 185} 186 187define <vscale x 4 x i16> @zextload_nxv4i8_nxv4i16(<vscale x 4 x i8>* %x) { 188; CHECK-LABEL: zextload_nxv4i8_nxv4i16: 189; CHECK: # %bb.0: 190; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, mu 191; CHECK-NEXT: vle8.v v25, (a0) 192; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu 193; CHECK-NEXT: vzext.vf2 v8, v25 194; CHECK-NEXT: ret 195 %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x 196 %z = zext <vscale x 4 x i8> %y to <vscale x 4 x i16> 197 ret <vscale x 4 x i16> %z 198} 199 200define <vscale x 4 x i32> @sextload_nxv4i8_nxv4i32(<vscale x 4 x i8>* %x) { 201; CHECK-LABEL: sextload_nxv4i8_nxv4i32: 202; CHECK: # %bb.0: 203; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, mu 204; CHECK-NEXT: vle8.v v25, (a0) 205; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, mu 206; CHECK-NEXT: vsext.vf4 v8, v25 207; CHECK-NEXT: ret 208 %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x 209 %z = sext <vscale x 4 x i8> %y to <vscale x 4 x i32> 210 ret <vscale x 4 x i32> %z 211} 212 213define <vscale x 4 x i32> @zextload_nxv4i8_nxv4i32(<vscale x 4 x i8>* %x) { 214; CHECK-LABEL: zextload_nxv4i8_nxv4i32: 215; CHECK: # %bb.0: 216; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, mu 217; CHECK-NEXT: vle8.v v25, (a0) 218; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, mu 219; CHECK-NEXT: vzext.vf4 v8, v25 220; CHECK-NEXT: ret 221 %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x 222 %z = zext <vscale x 4 x i8> %y to <vscale x 4 x i32> 223 ret <vscale x 4 x i32> %z 224} 225 226define <vscale x 4 x i64> @sextload_nxv4i8_nxv4i64(<vscale x 4 x i8>* %x) { 227; CHECK-LABEL: sextload_nxv4i8_nxv4i64: 228; CHECK: # %bb.0: 229; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, mu 230; CHECK-NEXT: vle8.v v25, (a0) 231; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, mu 232; CHECK-NEXT: vsext.vf8 v8, v25 233; CHECK-NEXT: ret 234 %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x 235 %z = sext <vscale x 4 x i8> %y to <vscale x 4 x i64> 236 ret <vscale x 4 x i64> %z 237} 238 239define <vscale x 4 x i64> @zextload_nxv4i8_nxv4i64(<vscale x 4 x i8>* %x) { 240; CHECK-LABEL: zextload_nxv4i8_nxv4i64: 241; CHECK: # %bb.0: 242; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, mu 243; CHECK-NEXT: vle8.v v25, (a0) 244; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, mu 245; CHECK-NEXT: vzext.vf8 v8, v25 246; CHECK-NEXT: ret 247 %y = load <vscale x 4 x i8>, <vscale x 4 x i8>* %x 248 %z = zext <vscale x 4 x i8> %y to <vscale x 4 x i64> 249 ret <vscale x 4 x i64> %z 250} 251 252define <vscale x 8 x i16> @sextload_nxv8i8_nxv8i16(<vscale x 8 x i8>* %x) { 253; CHECK-LABEL: sextload_nxv8i8_nxv8i16: 254; CHECK: # %bb.0: 255; CHECK-NEXT: vl1r.v v25, (a0) 256; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 257; CHECK-NEXT: vsext.vf2 v8, v25 258; CHECK-NEXT: ret 259 %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x 260 %z = sext <vscale x 8 x i8> %y to <vscale x 8 x i16> 261 ret <vscale x 8 x i16> %z 262} 263 264define <vscale x 8 x i16> @zextload_nxv8i8_nxv8i16(<vscale x 8 x i8>* %x) { 265; CHECK-LABEL: zextload_nxv8i8_nxv8i16: 266; CHECK: # %bb.0: 267; CHECK-NEXT: vl1r.v v25, (a0) 268; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 269; CHECK-NEXT: vzext.vf2 v8, v25 270; CHECK-NEXT: ret 271 %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x 272 %z = zext <vscale x 8 x i8> %y to <vscale x 8 x i16> 273 ret <vscale x 8 x i16> %z 274} 275 276define <vscale x 8 x i32> @sextload_nxv8i8_nxv8i32(<vscale x 8 x i8>* %x) { 277; CHECK-LABEL: sextload_nxv8i8_nxv8i32: 278; CHECK: # %bb.0: 279; CHECK-NEXT: vl1r.v v25, (a0) 280; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 281; CHECK-NEXT: vsext.vf4 v8, v25 282; CHECK-NEXT: ret 283 %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x 284 %z = sext <vscale x 8 x i8> %y to <vscale x 8 x i32> 285 ret <vscale x 8 x i32> %z 286} 287 288define <vscale x 8 x i32> @zextload_nxv8i8_nxv8i32(<vscale x 8 x i8>* %x) { 289; CHECK-LABEL: zextload_nxv8i8_nxv8i32: 290; CHECK: # %bb.0: 291; CHECK-NEXT: vl1r.v v25, (a0) 292; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 293; CHECK-NEXT: vzext.vf4 v8, v25 294; CHECK-NEXT: ret 295 %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x 296 %z = zext <vscale x 8 x i8> %y to <vscale x 8 x i32> 297 ret <vscale x 8 x i32> %z 298} 299 300define <vscale x 8 x i64> @sextload_nxv8i8_nxv8i64(<vscale x 8 x i8>* %x) { 301; CHECK-LABEL: sextload_nxv8i8_nxv8i64: 302; CHECK: # %bb.0: 303; CHECK-NEXT: vl1r.v v25, (a0) 304; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 305; CHECK-NEXT: vsext.vf8 v8, v25 306; CHECK-NEXT: ret 307 %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x 308 %z = sext <vscale x 8 x i8> %y to <vscale x 8 x i64> 309 ret <vscale x 8 x i64> %z 310} 311 312define <vscale x 8 x i64> @zextload_nxv8i8_nxv8i64(<vscale x 8 x i8>* %x) { 313; CHECK-LABEL: zextload_nxv8i8_nxv8i64: 314; CHECK: # %bb.0: 315; CHECK-NEXT: vl1r.v v25, (a0) 316; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 317; CHECK-NEXT: vzext.vf8 v8, v25 318; CHECK-NEXT: ret 319 %y = load <vscale x 8 x i8>, <vscale x 8 x i8>* %x 320 %z = zext <vscale x 8 x i8> %y to <vscale x 8 x i64> 321 ret <vscale x 8 x i64> %z 322} 323 324define <vscale x 16 x i16> @sextload_nxv16i8_nxv16i16(<vscale x 16 x i8>* %x) { 325; CHECK-LABEL: sextload_nxv16i8_nxv16i16: 326; CHECK: # %bb.0: 327; CHECK-NEXT: vl2r.v v26, (a0) 328; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, mu 329; CHECK-NEXT: vsext.vf2 v8, v26 330; CHECK-NEXT: ret 331 %y = load <vscale x 16 x i8>, <vscale x 16 x i8>* %x 332 %z = sext <vscale x 16 x i8> %y to <vscale x 16 x i16> 333 ret <vscale x 16 x i16> %z 334} 335 336define <vscale x 16 x i16> @zextload_nxv16i8_nxv16i16(<vscale x 16 x i8>* %x) { 337; CHECK-LABEL: zextload_nxv16i8_nxv16i16: 338; CHECK: # %bb.0: 339; CHECK-NEXT: vl2r.v v26, (a0) 340; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, mu 341; CHECK-NEXT: vzext.vf2 v8, v26 342; CHECK-NEXT: ret 343 %y = load <vscale x 16 x i8>, <vscale x 16 x i8>* %x 344 %z = zext <vscale x 16 x i8> %y to <vscale x 16 x i16> 345 ret <vscale x 16 x i16> %z 346} 347 348define <vscale x 16 x i32> @sextload_nxv16i8_nxv16i32(<vscale x 16 x i8>* %x) { 349; CHECK-LABEL: sextload_nxv16i8_nxv16i32: 350; CHECK: # %bb.0: 351; CHECK-NEXT: vl2r.v v26, (a0) 352; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, mu 353; CHECK-NEXT: vsext.vf4 v8, v26 354; CHECK-NEXT: ret 355 %y = load <vscale x 16 x i8>, <vscale x 16 x i8>* %x 356 %z = sext <vscale x 16 x i8> %y to <vscale x 16 x i32> 357 ret <vscale x 16 x i32> %z 358} 359 360define <vscale x 16 x i32> @zextload_nxv16i8_nxv16i32(<vscale x 16 x i8>* %x) { 361; CHECK-LABEL: zextload_nxv16i8_nxv16i32: 362; CHECK: # %bb.0: 363; CHECK-NEXT: vl2r.v v26, (a0) 364; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, mu 365; CHECK-NEXT: vzext.vf4 v8, v26 366; CHECK-NEXT: ret 367 %y = load <vscale x 16 x i8>, <vscale x 16 x i8>* %x 368 %z = zext <vscale x 16 x i8> %y to <vscale x 16 x i32> 369 ret <vscale x 16 x i32> %z 370} 371 372define <vscale x 32 x i16> @sextload_nxv32i8_nxv32i16(<vscale x 32 x i8>* %x) { 373; CHECK-LABEL: sextload_nxv32i8_nxv32i16: 374; CHECK: # %bb.0: 375; CHECK-NEXT: vl4r.v v28, (a0) 376; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, mu 377; CHECK-NEXT: vsext.vf2 v8, v28 378; CHECK-NEXT: ret 379 %y = load <vscale x 32 x i8>, <vscale x 32 x i8>* %x 380 %z = sext <vscale x 32 x i8> %y to <vscale x 32 x i16> 381 ret <vscale x 32 x i16> %z 382} 383 384define <vscale x 32 x i16> @zextload_nxv32i8_nxv32i16(<vscale x 32 x i8>* %x) { 385; CHECK-LABEL: zextload_nxv32i8_nxv32i16: 386; CHECK: # %bb.0: 387; CHECK-NEXT: vl4r.v v28, (a0) 388; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, mu 389; CHECK-NEXT: vzext.vf2 v8, v28 390; CHECK-NEXT: ret 391 %y = load <vscale x 32 x i8>, <vscale x 32 x i8>* %x 392 %z = zext <vscale x 32 x i8> %y to <vscale x 32 x i16> 393 ret <vscale x 32 x i16> %z 394} 395 396define void @truncstore_nxv1i8_nxv1i1(<vscale x 1 x i8> %x, <vscale x 1 x i1> *%z) { 397; CHECK-LABEL: truncstore_nxv1i8_nxv1i1: 398; CHECK: # %bb.0: 399; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, mu 400; CHECK-NEXT: vand.vi v25, v8, 1 401; CHECK-NEXT: vmsne.vi v25, v25, 0 402; CHECK-NEXT: vse1.v v25, (a0) 403; CHECK-NEXT: ret 404 %y = trunc <vscale x 1 x i8> %x to <vscale x 1 x i1> 405 store <vscale x 1 x i1> %y, <vscale x 1 x i1>* %z 406 ret void 407} 408 409define void @truncstore_nxv1i16_nxv1i8(<vscale x 1 x i16> %x, <vscale x 1 x i8>* %z) { 410; CHECK-LABEL: truncstore_nxv1i16_nxv1i8: 411; CHECK: # %bb.0: 412; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, mu 413; CHECK-NEXT: vnsrl.wi v25, v8, 0 414; CHECK-NEXT: vse8.v v25, (a0) 415; CHECK-NEXT: ret 416 %y = trunc <vscale x 1 x i16> %x to <vscale x 1 x i8> 417 store <vscale x 1 x i8> %y, <vscale x 1 x i8>* %z 418 ret void 419} 420 421define <vscale x 1 x i32> @sextload_nxv1i16_nxv1i32(<vscale x 1 x i16>* %x) { 422; CHECK-LABEL: sextload_nxv1i16_nxv1i32: 423; CHECK: # %bb.0: 424; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, mu 425; CHECK-NEXT: vle16.v v25, (a0) 426; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 427; CHECK-NEXT: vsext.vf2 v8, v25 428; CHECK-NEXT: ret 429 %y = load <vscale x 1 x i16>, <vscale x 1 x i16>* %x 430 %z = sext <vscale x 1 x i16> %y to <vscale x 1 x i32> 431 ret <vscale x 1 x i32> %z 432} 433 434define <vscale x 1 x i32> @zextload_nxv1i16_nxv1i32(<vscale x 1 x i16>* %x) { 435; CHECK-LABEL: zextload_nxv1i16_nxv1i32: 436; CHECK: # %bb.0: 437; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, mu 438; CHECK-NEXT: vle16.v v25, (a0) 439; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 440; CHECK-NEXT: vzext.vf2 v8, v25 441; CHECK-NEXT: ret 442 %y = load <vscale x 1 x i16>, <vscale x 1 x i16>* %x 443 %z = zext <vscale x 1 x i16> %y to <vscale x 1 x i32> 444 ret <vscale x 1 x i32> %z 445} 446 447define <vscale x 1 x i64> @sextload_nxv1i16_nxv1i64(<vscale x 1 x i16>* %x) { 448; CHECK-LABEL: sextload_nxv1i16_nxv1i64: 449; CHECK: # %bb.0: 450; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, mu 451; CHECK-NEXT: vle16.v v25, (a0) 452; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 453; CHECK-NEXT: vsext.vf4 v8, v25 454; CHECK-NEXT: ret 455 %y = load <vscale x 1 x i16>, <vscale x 1 x i16>* %x 456 %z = sext <vscale x 1 x i16> %y to <vscale x 1 x i64> 457 ret <vscale x 1 x i64> %z 458} 459 460define <vscale x 1 x i64> @zextload_nxv1i16_nxv1i64(<vscale x 1 x i16>* %x) { 461; CHECK-LABEL: zextload_nxv1i16_nxv1i64: 462; CHECK: # %bb.0: 463; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, mu 464; CHECK-NEXT: vle16.v v25, (a0) 465; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 466; CHECK-NEXT: vzext.vf4 v8, v25 467; CHECK-NEXT: ret 468 %y = load <vscale x 1 x i16>, <vscale x 1 x i16>* %x 469 %z = zext <vscale x 1 x i16> %y to <vscale x 1 x i64> 470 ret <vscale x 1 x i64> %z 471} 472 473define void @truncstore_nxv2i16_nxv2i8(<vscale x 2 x i16> %x, <vscale x 2 x i8>* %z) { 474; CHECK-LABEL: truncstore_nxv2i16_nxv2i8: 475; CHECK: # %bb.0: 476; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, mu 477; CHECK-NEXT: vnsrl.wi v25, v8, 0 478; CHECK-NEXT: vse8.v v25, (a0) 479; CHECK-NEXT: ret 480 %y = trunc <vscale x 2 x i16> %x to <vscale x 2 x i8> 481 store <vscale x 2 x i8> %y, <vscale x 2 x i8>* %z 482 ret void 483} 484 485define <vscale x 2 x i32> @sextload_nxv2i16_nxv2i32(<vscale x 2 x i16>* %x) { 486; CHECK-LABEL: sextload_nxv2i16_nxv2i32: 487; CHECK: # %bb.0: 488; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, mu 489; CHECK-NEXT: vle16.v v25, (a0) 490; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, mu 491; CHECK-NEXT: vsext.vf2 v8, v25 492; CHECK-NEXT: ret 493 %y = load <vscale x 2 x i16>, <vscale x 2 x i16>* %x 494 %z = sext <vscale x 2 x i16> %y to <vscale x 2 x i32> 495 ret <vscale x 2 x i32> %z 496} 497 498define <vscale x 2 x i32> @zextload_nxv2i16_nxv2i32(<vscale x 2 x i16>* %x) { 499; CHECK-LABEL: zextload_nxv2i16_nxv2i32: 500; CHECK: # %bb.0: 501; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, mu 502; CHECK-NEXT: vle16.v v25, (a0) 503; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, mu 504; CHECK-NEXT: vzext.vf2 v8, v25 505; CHECK-NEXT: ret 506 %y = load <vscale x 2 x i16>, <vscale x 2 x i16>* %x 507 %z = zext <vscale x 2 x i16> %y to <vscale x 2 x i32> 508 ret <vscale x 2 x i32> %z 509} 510 511define <vscale x 2 x i64> @sextload_nxv2i16_nxv2i64(<vscale x 2 x i16>* %x) { 512; CHECK-LABEL: sextload_nxv2i16_nxv2i64: 513; CHECK: # %bb.0: 514; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, mu 515; CHECK-NEXT: vle16.v v25, (a0) 516; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, mu 517; CHECK-NEXT: vsext.vf4 v8, v25 518; CHECK-NEXT: ret 519 %y = load <vscale x 2 x i16>, <vscale x 2 x i16>* %x 520 %z = sext <vscale x 2 x i16> %y to <vscale x 2 x i64> 521 ret <vscale x 2 x i64> %z 522} 523 524define <vscale x 2 x i64> @zextload_nxv2i16_nxv2i64(<vscale x 2 x i16>* %x) { 525; CHECK-LABEL: zextload_nxv2i16_nxv2i64: 526; CHECK: # %bb.0: 527; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, mu 528; CHECK-NEXT: vle16.v v25, (a0) 529; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, mu 530; CHECK-NEXT: vzext.vf4 v8, v25 531; CHECK-NEXT: ret 532 %y = load <vscale x 2 x i16>, <vscale x 2 x i16>* %x 533 %z = zext <vscale x 2 x i16> %y to <vscale x 2 x i64> 534 ret <vscale x 2 x i64> %z 535} 536 537define void @truncstore_nxv4i16_nxv4i8(<vscale x 4 x i16> %x, <vscale x 4 x i8>* %z) { 538; CHECK-LABEL: truncstore_nxv4i16_nxv4i8: 539; CHECK: # %bb.0: 540; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, mu 541; CHECK-NEXT: vnsrl.wi v25, v8, 0 542; CHECK-NEXT: vse8.v v25, (a0) 543; CHECK-NEXT: ret 544 %y = trunc <vscale x 4 x i16> %x to <vscale x 4 x i8> 545 store <vscale x 4 x i8> %y, <vscale x 4 x i8>* %z 546 ret void 547} 548 549define <vscale x 4 x i32> @sextload_nxv4i16_nxv4i32(<vscale x 4 x i16>* %x) { 550; CHECK-LABEL: sextload_nxv4i16_nxv4i32: 551; CHECK: # %bb.0: 552; CHECK-NEXT: vl1re16.v v25, (a0) 553; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 554; CHECK-NEXT: vsext.vf2 v8, v25 555; CHECK-NEXT: ret 556 %y = load <vscale x 4 x i16>, <vscale x 4 x i16>* %x 557 %z = sext <vscale x 4 x i16> %y to <vscale x 4 x i32> 558 ret <vscale x 4 x i32> %z 559} 560 561define <vscale x 4 x i32> @zextload_nxv4i16_nxv4i32(<vscale x 4 x i16>* %x) { 562; CHECK-LABEL: zextload_nxv4i16_nxv4i32: 563; CHECK: # %bb.0: 564; CHECK-NEXT: vl1re16.v v25, (a0) 565; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 566; CHECK-NEXT: vzext.vf2 v8, v25 567; CHECK-NEXT: ret 568 %y = load <vscale x 4 x i16>, <vscale x 4 x i16>* %x 569 %z = zext <vscale x 4 x i16> %y to <vscale x 4 x i32> 570 ret <vscale x 4 x i32> %z 571} 572 573define <vscale x 4 x i64> @sextload_nxv4i16_nxv4i64(<vscale x 4 x i16>* %x) { 574; CHECK-LABEL: sextload_nxv4i16_nxv4i64: 575; CHECK: # %bb.0: 576; CHECK-NEXT: vl1re16.v v25, (a0) 577; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, mu 578; CHECK-NEXT: vsext.vf4 v8, v25 579; CHECK-NEXT: ret 580 %y = load <vscale x 4 x i16>, <vscale x 4 x i16>* %x 581 %z = sext <vscale x 4 x i16> %y to <vscale x 4 x i64> 582 ret <vscale x 4 x i64> %z 583} 584 585define <vscale x 4 x i64> @zextload_nxv4i16_nxv4i64(<vscale x 4 x i16>* %x) { 586; CHECK-LABEL: zextload_nxv4i16_nxv4i64: 587; CHECK: # %bb.0: 588; CHECK-NEXT: vl1re16.v v25, (a0) 589; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, mu 590; CHECK-NEXT: vzext.vf4 v8, v25 591; CHECK-NEXT: ret 592 %y = load <vscale x 4 x i16>, <vscale x 4 x i16>* %x 593 %z = zext <vscale x 4 x i16> %y to <vscale x 4 x i64> 594 ret <vscale x 4 x i64> %z 595} 596 597define void @truncstore_nxv8i16_nxv8i8(<vscale x 8 x i16> %x, <vscale x 8 x i8>* %z) { 598; CHECK-LABEL: truncstore_nxv8i16_nxv8i8: 599; CHECK: # %bb.0: 600; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, mu 601; CHECK-NEXT: vnsrl.wi v25, v8, 0 602; CHECK-NEXT: vs1r.v v25, (a0) 603; CHECK-NEXT: ret 604 %y = trunc <vscale x 8 x i16> %x to <vscale x 8 x i8> 605 store <vscale x 8 x i8> %y, <vscale x 8 x i8>* %z 606 ret void 607} 608 609define <vscale x 8 x i32> @sextload_nxv8i16_nxv8i32(<vscale x 8 x i16>* %x) { 610; CHECK-LABEL: sextload_nxv8i16_nxv8i32: 611; CHECK: # %bb.0: 612; CHECK-NEXT: vl2re16.v v26, (a0) 613; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 614; CHECK-NEXT: vsext.vf2 v8, v26 615; CHECK-NEXT: ret 616 %y = load <vscale x 8 x i16>, <vscale x 8 x i16>* %x 617 %z = sext <vscale x 8 x i16> %y to <vscale x 8 x i32> 618 ret <vscale x 8 x i32> %z 619} 620 621define <vscale x 8 x i32> @zextload_nxv8i16_nxv8i32(<vscale x 8 x i16>* %x) { 622; CHECK-LABEL: zextload_nxv8i16_nxv8i32: 623; CHECK: # %bb.0: 624; CHECK-NEXT: vl2re16.v v26, (a0) 625; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 626; CHECK-NEXT: vzext.vf2 v8, v26 627; CHECK-NEXT: ret 628 %y = load <vscale x 8 x i16>, <vscale x 8 x i16>* %x 629 %z = zext <vscale x 8 x i16> %y to <vscale x 8 x i32> 630 ret <vscale x 8 x i32> %z 631} 632 633define <vscale x 8 x i64> @sextload_nxv8i16_nxv8i64(<vscale x 8 x i16>* %x) { 634; CHECK-LABEL: sextload_nxv8i16_nxv8i64: 635; CHECK: # %bb.0: 636; CHECK-NEXT: vl2re16.v v26, (a0) 637; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 638; CHECK-NEXT: vsext.vf4 v8, v26 639; CHECK-NEXT: ret 640 %y = load <vscale x 8 x i16>, <vscale x 8 x i16>* %x 641 %z = sext <vscale x 8 x i16> %y to <vscale x 8 x i64> 642 ret <vscale x 8 x i64> %z 643} 644 645define <vscale x 8 x i64> @zextload_nxv8i16_nxv8i64(<vscale x 8 x i16>* %x) { 646; CHECK-LABEL: zextload_nxv8i16_nxv8i64: 647; CHECK: # %bb.0: 648; CHECK-NEXT: vl2re16.v v26, (a0) 649; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 650; CHECK-NEXT: vzext.vf4 v8, v26 651; CHECK-NEXT: ret 652 %y = load <vscale x 8 x i16>, <vscale x 8 x i16>* %x 653 %z = zext <vscale x 8 x i16> %y to <vscale x 8 x i64> 654 ret <vscale x 8 x i64> %z 655} 656 657define void @truncstore_nxv16i16_nxv16i8(<vscale x 16 x i16> %x, <vscale x 16 x i8>* %z) { 658; CHECK-LABEL: truncstore_nxv16i16_nxv16i8: 659; CHECK: # %bb.0: 660; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, mu 661; CHECK-NEXT: vnsrl.wi v26, v8, 0 662; CHECK-NEXT: vs2r.v v26, (a0) 663; CHECK-NEXT: ret 664 %y = trunc <vscale x 16 x i16> %x to <vscale x 16 x i8> 665 store <vscale x 16 x i8> %y, <vscale x 16 x i8>* %z 666 ret void 667} 668 669define <vscale x 16 x i32> @sextload_nxv16i16_nxv16i32(<vscale x 16 x i16>* %x) { 670; CHECK-LABEL: sextload_nxv16i16_nxv16i32: 671; CHECK: # %bb.0: 672; CHECK-NEXT: vl4re16.v v28, (a0) 673; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, mu 674; CHECK-NEXT: vsext.vf2 v8, v28 675; CHECK-NEXT: ret 676 %y = load <vscale x 16 x i16>, <vscale x 16 x i16>* %x 677 %z = sext <vscale x 16 x i16> %y to <vscale x 16 x i32> 678 ret <vscale x 16 x i32> %z 679} 680 681define <vscale x 16 x i32> @zextload_nxv16i16_nxv16i32(<vscale x 16 x i16>* %x) { 682; CHECK-LABEL: zextload_nxv16i16_nxv16i32: 683; CHECK: # %bb.0: 684; CHECK-NEXT: vl4re16.v v28, (a0) 685; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, mu 686; CHECK-NEXT: vzext.vf2 v8, v28 687; CHECK-NEXT: ret 688 %y = load <vscale x 16 x i16>, <vscale x 16 x i16>* %x 689 %z = zext <vscale x 16 x i16> %y to <vscale x 16 x i32> 690 ret <vscale x 16 x i32> %z 691} 692 693define void @truncstore_nxv32i16_nxv32i8(<vscale x 32 x i16> %x, <vscale x 32 x i8>* %z) { 694; CHECK-LABEL: truncstore_nxv32i16_nxv32i8: 695; CHECK: # %bb.0: 696; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, mu 697; CHECK-NEXT: vnsrl.wi v28, v8, 0 698; CHECK-NEXT: vs4r.v v28, (a0) 699; CHECK-NEXT: ret 700 %y = trunc <vscale x 32 x i16> %x to <vscale x 32 x i8> 701 store <vscale x 32 x i8> %y, <vscale x 32 x i8>* %z 702 ret void 703} 704 705define void @truncstore_nxv1i32_nxv1i8(<vscale x 1 x i32> %x, <vscale x 1 x i8>* %z) { 706; CHECK-LABEL: truncstore_nxv1i32_nxv1i8: 707; CHECK: # %bb.0: 708; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, mu 709; CHECK-NEXT: vnsrl.wi v25, v8, 0 710; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 711; CHECK-NEXT: vnsrl.wi v25, v25, 0 712; CHECK-NEXT: vse8.v v25, (a0) 713; CHECK-NEXT: ret 714 %y = trunc <vscale x 1 x i32> %x to <vscale x 1 x i8> 715 store <vscale x 1 x i8> %y, <vscale x 1 x i8>* %z 716 ret void 717} 718 719define void @truncstore_nxv1i32_nxv1i16(<vscale x 1 x i32> %x, <vscale x 1 x i16>* %z) { 720; CHECK-LABEL: truncstore_nxv1i32_nxv1i16: 721; CHECK: # %bb.0: 722; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, mu 723; CHECK-NEXT: vnsrl.wi v25, v8, 0 724; CHECK-NEXT: vse16.v v25, (a0) 725; CHECK-NEXT: ret 726 %y = trunc <vscale x 1 x i32> %x to <vscale x 1 x i16> 727 store <vscale x 1 x i16> %y, <vscale x 1 x i16>* %z 728 ret void 729} 730 731define <vscale x 1 x i64> @sextload_nxv1i32_nxv1i64(<vscale x 1 x i32>* %x) { 732; CHECK-LABEL: sextload_nxv1i32_nxv1i64: 733; CHECK: # %bb.0: 734; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, mu 735; CHECK-NEXT: vle32.v v25, (a0) 736; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 737; CHECK-NEXT: vsext.vf2 v8, v25 738; CHECK-NEXT: ret 739 %y = load <vscale x 1 x i32>, <vscale x 1 x i32>* %x 740 %z = sext <vscale x 1 x i32> %y to <vscale x 1 x i64> 741 ret <vscale x 1 x i64> %z 742} 743 744define <vscale x 1 x i64> @zextload_nxv1i32_nxv1i64(<vscale x 1 x i32>* %x) { 745; CHECK-LABEL: zextload_nxv1i32_nxv1i64: 746; CHECK: # %bb.0: 747; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, mu 748; CHECK-NEXT: vle32.v v25, (a0) 749; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 750; CHECK-NEXT: vzext.vf2 v8, v25 751; CHECK-NEXT: ret 752 %y = load <vscale x 1 x i32>, <vscale x 1 x i32>* %x 753 %z = zext <vscale x 1 x i32> %y to <vscale x 1 x i64> 754 ret <vscale x 1 x i64> %z 755} 756 757define void @truncstore_nxv2i32_nxv2i8(<vscale x 2 x i32> %x, <vscale x 2 x i8>* %z) { 758; CHECK-LABEL: truncstore_nxv2i32_nxv2i8: 759; CHECK: # %bb.0: 760; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, mu 761; CHECK-NEXT: vnsrl.wi v25, v8, 0 762; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, mu 763; CHECK-NEXT: vnsrl.wi v25, v25, 0 764; CHECK-NEXT: vse8.v v25, (a0) 765; CHECK-NEXT: ret 766 %y = trunc <vscale x 2 x i32> %x to <vscale x 2 x i8> 767 store <vscale x 2 x i8> %y, <vscale x 2 x i8>* %z 768 ret void 769} 770 771define void @truncstore_nxv2i32_nxv2i16(<vscale x 2 x i32> %x, <vscale x 2 x i16>* %z) { 772; CHECK-LABEL: truncstore_nxv2i32_nxv2i16: 773; CHECK: # %bb.0: 774; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, mu 775; CHECK-NEXT: vnsrl.wi v25, v8, 0 776; CHECK-NEXT: vse16.v v25, (a0) 777; CHECK-NEXT: ret 778 %y = trunc <vscale x 2 x i32> %x to <vscale x 2 x i16> 779 store <vscale x 2 x i16> %y, <vscale x 2 x i16>* %z 780 ret void 781} 782 783define <vscale x 2 x i64> @sextload_nxv2i32_nxv2i64(<vscale x 2 x i32>* %x) { 784; CHECK-LABEL: sextload_nxv2i32_nxv2i64: 785; CHECK: # %bb.0: 786; CHECK-NEXT: vl1re32.v v25, (a0) 787; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, mu 788; CHECK-NEXT: vsext.vf2 v8, v25 789; CHECK-NEXT: ret 790 %y = load <vscale x 2 x i32>, <vscale x 2 x i32>* %x 791 %z = sext <vscale x 2 x i32> %y to <vscale x 2 x i64> 792 ret <vscale x 2 x i64> %z 793} 794 795define <vscale x 2 x i64> @zextload_nxv2i32_nxv2i64(<vscale x 2 x i32>* %x) { 796; CHECK-LABEL: zextload_nxv2i32_nxv2i64: 797; CHECK: # %bb.0: 798; CHECK-NEXT: vl1re32.v v25, (a0) 799; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, mu 800; CHECK-NEXT: vzext.vf2 v8, v25 801; CHECK-NEXT: ret 802 %y = load <vscale x 2 x i32>, <vscale x 2 x i32>* %x 803 %z = zext <vscale x 2 x i32> %y to <vscale x 2 x i64> 804 ret <vscale x 2 x i64> %z 805} 806 807define void @truncstore_nxv4i32_nxv4i8(<vscale x 4 x i32> %x, <vscale x 4 x i8>* %z) { 808; CHECK-LABEL: truncstore_nxv4i32_nxv4i8: 809; CHECK: # %bb.0: 810; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, mu 811; CHECK-NEXT: vnsrl.wi v25, v8, 0 812; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, mu 813; CHECK-NEXT: vnsrl.wi v25, v25, 0 814; CHECK-NEXT: vse8.v v25, (a0) 815; CHECK-NEXT: ret 816 %y = trunc <vscale x 4 x i32> %x to <vscale x 4 x i8> 817 store <vscale x 4 x i8> %y, <vscale x 4 x i8>* %z 818 ret void 819} 820 821define void @truncstore_nxv4i32_nxv4i16(<vscale x 4 x i32> %x, <vscale x 4 x i16>* %z) { 822; CHECK-LABEL: truncstore_nxv4i32_nxv4i16: 823; CHECK: # %bb.0: 824; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, mu 825; CHECK-NEXT: vnsrl.wi v25, v8, 0 826; CHECK-NEXT: vs1r.v v25, (a0) 827; CHECK-NEXT: ret 828 %y = trunc <vscale x 4 x i32> %x to <vscale x 4 x i16> 829 store <vscale x 4 x i16> %y, <vscale x 4 x i16>* %z 830 ret void 831} 832 833define <vscale x 4 x i64> @sextload_nxv4i32_nxv4i64(<vscale x 4 x i32>* %x) { 834; CHECK-LABEL: sextload_nxv4i32_nxv4i64: 835; CHECK: # %bb.0: 836; CHECK-NEXT: vl2re32.v v26, (a0) 837; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, mu 838; CHECK-NEXT: vsext.vf2 v8, v26 839; CHECK-NEXT: ret 840 %y = load <vscale x 4 x i32>, <vscale x 4 x i32>* %x 841 %z = sext <vscale x 4 x i32> %y to <vscale x 4 x i64> 842 ret <vscale x 4 x i64> %z 843} 844 845define <vscale x 4 x i64> @zextload_nxv4i32_nxv4i64(<vscale x 4 x i32>* %x) { 846; CHECK-LABEL: zextload_nxv4i32_nxv4i64: 847; CHECK: # %bb.0: 848; CHECK-NEXT: vl2re32.v v26, (a0) 849; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, mu 850; CHECK-NEXT: vzext.vf2 v8, v26 851; CHECK-NEXT: ret 852 %y = load <vscale x 4 x i32>, <vscale x 4 x i32>* %x 853 %z = zext <vscale x 4 x i32> %y to <vscale x 4 x i64> 854 ret <vscale x 4 x i64> %z 855} 856 857define void @truncstore_nxv8i32_nxv8i8(<vscale x 8 x i32> %x, <vscale x 8 x i8>* %z) { 858; CHECK-LABEL: truncstore_nxv8i32_nxv8i8: 859; CHECK: # %bb.0: 860; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, mu 861; CHECK-NEXT: vnsrl.wi v26, v8, 0 862; CHECK-NEXT: vsetvli zero, zero, e8, m1, ta, mu 863; CHECK-NEXT: vnsrl.wi v25, v26, 0 864; CHECK-NEXT: vs1r.v v25, (a0) 865; CHECK-NEXT: ret 866 %y = trunc <vscale x 8 x i32> %x to <vscale x 8 x i8> 867 store <vscale x 8 x i8> %y, <vscale x 8 x i8>* %z 868 ret void 869} 870 871define void @truncstore_nxv8i32_nxv8i16(<vscale x 8 x i32> %x, <vscale x 8 x i16>* %z) { 872; CHECK-LABEL: truncstore_nxv8i32_nxv8i16: 873; CHECK: # %bb.0: 874; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, mu 875; CHECK-NEXT: vnsrl.wi v26, v8, 0 876; CHECK-NEXT: vs2r.v v26, (a0) 877; CHECK-NEXT: ret 878 %y = trunc <vscale x 8 x i32> %x to <vscale x 8 x i16> 879 store <vscale x 8 x i16> %y, <vscale x 8 x i16>* %z 880 ret void 881} 882 883define <vscale x 8 x i64> @sextload_nxv8i32_nxv8i64(<vscale x 8 x i32>* %x) { 884; CHECK-LABEL: sextload_nxv8i32_nxv8i64: 885; CHECK: # %bb.0: 886; CHECK-NEXT: vl4re32.v v28, (a0) 887; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 888; CHECK-NEXT: vsext.vf2 v8, v28 889; CHECK-NEXT: ret 890 %y = load <vscale x 8 x i32>, <vscale x 8 x i32>* %x 891 %z = sext <vscale x 8 x i32> %y to <vscale x 8 x i64> 892 ret <vscale x 8 x i64> %z 893} 894 895define <vscale x 8 x i64> @zextload_nxv8i32_nxv8i64(<vscale x 8 x i32>* %x) { 896; CHECK-LABEL: zextload_nxv8i32_nxv8i64: 897; CHECK: # %bb.0: 898; CHECK-NEXT: vl4re32.v v28, (a0) 899; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 900; CHECK-NEXT: vzext.vf2 v8, v28 901; CHECK-NEXT: ret 902 %y = load <vscale x 8 x i32>, <vscale x 8 x i32>* %x 903 %z = zext <vscale x 8 x i32> %y to <vscale x 8 x i64> 904 ret <vscale x 8 x i64> %z 905} 906 907define void @truncstore_nxv16i32_nxv16i8(<vscale x 16 x i32> %x, <vscale x 16 x i8>* %z) { 908; CHECK-LABEL: truncstore_nxv16i32_nxv16i8: 909; CHECK: # %bb.0: 910; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, mu 911; CHECK-NEXT: vnsrl.wi v28, v8, 0 912; CHECK-NEXT: vsetvli zero, zero, e8, m2, ta, mu 913; CHECK-NEXT: vnsrl.wi v26, v28, 0 914; CHECK-NEXT: vs2r.v v26, (a0) 915; CHECK-NEXT: ret 916 %y = trunc <vscale x 16 x i32> %x to <vscale x 16 x i8> 917 store <vscale x 16 x i8> %y, <vscale x 16 x i8>* %z 918 ret void 919} 920 921define void @truncstore_nxv16i32_nxv16i16(<vscale x 16 x i32> %x, <vscale x 16 x i16>* %z) { 922; CHECK-LABEL: truncstore_nxv16i32_nxv16i16: 923; CHECK: # %bb.0: 924; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, mu 925; CHECK-NEXT: vnsrl.wi v28, v8, 0 926; CHECK-NEXT: vs4r.v v28, (a0) 927; CHECK-NEXT: ret 928 %y = trunc <vscale x 16 x i32> %x to <vscale x 16 x i16> 929 store <vscale x 16 x i16> %y, <vscale x 16 x i16>* %z 930 ret void 931} 932 933define void @truncstore_nxv1i64_nxv1i8(<vscale x 1 x i64> %x, <vscale x 1 x i8>* %z) { 934; CHECK-LABEL: truncstore_nxv1i64_nxv1i8: 935; CHECK: # %bb.0: 936; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, mu 937; CHECK-NEXT: vnsrl.wi v25, v8, 0 938; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 939; CHECK-NEXT: vnsrl.wi v25, v25, 0 940; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 941; CHECK-NEXT: vnsrl.wi v25, v25, 0 942; CHECK-NEXT: vse8.v v25, (a0) 943; CHECK-NEXT: ret 944 %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i8> 945 store <vscale x 1 x i8> %y, <vscale x 1 x i8>* %z 946 ret void 947} 948 949define void @truncstore_nxv1i64_nxv1i16(<vscale x 1 x i64> %x, <vscale x 1 x i16>* %z) { 950; CHECK-LABEL: truncstore_nxv1i64_nxv1i16: 951; CHECK: # %bb.0: 952; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, mu 953; CHECK-NEXT: vnsrl.wi v25, v8, 0 954; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 955; CHECK-NEXT: vnsrl.wi v25, v25, 0 956; CHECK-NEXT: vse16.v v25, (a0) 957; CHECK-NEXT: ret 958 %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i16> 959 store <vscale x 1 x i16> %y, <vscale x 1 x i16>* %z 960 ret void 961} 962 963define void @truncstore_nxv1i64_nxv1i32(<vscale x 1 x i64> %x, <vscale x 1 x i32>* %z) { 964; CHECK-LABEL: truncstore_nxv1i64_nxv1i32: 965; CHECK: # %bb.0: 966; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, mu 967; CHECK-NEXT: vnsrl.wi v25, v8, 0 968; CHECK-NEXT: vse32.v v25, (a0) 969; CHECK-NEXT: ret 970 %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32> 971 store <vscale x 1 x i32> %y, <vscale x 1 x i32>* %z 972 ret void 973} 974 975define void @truncstore_nxv2i64_nxv2i8(<vscale x 2 x i64> %x, <vscale x 2 x i8>* %z) { 976; CHECK-LABEL: truncstore_nxv2i64_nxv2i8: 977; CHECK: # %bb.0: 978; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, mu 979; CHECK-NEXT: vnsrl.wi v25, v8, 0 980; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 981; CHECK-NEXT: vnsrl.wi v25, v25, 0 982; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, mu 983; CHECK-NEXT: vnsrl.wi v25, v25, 0 984; CHECK-NEXT: vse8.v v25, (a0) 985; CHECK-NEXT: ret 986 %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i8> 987 store <vscale x 2 x i8> %y, <vscale x 2 x i8>* %z 988 ret void 989} 990 991define void @truncstore_nxv2i64_nxv2i16(<vscale x 2 x i64> %x, <vscale x 2 x i16>* %z) { 992; CHECK-LABEL: truncstore_nxv2i64_nxv2i16: 993; CHECK: # %bb.0: 994; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, mu 995; CHECK-NEXT: vnsrl.wi v25, v8, 0 996; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 997; CHECK-NEXT: vnsrl.wi v25, v25, 0 998; CHECK-NEXT: vse16.v v25, (a0) 999; CHECK-NEXT: ret 1000 %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i16> 1001 store <vscale x 2 x i16> %y, <vscale x 2 x i16>* %z 1002 ret void 1003} 1004 1005define void @truncstore_nxv2i64_nxv2i32(<vscale x 2 x i64> %x, <vscale x 2 x i32>* %z) { 1006; CHECK-LABEL: truncstore_nxv2i64_nxv2i32: 1007; CHECK: # %bb.0: 1008; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, mu 1009; CHECK-NEXT: vnsrl.wi v25, v8, 0 1010; CHECK-NEXT: vs1r.v v25, (a0) 1011; CHECK-NEXT: ret 1012 %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32> 1013 store <vscale x 2 x i32> %y, <vscale x 2 x i32>* %z 1014 ret void 1015} 1016 1017define void @truncstore_nxv4i64_nxv4i8(<vscale x 4 x i64> %x, <vscale x 4 x i8>* %z) { 1018; CHECK-LABEL: truncstore_nxv4i64_nxv4i8: 1019; CHECK: # %bb.0: 1020; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, mu 1021; CHECK-NEXT: vnsrl.wi v26, v8, 0 1022; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu 1023; CHECK-NEXT: vnsrl.wi v25, v26, 0 1024; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, mu 1025; CHECK-NEXT: vnsrl.wi v25, v25, 0 1026; CHECK-NEXT: vse8.v v25, (a0) 1027; CHECK-NEXT: ret 1028 %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i8> 1029 store <vscale x 4 x i8> %y, <vscale x 4 x i8>* %z 1030 ret void 1031} 1032 1033define void @truncstore_nxv4i64_nxv4i16(<vscale x 4 x i64> %x, <vscale x 4 x i16>* %z) { 1034; CHECK-LABEL: truncstore_nxv4i64_nxv4i16: 1035; CHECK: # %bb.0: 1036; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, mu 1037; CHECK-NEXT: vnsrl.wi v26, v8, 0 1038; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu 1039; CHECK-NEXT: vnsrl.wi v25, v26, 0 1040; CHECK-NEXT: vs1r.v v25, (a0) 1041; CHECK-NEXT: ret 1042 %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i16> 1043 store <vscale x 4 x i16> %y, <vscale x 4 x i16>* %z 1044 ret void 1045} 1046 1047define void @truncstore_nxv4i64_nxv4i32(<vscale x 4 x i64> %x, <vscale x 4 x i32>* %z) { 1048; CHECK-LABEL: truncstore_nxv4i64_nxv4i32: 1049; CHECK: # %bb.0: 1050; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, mu 1051; CHECK-NEXT: vnsrl.wi v26, v8, 0 1052; CHECK-NEXT: vs2r.v v26, (a0) 1053; CHECK-NEXT: ret 1054 %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32> 1055 store <vscale x 4 x i32> %y, <vscale x 4 x i32>* %z 1056 ret void 1057} 1058 1059define void @truncstore_nxv8i64_nxv8i8(<vscale x 8 x i64> %x, <vscale x 8 x i8>* %z) { 1060; CHECK-LABEL: truncstore_nxv8i64_nxv8i8: 1061; CHECK: # %bb.0: 1062; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu 1063; CHECK-NEXT: vnsrl.wi v28, v8, 0 1064; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 1065; CHECK-NEXT: vnsrl.wi v26, v28, 0 1066; CHECK-NEXT: vsetvli zero, zero, e8, m1, ta, mu 1067; CHECK-NEXT: vnsrl.wi v25, v26, 0 1068; CHECK-NEXT: vs1r.v v25, (a0) 1069; CHECK-NEXT: ret 1070 %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i8> 1071 store <vscale x 8 x i8> %y, <vscale x 8 x i8>* %z 1072 ret void 1073} 1074 1075define void @truncstore_nxv8i64_nxv8i16(<vscale x 8 x i64> %x, <vscale x 8 x i16>* %z) { 1076; CHECK-LABEL: truncstore_nxv8i64_nxv8i16: 1077; CHECK: # %bb.0: 1078; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu 1079; CHECK-NEXT: vnsrl.wi v28, v8, 0 1080; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 1081; CHECK-NEXT: vnsrl.wi v26, v28, 0 1082; CHECK-NEXT: vs2r.v v26, (a0) 1083; CHECK-NEXT: ret 1084 %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i16> 1085 store <vscale x 8 x i16> %y, <vscale x 8 x i16>* %z 1086 ret void 1087} 1088 1089define void @truncstore_nxv8i64_nxv8i32(<vscale x 8 x i64> %x, <vscale x 8 x i32>* %z) { 1090; CHECK-LABEL: truncstore_nxv8i64_nxv8i32: 1091; CHECK: # %bb.0: 1092; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu 1093; CHECK-NEXT: vnsrl.wi v28, v8, 0 1094; CHECK-NEXT: vs4r.v v28, (a0) 1095; CHECK-NEXT: ret 1096 %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32> 1097 store <vscale x 8 x i32> %y, <vscale x 8 x i32>* %z 1098 ret void 1099} 1100 1101define <vscale x 1 x float> @extload_nxv1f16_nxv1f32(<vscale x 1 x half>* %x) { 1102; CHECK-LABEL: extload_nxv1f16_nxv1f32: 1103; CHECK: # %bb.0: 1104; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, mu 1105; CHECK-NEXT: vle16.v v25, (a0) 1106; CHECK-NEXT: vfwcvt.f.f.v v8, v25 1107; CHECK-NEXT: ret 1108 %y = load <vscale x 1 x half>, <vscale x 1 x half>* %x 1109 %z = fpext <vscale x 1 x half> %y to <vscale x 1 x float> 1110 ret <vscale x 1 x float> %z 1111} 1112 1113define <vscale x 1 x double> @extload_nxv1f16_nxv1f64(<vscale x 1 x half>* %x) { 1114; CHECK-LABEL: extload_nxv1f16_nxv1f64: 1115; CHECK: # %bb.0: 1116; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, mu 1117; CHECK-NEXT: vle16.v v25, (a0) 1118; CHECK-NEXT: vfwcvt.f.f.v v26, v25 1119; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 1120; CHECK-NEXT: vfwcvt.f.f.v v8, v26 1121; CHECK-NEXT: ret 1122 %y = load <vscale x 1 x half>, <vscale x 1 x half>* %x 1123 %z = fpext <vscale x 1 x half> %y to <vscale x 1 x double> 1124 ret <vscale x 1 x double> %z 1125} 1126 1127define <vscale x 2 x float> @extload_nxv2f16_nxv2f32(<vscale x 2 x half>* %x) { 1128; CHECK-LABEL: extload_nxv2f16_nxv2f32: 1129; CHECK: # %bb.0: 1130; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, mu 1131; CHECK-NEXT: vle16.v v25, (a0) 1132; CHECK-NEXT: vfwcvt.f.f.v v8, v25 1133; CHECK-NEXT: ret 1134 %y = load <vscale x 2 x half>, <vscale x 2 x half>* %x 1135 %z = fpext <vscale x 2 x half> %y to <vscale x 2 x float> 1136 ret <vscale x 2 x float> %z 1137} 1138 1139define <vscale x 2 x double> @extload_nxv2f16_nxv2f64(<vscale x 2 x half>* %x) { 1140; CHECK-LABEL: extload_nxv2f16_nxv2f64: 1141; CHECK: # %bb.0: 1142; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, mu 1143; CHECK-NEXT: vle16.v v25, (a0) 1144; CHECK-NEXT: vfwcvt.f.f.v v26, v25 1145; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, mu 1146; CHECK-NEXT: vfwcvt.f.f.v v8, v26 1147; CHECK-NEXT: ret 1148 %y = load <vscale x 2 x half>, <vscale x 2 x half>* %x 1149 %z = fpext <vscale x 2 x half> %y to <vscale x 2 x double> 1150 ret <vscale x 2 x double> %z 1151} 1152 1153define <vscale x 4 x float> @extload_nxv4f16_nxv4f32(<vscale x 4 x half>* %x) { 1154; CHECK-LABEL: extload_nxv4f16_nxv4f32: 1155; CHECK: # %bb.0: 1156; CHECK-NEXT: vl1re16.v v25, (a0) 1157; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, mu 1158; CHECK-NEXT: vfwcvt.f.f.v v8, v25 1159; CHECK-NEXT: ret 1160 %y = load <vscale x 4 x half>, <vscale x 4 x half>* %x 1161 %z = fpext <vscale x 4 x half> %y to <vscale x 4 x float> 1162 ret <vscale x 4 x float> %z 1163} 1164 1165define <vscale x 4 x double> @extload_nxv4f16_nxv4f64(<vscale x 4 x half>* %x) { 1166; CHECK-LABEL: extload_nxv4f16_nxv4f64: 1167; CHECK: # %bb.0: 1168; CHECK-NEXT: vl1re16.v v25, (a0) 1169; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, mu 1170; CHECK-NEXT: vfwcvt.f.f.v v26, v25 1171; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, mu 1172; CHECK-NEXT: vfwcvt.f.f.v v8, v26 1173; CHECK-NEXT: ret 1174 %y = load <vscale x 4 x half>, <vscale x 4 x half>* %x 1175 %z = fpext <vscale x 4 x half> %y to <vscale x 4 x double> 1176 ret <vscale x 4 x double> %z 1177} 1178 1179define <vscale x 8 x float> @extload_nxv8f16_nxv8f32(<vscale x 8 x half>* %x) { 1180; CHECK-LABEL: extload_nxv8f16_nxv8f32: 1181; CHECK: # %bb.0: 1182; CHECK-NEXT: vl2re16.v v26, (a0) 1183; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 1184; CHECK-NEXT: vfwcvt.f.f.v v8, v26 1185; CHECK-NEXT: ret 1186 %y = load <vscale x 8 x half>, <vscale x 8 x half>* %x 1187 %z = fpext <vscale x 8 x half> %y to <vscale x 8 x float> 1188 ret <vscale x 8 x float> %z 1189} 1190 1191define <vscale x 8 x double> @extload_nxv8f16_nxv8f64(<vscale x 8 x half>* %x) { 1192; CHECK-LABEL: extload_nxv8f16_nxv8f64: 1193; CHECK: # %bb.0: 1194; CHECK-NEXT: vl2re16.v v26, (a0) 1195; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 1196; CHECK-NEXT: vfwcvt.f.f.v v28, v26 1197; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 1198; CHECK-NEXT: vfwcvt.f.f.v v8, v28 1199; CHECK-NEXT: ret 1200 %y = load <vscale x 8 x half>, <vscale x 8 x half>* %x 1201 %z = fpext <vscale x 8 x half> %y to <vscale x 8 x double> 1202 ret <vscale x 8 x double> %z 1203} 1204 1205define <vscale x 16 x float> @extload_nxv16f16_nxv16f32(<vscale x 16 x half>* %x) { 1206; CHECK-LABEL: extload_nxv16f16_nxv16f32: 1207; CHECK: # %bb.0: 1208; CHECK-NEXT: vl4re16.v v28, (a0) 1209; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, mu 1210; CHECK-NEXT: vfwcvt.f.f.v v8, v28 1211; CHECK-NEXT: ret 1212 %y = load <vscale x 16 x half>, <vscale x 16 x half>* %x 1213 %z = fpext <vscale x 16 x half> %y to <vscale x 16 x float> 1214 ret <vscale x 16 x float> %z 1215} 1216 1217define void @truncstore_nxv1f32_nxv1f16(<vscale x 1 x float> %x, <vscale x 1 x half>* %z) { 1218; CHECK-LABEL: truncstore_nxv1f32_nxv1f16: 1219; CHECK: # %bb.0: 1220; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, mu 1221; CHECK-NEXT: vfncvt.f.f.w v25, v8 1222; CHECK-NEXT: vse16.v v25, (a0) 1223; CHECK-NEXT: ret 1224 %y = fptrunc <vscale x 1 x float> %x to <vscale x 1 x half> 1225 store <vscale x 1 x half> %y, <vscale x 1 x half>* %z 1226 ret void 1227} 1228 1229define <vscale x 1 x double> @extload_nxv1f32_nxv1f64(<vscale x 1 x float>* %x) { 1230; CHECK-LABEL: extload_nxv1f32_nxv1f64: 1231; CHECK: # %bb.0: 1232; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, mu 1233; CHECK-NEXT: vle32.v v25, (a0) 1234; CHECK-NEXT: vfwcvt.f.f.v v8, v25 1235; CHECK-NEXT: ret 1236 %y = load <vscale x 1 x float>, <vscale x 1 x float>* %x 1237 %z = fpext <vscale x 1 x float> %y to <vscale x 1 x double> 1238 ret <vscale x 1 x double> %z 1239} 1240 1241define void @truncstore_nxv2f32_nxv2f16(<vscale x 2 x float> %x, <vscale x 2 x half>* %z) { 1242; CHECK-LABEL: truncstore_nxv2f32_nxv2f16: 1243; CHECK: # %bb.0: 1244; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, mu 1245; CHECK-NEXT: vfncvt.f.f.w v25, v8 1246; CHECK-NEXT: vse16.v v25, (a0) 1247; CHECK-NEXT: ret 1248 %y = fptrunc <vscale x 2 x float> %x to <vscale x 2 x half> 1249 store <vscale x 2 x half> %y, <vscale x 2 x half>* %z 1250 ret void 1251} 1252 1253define <vscale x 2 x double> @extload_nxv2f32_nxv2f64(<vscale x 2 x float>* %x) { 1254; CHECK-LABEL: extload_nxv2f32_nxv2f64: 1255; CHECK: # %bb.0: 1256; CHECK-NEXT: vl1re32.v v25, (a0) 1257; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 1258; CHECK-NEXT: vfwcvt.f.f.v v8, v25 1259; CHECK-NEXT: ret 1260 %y = load <vscale x 2 x float>, <vscale x 2 x float>* %x 1261 %z = fpext <vscale x 2 x float> %y to <vscale x 2 x double> 1262 ret <vscale x 2 x double> %z 1263} 1264 1265define void @truncstore_nxv4f32_nxv4f16(<vscale x 4 x float> %x, <vscale x 4 x half>* %z) { 1266; CHECK-LABEL: truncstore_nxv4f32_nxv4f16: 1267; CHECK: # %bb.0: 1268; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, mu 1269; CHECK-NEXT: vfncvt.f.f.w v25, v8 1270; CHECK-NEXT: vs1r.v v25, (a0) 1271; CHECK-NEXT: ret 1272 %y = fptrunc <vscale x 4 x float> %x to <vscale x 4 x half> 1273 store <vscale x 4 x half> %y, <vscale x 4 x half>* %z 1274 ret void 1275} 1276 1277define <vscale x 4 x double> @extload_nxv4f32_nxv4f64(<vscale x 4 x float>* %x) { 1278; CHECK-LABEL: extload_nxv4f32_nxv4f64: 1279; CHECK: # %bb.0: 1280; CHECK-NEXT: vl2re32.v v26, (a0) 1281; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 1282; CHECK-NEXT: vfwcvt.f.f.v v8, v26 1283; CHECK-NEXT: ret 1284 %y = load <vscale x 4 x float>, <vscale x 4 x float>* %x 1285 %z = fpext <vscale x 4 x float> %y to <vscale x 4 x double> 1286 ret <vscale x 4 x double> %z 1287} 1288 1289define void @truncstore_nxv8f32_nxv8f16(<vscale x 8 x float> %x, <vscale x 8 x half>* %z) { 1290; CHECK-LABEL: truncstore_nxv8f32_nxv8f16: 1291; CHECK: # %bb.0: 1292; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, mu 1293; CHECK-NEXT: vfncvt.f.f.w v26, v8 1294; CHECK-NEXT: vs2r.v v26, (a0) 1295; CHECK-NEXT: ret 1296 %y = fptrunc <vscale x 8 x float> %x to <vscale x 8 x half> 1297 store <vscale x 8 x half> %y, <vscale x 8 x half>* %z 1298 ret void 1299} 1300 1301define <vscale x 8 x double> @extload_nxv8f32_nxv8f64(<vscale x 8 x float>* %x) { 1302; CHECK-LABEL: extload_nxv8f32_nxv8f64: 1303; CHECK: # %bb.0: 1304; CHECK-NEXT: vl4re32.v v28, (a0) 1305; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 1306; CHECK-NEXT: vfwcvt.f.f.v v8, v28 1307; CHECK-NEXT: ret 1308 %y = load <vscale x 8 x float>, <vscale x 8 x float>* %x 1309 %z = fpext <vscale x 8 x float> %y to <vscale x 8 x double> 1310 ret <vscale x 8 x double> %z 1311} 1312 1313define void @truncstore_nxv16f32_nxv16f16(<vscale x 16 x float> %x, <vscale x 16 x half>* %z) { 1314; CHECK-LABEL: truncstore_nxv16f32_nxv16f16: 1315; CHECK: # %bb.0: 1316; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, mu 1317; CHECK-NEXT: vfncvt.f.f.w v28, v8 1318; CHECK-NEXT: vs4r.v v28, (a0) 1319; CHECK-NEXT: ret 1320 %y = fptrunc <vscale x 16 x float> %x to <vscale x 16 x half> 1321 store <vscale x 16 x half> %y, <vscale x 16 x half>* %z 1322 ret void 1323} 1324 1325define void @truncstore_nxv1f64_nxv1f16(<vscale x 1 x double> %x, <vscale x 1 x half>* %z) { 1326; CHECK-LABEL: truncstore_nxv1f64_nxv1f16: 1327; CHECK: # %bb.0: 1328; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, mu 1329; CHECK-NEXT: vfncvt.rod.f.f.w v25, v8 1330; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 1331; CHECK-NEXT: vfncvt.f.f.w v26, v25 1332; CHECK-NEXT: vse16.v v26, (a0) 1333; CHECK-NEXT: ret 1334 %y = fptrunc <vscale x 1 x double> %x to <vscale x 1 x half> 1335 store <vscale x 1 x half> %y, <vscale x 1 x half>* %z 1336 ret void 1337} 1338 1339define void @truncstore_nxv1f64_nxv1f32(<vscale x 1 x double> %x, <vscale x 1 x float>* %z) { 1340; CHECK-LABEL: truncstore_nxv1f64_nxv1f32: 1341; CHECK: # %bb.0: 1342; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, mu 1343; CHECK-NEXT: vfncvt.f.f.w v25, v8 1344; CHECK-NEXT: vse32.v v25, (a0) 1345; CHECK-NEXT: ret 1346 %y = fptrunc <vscale x 1 x double> %x to <vscale x 1 x float> 1347 store <vscale x 1 x float> %y, <vscale x 1 x float>* %z 1348 ret void 1349} 1350 1351define void @truncstore_nxv2f64_nxv2f16(<vscale x 2 x double> %x, <vscale x 2 x half>* %z) { 1352; CHECK-LABEL: truncstore_nxv2f64_nxv2f16: 1353; CHECK: # %bb.0: 1354; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, mu 1355; CHECK-NEXT: vfncvt.rod.f.f.w v25, v8 1356; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 1357; CHECK-NEXT: vfncvt.f.f.w v26, v25 1358; CHECK-NEXT: vse16.v v26, (a0) 1359; CHECK-NEXT: ret 1360 %y = fptrunc <vscale x 2 x double> %x to <vscale x 2 x half> 1361 store <vscale x 2 x half> %y, <vscale x 2 x half>* %z 1362 ret void 1363} 1364 1365define void @truncstore_nxv2f64_nxv2f32(<vscale x 2 x double> %x, <vscale x 2 x float>* %z) { 1366; CHECK-LABEL: truncstore_nxv2f64_nxv2f32: 1367; CHECK: # %bb.0: 1368; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, mu 1369; CHECK-NEXT: vfncvt.f.f.w v25, v8 1370; CHECK-NEXT: vs1r.v v25, (a0) 1371; CHECK-NEXT: ret 1372 %y = fptrunc <vscale x 2 x double> %x to <vscale x 2 x float> 1373 store <vscale x 2 x float> %y, <vscale x 2 x float>* %z 1374 ret void 1375} 1376 1377define void @truncstore_nxv4f64_nxv4f16(<vscale x 4 x double> %x, <vscale x 4 x half>* %z) { 1378; CHECK-LABEL: truncstore_nxv4f64_nxv4f16: 1379; CHECK: # %bb.0: 1380; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, mu 1381; CHECK-NEXT: vfncvt.rod.f.f.w v26, v8 1382; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu 1383; CHECK-NEXT: vfncvt.f.f.w v25, v26 1384; CHECK-NEXT: vs1r.v v25, (a0) 1385; CHECK-NEXT: ret 1386 %y = fptrunc <vscale x 4 x double> %x to <vscale x 4 x half> 1387 store <vscale x 4 x half> %y, <vscale x 4 x half>* %z 1388 ret void 1389} 1390 1391define void @truncstore_nxv4f64_nxv4f32(<vscale x 4 x double> %x, <vscale x 4 x float>* %z) { 1392; CHECK-LABEL: truncstore_nxv4f64_nxv4f32: 1393; CHECK: # %bb.0: 1394; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, mu 1395; CHECK-NEXT: vfncvt.f.f.w v26, v8 1396; CHECK-NEXT: vs2r.v v26, (a0) 1397; CHECK-NEXT: ret 1398 %y = fptrunc <vscale x 4 x double> %x to <vscale x 4 x float> 1399 store <vscale x 4 x float> %y, <vscale x 4 x float>* %z 1400 ret void 1401} 1402 1403define void @truncstore_nxv8f64_nxv8f16(<vscale x 8 x double> %x, <vscale x 8 x half>* %z) { 1404; CHECK-LABEL: truncstore_nxv8f64_nxv8f16: 1405; CHECK: # %bb.0: 1406; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu 1407; CHECK-NEXT: vfncvt.rod.f.f.w v28, v8 1408; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 1409; CHECK-NEXT: vfncvt.f.f.w v26, v28 1410; CHECK-NEXT: vs2r.v v26, (a0) 1411; CHECK-NEXT: ret 1412 %y = fptrunc <vscale x 8 x double> %x to <vscale x 8 x half> 1413 store <vscale x 8 x half> %y, <vscale x 8 x half>* %z 1414 ret void 1415} 1416 1417define void @truncstore_nxv8f64_nxv8f32(<vscale x 8 x double> %x, <vscale x 8 x float>* %z) { 1418; CHECK-LABEL: truncstore_nxv8f64_nxv8f32: 1419; CHECK: # %bb.0: 1420; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu 1421; CHECK-NEXT: vfncvt.f.f.w v28, v8 1422; CHECK-NEXT: vs4r.v v28, (a0) 1423; CHECK-NEXT: ret 1424 %y = fptrunc <vscale x 8 x double> %x to <vscale x 8 x float> 1425 store <vscale x 8 x float> %y, <vscale x 8 x float>* %z 1426 ret void 1427} 1428