145 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc --mtriple=loongarch32 -mattr=+32s,+lsx --verify-machineinstrs < %s \3; RUN: | FileCheck %s --check-prefix=LA324; RUN: llc --mtriple=loongarch64 -mattr=+lsx --verify-machineinstrs < %s \5; RUN: | FileCheck %s --check-prefix=LA646 7declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>)8 9define <16 x i8> @test_bitreverse_v16i8(<16 x i8> %a) nounwind {10; LA32-LABEL: test_bitreverse_v16i8:11; LA32: # %bb.0:12; LA32-NEXT: vslli.b $vr1, $vr0, 413; LA32-NEXT: vsrli.b $vr0, $vr0, 414; LA32-NEXT: vor.v $vr0, $vr0, $vr115; LA32-NEXT: vandi.b $vr1, $vr0, 5116; LA32-NEXT: vslli.b $vr1, $vr1, 217; LA32-NEXT: vsrli.b $vr0, $vr0, 218; LA32-NEXT: vandi.b $vr0, $vr0, 5119; LA32-NEXT: vor.v $vr0, $vr0, $vr120; LA32-NEXT: vandi.b $vr1, $vr0, 8521; LA32-NEXT: vslli.b $vr1, $vr1, 122; LA32-NEXT: vsrli.b $vr0, $vr0, 123; LA32-NEXT: vandi.b $vr0, $vr0, 8524; LA32-NEXT: vor.v $vr0, $vr0, $vr125; LA32-NEXT: ret26;27; LA64-LABEL: test_bitreverse_v16i8:28; LA64: # %bb.0:29; LA64-NEXT: vpickve2gr.d $a0, $vr0, 030; LA64-NEXT: bitrev.8b $a0, $a031; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 032; LA64-NEXT: vpickve2gr.d $a0, $vr0, 133; LA64-NEXT: bitrev.8b $a0, $a034; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 135; LA64-NEXT: vori.b $vr0, $vr1, 036; LA64-NEXT: ret37 %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a)38 ret <16 x i8> %b39}40 41declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>)42 43define <8 x i16> @test_bitreverse_v8i16(<8 x i16> %a) nounwind {44; LA32-LABEL: test_bitreverse_v8i16:45; LA32: # %bb.0:46; LA32-NEXT: vpickve2gr.w $a0, $vr0, 147; LA32-NEXT: bitrev.w $a0, $a048; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 049; LA32-NEXT: vpickve2gr.w $a0, $vr0, 050; LA32-NEXT: bitrev.w $a0, $a051; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 152; LA32-NEXT: vpickve2gr.w $a0, $vr0, 353; LA32-NEXT: bitrev.w $a0, $a054; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 255; LA32-NEXT: vpickve2gr.w $a0, $vr0, 256; LA32-NEXT: bitrev.w $a0, $a057; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 358; LA32-NEXT: vshuf4i.h $vr0, $vr1, 2759; LA32-NEXT: ret60;61; LA64-LABEL: test_bitreverse_v8i16:62; LA64: # %bb.0:63; LA64-NEXT: vpickve2gr.d $a0, $vr0, 064; LA64-NEXT: bitrev.d $a0, $a065; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 066; LA64-NEXT: vpickve2gr.d $a0, $vr0, 167; LA64-NEXT: bitrev.d $a0, $a068; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 169; LA64-NEXT: vshuf4i.h $vr0, $vr1, 2770; LA64-NEXT: ret71 %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a)72 ret <8 x i16> %b73}74 75declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>)76 77define <4 x i32> @test_bitreverse_v4i32(<4 x i32> %a) nounwind {78; LA32-LABEL: test_bitreverse_v4i32:79; LA32: # %bb.0:80; LA32-NEXT: vpickve2gr.w $a0, $vr0, 081; LA32-NEXT: bitrev.w $a0, $a082; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 083; LA32-NEXT: vpickve2gr.w $a0, $vr0, 184; LA32-NEXT: bitrev.w $a0, $a085; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 186; LA32-NEXT: vpickve2gr.w $a0, $vr0, 287; LA32-NEXT: bitrev.w $a0, $a088; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 289; LA32-NEXT: vpickve2gr.w $a0, $vr0, 390; LA32-NEXT: bitrev.w $a0, $a091; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 392; LA32-NEXT: vori.b $vr0, $vr1, 093; LA32-NEXT: ret94;95; LA64-LABEL: test_bitreverse_v4i32:96; LA64: # %bb.0:97; LA64-NEXT: vpickve2gr.d $a0, $vr0, 098; LA64-NEXT: bitrev.d $a0, $a099; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 0100; LA64-NEXT: vpickve2gr.d $a0, $vr0, 1101; LA64-NEXT: bitrev.d $a0, $a0102; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 1103; LA64-NEXT: vshuf4i.w $vr0, $vr1, 177104; LA64-NEXT: ret105 %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a)106 ret <4 x i32> %b107}108 109declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>)110 111define <2 x i64> @test_bitreverse_v2i64(<2 x i64> %a) nounwind {112; LA32-LABEL: test_bitreverse_v2i64:113; LA32: # %bb.0:114; LA32-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_0)115; LA32-NEXT: vld $vr1, $a0, %pc_lo12(.LCPI3_0)116; LA32-NEXT: vshuf.b $vr0, $vr0, $vr0, $vr1117; LA32-NEXT: vslli.b $vr1, $vr0, 4118; LA32-NEXT: vsrli.b $vr0, $vr0, 4119; LA32-NEXT: vor.v $vr0, $vr0, $vr1120; LA32-NEXT: vandi.b $vr1, $vr0, 51121; LA32-NEXT: vslli.b $vr1, $vr1, 2122; LA32-NEXT: vsrli.b $vr0, $vr0, 2123; LA32-NEXT: vandi.b $vr0, $vr0, 51124; LA32-NEXT: vor.v $vr0, $vr0, $vr1125; LA32-NEXT: vandi.b $vr1, $vr0, 85126; LA32-NEXT: vslli.b $vr1, $vr1, 1127; LA32-NEXT: vsrli.b $vr0, $vr0, 1128; LA32-NEXT: vandi.b $vr0, $vr0, 85129; LA32-NEXT: vor.v $vr0, $vr0, $vr1130; LA32-NEXT: ret131;132; LA64-LABEL: test_bitreverse_v2i64:133; LA64: # %bb.0:134; LA64-NEXT: vpickve2gr.d $a0, $vr0, 0135; LA64-NEXT: bitrev.d $a0, $a0136; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 0137; LA64-NEXT: vpickve2gr.d $a0, $vr0, 1138; LA64-NEXT: bitrev.d $a0, $a0139; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 1140; LA64-NEXT: vori.b $vr0, $vr1, 0141; LA64-NEXT: ret142 %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a)143 ret <2 x i64> %b144}145