323 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=-32s,+d --verify-machineinstrs < %s \3; RUN: | FileCheck %s --check-prefix=LA32R4; RUN: llc --mtriple=loongarch32 -mattr=+32s,+d --verify-machineinstrs < %s \5; RUN: | FileCheck %s --check-prefix=LA32S6; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s \7; RUN: | FileCheck %s --check-prefix=LA648 9declare i16 @llvm.bitreverse.i16(i16)10declare i32 @llvm.bitreverse.i32(i32)11declare i64 @llvm.bitreverse.i64(i64)12declare i16 @llvm.bswap.i16(i16)13declare i32 @llvm.bswap.i32(i32)14declare i64 @llvm.bswap.i64(i64)15 16define i16 @test_bswap_bitreverse_i16(i16 %a) nounwind {17; LA32R-LABEL: test_bswap_bitreverse_i16:18; LA32R: # %bb.0:19; LA32R-NEXT: andi $a1, $a0, 385520; LA32R-NEXT: slli.w $a1, $a1, 421; LA32R-NEXT: srli.w $a0, $a0, 422; LA32R-NEXT: andi $a0, $a0, 385523; LA32R-NEXT: or $a0, $a0, $a124; LA32R-NEXT: srli.w $a1, $a0, 225; LA32R-NEXT: lu12i.w $a2, 326; LA32R-NEXT: ori $a2, $a2, 81927; LA32R-NEXT: and $a1, $a1, $a228; LA32R-NEXT: and $a0, $a0, $a229; LA32R-NEXT: slli.w $a0, $a0, 230; LA32R-NEXT: or $a0, $a1, $a031; LA32R-NEXT: srli.w $a1, $a0, 132; LA32R-NEXT: lu12i.w $a2, 533; LA32R-NEXT: ori $a2, $a2, 136534; LA32R-NEXT: and $a1, $a1, $a235; LA32R-NEXT: and $a0, $a0, $a236; LA32R-NEXT: slli.w $a0, $a0, 137; LA32R-NEXT: or $a0, $a1, $a038; LA32R-NEXT: ret39;40; LA32S-LABEL: test_bswap_bitreverse_i16:41; LA32S: # %bb.0:42; LA32S-NEXT: revb.2h $a0, $a043; LA32S-NEXT: bitrev.w $a0, $a044; LA32S-NEXT: srli.w $a0, $a0, 1645; LA32S-NEXT: ret46;47; LA64-LABEL: test_bswap_bitreverse_i16:48; LA64: # %bb.0:49; LA64-NEXT: revb.2h $a0, $a050; LA64-NEXT: bitrev.d $a0, $a051; LA64-NEXT: srli.d $a0, $a0, 4852; LA64-NEXT: ret53 %tmp = call i16 @llvm.bswap.i16(i16 %a)54 %tmp2 = call i16 @llvm.bitreverse.i16(i16 %tmp)55 ret i16 %tmp256}57 58define i32 @test_bswap_bitreverse_i32(i32 %a) nounwind {59; LA32R-LABEL: test_bswap_bitreverse_i32:60; LA32R: # %bb.0:61; LA32R-NEXT: srli.w $a1, $a0, 462; LA32R-NEXT: lu12i.w $a2, 6168063; LA32R-NEXT: ori $a2, $a2, 385564; LA32R-NEXT: and $a1, $a1, $a265; LA32R-NEXT: and $a0, $a0, $a266; LA32R-NEXT: slli.w $a0, $a0, 467; LA32R-NEXT: or $a0, $a1, $a068; LA32R-NEXT: srli.w $a1, $a0, 269; LA32R-NEXT: lu12i.w $a2, 20971570; LA32R-NEXT: ori $a2, $a2, 81971; LA32R-NEXT: and $a1, $a1, $a272; LA32R-NEXT: and $a0, $a0, $a273; LA32R-NEXT: slli.w $a0, $a0, 274; LA32R-NEXT: or $a0, $a1, $a075; LA32R-NEXT: srli.w $a1, $a0, 176; LA32R-NEXT: lu12i.w $a2, 34952577; LA32R-NEXT: ori $a2, $a2, 136578; LA32R-NEXT: and $a1, $a1, $a279; LA32R-NEXT: and $a0, $a0, $a280; LA32R-NEXT: slli.w $a0, $a0, 181; LA32R-NEXT: or $a0, $a1, $a082; LA32R-NEXT: ret83;84; LA32S-LABEL: test_bswap_bitreverse_i32:85; LA32S: # %bb.0:86; LA32S-NEXT: bitrev.4b $a0, $a087; LA32S-NEXT: ret88;89; LA64-LABEL: test_bswap_bitreverse_i32:90; LA64: # %bb.0:91; LA64-NEXT: bitrev.4b $a0, $a092; LA64-NEXT: ret93 %tmp = call i32 @llvm.bswap.i32(i32 %a)94 %tmp2 = call i32 @llvm.bitreverse.i32(i32 %tmp)95 ret i32 %tmp296}97 98define i64 @test_bswap_bitreverse_i64(i64 %a) nounwind {99; LA32R-LABEL: test_bswap_bitreverse_i64:100; LA32R: # %bb.0:101; LA32R-NEXT: srli.w $a2, $a0, 4102; LA32R-NEXT: lu12i.w $a3, 61680103; LA32R-NEXT: ori $a3, $a3, 3855104; LA32R-NEXT: and $a2, $a2, $a3105; LA32R-NEXT: and $a0, $a0, $a3106; LA32R-NEXT: slli.w $a0, $a0, 4107; LA32R-NEXT: or $a0, $a2, $a0108; LA32R-NEXT: srli.w $a2, $a0, 2109; LA32R-NEXT: lu12i.w $a4, 209715110; LA32R-NEXT: ori $a4, $a4, 819111; LA32R-NEXT: and $a2, $a2, $a4112; LA32R-NEXT: and $a0, $a0, $a4113; LA32R-NEXT: slli.w $a0, $a0, 2114; LA32R-NEXT: or $a0, $a2, $a0115; LA32R-NEXT: srli.w $a2, $a0, 1116; LA32R-NEXT: lu12i.w $a5, 349525117; LA32R-NEXT: ori $a5, $a5, 1365118; LA32R-NEXT: and $a2, $a2, $a5119; LA32R-NEXT: and $a0, $a0, $a5120; LA32R-NEXT: slli.w $a0, $a0, 1121; LA32R-NEXT: or $a0, $a2, $a0122; LA32R-NEXT: srli.w $a2, $a1, 4123; LA32R-NEXT: and $a2, $a2, $a3124; LA32R-NEXT: and $a1, $a1, $a3125; LA32R-NEXT: slli.w $a1, $a1, 4126; LA32R-NEXT: or $a1, $a2, $a1127; LA32R-NEXT: srli.w $a2, $a1, 2128; LA32R-NEXT: and $a2, $a2, $a4129; LA32R-NEXT: and $a1, $a1, $a4130; LA32R-NEXT: slli.w $a1, $a1, 2131; LA32R-NEXT: or $a1, $a2, $a1132; LA32R-NEXT: srli.w $a2, $a1, 1133; LA32R-NEXT: and $a2, $a2, $a5134; LA32R-NEXT: and $a1, $a1, $a5135; LA32R-NEXT: slli.w $a1, $a1, 1136; LA32R-NEXT: or $a1, $a2, $a1137; LA32R-NEXT: ret138;139; LA32S-LABEL: test_bswap_bitreverse_i64:140; LA32S: # %bb.0:141; LA32S-NEXT: bitrev.4b $a0, $a0142; LA32S-NEXT: bitrev.4b $a1, $a1143; LA32S-NEXT: ret144;145; LA64-LABEL: test_bswap_bitreverse_i64:146; LA64: # %bb.0:147; LA64-NEXT: bitrev.8b $a0, $a0148; LA64-NEXT: ret149 %tmp = call i64 @llvm.bswap.i64(i64 %a)150 %tmp2 = call i64 @llvm.bitreverse.i64(i64 %tmp)151 ret i64 %tmp2152}153 154define i16 @test_bitreverse_bswap_i16(i16 %a) nounwind {155; LA32R-LABEL: test_bitreverse_bswap_i16:156; LA32R: # %bb.0:157; LA32R-NEXT: andi $a1, $a0, 3855158; LA32R-NEXT: slli.w $a1, $a1, 4159; LA32R-NEXT: srli.w $a0, $a0, 4160; LA32R-NEXT: andi $a0, $a0, 3855161; LA32R-NEXT: or $a0, $a0, $a1162; LA32R-NEXT: srli.w $a1, $a0, 2163; LA32R-NEXT: lu12i.w $a2, 3164; LA32R-NEXT: ori $a2, $a2, 819165; LA32R-NEXT: and $a1, $a1, $a2166; LA32R-NEXT: and $a0, $a0, $a2167; LA32R-NEXT: slli.w $a0, $a0, 2168; LA32R-NEXT: or $a0, $a1, $a0169; LA32R-NEXT: srli.w $a1, $a0, 1170; LA32R-NEXT: lu12i.w $a2, 5171; LA32R-NEXT: ori $a2, $a2, 1365172; LA32R-NEXT: and $a1, $a1, $a2173; LA32R-NEXT: and $a0, $a0, $a2174; LA32R-NEXT: slli.w $a0, $a0, 1175; LA32R-NEXT: or $a0, $a1, $a0176; LA32R-NEXT: ret177;178; LA32S-LABEL: test_bitreverse_bswap_i16:179; LA32S: # %bb.0:180; LA32S-NEXT: revb.2h $a0, $a0181; LA32S-NEXT: bitrev.w $a0, $a0182; LA32S-NEXT: srli.w $a0, $a0, 16183; LA32S-NEXT: ret184;185; LA64-LABEL: test_bitreverse_bswap_i16:186; LA64: # %bb.0:187; LA64-NEXT: revb.2h $a0, $a0188; LA64-NEXT: bitrev.d $a0, $a0189; LA64-NEXT: srli.d $a0, $a0, 48190; LA64-NEXT: ret191 %tmp = call i16 @llvm.bitreverse.i16(i16 %a)192 %tmp2 = call i16 @llvm.bswap.i16(i16 %tmp)193 ret i16 %tmp2194}195 196define i32 @test_bitreverse_bswap_i32(i32 %a) nounwind {197; LA32R-LABEL: test_bitreverse_bswap_i32:198; LA32R: # %bb.0:199; LA32R-NEXT: srli.w $a1, $a0, 4200; LA32R-NEXT: lu12i.w $a2, 61680201; LA32R-NEXT: ori $a2, $a2, 3855202; LA32R-NEXT: and $a1, $a1, $a2203; LA32R-NEXT: and $a0, $a0, $a2204; LA32R-NEXT: slli.w $a0, $a0, 4205; LA32R-NEXT: or $a0, $a1, $a0206; LA32R-NEXT: srli.w $a1, $a0, 2207; LA32R-NEXT: lu12i.w $a2, 209715208; LA32R-NEXT: ori $a2, $a2, 819209; LA32R-NEXT: and $a1, $a1, $a2210; LA32R-NEXT: and $a0, $a0, $a2211; LA32R-NEXT: slli.w $a0, $a0, 2212; LA32R-NEXT: or $a0, $a1, $a0213; LA32R-NEXT: srli.w $a1, $a0, 1214; LA32R-NEXT: lu12i.w $a2, 349525215; LA32R-NEXT: ori $a2, $a2, 1365216; LA32R-NEXT: and $a1, $a1, $a2217; LA32R-NEXT: and $a0, $a0, $a2218; LA32R-NEXT: slli.w $a0, $a0, 1219; LA32R-NEXT: or $a0, $a1, $a0220; LA32R-NEXT: ret221;222; LA32S-LABEL: test_bitreverse_bswap_i32:223; LA32S: # %bb.0:224; LA32S-NEXT: bitrev.4b $a0, $a0225; LA32S-NEXT: ret226;227; LA64-LABEL: test_bitreverse_bswap_i32:228; LA64: # %bb.0:229; LA64-NEXT: bitrev.4b $a0, $a0230; LA64-NEXT: ret231 %tmp = call i32 @llvm.bitreverse.i32(i32 %a)232 %tmp2 = call i32 @llvm.bswap.i32(i32 %tmp)233 ret i32 %tmp2234}235 236define i64 @test_bitreverse_bswap_i64(i64 %a) nounwind {237; LA32R-LABEL: test_bitreverse_bswap_i64:238; LA32R: # %bb.0:239; LA32R-NEXT: srli.w $a2, $a0, 4240; LA32R-NEXT: lu12i.w $a3, 61680241; LA32R-NEXT: ori $a3, $a3, 3855242; LA32R-NEXT: and $a2, $a2, $a3243; LA32R-NEXT: and $a0, $a0, $a3244; LA32R-NEXT: slli.w $a0, $a0, 4245; LA32R-NEXT: or $a0, $a2, $a0246; LA32R-NEXT: srli.w $a2, $a0, 2247; LA32R-NEXT: lu12i.w $a4, 209715248; LA32R-NEXT: ori $a4, $a4, 819249; LA32R-NEXT: and $a2, $a2, $a4250; LA32R-NEXT: and $a0, $a0, $a4251; LA32R-NEXT: slli.w $a0, $a0, 2252; LA32R-NEXT: or $a0, $a2, $a0253; LA32R-NEXT: srli.w $a2, $a0, 1254; LA32R-NEXT: lu12i.w $a5, 349525255; LA32R-NEXT: ori $a5, $a5, 1365256; LA32R-NEXT: and $a2, $a2, $a5257; LA32R-NEXT: and $a0, $a0, $a5258; LA32R-NEXT: slli.w $a0, $a0, 1259; LA32R-NEXT: or $a0, $a2, $a0260; LA32R-NEXT: srli.w $a2, $a1, 4261; LA32R-NEXT: and $a2, $a2, $a3262; LA32R-NEXT: and $a1, $a1, $a3263; LA32R-NEXT: slli.w $a1, $a1, 4264; LA32R-NEXT: or $a1, $a2, $a1265; LA32R-NEXT: srli.w $a2, $a1, 2266; LA32R-NEXT: and $a2, $a2, $a4267; LA32R-NEXT: and $a1, $a1, $a4268; LA32R-NEXT: slli.w $a1, $a1, 2269; LA32R-NEXT: or $a1, $a2, $a1270; LA32R-NEXT: srli.w $a2, $a1, 1271; LA32R-NEXT: and $a2, $a2, $a5272; LA32R-NEXT: and $a1, $a1, $a5273; LA32R-NEXT: slli.w $a1, $a1, 1274; LA32R-NEXT: or $a1, $a2, $a1275; LA32R-NEXT: ret276;277; LA32S-LABEL: test_bitreverse_bswap_i64:278; LA32S: # %bb.0:279; LA32S-NEXT: bitrev.4b $a0, $a0280; LA32S-NEXT: bitrev.4b $a1, $a1281; LA32S-NEXT: ret282;283; LA64-LABEL: test_bitreverse_bswap_i64:284; LA64: # %bb.0:285; LA64-NEXT: bitrev.8b $a0, $a0286; LA64-NEXT: ret287 %tmp = call i64 @llvm.bitreverse.i64(i64 %a)288 %tmp2 = call i64 @llvm.bswap.i64(i64 %tmp)289 ret i64 %tmp2290}291 292define i32 @pr55484(i32 %0) {293; LA32R-LABEL: pr55484:294; LA32R: # %bb.0:295; LA32R-NEXT: slli.w $a1, $a0, 8296; LA32R-NEXT: slli.w $a0, $a0, 24297; LA32R-NEXT: or $a0, $a0, $a1298; LA32R-NEXT: srai.w $a0, $a0, 16299; LA32R-NEXT: ret300;301; LA32S-LABEL: pr55484:302; LA32S: # %bb.0:303; LA32S-NEXT: srli.w $a1, $a0, 8304; LA32S-NEXT: slli.w $a0, $a0, 8305; LA32S-NEXT: or $a0, $a1, $a0306; LA32S-NEXT: ext.w.h $a0, $a0307; LA32S-NEXT: ret308;309; LA64-LABEL: pr55484:310; LA64: # %bb.0:311; LA64-NEXT: srli.d $a1, $a0, 8312; LA64-NEXT: slli.d $a0, $a0, 8313; LA64-NEXT: or $a0, $a1, $a0314; LA64-NEXT: ext.w.h $a0, $a0315; LA64-NEXT: ret316 %2 = lshr i32 %0, 8317 %3 = shl i32 %0, 8318 %4 = or i32 %2, %3319 %5 = trunc i32 %4 to i16320 %6 = sext i16 %5 to i32321 ret i32 %6322}323