1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple riscv32 -mattr=+d,+zvfh,+v < %s \ 3; RUN: -verify-machineinstrs | FileCheck %s 4; RUN: llc -mtriple riscv64 -mattr=+d,+zvfh,+v < %s \ 5; RUN: -verify-machineinstrs | FileCheck %s 6; RUN: llc -mtriple riscv32 -mattr=+d,+zvfh,+v,+unaligned-vector-mem < %s \ 7; RUN: -verify-machineinstrs | FileCheck --check-prefix=FAST %s 8; RUN: llc -mtriple riscv64 -mattr=+d,+zvfh,+v,+unaligned-vector-mem < %s \ 9; RUN: -verify-machineinstrs | FileCheck --check-prefix=FAST %s 10 11 12define <vscale x 1 x i32> @unaligned_load_nxv1i32_a1(ptr %ptr) { 13; CHECK-LABEL: unaligned_load_nxv1i32_a1: 14; CHECK: # %bb.0: 15; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 16; CHECK-NEXT: vle8.v v8, (a0) 17; CHECK-NEXT: ret 18; 19; FAST-LABEL: unaligned_load_nxv1i32_a1: 20; FAST: # %bb.0: 21; FAST-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 22; FAST-NEXT: vle32.v v8, (a0) 23; FAST-NEXT: ret 24 %v = load <vscale x 1 x i32>, ptr %ptr, align 1 25 ret <vscale x 1 x i32> %v 26} 27 28define <vscale x 1 x i32> @unaligned_load_nxv1i32_a2(ptr %ptr) { 29; CHECK-LABEL: unaligned_load_nxv1i32_a2: 30; CHECK: # %bb.0: 31; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 32; CHECK-NEXT: vle8.v v8, (a0) 33; CHECK-NEXT: ret 34; 35; FAST-LABEL: unaligned_load_nxv1i32_a2: 36; FAST: # %bb.0: 37; FAST-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 38; FAST-NEXT: vle32.v v8, (a0) 39; FAST-NEXT: ret 40 %v = load <vscale x 1 x i32>, ptr %ptr, align 2 41 ret <vscale x 1 x i32> %v 42} 43 44define <vscale x 1 x i32> @aligned_load_nxv1i32_a4(ptr %ptr) { 45; CHECK-LABEL: aligned_load_nxv1i32_a4: 46; CHECK: # %bb.0: 47; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 48; CHECK-NEXT: vle32.v v8, (a0) 49; CHECK-NEXT: ret 50; 51; FAST-LABEL: aligned_load_nxv1i32_a4: 52; FAST: # %bb.0: 53; FAST-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 54; FAST-NEXT: vle32.v v8, (a0) 55; FAST-NEXT: ret 56 %v = load <vscale x 1 x i32>, ptr %ptr, align 4 57 ret <vscale x 1 x i32> %v 58} 59 60define <vscale x 1 x i64> @unaligned_load_nxv1i64_a1(ptr %ptr) { 61; CHECK-LABEL: unaligned_load_nxv1i64_a1: 62; CHECK: # %bb.0: 63; CHECK-NEXT: vl1r.v v8, (a0) 64; CHECK-NEXT: ret 65; 66; FAST-LABEL: unaligned_load_nxv1i64_a1: 67; FAST: # %bb.0: 68; FAST-NEXT: vl1re64.v v8, (a0) 69; FAST-NEXT: ret 70 %v = load <vscale x 1 x i64>, ptr %ptr, align 1 71 ret <vscale x 1 x i64> %v 72} 73 74define <vscale x 1 x i64> @unaligned_load_nxv1i64_a4(ptr %ptr) { 75; CHECK-LABEL: unaligned_load_nxv1i64_a4: 76; CHECK: # %bb.0: 77; CHECK-NEXT: vl1r.v v8, (a0) 78; CHECK-NEXT: ret 79; 80; FAST-LABEL: unaligned_load_nxv1i64_a4: 81; FAST: # %bb.0: 82; FAST-NEXT: vl1re64.v v8, (a0) 83; FAST-NEXT: ret 84 %v = load <vscale x 1 x i64>, ptr %ptr, align 4 85 ret <vscale x 1 x i64> %v 86} 87 88define <vscale x 1 x i64> @aligned_load_nxv1i64_a8(ptr %ptr) { 89; CHECK-LABEL: aligned_load_nxv1i64_a8: 90; CHECK: # %bb.0: 91; CHECK-NEXT: vl1re64.v v8, (a0) 92; CHECK-NEXT: ret 93; 94; FAST-LABEL: aligned_load_nxv1i64_a8: 95; FAST: # %bb.0: 96; FAST-NEXT: vl1re64.v v8, (a0) 97; FAST-NEXT: ret 98 %v = load <vscale x 1 x i64>, ptr %ptr, align 8 99 ret <vscale x 1 x i64> %v 100} 101 102define <vscale x 2 x i64> @unaligned_load_nxv2i64_a1(ptr %ptr) { 103; CHECK-LABEL: unaligned_load_nxv2i64_a1: 104; CHECK: # %bb.0: 105; CHECK-NEXT: vl2r.v v8, (a0) 106; CHECK-NEXT: ret 107; 108; FAST-LABEL: unaligned_load_nxv2i64_a1: 109; FAST: # %bb.0: 110; FAST-NEXT: vl2re64.v v8, (a0) 111; FAST-NEXT: ret 112 %v = load <vscale x 2 x i64>, ptr %ptr, align 1 113 ret <vscale x 2 x i64> %v 114} 115 116define <vscale x 2 x i64> @unaligned_load_nxv2i64_a4(ptr %ptr) { 117; CHECK-LABEL: unaligned_load_nxv2i64_a4: 118; CHECK: # %bb.0: 119; CHECK-NEXT: vl2r.v v8, (a0) 120; CHECK-NEXT: ret 121; 122; FAST-LABEL: unaligned_load_nxv2i64_a4: 123; FAST: # %bb.0: 124; FAST-NEXT: vl2re64.v v8, (a0) 125; FAST-NEXT: ret 126 %v = load <vscale x 2 x i64>, ptr %ptr, align 4 127 ret <vscale x 2 x i64> %v 128} 129 130define <vscale x 2 x i64> @aligned_load_nxv2i64_a8(ptr %ptr) { 131; CHECK-LABEL: aligned_load_nxv2i64_a8: 132; CHECK: # %bb.0: 133; CHECK-NEXT: vl2re64.v v8, (a0) 134; CHECK-NEXT: ret 135; 136; FAST-LABEL: aligned_load_nxv2i64_a8: 137; FAST: # %bb.0: 138; FAST-NEXT: vl2re64.v v8, (a0) 139; FAST-NEXT: ret 140 %v = load <vscale x 2 x i64>, ptr %ptr, align 8 141 ret <vscale x 2 x i64> %v 142} 143 144; Masks should always be aligned 145define <vscale x 1 x i1> @unaligned_load_nxv1i1_a1(ptr %ptr) { 146; CHECK-LABEL: unaligned_load_nxv1i1_a1: 147; CHECK: # %bb.0: 148; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 149; CHECK-NEXT: vlm.v v0, (a0) 150; CHECK-NEXT: ret 151; 152; FAST-LABEL: unaligned_load_nxv1i1_a1: 153; FAST: # %bb.0: 154; FAST-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 155; FAST-NEXT: vlm.v v0, (a0) 156; FAST-NEXT: ret 157 %v = load <vscale x 1 x i1>, ptr %ptr, align 1 158 ret <vscale x 1 x i1> %v 159} 160 161define <vscale x 4 x float> @unaligned_load_nxv4f32_a1(ptr %ptr) { 162; CHECK-LABEL: unaligned_load_nxv4f32_a1: 163; CHECK: # %bb.0: 164; CHECK-NEXT: vl2r.v v8, (a0) 165; CHECK-NEXT: ret 166; 167; FAST-LABEL: unaligned_load_nxv4f32_a1: 168; FAST: # %bb.0: 169; FAST-NEXT: vl2re32.v v8, (a0) 170; FAST-NEXT: ret 171 %v = load <vscale x 4 x float>, ptr %ptr, align 1 172 ret <vscale x 4 x float> %v 173} 174 175define <vscale x 4 x float> @unaligned_load_nxv4f32_a2(ptr %ptr) { 176; CHECK-LABEL: unaligned_load_nxv4f32_a2: 177; CHECK: # %bb.0: 178; CHECK-NEXT: vl2r.v v8, (a0) 179; CHECK-NEXT: ret 180; 181; FAST-LABEL: unaligned_load_nxv4f32_a2: 182; FAST: # %bb.0: 183; FAST-NEXT: vl2re32.v v8, (a0) 184; FAST-NEXT: ret 185 %v = load <vscale x 4 x float>, ptr %ptr, align 2 186 ret <vscale x 4 x float> %v 187} 188 189define <vscale x 4 x float> @aligned_load_nxv4f32_a4(ptr %ptr) { 190; CHECK-LABEL: aligned_load_nxv4f32_a4: 191; CHECK: # %bb.0: 192; CHECK-NEXT: vl2re32.v v8, (a0) 193; CHECK-NEXT: ret 194; 195; FAST-LABEL: aligned_load_nxv4f32_a4: 196; FAST: # %bb.0: 197; FAST-NEXT: vl2re32.v v8, (a0) 198; FAST-NEXT: ret 199 %v = load <vscale x 4 x float>, ptr %ptr, align 4 200 ret <vscale x 4 x float> %v 201} 202 203define <vscale x 8 x half> @unaligned_load_nxv8f16_a1(ptr %ptr) { 204; CHECK-LABEL: unaligned_load_nxv8f16_a1: 205; CHECK: # %bb.0: 206; CHECK-NEXT: vl2r.v v8, (a0) 207; CHECK-NEXT: ret 208; 209; FAST-LABEL: unaligned_load_nxv8f16_a1: 210; FAST: # %bb.0: 211; FAST-NEXT: vl2re16.v v8, (a0) 212; FAST-NEXT: ret 213 %v = load <vscale x 8 x half>, ptr %ptr, align 1 214 ret <vscale x 8 x half> %v 215} 216 217define <vscale x 8 x half> @aligned_load_nxv8f16_a2(ptr %ptr) { 218; CHECK-LABEL: aligned_load_nxv8f16_a2: 219; CHECK: # %bb.0: 220; CHECK-NEXT: vl2re16.v v8, (a0) 221; CHECK-NEXT: ret 222; 223; FAST-LABEL: aligned_load_nxv8f16_a2: 224; FAST: # %bb.0: 225; FAST-NEXT: vl2re16.v v8, (a0) 226; FAST-NEXT: ret 227 %v = load <vscale x 8 x half>, ptr %ptr, align 2 228 ret <vscale x 8 x half> %v 229} 230 231define void @unaligned_store_nxv4i32_a1(<vscale x 4 x i32> %x, ptr %ptr) { 232; CHECK-LABEL: unaligned_store_nxv4i32_a1: 233; CHECK: # %bb.0: 234; CHECK-NEXT: vs2r.v v8, (a0) 235; CHECK-NEXT: ret 236; 237; FAST-LABEL: unaligned_store_nxv4i32_a1: 238; FAST: # %bb.0: 239; FAST-NEXT: vs2r.v v8, (a0) 240; FAST-NEXT: ret 241 store <vscale x 4 x i32> %x, ptr %ptr, align 1 242 ret void 243} 244 245define void @unaligned_store_nxv4i32_a2(<vscale x 4 x i32> %x, ptr %ptr) { 246; CHECK-LABEL: unaligned_store_nxv4i32_a2: 247; CHECK: # %bb.0: 248; CHECK-NEXT: vs2r.v v8, (a0) 249; CHECK-NEXT: ret 250; 251; FAST-LABEL: unaligned_store_nxv4i32_a2: 252; FAST: # %bb.0: 253; FAST-NEXT: vs2r.v v8, (a0) 254; FAST-NEXT: ret 255 store <vscale x 4 x i32> %x, ptr %ptr, align 2 256 ret void 257} 258 259define void @aligned_store_nxv4i32_a4(<vscale x 4 x i32> %x, ptr %ptr) { 260; CHECK-LABEL: aligned_store_nxv4i32_a4: 261; CHECK: # %bb.0: 262; CHECK-NEXT: vs2r.v v8, (a0) 263; CHECK-NEXT: ret 264; 265; FAST-LABEL: aligned_store_nxv4i32_a4: 266; FAST: # %bb.0: 267; FAST-NEXT: vs2r.v v8, (a0) 268; FAST-NEXT: ret 269 store <vscale x 4 x i32> %x, ptr %ptr, align 4 270 ret void 271} 272 273define void @unaligned_store_nxv1i16_a1(<vscale x 1 x i16> %x, ptr %ptr) { 274; CHECK-LABEL: unaligned_store_nxv1i16_a1: 275; CHECK: # %bb.0: 276; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 277; CHECK-NEXT: vse8.v v8, (a0) 278; CHECK-NEXT: ret 279; 280; FAST-LABEL: unaligned_store_nxv1i16_a1: 281; FAST: # %bb.0: 282; FAST-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 283; FAST-NEXT: vse16.v v8, (a0) 284; FAST-NEXT: ret 285 store <vscale x 1 x i16> %x, ptr %ptr, align 1 286 ret void 287} 288 289define void @aligned_store_nxv1i16_a2(<vscale x 1 x i16> %x, ptr %ptr) { 290; CHECK-LABEL: aligned_store_nxv1i16_a2: 291; CHECK: # %bb.0: 292; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 293; CHECK-NEXT: vse16.v v8, (a0) 294; CHECK-NEXT: ret 295; 296; FAST-LABEL: aligned_store_nxv1i16_a2: 297; FAST: # %bb.0: 298; FAST-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 299; FAST-NEXT: vse16.v v8, (a0) 300; FAST-NEXT: ret 301 store <vscale x 1 x i16> %x, ptr %ptr, align 2 302 ret void 303} 304