237 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=-32s,+d < %s | FileCheck %s --check-prefix=LA32R3; RUN: llc --mtriple=loongarch32 -mattr=+32s,+d < %s | FileCheck %s --check-prefix=LA32S4; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA645 6;; Exercise the 'lshr' LLVM IR: https://llvm.org/docs/LangRef.html#lshr-instruction7 8define i1 @lshr_i1(i1 %x, i1 %y) {9; LA32R-LABEL: lshr_i1:10; LA32R: # %bb.0:11; LA32R-NEXT: ret12;13; LA32S-LABEL: lshr_i1:14; LA32S: # %bb.0:15; LA32S-NEXT: ret16;17; LA64-LABEL: lshr_i1:18; LA64: # %bb.0:19; LA64-NEXT: ret20 %lshr = lshr i1 %x, %y21 ret i1 %lshr22}23 24define i8 @lshr_i8(i8 %x, i8 %y) {25; LA32R-LABEL: lshr_i8:26; LA32R: # %bb.0:27; LA32R-NEXT: andi $a0, $a0, 25528; LA32R-NEXT: srl.w $a0, $a0, $a129; LA32R-NEXT: ret30;31; LA32S-LABEL: lshr_i8:32; LA32S: # %bb.0:33; LA32S-NEXT: andi $a0, $a0, 25534; LA32S-NEXT: srl.w $a0, $a0, $a135; LA32S-NEXT: ret36;37; LA64-LABEL: lshr_i8:38; LA64: # %bb.0:39; LA64-NEXT: andi $a0, $a0, 25540; LA64-NEXT: srl.d $a0, $a0, $a141; LA64-NEXT: ret42 %lshr = lshr i8 %x, %y43 ret i8 %lshr44}45 46define i16 @lshr_i16(i16 %x, i16 %y) {47; LA32R-LABEL: lshr_i16:48; LA32R: # %bb.0:49; LA32R-NEXT: lu12i.w $a2, 1550; LA32R-NEXT: ori $a2, $a2, 409551; LA32R-NEXT: and $a0, $a0, $a252; LA32R-NEXT: srl.w $a0, $a0, $a153; LA32R-NEXT: ret54;55; LA32S-LABEL: lshr_i16:56; LA32S: # %bb.0:57; LA32S-NEXT: bstrpick.w $a0, $a0, 15, 058; LA32S-NEXT: srl.w $a0, $a0, $a159; LA32S-NEXT: ret60;61; LA64-LABEL: lshr_i16:62; LA64: # %bb.0:63; LA64-NEXT: bstrpick.d $a0, $a0, 15, 064; LA64-NEXT: srl.d $a0, $a0, $a165; LA64-NEXT: ret66 %lshr = lshr i16 %x, %y67 ret i16 %lshr68}69 70define i32 @lshr_i32(i32 %x, i32 %y) {71; LA32R-LABEL: lshr_i32:72; LA32R: # %bb.0:73; LA32R-NEXT: srl.w $a0, $a0, $a174; LA32R-NEXT: ret75;76; LA32S-LABEL: lshr_i32:77; LA32S: # %bb.0:78; LA32S-NEXT: srl.w $a0, $a0, $a179; LA32S-NEXT: ret80;81; LA64-LABEL: lshr_i32:82; LA64: # %bb.0:83; LA64-NEXT: srl.w $a0, $a0, $a184; LA64-NEXT: ret85 %lshr = lshr i32 %x, %y86 ret i32 %lshr87}88 89define i64 @lshr_i64(i64 %x, i64 %y) {90; LA32R-LABEL: lshr_i64:91; LA32R: # %bb.0:92; LA32R-NEXT: addi.w $a3, $a2, -3293; LA32R-NEXT: bltz $a3, .LBB4_294; LA32R-NEXT: # %bb.1:95; LA32R-NEXT: srl.w $a0, $a1, $a396; LA32R-NEXT: b .LBB4_397; LA32R-NEXT: .LBB4_2:98; LA32R-NEXT: srl.w $a0, $a0, $a299; LA32R-NEXT: xori $a4, $a2, 31100; LA32R-NEXT: slli.w $a5, $a1, 1101; LA32R-NEXT: sll.w $a4, $a5, $a4102; LA32R-NEXT: or $a0, $a0, $a4103; LA32R-NEXT: .LBB4_3:104; LA32R-NEXT: slti $a3, $a3, 0105; LA32R-NEXT: sub.w $a3, $zero, $a3106; LA32R-NEXT: srl.w $a1, $a1, $a2107; LA32R-NEXT: and $a1, $a3, $a1108; LA32R-NEXT: ret109;110; LA32S-LABEL: lshr_i64:111; LA32S: # %bb.0:112; LA32S-NEXT: srl.w $a0, $a0, $a2113; LA32S-NEXT: xori $a3, $a2, 31114; LA32S-NEXT: slli.w $a4, $a1, 1115; LA32S-NEXT: sll.w $a3, $a4, $a3116; LA32S-NEXT: or $a0, $a0, $a3117; LA32S-NEXT: addi.w $a3, $a2, -32118; LA32S-NEXT: slti $a4, $a3, 0119; LA32S-NEXT: maskeqz $a0, $a0, $a4120; LA32S-NEXT: srl.w $a5, $a1, $a3121; LA32S-NEXT: masknez $a4, $a5, $a4122; LA32S-NEXT: or $a0, $a0, $a4123; LA32S-NEXT: srl.w $a1, $a1, $a2124; LA32S-NEXT: srai.w $a2, $a3, 31125; LA32S-NEXT: and $a1, $a2, $a1126; LA32S-NEXT: ret127;128; LA64-LABEL: lshr_i64:129; LA64: # %bb.0:130; LA64-NEXT: srl.d $a0, $a0, $a1131; LA64-NEXT: ret132 %lshr = lshr i64 %x, %y133 ret i64 %lshr134}135 136define i1 @lshr_i1_3(i1 %x) {137; LA32R-LABEL: lshr_i1_3:138; LA32R: # %bb.0:139; LA32R-NEXT: ret140;141; LA32S-LABEL: lshr_i1_3:142; LA32S: # %bb.0:143; LA32S-NEXT: ret144;145; LA64-LABEL: lshr_i1_3:146; LA64: # %bb.0:147; LA64-NEXT: ret148 %lshr = lshr i1 %x, 3149 ret i1 %lshr150}151 152define i8 @lshr_i8_3(i8 %x) {153; LA32R-LABEL: lshr_i8_3:154; LA32R: # %bb.0:155; LA32R-NEXT: andi $a0, $a0, 248156; LA32R-NEXT: srli.w $a0, $a0, 3157; LA32R-NEXT: ret158;159; LA32S-LABEL: lshr_i8_3:160; LA32S: # %bb.0:161; LA32S-NEXT: bstrpick.w $a0, $a0, 7, 3162; LA32S-NEXT: ret163;164; LA64-LABEL: lshr_i8_3:165; LA64: # %bb.0:166; LA64-NEXT: bstrpick.d $a0, $a0, 7, 3167; LA64-NEXT: ret168 %lshr = lshr i8 %x, 3169 ret i8 %lshr170}171 172define i16 @lshr_i16_3(i16 %x) {173; LA32R-LABEL: lshr_i16_3:174; LA32R: # %bb.0:175; LA32R-NEXT: lu12i.w $a1, 15176; LA32R-NEXT: ori $a1, $a1, 4088177; LA32R-NEXT: and $a0, $a0, $a1178; LA32R-NEXT: srli.w $a0, $a0, 3179; LA32R-NEXT: ret180;181; LA32S-LABEL: lshr_i16_3:182; LA32S: # %bb.0:183; LA32S-NEXT: bstrpick.w $a0, $a0, 15, 3184; LA32S-NEXT: ret185;186; LA64-LABEL: lshr_i16_3:187; LA64: # %bb.0:188; LA64-NEXT: bstrpick.d $a0, $a0, 15, 3189; LA64-NEXT: ret190 %lshr = lshr i16 %x, 3191 ret i16 %lshr192}193 194define i32 @lshr_i32_3(i32 %x) {195; LA32R-LABEL: lshr_i32_3:196; LA32R: # %bb.0:197; LA32R-NEXT: srli.w $a0, $a0, 3198; LA32R-NEXT: ret199;200; LA32S-LABEL: lshr_i32_3:201; LA32S: # %bb.0:202; LA32S-NEXT: srli.w $a0, $a0, 3203; LA32S-NEXT: ret204;205; LA64-LABEL: lshr_i32_3:206; LA64: # %bb.0:207; LA64-NEXT: bstrpick.d $a0, $a0, 31, 3208; LA64-NEXT: ret209 %lshr = lshr i32 %x, 3210 ret i32 %lshr211}212 213define i64 @lshr_i64_3(i64 %x) {214; LA32R-LABEL: lshr_i64_3:215; LA32R: # %bb.0:216; LA32R-NEXT: slli.w $a2, $a1, 29217; LA32R-NEXT: srli.w $a0, $a0, 3218; LA32R-NEXT: or $a0, $a0, $a2219; LA32R-NEXT: srli.w $a1, $a1, 3220; LA32R-NEXT: ret221;222; LA32S-LABEL: lshr_i64_3:223; LA32S: # %bb.0:224; LA32S-NEXT: slli.w $a2, $a1, 29225; LA32S-NEXT: srli.w $a0, $a0, 3226; LA32S-NEXT: or $a0, $a0, $a2227; LA32S-NEXT: srli.w $a1, $a1, 3228; LA32S-NEXT: ret229;230; LA64-LABEL: lshr_i64_3:231; LA64: # %bb.0:232; LA64-NEXT: srli.d $a0, $a0, 3233; LA64-NEXT: ret234 %lshr = lshr i64 %x, 3235 ret i64 %lshr236}237