1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s \ 3; RUN: | FileCheck %s --check-prefix=LA32 4; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s \ 5; RUN: | FileCheck %s --check-prefix=LA64 6 7;; a=00112233 b=44556677 8;; expected 11223344 9define i32 @pick_i32_1(i32 %a, i32 %b) { 10; LA32-LABEL: pick_i32_1: 11; LA32: # %bb.0: 12; LA32-NEXT: bytepick.w $a0, $a1, $a0, 1 13; LA32-NEXT: ret 14; 15; LA64-LABEL: pick_i32_1: 16; LA64: # %bb.0: 17; LA64-NEXT: bstrpick.d $a1, $a1, 31, 24 18; LA64-NEXT: slli.d $a0, $a0, 8 19; LA64-NEXT: or $a0, $a1, $a0 20; LA64-NEXT: ret 21 %1 = lshr i32 %b, 24 22 %2 = shl i32 %a, 8 23 %3 = or i32 %1, %2 24 ret i32 %3 25} 26 27;; a=00112233 b=44556677 28;; expected 11223344 29define signext i32 @pick_i32_1_sext(i32 %a, i32 %b) { 30; LA32-LABEL: pick_i32_1_sext: 31; LA32: # %bb.0: 32; LA32-NEXT: bytepick.w $a0, $a1, $a0, 1 33; LA32-NEXT: ret 34; 35; LA64-LABEL: pick_i32_1_sext: 36; LA64: # %bb.0: 37; LA64-NEXT: bytepick.w $a0, $a1, $a0, 1 38; LA64-NEXT: ret 39 %1 = lshr i32 %b, 24 40 %2 = shl i32 %a, 8 41 %3 = or i32 %1, %2 42 ret i32 %3 43} 44 45;; a=00112233 b=44556677 46;; expected 22334455 47define i32 @pick_i32_2(i32 %a, i32 %b) { 48; LA32-LABEL: pick_i32_2: 49; LA32: # %bb.0: 50; LA32-NEXT: bytepick.w $a0, $a1, $a0, 2 51; LA32-NEXT: ret 52; 53; LA64-LABEL: pick_i32_2: 54; LA64: # %bb.0: 55; LA64-NEXT: bstrpick.d $a1, $a1, 31, 16 56; LA64-NEXT: slli.d $a0, $a0, 16 57; LA64-NEXT: or $a0, $a1, $a0 58; LA64-NEXT: ret 59 %1 = lshr i32 %b, 16 60 %2 = shl i32 %a, 16 61 %3 = or i32 %1, %2 62 ret i32 %3 63} 64 65;; a=00112233 b=44556677 66;; expected 22334455 67define signext i32 @pick_i32_2_sext(i32 %a, i32 %b) { 68; LA32-LABEL: pick_i32_2_sext: 69; LA32: # %bb.0: 70; LA32-NEXT: bytepick.w $a0, $a1, $a0, 2 71; LA32-NEXT: ret 72; 73; LA64-LABEL: pick_i32_2_sext: 74; LA64: # %bb.0: 75; LA64-NEXT: bytepick.w $a0, $a1, $a0, 2 76; LA64-NEXT: ret 77 %1 = lshr i32 %b, 16 78 %2 = shl i32 %a, 16 79 %3 = or i32 %1, %2 80 ret i32 %3 81} 82 83;; a=00112233 b=44556677 84;; expected 33445566 85define i32 @pick_i32_3(i32 %a, i32 %b) { 86; LA32-LABEL: pick_i32_3: 87; LA32: # %bb.0: 88; LA32-NEXT: bytepick.w $a0, $a1, $a0, 3 89; LA32-NEXT: ret 90; 91; LA64-LABEL: pick_i32_3: 92; LA64: # %bb.0: 93; LA64-NEXT: bstrpick.d $a1, $a1, 31, 8 94; LA64-NEXT: slli.d $a0, $a0, 24 95; LA64-NEXT: or $a0, $a1, $a0 96; LA64-NEXT: ret 97 %1 = lshr i32 %b, 8 98 %2 = shl i32 %a, 24 99 %3 = or i32 %1, %2 100 ret i32 %3 101} 102 103;; a=00112233 b=44556677 104;; expected 33445566 105define signext i32 @pick_i32_3_sext(i32 %a, i32 %b) { 106; LA32-LABEL: pick_i32_3_sext: 107; LA32: # %bb.0: 108; LA32-NEXT: bytepick.w $a0, $a1, $a0, 3 109; LA32-NEXT: ret 110; 111; LA64-LABEL: pick_i32_3_sext: 112; LA64: # %bb.0: 113; LA64-NEXT: bytepick.w $a0, $a1, $a0, 3 114; LA64-NEXT: ret 115 %1 = lshr i32 %b, 8 116 %2 = shl i32 %a, 24 117 %3 = or i32 %1, %2 118 ret i32 %3 119} 120 121;; a=0011223344556677 b=8899aabbccddeeff 122;; expected 1122334455667788 123define i64 @pick_i64_1(i64 %a, i64 %b) { 124; LA32-LABEL: pick_i64_1: 125; LA32: # %bb.0: 126; LA32-NEXT: bytepick.w $a1, $a0, $a1, 1 127; LA32-NEXT: bytepick.w $a0, $a3, $a0, 1 128; LA32-NEXT: ret 129; 130; LA64-LABEL: pick_i64_1: 131; LA64: # %bb.0: 132; LA64-NEXT: bytepick.d $a0, $a1, $a0, 1 133; LA64-NEXT: ret 134 %1 = lshr i64 %b, 56 135 %2 = shl i64 %a, 8 136 %3 = or i64 %1, %2 137 ret i64 %3 138} 139 140;; a=0011223344556677 b=8899aabbccddeeff 141;; expected 2233445566778899 142define i64 @pick_i64_2(i64 %a, i64 %b) { 143; LA32-LABEL: pick_i64_2: 144; LA32: # %bb.0: 145; LA32-NEXT: bytepick.w $a1, $a0, $a1, 2 146; LA32-NEXT: bytepick.w $a0, $a3, $a0, 2 147; LA32-NEXT: ret 148; 149; LA64-LABEL: pick_i64_2: 150; LA64: # %bb.0: 151; LA64-NEXT: bytepick.d $a0, $a1, $a0, 2 152; LA64-NEXT: ret 153 %1 = lshr i64 %b, 48 154 %2 = shl i64 %a, 16 155 %3 = or i64 %1, %2 156 ret i64 %3 157} 158 159;; a=0011223344556677 b=8899aabbccddeeff 160;; expected 33445566778899aa 161define i64 @pick_i64_3(i64 %a, i64 %b) { 162; LA32-LABEL: pick_i64_3: 163; LA32: # %bb.0: 164; LA32-NEXT: bytepick.w $a1, $a0, $a1, 3 165; LA32-NEXT: bytepick.w $a0, $a3, $a0, 3 166; LA32-NEXT: ret 167; 168; LA64-LABEL: pick_i64_3: 169; LA64: # %bb.0: 170; LA64-NEXT: bytepick.d $a0, $a1, $a0, 3 171; LA64-NEXT: ret 172 %1 = lshr i64 %b, 40 173 %2 = shl i64 %a, 24 174 %3 = or i64 %1, %2 175 ret i64 %3 176} 177 178;; a=0011223344556677 b=8899aabbccddeeff 179;; expected 445566778899aabb 180define i64 @pick_i64_4(i64 %a, i64 %b) { 181; LA32-LABEL: pick_i64_4: 182; LA32: # %bb.0: 183; LA32-NEXT: move $a1, $a0 184; LA32-NEXT: move $a0, $a3 185; LA32-NEXT: ret 186; 187; LA64-LABEL: pick_i64_4: 188; LA64: # %bb.0: 189; LA64-NEXT: bytepick.d $a0, $a1, $a0, 4 190; LA64-NEXT: ret 191 %1 = lshr i64 %b, 32 192 %2 = shl i64 %a, 32 193 %3 = or i64 %1, %2 194 ret i64 %3 195} 196 197;; a=0011223344556677 b=8899aabbccddeeff 198;; expected 5566778899aabbcc 199define i64 @pick_i64_5(i64 %a, i64 %b) { 200; LA32-LABEL: pick_i64_5: 201; LA32: # %bb.0: 202; LA32-NEXT: bytepick.w $a2, $a2, $a3, 1 203; LA32-NEXT: bytepick.w $a1, $a3, $a0, 1 204; LA32-NEXT: move $a0, $a2 205; LA32-NEXT: ret 206; 207; LA64-LABEL: pick_i64_5: 208; LA64: # %bb.0: 209; LA64-NEXT: bytepick.d $a0, $a1, $a0, 5 210; LA64-NEXT: ret 211 %1 = lshr i64 %b, 24 212 %2 = shl i64 %a,40 213 %3 = or i64 %1, %2 214 ret i64 %3 215} 216 217;; a=0011223344556677 b=8899aabbccddeeff 218;; expected 66778899aabbccdd 219define i64 @pick_i64_6(i64 %a, i64 %b) { 220; LA32-LABEL: pick_i64_6: 221; LA32: # %bb.0: 222; LA32-NEXT: bytepick.w $a2, $a2, $a3, 2 223; LA32-NEXT: bytepick.w $a1, $a3, $a0, 2 224; LA32-NEXT: move $a0, $a2 225; LA32-NEXT: ret 226; 227; LA64-LABEL: pick_i64_6: 228; LA64: # %bb.0: 229; LA64-NEXT: bytepick.d $a0, $a1, $a0, 6 230; LA64-NEXT: ret 231 %1 = lshr i64 %b, 16 232 %2 = shl i64 %a, 48 233 %3 = or i64 %1, %2 234 ret i64 %3 235} 236 237;; a=0011223344556677 b=8899aabbccddeeff 238;; expected 778899aabbccddee 239define i64 @pick_i64_7(i64 %a, i64 %b) { 240; LA32-LABEL: pick_i64_7: 241; LA32: # %bb.0: 242; LA32-NEXT: bytepick.w $a2, $a2, $a3, 3 243; LA32-NEXT: bytepick.w $a1, $a3, $a0, 3 244; LA32-NEXT: move $a0, $a2 245; LA32-NEXT: ret 246; 247; LA64-LABEL: pick_i64_7: 248; LA64: # %bb.0: 249; LA64-NEXT: bytepick.d $a0, $a1, $a0, 7 250; LA64-NEXT: ret 251 %1 = lshr i64 %b, 8 252 %2 = shl i64 %a, 56 253 %3 = or i64 %1, %2 254 ret i64 %3 255} 256