304 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple riscv32 -mattr=+d,+zvfh,+v < %s \3; RUN: -verify-machineinstrs | FileCheck %s4; RUN: llc -mtriple riscv64 -mattr=+d,+zvfh,+v < %s \5; RUN: -verify-machineinstrs | FileCheck %s6; RUN: llc -mtriple riscv32 -mattr=+d,+zvfh,+v,+unaligned-vector-mem < %s \7; RUN: -verify-machineinstrs | FileCheck --check-prefix=FAST %s8; RUN: llc -mtriple riscv64 -mattr=+d,+zvfh,+v,+unaligned-vector-mem < %s \9; RUN: -verify-machineinstrs | FileCheck --check-prefix=FAST %s10 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, ma16; CHECK-NEXT: vle8.v v8, (a0)17; CHECK-NEXT: ret18;19; FAST-LABEL: unaligned_load_nxv1i32_a1:20; FAST: # %bb.0:21; FAST-NEXT: vsetvli a1, zero, e32, mf2, ta, ma22; FAST-NEXT: vle32.v v8, (a0)23; FAST-NEXT: ret24 %v = load <vscale x 1 x i32>, ptr %ptr, align 125 ret <vscale x 1 x i32> %v26}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, ma32; CHECK-NEXT: vle8.v v8, (a0)33; CHECK-NEXT: ret34;35; FAST-LABEL: unaligned_load_nxv1i32_a2:36; FAST: # %bb.0:37; FAST-NEXT: vsetvli a1, zero, e32, mf2, ta, ma38; FAST-NEXT: vle32.v v8, (a0)39; FAST-NEXT: ret40 %v = load <vscale x 1 x i32>, ptr %ptr, align 241 ret <vscale x 1 x i32> %v42}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, ma48; CHECK-NEXT: vle32.v v8, (a0)49; CHECK-NEXT: ret50;51; FAST-LABEL: aligned_load_nxv1i32_a4:52; FAST: # %bb.0:53; FAST-NEXT: vsetvli a1, zero, e32, mf2, ta, ma54; FAST-NEXT: vle32.v v8, (a0)55; FAST-NEXT: ret56 %v = load <vscale x 1 x i32>, ptr %ptr, align 457 ret <vscale x 1 x i32> %v58}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: ret65;66; FAST-LABEL: unaligned_load_nxv1i64_a1:67; FAST: # %bb.0:68; FAST-NEXT: vl1re64.v v8, (a0)69; FAST-NEXT: ret70 %v = load <vscale x 1 x i64>, ptr %ptr, align 171 ret <vscale x 1 x i64> %v72}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: ret79;80; FAST-LABEL: unaligned_load_nxv1i64_a4:81; FAST: # %bb.0:82; FAST-NEXT: vl1re64.v v8, (a0)83; FAST-NEXT: ret84 %v = load <vscale x 1 x i64>, ptr %ptr, align 485 ret <vscale x 1 x i64> %v86}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: ret93;94; FAST-LABEL: aligned_load_nxv1i64_a8:95; FAST: # %bb.0:96; FAST-NEXT: vl1re64.v v8, (a0)97; FAST-NEXT: ret98 %v = load <vscale x 1 x i64>, ptr %ptr, align 899 ret <vscale x 1 x i64> %v100}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: ret107;108; FAST-LABEL: unaligned_load_nxv2i64_a1:109; FAST: # %bb.0:110; FAST-NEXT: vl2re64.v v8, (a0)111; FAST-NEXT: ret112 %v = load <vscale x 2 x i64>, ptr %ptr, align 1113 ret <vscale x 2 x i64> %v114}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: ret121;122; FAST-LABEL: unaligned_load_nxv2i64_a4:123; FAST: # %bb.0:124; FAST-NEXT: vl2re64.v v8, (a0)125; FAST-NEXT: ret126 %v = load <vscale x 2 x i64>, ptr %ptr, align 4127 ret <vscale x 2 x i64> %v128}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: ret135;136; FAST-LABEL: aligned_load_nxv2i64_a8:137; FAST: # %bb.0:138; FAST-NEXT: vl2re64.v v8, (a0)139; FAST-NEXT: ret140 %v = load <vscale x 2 x i64>, ptr %ptr, align 8141 ret <vscale x 2 x i64> %v142}143 144; Masks should always be aligned145define <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, ma149; CHECK-NEXT: vlm.v v0, (a0)150; CHECK-NEXT: ret151;152; FAST-LABEL: unaligned_load_nxv1i1_a1:153; FAST: # %bb.0:154; FAST-NEXT: vsetvli a1, zero, e8, mf8, ta, ma155; FAST-NEXT: vlm.v v0, (a0)156; FAST-NEXT: ret157 %v = load <vscale x 1 x i1>, ptr %ptr, align 1158 ret <vscale x 1 x i1> %v159}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: ret166;167; FAST-LABEL: unaligned_load_nxv4f32_a1:168; FAST: # %bb.0:169; FAST-NEXT: vl2re32.v v8, (a0)170; FAST-NEXT: ret171 %v = load <vscale x 4 x float>, ptr %ptr, align 1172 ret <vscale x 4 x float> %v173}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: ret180;181; FAST-LABEL: unaligned_load_nxv4f32_a2:182; FAST: # %bb.0:183; FAST-NEXT: vl2re32.v v8, (a0)184; FAST-NEXT: ret185 %v = load <vscale x 4 x float>, ptr %ptr, align 2186 ret <vscale x 4 x float> %v187}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: ret194;195; FAST-LABEL: aligned_load_nxv4f32_a4:196; FAST: # %bb.0:197; FAST-NEXT: vl2re32.v v8, (a0)198; FAST-NEXT: ret199 %v = load <vscale x 4 x float>, ptr %ptr, align 4200 ret <vscale x 4 x float> %v201}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: ret208;209; FAST-LABEL: unaligned_load_nxv8f16_a1:210; FAST: # %bb.0:211; FAST-NEXT: vl2re16.v v8, (a0)212; FAST-NEXT: ret213 %v = load <vscale x 8 x half>, ptr %ptr, align 1214 ret <vscale x 8 x half> %v215}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: ret222;223; FAST-LABEL: aligned_load_nxv8f16_a2:224; FAST: # %bb.0:225; FAST-NEXT: vl2re16.v v8, (a0)226; FAST-NEXT: ret227 %v = load <vscale x 8 x half>, ptr %ptr, align 2228 ret <vscale x 8 x half> %v229}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: ret236;237; FAST-LABEL: unaligned_store_nxv4i32_a1:238; FAST: # %bb.0:239; FAST-NEXT: vs2r.v v8, (a0)240; FAST-NEXT: ret241 store <vscale x 4 x i32> %x, ptr %ptr, align 1242 ret void243}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: ret250;251; FAST-LABEL: unaligned_store_nxv4i32_a2:252; FAST: # %bb.0:253; FAST-NEXT: vs2r.v v8, (a0)254; FAST-NEXT: ret255 store <vscale x 4 x i32> %x, ptr %ptr, align 2256 ret void257}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: ret264;265; FAST-LABEL: aligned_store_nxv4i32_a4:266; FAST: # %bb.0:267; FAST-NEXT: vs2r.v v8, (a0)268; FAST-NEXT: ret269 store <vscale x 4 x i32> %x, ptr %ptr, align 4270 ret void271}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, ma277; CHECK-NEXT: vse8.v v8, (a0)278; CHECK-NEXT: ret279;280; FAST-LABEL: unaligned_store_nxv1i16_a1:281; FAST: # %bb.0:282; FAST-NEXT: vsetvli a1, zero, e16, mf4, ta, ma283; FAST-NEXT: vse16.v v8, (a0)284; FAST-NEXT: ret285 store <vscale x 1 x i16> %x, ptr %ptr, align 1286 ret void287}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, ma293; CHECK-NEXT: vse16.v v8, (a0)294; CHECK-NEXT: ret295;296; FAST-LABEL: aligned_store_nxv1i16_a2:297; FAST: # %bb.0:298; FAST-NEXT: vsetvli a1, zero, e16, mf4, ta, ma299; FAST-NEXT: vse16.v v8, (a0)300; FAST-NEXT: ret301 store <vscale x 1 x i16> %x, ptr %ptr, align 2302 ret void303}304