308 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.bswap.i16(i16)10declare i32 @llvm.bswap.i32(i32)11declare i48 @llvm.bswap.i48(i48)12declare i64 @llvm.bswap.i64(i64)13declare i80 @llvm.bswap.i80(i80)14declare i128 @llvm.bswap.i128(i128)15 16define i16 @test_bswap_i16(i16 %a) nounwind {17; LA32R-LABEL: test_bswap_i16:18; LA32R: # %bb.0:19; LA32R-NEXT: lu12i.w $a1, 1520; LA32R-NEXT: ori $a1, $a1, 384021; LA32R-NEXT: and $a1, $a0, $a122; LA32R-NEXT: srli.w $a1, $a1, 823; LA32R-NEXT: slli.w $a0, $a0, 824; LA32R-NEXT: or $a0, $a0, $a125; LA32R-NEXT: ret26;27; LA32S-LABEL: test_bswap_i16:28; LA32S: # %bb.0:29; LA32S-NEXT: revb.2h $a0, $a030; LA32S-NEXT: ret31;32; LA64-LABEL: test_bswap_i16:33; LA64: # %bb.0:34; LA64-NEXT: revb.2h $a0, $a035; LA64-NEXT: ret36 %tmp = call i16 @llvm.bswap.i16(i16 %a)37 ret i16 %tmp38}39 40define i32 @test_bswap_i32(i32 %a) nounwind {41; LA32R-LABEL: test_bswap_i32:42; LA32R: # %bb.0:43; LA32R-NEXT: srli.w $a1, $a0, 844; LA32R-NEXT: lu12i.w $a2, 1545; LA32R-NEXT: ori $a2, $a2, 384046; LA32R-NEXT: and $a1, $a1, $a247; LA32R-NEXT: srli.w $a3, $a0, 2448; LA32R-NEXT: or $a1, $a1, $a349; LA32R-NEXT: and $a2, $a0, $a250; LA32R-NEXT: slli.w $a2, $a2, 851; LA32R-NEXT: slli.w $a0, $a0, 2452; LA32R-NEXT: or $a0, $a0, $a253; LA32R-NEXT: or $a0, $a0, $a154; LA32R-NEXT: ret55;56; LA32S-LABEL: test_bswap_i32:57; LA32S: # %bb.0:58; LA32S-NEXT: revb.2h $a0, $a059; LA32S-NEXT: rotri.w $a0, $a0, 1660; LA32S-NEXT: ret61;62; LA64-LABEL: test_bswap_i32:63; LA64: # %bb.0:64; LA64-NEXT: revb.2w $a0, $a065; LA64-NEXT: ret66 %tmp = call i32 @llvm.bswap.i32(i32 %a)67 ret i32 %tmp68}69 70define i64 @test_bswap_i64(i64 %a) nounwind {71; LA32R-LABEL: test_bswap_i64:72; LA32R: # %bb.0:73; LA32R-NEXT: srli.w $a2, $a1, 874; LA32R-NEXT: lu12i.w $a3, 1575; LA32R-NEXT: ori $a3, $a3, 384076; LA32R-NEXT: and $a2, $a2, $a377; LA32R-NEXT: srli.w $a4, $a1, 2478; LA32R-NEXT: or $a2, $a2, $a479; LA32R-NEXT: and $a4, $a1, $a380; LA32R-NEXT: slli.w $a4, $a4, 881; LA32R-NEXT: slli.w $a1, $a1, 2482; LA32R-NEXT: or $a1, $a1, $a483; LA32R-NEXT: or $a2, $a1, $a284; LA32R-NEXT: srli.w $a1, $a0, 885; LA32R-NEXT: and $a1, $a1, $a386; LA32R-NEXT: srli.w $a4, $a0, 2487; LA32R-NEXT: or $a1, $a1, $a488; LA32R-NEXT: and $a3, $a0, $a389; LA32R-NEXT: slli.w $a3, $a3, 890; LA32R-NEXT: slli.w $a0, $a0, 2491; LA32R-NEXT: or $a0, $a0, $a392; LA32R-NEXT: or $a1, $a0, $a193; LA32R-NEXT: move $a0, $a294; LA32R-NEXT: ret95;96; LA32S-LABEL: test_bswap_i64:97; LA32S: # %bb.0:98; LA32S-NEXT: revb.2h $a1, $a199; LA32S-NEXT: rotri.w $a2, $a1, 16100; LA32S-NEXT: revb.2h $a0, $a0101; LA32S-NEXT: rotri.w $a1, $a0, 16102; LA32S-NEXT: move $a0, $a2103; LA32S-NEXT: ret104;105; LA64-LABEL: test_bswap_i64:106; LA64: # %bb.0:107; LA64-NEXT: revb.d $a0, $a0108; LA64-NEXT: ret109 %tmp = call i64 @llvm.bswap.i64(i64 %a)110 ret i64 %tmp111}112 113;; Bswap on non-native integer widths.114 115define i48 @test_bswap_i48(i48 %a) nounwind {116; LA32R-LABEL: test_bswap_i48:117; LA32R: # %bb.0:118; LA32R-NEXT: srli.w $a2, $a0, 8119; LA32R-NEXT: lu12i.w $a3, 15120; LA32R-NEXT: ori $a3, $a3, 3840121; LA32R-NEXT: and $a2, $a2, $a3122; LA32R-NEXT: srli.w $a4, $a0, 24123; LA32R-NEXT: or $a2, $a2, $a4124; LA32R-NEXT: slli.w $a2, $a2, 16125; LA32R-NEXT: and $a4, $a1, $a3126; LA32R-NEXT: slli.w $a4, $a4, 8127; LA32R-NEXT: slli.w $a1, $a1, 24128; LA32R-NEXT: or $a1, $a1, $a4129; LA32R-NEXT: srli.w $a1, $a1, 16130; LA32R-NEXT: or $a2, $a1, $a2131; LA32R-NEXT: and $a1, $a0, $a3132; LA32R-NEXT: slli.w $a1, $a1, 8133; LA32R-NEXT: slli.w $a0, $a0, 24134; LA32R-NEXT: or $a0, $a0, $a1135; LA32R-NEXT: srli.w $a1, $a0, 16136; LA32R-NEXT: move $a0, $a2137; LA32R-NEXT: ret138;139; LA32S-LABEL: test_bswap_i48:140; LA32S: # %bb.0:141; LA32S-NEXT: revb.2h $a0, $a0142; LA32S-NEXT: rotri.w $a2, $a0, 16143; LA32S-NEXT: revb.2h $a0, $a1144; LA32S-NEXT: rotri.w $a0, $a0, 16145; LA32S-NEXT: bytepick.w $a0, $a0, $a2, 2146; LA32S-NEXT: srli.w $a1, $a2, 16147; LA32S-NEXT: ret148;149; LA64-LABEL: test_bswap_i48:150; LA64: # %bb.0:151; LA64-NEXT: revb.d $a0, $a0152; LA64-NEXT: srli.d $a0, $a0, 16153; LA64-NEXT: ret154 %tmp = call i48 @llvm.bswap.i48(i48 %a)155 ret i48 %tmp156}157 158define i80 @test_bswap_i80(i80 %a) nounwind {159; LA32R-LABEL: test_bswap_i80:160; LA32R: # %bb.0:161; LA32R-NEXT: ld.w $a2, $a1, 4162; LA32R-NEXT: ld.w $a3, $a1, 0163; LA32R-NEXT: ld.w $a1, $a1, 8164; LA32R-NEXT: srli.w $a4, $a2, 8165; LA32R-NEXT: lu12i.w $a5, 15166; LA32R-NEXT: ori $a5, $a5, 3840167; LA32R-NEXT: and $a4, $a4, $a5168; LA32R-NEXT: srli.w $a6, $a2, 24169; LA32R-NEXT: or $a4, $a4, $a6170; LA32R-NEXT: slli.w $a4, $a4, 16171; LA32R-NEXT: and $a6, $a1, $a5172; LA32R-NEXT: slli.w $a6, $a6, 8173; LA32R-NEXT: slli.w $a1, $a1, 24174; LA32R-NEXT: or $a1, $a1, $a6175; LA32R-NEXT: srli.w $a1, $a1, 16176; LA32R-NEXT: or $a1, $a1, $a4177; LA32R-NEXT: and $a4, $a2, $a5178; LA32R-NEXT: slli.w $a4, $a4, 8179; LA32R-NEXT: slli.w $a2, $a2, 24180; LA32R-NEXT: or $a2, $a2, $a4181; LA32R-NEXT: srli.w $a2, $a2, 16182; LA32R-NEXT: srli.w $a4, $a3, 8183; LA32R-NEXT: and $a4, $a4, $a5184; LA32R-NEXT: srli.w $a6, $a3, 24185; LA32R-NEXT: or $a4, $a4, $a6186; LA32R-NEXT: slli.w $a4, $a4, 16187; LA32R-NEXT: or $a2, $a4, $a2188; LA32R-NEXT: and $a4, $a3, $a5189; LA32R-NEXT: slli.w $a4, $a4, 8190; LA32R-NEXT: slli.w $a3, $a3, 24191; LA32R-NEXT: or $a3, $a3, $a4192; LA32R-NEXT: srli.w $a3, $a3, 16193; LA32R-NEXT: st.h $a3, $a0, 8194; LA32R-NEXT: st.w $a2, $a0, 4195; LA32R-NEXT: st.w $a1, $a0, 0196; LA32R-NEXT: ret197;198; LA32S-LABEL: test_bswap_i80:199; LA32S: # %bb.0:200; LA32S-NEXT: ld.w $a2, $a1, 4201; LA32S-NEXT: ld.w $a3, $a1, 8202; LA32S-NEXT: ld.w $a1, $a1, 0203; LA32S-NEXT: revb.2h $a2, $a2204; LA32S-NEXT: rotri.w $a2, $a2, 16205; LA32S-NEXT: revb.2h $a3, $a3206; LA32S-NEXT: rotri.w $a3, $a3, 16207; LA32S-NEXT: bytepick.w $a3, $a3, $a2, 2208; LA32S-NEXT: revb.2h $a1, $a1209; LA32S-NEXT: rotri.w $a1, $a1, 16210; LA32S-NEXT: bytepick.w $a2, $a2, $a1, 2211; LA32S-NEXT: srli.w $a1, $a1, 16212; LA32S-NEXT: st.w $a2, $a0, 4213; LA32S-NEXT: st.w $a3, $a0, 0214; LA32S-NEXT: st.h $a1, $a0, 8215; LA32S-NEXT: ret216;217; LA64-LABEL: test_bswap_i80:218; LA64: # %bb.0:219; LA64-NEXT: revb.d $a2, $a0220; LA64-NEXT: revb.d $a0, $a1221; LA64-NEXT: bytepick.d $a0, $a0, $a2, 2222; LA64-NEXT: srli.d $a1, $a2, 48223; LA64-NEXT: ret224 %tmp = call i80 @llvm.bswap.i80(i80 %a)225 ret i80 %tmp226}227 228define i128 @test_bswap_i128(i128 %a) nounwind {229; LA32R-LABEL: test_bswap_i128:230; LA32R: # %bb.0:231; LA32R-NEXT: ld.w $a2, $a1, 12232; LA32R-NEXT: ld.w $a3, $a1, 0233; LA32R-NEXT: ld.w $a4, $a1, 4234; LA32R-NEXT: ld.w $a1, $a1, 8235; LA32R-NEXT: srli.w $a5, $a2, 8236; LA32R-NEXT: lu12i.w $a6, 15237; LA32R-NEXT: ori $a6, $a6, 3840238; LA32R-NEXT: and $a5, $a5, $a6239; LA32R-NEXT: srli.w $a7, $a2, 24240; LA32R-NEXT: or $a5, $a5, $a7241; LA32R-NEXT: and $a7, $a2, $a6242; LA32R-NEXT: slli.w $a7, $a7, 8243; LA32R-NEXT: slli.w $a2, $a2, 24244; LA32R-NEXT: or $a2, $a2, $a7245; LA32R-NEXT: or $a2, $a2, $a5246; LA32R-NEXT: srli.w $a5, $a1, 8247; LA32R-NEXT: and $a5, $a5, $a6248; LA32R-NEXT: srli.w $a7, $a1, 24249; LA32R-NEXT: or $a5, $a5, $a7250; LA32R-NEXT: and $a7, $a1, $a6251; LA32R-NEXT: slli.w $a7, $a7, 8252; LA32R-NEXT: slli.w $a1, $a1, 24253; LA32R-NEXT: or $a1, $a1, $a7254; LA32R-NEXT: or $a1, $a1, $a5255; LA32R-NEXT: srli.w $a5, $a4, 8256; LA32R-NEXT: and $a5, $a5, $a6257; LA32R-NEXT: srli.w $a7, $a4, 24258; LA32R-NEXT: or $a5, $a5, $a7259; LA32R-NEXT: and $a7, $a4, $a6260; LA32R-NEXT: slli.w $a7, $a7, 8261; LA32R-NEXT: slli.w $a4, $a4, 24262; LA32R-NEXT: or $a4, $a4, $a7263; LA32R-NEXT: or $a4, $a4, $a5264; LA32R-NEXT: srli.w $a5, $a3, 8265; LA32R-NEXT: and $a5, $a5, $a6266; LA32R-NEXT: srli.w $a7, $a3, 24267; LA32R-NEXT: or $a5, $a5, $a7268; LA32R-NEXT: and $a6, $a3, $a6269; LA32R-NEXT: slli.w $a6, $a6, 8270; LA32R-NEXT: slli.w $a3, $a3, 24271; LA32R-NEXT: or $a3, $a3, $a6272; LA32R-NEXT: or $a3, $a3, $a5273; LA32R-NEXT: st.w $a3, $a0, 12274; LA32R-NEXT: st.w $a4, $a0, 8275; LA32R-NEXT: st.w $a1, $a0, 4276; LA32R-NEXT: st.w $a2, $a0, 0277; LA32R-NEXT: ret278;279; LA32S-LABEL: test_bswap_i128:280; LA32S: # %bb.0:281; LA32S-NEXT: ld.w $a2, $a1, 12282; LA32S-NEXT: ld.w $a3, $a1, 0283; LA32S-NEXT: ld.w $a4, $a1, 8284; LA32S-NEXT: ld.w $a1, $a1, 4285; LA32S-NEXT: revb.2h $a2, $a2286; LA32S-NEXT: rotri.w $a2, $a2, 16287; LA32S-NEXT: revb.2h $a4, $a4288; LA32S-NEXT: rotri.w $a4, $a4, 16289; LA32S-NEXT: revb.2h $a1, $a1290; LA32S-NEXT: rotri.w $a1, $a1, 16291; LA32S-NEXT: revb.2h $a3, $a3292; LA32S-NEXT: rotri.w $a3, $a3, 16293; LA32S-NEXT: st.w $a3, $a0, 12294; LA32S-NEXT: st.w $a1, $a0, 8295; LA32S-NEXT: st.w $a4, $a0, 4296; LA32S-NEXT: st.w $a2, $a0, 0297; LA32S-NEXT: ret298;299; LA64-LABEL: test_bswap_i128:300; LA64: # %bb.0:301; LA64-NEXT: revb.d $a2, $a1302; LA64-NEXT: revb.d $a1, $a0303; LA64-NEXT: move $a0, $a2304; LA64-NEXT: ret305 %tmp = call i128 @llvm.bswap.i128(i128 %a)306 ret i128 %tmp307}308