1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s 3 4define i32 @lshr10_and255(i32 %a) { 5; CHECK-LABEL: lshr10_and255: 6; CHECK: # %bb.0: 7; CHECK-NEXT: bstrpick.w $a0, $a0, 17, 10 8; CHECK-NEXT: ret 9 %shr = lshr i32 %a, 10 10 %and = and i32 %shr, 255 11 ret i32 %and 12} 13 14define i32 @ashr20_and511(i32 %a) { 15; CHECK-LABEL: ashr20_and511: 16; CHECK: # %bb.0: 17; CHECK-NEXT: bstrpick.w $a0, $a0, 28, 20 18; CHECK-NEXT: ret 19 %shr = ashr i32 %a, 20 20 %and = and i32 %shr, 511 21 ret i32 %and 22} 23 24define i32 @zext_i16_to_i32(i16 %a) { 25; CHECK-LABEL: zext_i16_to_i32: 26; CHECK: # %bb.0: 27; CHECK-NEXT: bstrpick.w $a0, $a0, 15, 0 28; CHECK-NEXT: ret 29 %res = zext i16 %a to i32 30 ret i32 %res 31} 32 33define i32 @and8191(i32 %a) { 34; CHECK-LABEL: and8191: 35; CHECK: # %bb.0: 36; CHECK-NEXT: bstrpick.w $a0, $a0, 12, 0 37; CHECK-NEXT: ret 38 %and = and i32 %a, 8191 39 ret i32 %and 40} 41 42;; Check that andi but not bstrpick.d is generated. 43define i32 @and4095(i32 %a) { 44; CHECK-LABEL: and4095: 45; CHECK: # %bb.0: 46; CHECK-NEXT: andi $a0, $a0, 4095 47; CHECK-NEXT: ret 48 %and = and i32 %a, 4095 49 ret i32 %and 50} 51 52;; (srl (and a, 0xff0), 4) => (BSTRPICK a, 11, 4) 53define i32 @and0xff0_lshr4(i32 %a) { 54; CHECK-LABEL: and0xff0_lshr4: 55; CHECK: # %bb.0: 56; CHECK-NEXT: bstrpick.w $a0, $a0, 11, 4 57; CHECK-NEXT: ret 58 %and = and i32 %a, 4080 59 %shr = lshr i32 %and, 4 60 ret i32 %shr 61} 62 63;; (sra (and a, 0xff0), 5) can also be combined to (BSTRPICK a, 11, 5). 64;; This is because (sra (and a, 0xff0)) would be combined to (srl (and a, 0xff0), 5) 65;; firstly by DAGCombiner::SimplifyDemandedBits. 66define i32 @and4080_ashr5(i32 %a) { 67; CHECK-LABEL: and4080_ashr5: 68; CHECK: # %bb.0: 69; CHECK-NEXT: bstrpick.w $a0, $a0, 11, 5 70; CHECK-NEXT: ret 71 %and = and i32 %a, 4080 72 %shr = ashr i32 %and, 5 73 ret i32 %shr 74} 75 76;; Negative test: the second operand of AND is not a shifted mask 77define i32 @and0xf30_lshr4(i32 %a) { 78; CHECK-LABEL: and0xf30_lshr4: 79; CHECK: # %bb.0: 80; CHECK-NEXT: andi $a0, $a0, 3888 81; CHECK-NEXT: srli.w $a0, $a0, 4 82; CHECK-NEXT: ret 83 %and = and i32 %a, 3888 84 %shr = lshr i32 %and, 4 85 ret i32 %shr 86} 87 88;; Negative test: Shamt < MaskIdx 89define i32 @and0xff0_lshr3(i32 %a) { 90; CHECK-LABEL: and0xff0_lshr3: 91; CHECK: # %bb.0: 92; CHECK-NEXT: andi $a0, $a0, 4080 93; CHECK-NEXT: srli.w $a0, $a0, 3 94; CHECK-NEXT: ret 95 %and = and i32 %a, 4080 96 %shr = lshr i32 %and, 3 97 ret i32 %shr 98} 99