199 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,+lasx --verify-machineinstrs < %s \3; RUN: | FileCheck %s --check-prefix=LA324; RUN: llc --mtriple=loongarch64 -mattr=+lasx --verify-machineinstrs < %s \5; RUN: | FileCheck %s --check-prefix=LA646 7declare <32 x i8> @llvm.bitreverse.v32i8(<32 x i8>)8 9define <32 x i8> @test_bitreverse_v32i8(<32 x i8> %a) nounwind {10; LA32-LABEL: test_bitreverse_v32i8:11; LA32: # %bb.0:12; LA32-NEXT: xvslli.b $xr1, $xr0, 413; LA32-NEXT: xvsrli.b $xr0, $xr0, 414; LA32-NEXT: xvor.v $xr0, $xr0, $xr115; LA32-NEXT: xvandi.b $xr1, $xr0, 5116; LA32-NEXT: xvslli.b $xr1, $xr1, 217; LA32-NEXT: xvsrli.b $xr0, $xr0, 218; LA32-NEXT: xvandi.b $xr0, $xr0, 5119; LA32-NEXT: xvor.v $xr0, $xr0, $xr120; LA32-NEXT: xvandi.b $xr1, $xr0, 8521; LA32-NEXT: xvslli.b $xr1, $xr1, 122; LA32-NEXT: xvsrli.b $xr0, $xr0, 123; LA32-NEXT: xvandi.b $xr0, $xr0, 8524; LA32-NEXT: xvor.v $xr0, $xr0, $xr125; LA32-NEXT: ret26;27; LA64-LABEL: test_bitreverse_v32i8:28; LA64: # %bb.0:29; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 230; LA64-NEXT: bitrev.8b $a0, $a031; LA64-NEXT: vinsgr2vr.d $vr2, $a0, 032; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 333; LA64-NEXT: bitrev.8b $a0, $a034; LA64-NEXT: vinsgr2vr.d $vr2, $a0, 135; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 036; LA64-NEXT: bitrev.8b $a0, $a037; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 038; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 139; LA64-NEXT: bitrev.8b $a0, $a040; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 141; LA64-NEXT: xvpermi.q $xr1, $xr2, 242; LA64-NEXT: xvori.b $xr0, $xr1, 043; LA64-NEXT: ret44 %b = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a)45 ret <32 x i8> %b46}47 48declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>)49 50define <16 x i16> @test_bitreverse_v16i16(<16 x i16> %a) nounwind {51; LA32-LABEL: test_bitreverse_v16i16:52; LA32: # %bb.0:53; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 554; LA32-NEXT: bitrev.w $a0, $a055; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 056; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 457; LA32-NEXT: bitrev.w $a0, $a058; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 159; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 760; LA32-NEXT: bitrev.w $a0, $a061; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 262; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 663; LA32-NEXT: bitrev.w $a0, $a064; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 365; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 166; LA32-NEXT: bitrev.w $a0, $a067; LA32-NEXT: vinsgr2vr.w $vr2, $a0, 068; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 069; LA32-NEXT: bitrev.w $a0, $a070; LA32-NEXT: vinsgr2vr.w $vr2, $a0, 171; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 372; LA32-NEXT: bitrev.w $a0, $a073; LA32-NEXT: vinsgr2vr.w $vr2, $a0, 274; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 275; LA32-NEXT: bitrev.w $a0, $a076; LA32-NEXT: vinsgr2vr.w $vr2, $a0, 377; LA32-NEXT: xvpermi.q $xr2, $xr1, 278; LA32-NEXT: xvshuf4i.h $xr0, $xr2, 2779; LA32-NEXT: ret80;81; LA64-LABEL: test_bitreverse_v16i16:82; LA64: # %bb.0:83; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 284; LA64-NEXT: bitrev.d $a0, $a085; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 086; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 387; LA64-NEXT: bitrev.d $a0, $a088; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 189; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 090; LA64-NEXT: bitrev.d $a0, $a091; LA64-NEXT: vinsgr2vr.d $vr2, $a0, 092; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 193; LA64-NEXT: bitrev.d $a0, $a094; LA64-NEXT: vinsgr2vr.d $vr2, $a0, 195; LA64-NEXT: xvpermi.q $xr2, $xr1, 296; LA64-NEXT: xvshuf4i.h $xr0, $xr2, 2797; LA64-NEXT: ret98 %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a)99 ret <16 x i16> %b100}101 102declare <8 x i32> @llvm.bitreverse.v8i32(<8 x i32>)103 104define <8 x i32> @test_bitreverse_v8i32(<8 x i32> %a) nounwind {105; LA32-LABEL: test_bitreverse_v8i32:106; LA32: # %bb.0:107; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 4108; LA32-NEXT: bitrev.w $a0, $a0109; LA32-NEXT: vinsgr2vr.w $vr2, $a0, 0110; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 5111; LA32-NEXT: bitrev.w $a0, $a0112; LA32-NEXT: vinsgr2vr.w $vr2, $a0, 1113; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 6114; LA32-NEXT: bitrev.w $a0, $a0115; LA32-NEXT: vinsgr2vr.w $vr2, $a0, 2116; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 7117; LA32-NEXT: bitrev.w $a0, $a0118; LA32-NEXT: vinsgr2vr.w $vr2, $a0, 3119; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 0120; LA32-NEXT: bitrev.w $a0, $a0121; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 0122; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 1123; LA32-NEXT: bitrev.w $a0, $a0124; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 1125; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 2126; LA32-NEXT: bitrev.w $a0, $a0127; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 2128; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 3129; LA32-NEXT: bitrev.w $a0, $a0130; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 3131; LA32-NEXT: xvpermi.q $xr1, $xr2, 2132; LA32-NEXT: xvori.b $xr0, $xr1, 0133; LA32-NEXT: ret134;135; LA64-LABEL: test_bitreverse_v8i32:136; LA64: # %bb.0:137; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 2138; LA64-NEXT: bitrev.d $a0, $a0139; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 0140; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 3141; LA64-NEXT: bitrev.d $a0, $a0142; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 1143; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 0144; LA64-NEXT: bitrev.d $a0, $a0145; LA64-NEXT: vinsgr2vr.d $vr2, $a0, 0146; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 1147; LA64-NEXT: bitrev.d $a0, $a0148; LA64-NEXT: vinsgr2vr.d $vr2, $a0, 1149; LA64-NEXT: xvpermi.q $xr2, $xr1, 2150; LA64-NEXT: xvshuf4i.w $xr0, $xr2, 177151; LA64-NEXT: ret152 %b = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a)153 ret <8 x i32> %b154}155 156declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>)157 158define <4 x i64> @test_bitreverse_v4i64(<4 x i64> %a) nounwind {159; LA32-LABEL: test_bitreverse_v4i64:160; LA32: # %bb.0:161; LA32-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_0)162; LA32-NEXT: xvld $xr1, $a0, %pc_lo12(.LCPI3_0)163; LA32-NEXT: xvshuf.b $xr0, $xr0, $xr0, $xr1164; LA32-NEXT: xvslli.b $xr1, $xr0, 4165; LA32-NEXT: xvsrli.b $xr0, $xr0, 4166; LA32-NEXT: xvor.v $xr0, $xr0, $xr1167; LA32-NEXT: xvandi.b $xr1, $xr0, 51168; LA32-NEXT: xvslli.b $xr1, $xr1, 2169; LA32-NEXT: xvsrli.b $xr0, $xr0, 2170; LA32-NEXT: xvandi.b $xr0, $xr0, 51171; LA32-NEXT: xvor.v $xr0, $xr0, $xr1172; LA32-NEXT: xvandi.b $xr1, $xr0, 85173; LA32-NEXT: xvslli.b $xr1, $xr1, 1174; LA32-NEXT: xvsrli.b $xr0, $xr0, 1175; LA32-NEXT: xvandi.b $xr0, $xr0, 85176; LA32-NEXT: xvor.v $xr0, $xr0, $xr1177; LA32-NEXT: ret178;179; LA64-LABEL: test_bitreverse_v4i64:180; LA64: # %bb.0:181; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 2182; LA64-NEXT: bitrev.d $a0, $a0183; LA64-NEXT: vinsgr2vr.d $vr2, $a0, 0184; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 3185; LA64-NEXT: bitrev.d $a0, $a0186; LA64-NEXT: vinsgr2vr.d $vr2, $a0, 1187; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 0188; LA64-NEXT: bitrev.d $a0, $a0189; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 0190; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 1191; LA64-NEXT: bitrev.d $a0, $a0192; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 1193; LA64-NEXT: xvpermi.q $xr1, $xr2, 2194; LA64-NEXT: xvori.b $xr0, $xr1, 0195; LA64-NEXT: ret196 %b = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a)197 ret <4 x i64> %b198}199