312 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s3; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme -force-streaming < %s | FileCheck %s4 5;6; Testing prfop encodings7;8define void @test_svprf_pldl1strm(<vscale x 16 x i1> %pg, ptr %base) {9; CHECK-LABEL: test_svprf_pldl1strm:10; CHECK: // %bb.0: // %entry11; CHECK-NEXT: prfb pldl1strm, p0, [x0]12; CHECK-NEXT: ret13entry:14 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 1)15 ret void16}17 18define void @test_svprf_pldl2keep(<vscale x 16 x i1> %pg, ptr %base) {19; CHECK-LABEL: test_svprf_pldl2keep:20; CHECK: // %bb.0: // %entry21; CHECK-NEXT: prfb pldl2keep, p0, [x0]22; CHECK-NEXT: ret23entry:24 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 2)25 ret void26}27 28define void @test_svprf_pldl2strm(<vscale x 16 x i1> %pg, ptr %base) {29; CHECK-LABEL: test_svprf_pldl2strm:30; CHECK: // %bb.0: // %entry31; CHECK-NEXT: prfb pldl2strm, p0, [x0]32; CHECK-NEXT: ret33entry:34 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 3)35 ret void36}37 38define void @test_svprf_pldl3keep(<vscale x 16 x i1> %pg, ptr %base) {39; CHECK-LABEL: test_svprf_pldl3keep:40; CHECK: // %bb.0: // %entry41; CHECK-NEXT: prfb pldl3keep, p0, [x0]42; CHECK-NEXT: ret43entry:44 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 4)45 ret void46}47 48define void @test_svprf_pldl3strm(<vscale x 16 x i1> %pg, ptr %base) {49; CHECK-LABEL: test_svprf_pldl3strm:50; CHECK: // %bb.0: // %entry51; CHECK-NEXT: prfb pldl3strm, p0, [x0]52; CHECK-NEXT: ret53entry:54 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 5)55 ret void56}57 58define void @test_svprf_pstl1keep(<vscale x 16 x i1> %pg, ptr %base) {59; CHECK-LABEL: test_svprf_pstl1keep:60; CHECK: // %bb.0: // %entry61; CHECK-NEXT: prfb pstl1keep, p0, [x0]62; CHECK-NEXT: ret63entry:64 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 8)65 ret void66}67 68define void @test_svprf_pstl1strm(<vscale x 16 x i1> %pg, ptr %base) {69; CHECK-LABEL: test_svprf_pstl1strm:70; CHECK: // %bb.0: // %entry71; CHECK-NEXT: prfb pstl1strm, p0, [x0]72; CHECK-NEXT: ret73entry:74 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 9)75 ret void76}77 78define void @test_svprf_pstl2keep(<vscale x 16 x i1> %pg, ptr %base) {79; CHECK-LABEL: test_svprf_pstl2keep:80; CHECK: // %bb.0: // %entry81; CHECK-NEXT: prfb pstl2keep, p0, [x0]82; CHECK-NEXT: ret83entry:84 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 10)85 ret void86}87 88define void @test_svprf_pstl2strm(<vscale x 16 x i1> %pg, ptr %base) {89; CHECK-LABEL: test_svprf_pstl2strm:90; CHECK: // %bb.0: // %entry91; CHECK-NEXT: prfb pstl2strm, p0, [x0]92; CHECK-NEXT: ret93entry:94 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 11)95 ret void96}97 98define void @test_svprf_pstl3keep(<vscale x 16 x i1> %pg, ptr %base) {99; CHECK-LABEL: test_svprf_pstl3keep:100; CHECK: // %bb.0: // %entry101; CHECK-NEXT: prfb pstl3keep, p0, [x0]102; CHECK-NEXT: ret103entry:104 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 12)105 ret void106}107 108define void @test_svprf_pstl3strm(<vscale x 16 x i1> %pg, ptr %base) {109; CHECK-LABEL: test_svprf_pstl3strm:110; CHECK: // %bb.0: // %entry111; CHECK-NEXT: prfb pstl3strm, p0, [x0]112; CHECK-NEXT: ret113entry:114 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 13)115 ret void116}117 118;119; Testing imm limits of SI form120;121 122define void @test_svprf_vnum_under(<vscale x 16 x i1> %pg, ptr %base) {123; CHECK-LABEL: test_svprf_vnum_under:124; CHECK: // %bb.0: // %entry125; CHECK-NEXT: rdvl x8, #1126; CHECK-NEXT: mov x9, #-528127; CHECK-NEXT: lsr x8, x8, #4128; CHECK-NEXT: mul x8, x8, x9129; CHECK-NEXT: prfb pstl3strm, p0, [x0, x8]130; CHECK-NEXT: ret131entry:132 %gep = getelementptr inbounds <vscale x 16 x i8>, ptr %base, i64 -33, i64 0133 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %gep, i32 13)134 ret void135}136 137define void @test_svprf_vnum_min(<vscale x 16 x i1> %pg, ptr %base) {138; CHECK-LABEL: test_svprf_vnum_min:139; CHECK: // %bb.0: // %entry140; CHECK-NEXT: prfb pstl3strm, p0, [x0, #-32, mul vl]141; CHECK-NEXT: ret142entry:143 %gep = getelementptr inbounds <vscale x 16 x i8>, ptr %base, i64 -32, i64 0144 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %gep, i32 13)145 ret void146}147 148define void @test_svprf_vnum_over(<vscale x 16 x i1> %pg, ptr %base) {149; CHECK-LABEL: test_svprf_vnum_over:150; CHECK: // %bb.0: // %entry151; CHECK-NEXT: rdvl x8, #1152; CHECK-NEXT: mov w9, #512153; CHECK-NEXT: lsr x8, x8, #4154; CHECK-NEXT: mul x8, x8, x9155; CHECK-NEXT: prfb pstl3strm, p0, [x0, x8]156; CHECK-NEXT: ret157entry:158 %gep = getelementptr inbounds <vscale x 16 x i8>, ptr %base, i64 32, i64 0159 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %gep, i32 13)160 ret void161}162 163define void @test_svprf_vnum_max(<vscale x 16 x i1> %pg, ptr %base) {164; CHECK-LABEL: test_svprf_vnum_max:165; CHECK: // %bb.0: // %entry166; CHECK-NEXT: prfb pstl3strm, p0, [x0, #31, mul vl]167; CHECK-NEXT: ret168entry:169 %gep = getelementptr inbounds <vscale x 16 x i8>, ptr %base, i64 31, i64 0170 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %gep, i32 13)171 ret void172}173 174;175; scalar contiguous176;177 178define void @test_svprfb(<vscale x 16 x i1> %pg, ptr %base) {179; CHECK-LABEL: test_svprfb:180; CHECK: // %bb.0: // %entry181; CHECK-NEXT: prfb pldl1keep, p0, [x0]182; CHECK-NEXT: ret183entry:184 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %base, i32 0)185 ret void186}187 188define void @test_svprfh(<vscale x 8 x i1> %pg, ptr %base) {189; CHECK-LABEL: test_svprfh:190; CHECK: // %bb.0: // %entry191; CHECK-NEXT: prfh pldl1keep, p0, [x0]192; CHECK-NEXT: ret193entry:194 tail call void @llvm.aarch64.sve.prf.nxv8i1(<vscale x 8 x i1> %pg, ptr %base, i32 0)195 ret void196}197 198define void @test_svprfw(<vscale x 4 x i1> %pg, ptr %base) {199; CHECK-LABEL: test_svprfw:200; CHECK: // %bb.0: // %entry201; CHECK-NEXT: prfw pldl1keep, p0, [x0]202; CHECK-NEXT: ret203entry:204 tail call void @llvm.aarch64.sve.prf.nxv4i1(<vscale x 4 x i1> %pg, ptr %base, i32 0)205 ret void206}207 208define void @test_svprfd(<vscale x 2 x i1> %pg, ptr %base) {209; CHECK-LABEL: test_svprfd:210; CHECK: // %bb.0: // %entry211; CHECK-NEXT: prfd pldl1keep, p0, [x0]212; CHECK-NEXT: ret213entry:214 tail call void @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %pg, ptr %base, i32 0)215 ret void216}217 218;219; scalar + imm contiguous220;221; imm form of prfb is tested above222 223define void @test_svprfh_vnum(<vscale x 8 x i1> %pg, ptr %base) {224; CHECK-LABEL: test_svprfh_vnum:225; CHECK: // %bb.0: // %entry226; CHECK-NEXT: prfh pstl3strm, p0, [x0, #31, mul vl]227; CHECK-NEXT: ret228entry:229 %gep = getelementptr <vscale x 8 x i16>, ptr %base, i64 31230 %addr = bitcast ptr %gep to ptr231 tail call void @llvm.aarch64.sve.prf.nxv8i1(<vscale x 8 x i1> %pg, ptr %addr, i32 13)232 ret void233}234 235define void @test_svprfw_vnum(<vscale x 4 x i1> %pg, ptr %base) {236; CHECK-LABEL: test_svprfw_vnum:237; CHECK: // %bb.0: // %entry238; CHECK-NEXT: prfw pstl3strm, p0, [x0, #31, mul vl]239; CHECK-NEXT: ret240entry:241 %gep = getelementptr <vscale x 4 x i32>, ptr %base, i64 31242 %addr = bitcast ptr %gep to ptr243 tail call void @llvm.aarch64.sve.prf.nxv4i1(<vscale x 4 x i1> %pg, ptr %addr, i32 13)244 ret void245}246 247define void @test_svprfd_vnum(<vscale x 2 x i1> %pg, ptr %base) {248; CHECK-LABEL: test_svprfd_vnum:249; CHECK: // %bb.0: // %entry250; CHECK-NEXT: prfd pstl3strm, p0, [x0, #31, mul vl]251; CHECK-NEXT: ret252entry:253 %gep = getelementptr <vscale x 2 x i64>, ptr %base, i64 31254 %addr = bitcast ptr %gep to ptr255 tail call void @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %pg, ptr %addr, i32 13)256 ret void257}258 259;260; scalar + scaled scalar contiguous261;262 263define void @test_svprfb_ss(<vscale x 16 x i1> %pg, ptr %base, i64 %offset) {264; CHECK-LABEL: test_svprfb_ss:265; CHECK: // %bb.0: // %entry266; CHECK-NEXT: prfb pstl3strm, p0, [x0, x1]267; CHECK-NEXT: ret268entry:269 %addr = getelementptr i8, ptr %base, i64 %offset270 tail call void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, ptr %addr, i32 13)271 ret void272}273 274define void @test_svprfh_ss(<vscale x 8 x i1> %pg, ptr %base, i64 %offset) {275; CHECK-LABEL: test_svprfh_ss:276; CHECK: // %bb.0: // %entry277; CHECK-NEXT: prfh pstl3strm, p0, [x0, x1, lsl #1]278; CHECK-NEXT: ret279entry:280 %gep = getelementptr i16, ptr %base, i64 %offset281 tail call void @llvm.aarch64.sve.prf.nxv8i1(<vscale x 8 x i1> %pg, ptr %gep, i32 13)282 ret void283}284 285define void @test_svprfw_ss(<vscale x 4 x i1> %pg, ptr %base, i64 %offset) {286; CHECK-LABEL: test_svprfw_ss:287; CHECK: // %bb.0: // %entry288; CHECK-NEXT: prfw pstl3strm, p0, [x0, x1, lsl #2]289; CHECK-NEXT: ret290entry:291 %gep = getelementptr i32, ptr %base, i64 %offset292 tail call void @llvm.aarch64.sve.prf.nxv4i1(<vscale x 4 x i1> %pg, ptr %gep, i32 13)293 ret void294}295 296define void @test_svprfd_ss(<vscale x 2 x i1> %pg, ptr %base, i64 %offset) {297; CHECK-LABEL: test_svprfd_ss:298; CHECK: // %bb.0: // %entry299; CHECK-NEXT: prfd pstl3strm, p0, [x0, x1, lsl #3]300; CHECK-NEXT: ret301entry:302 %gep = getelementptr i64, ptr %base, i64 %offset303 tail call void @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %pg, ptr %gep, i32 13)304 ret void305}306 307 308declare void @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1>, ptr, i32)309declare void @llvm.aarch64.sve.prf.nxv8i1(<vscale x 8 x i1>, ptr, i32)310declare void @llvm.aarch64.sve.prf.nxv4i1(<vscale x 4 x i1>, ptr, i32)311declare void @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1>, ptr, i32)312