1; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32 2; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64 3 4;; Exercise the 'lshr' LLVM IR: https://llvm.org/docs/LangRef.html#lshr-instruction 5 6define i1 @lshr_i1(i1 %x, i1 %y) { 7; LA32-LABEL: lshr_i1: 8; LA32: # %bb.0: 9; LA32-NEXT: jirl $zero, $ra, 0 10; 11; LA64-LABEL: lshr_i1: 12; LA64: # %bb.0: 13; LA64-NEXT: jirl $zero, $ra, 0 14 %lshr = lshr i1 %x, %y 15 ret i1 %lshr 16} 17 18define i8 @lshr_i8(i8 %x, i8 %y) { 19; LA32-LABEL: lshr_i8: 20; LA32: # %bb.0: 21; LA32-NEXT: andi $a0, $a0, 255 22; LA32-NEXT: srl.w $a0, $a0, $a1 23; LA32-NEXT: jirl $zero, $ra, 0 24; 25; LA64-LABEL: lshr_i8: 26; LA64: # %bb.0: 27; LA64-NEXT: andi $a0, $a0, 255 28; LA64-NEXT: srl.d $a0, $a0, $a1 29; LA64-NEXT: jirl $zero, $ra, 0 30 %lshr = lshr i8 %x, %y 31 ret i8 %lshr 32} 33 34define i16 @lshr_i16(i16 %x, i16 %y) { 35; LA32-LABEL: lshr_i16: 36; LA32: # %bb.0: 37; LA32-NEXT: bstrpick.w $a0, $a0, 15, 0 38; LA32-NEXT: srl.w $a0, $a0, $a1 39; LA32-NEXT: jirl $zero, $ra, 0 40; 41; LA64-LABEL: lshr_i16: 42; LA64: # %bb.0: 43; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0 44; LA64-NEXT: srl.d $a0, $a0, $a1 45; LA64-NEXT: jirl $zero, $ra, 0 46 %lshr = lshr i16 %x, %y 47 ret i16 %lshr 48} 49 50define i32 @lshr_i32(i32 %x, i32 %y) { 51; LA32-LABEL: lshr_i32: 52; LA32: # %bb.0: 53; LA32-NEXT: srl.w $a0, $a0, $a1 54; LA32-NEXT: jirl $zero, $ra, 0 55; 56; LA64-LABEL: lshr_i32: 57; LA64: # %bb.0: 58; LA64-NEXT: srl.w $a0, $a0, $a1 59; LA64-NEXT: jirl $zero, $ra, 0 60 %lshr = lshr i32 %x, %y 61 ret i32 %lshr 62} 63 64define i64 @lshr_i64(i64 %x, i64 %y) { 65; LA32-LABEL: lshr_i64: 66; LA32: # %bb.0: 67; LA32-NEXT: xori $a3, $a2, 31 68; LA32-NEXT: slli.w $a4, $a1, 1 69; LA32-NEXT: sll.w $a3, $a4, $a3 70; LA32-NEXT: srl.w $a0, $a0, $a2 71; LA32-NEXT: or $a0, $a0, $a3 72; LA32-NEXT: addi.w $a3, $a2, -32 73; LA32-NEXT: slti $a4, $a3, 0 74; LA32-NEXT: maskeqz $a0, $a0, $a4 75; LA32-NEXT: srl.w $a5, $a1, $a3 76; LA32-NEXT: masknez $a4, $a5, $a4 77; LA32-NEXT: or $a0, $a0, $a4 78; LA32-NEXT: srl.w $a1, $a1, $a2 79; LA32-NEXT: srai.w $a2, $a3, 31 80; LA32-NEXT: and $a1, $a2, $a1 81; LA32-NEXT: jirl $zero, $ra, 0 82; 83; LA64-LABEL: lshr_i64: 84; LA64: # %bb.0: 85; LA64-NEXT: srl.d $a0, $a0, $a1 86; LA64-NEXT: jirl $zero, $ra, 0 87 %lshr = lshr i64 %x, %y 88 ret i64 %lshr 89} 90 91define i1 @lshr_i1_3(i1 %x) { 92; LA32-LABEL: lshr_i1_3: 93; LA32: # %bb.0: 94; LA32-NEXT: jirl $zero, $ra, 0 95; 96; LA64-LABEL: lshr_i1_3: 97; LA64: # %bb.0: 98; LA64-NEXT: jirl $zero, $ra, 0 99 %lshr = lshr i1 %x, 3 100 ret i1 %lshr 101} 102 103define i8 @lshr_i8_3(i8 %x) { 104; LA32-LABEL: lshr_i8_3: 105; LA32: # %bb.0: 106; LA32-NEXT: bstrpick.w $a0, $a0, 7, 3 107; LA32-NEXT: jirl $zero, $ra, 0 108; 109; LA64-LABEL: lshr_i8_3: 110; LA64: # %bb.0: 111; LA64-NEXT: bstrpick.d $a0, $a0, 7, 3 112; LA64-NEXT: jirl $zero, $ra, 0 113 %lshr = lshr i8 %x, 3 114 ret i8 %lshr 115} 116 117define i16 @lshr_i16_3(i16 %x) { 118; LA32-LABEL: lshr_i16_3: 119; LA32: # %bb.0: 120; LA32-NEXT: bstrpick.w $a0, $a0, 15, 3 121; LA32-NEXT: jirl $zero, $ra, 0 122; 123; LA64-LABEL: lshr_i16_3: 124; LA64: # %bb.0: 125; LA64-NEXT: bstrpick.d $a0, $a0, 15, 3 126; LA64-NEXT: jirl $zero, $ra, 0 127 %lshr = lshr i16 %x, 3 128 ret i16 %lshr 129} 130 131define i32 @lshr_i32_3(i32 %x) { 132; LA32-LABEL: lshr_i32_3: 133; LA32: # %bb.0: 134; LA32-NEXT: srli.w $a0, $a0, 3 135; LA32-NEXT: jirl $zero, $ra, 0 136; 137; LA64-LABEL: lshr_i32_3: 138; LA64: # %bb.0: 139; LA64-NEXT: bstrpick.d $a0, $a0, 31, 3 140; LA64-NEXT: jirl $zero, $ra, 0 141 %lshr = lshr i32 %x, 3 142 ret i32 %lshr 143} 144 145define i64 @lshr_i64_3(i64 %x) { 146; LA32-LABEL: lshr_i64_3: 147; LA32: # %bb.0: 148; LA32-NEXT: srli.w $a0, $a0, 3 149; LA32-NEXT: slli.w $a2, $a1, 29 150; LA32-NEXT: or $a0, $a0, $a2 151; LA32-NEXT: srli.w $a1, $a1, 3 152; LA32-NEXT: jirl $zero, $ra, 0 153; 154; LA64-LABEL: lshr_i64_3: 155; LA64: # %bb.0: 156; LA64-NEXT: srli.d $a0, $a0, 3 157; LA64-NEXT: jirl $zero, $ra, 0 158 %lshr = lshr i64 %x, 3 159 ret i64 %lshr 160} 161