diff --git a/llvm/test/CodeGen/LoongArch/bytepick.ll b/llvm/test/CodeGen/LoongArch/bytepick.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/bytepick.ll @@ -0,0 +1,317 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc --mtriple=loongarch32 --verify-machineinstrs < %s \ +; RUN: | FileCheck %s --check-prefix=LA32 +; RUN: llc --mtriple=loongarch64 --verify-machineinstrs < %s \ +; RUN: | FileCheck %s --check-prefix=LA64 + +;; a=00112233 b=44556677 +;; expected 11223344 +define i32 @pick_i32_1(i32 %a, i32 %b) { +; LA32-LABEL: pick_i32_1: +; LA32: # %bb.0: +; LA32-NEXT: slli.w $a0, $a0, 8 +; LA32-NEXT: srli.w $a1, $a1, 24 +; LA32-NEXT: or $a0, $a1, $a0 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i32_1: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 8 +; LA64-NEXT: bstrpick.d $a1, $a1, 31, 24 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: ret + %1 = lshr i32 %b, 24 + %2 = shl i32 %a, 8 + %3 = or i32 %1, %2 + ret i32 %3 +} + +;; a=00112233 b=44556677 +;; expected 11223344 +define signext i32 @pick_i32_1_sext(i32 %a, i32 %b) { +; LA32-LABEL: pick_i32_1_sext: +; LA32: # %bb.0: +; LA32-NEXT: slli.w $a0, $a0, 8 +; LA32-NEXT: srli.w $a1, $a1, 24 +; LA32-NEXT: or $a0, $a1, $a0 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i32_1_sext: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 8 +; LA64-NEXT: bstrpick.d $a1, $a1, 31, 24 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %1 = lshr i32 %b, 24 + %2 = shl i32 %a, 8 + %3 = or i32 %1, %2 + ret i32 %3 +} + +;; a=00112233 b=44556677 +;; expected 22334455 +define i32 @pick_i32_2(i32 %a, i32 %b) { +; LA32-LABEL: pick_i32_2: +; LA32: # %bb.0: +; LA32-NEXT: slli.w $a0, $a0, 16 +; LA32-NEXT: srli.w $a1, $a1, 16 +; LA32-NEXT: or $a0, $a1, $a0 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i32_2: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 16 +; LA64-NEXT: bstrpick.d $a1, $a1, 31, 16 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: ret + %1 = lshr i32 %b, 16 + %2 = shl i32 %a, 16 + %3 = or i32 %1, %2 + ret i32 %3 +} + +;; a=00112233 b=44556677 +;; expected 22334455 +define signext i32 @pick_i32_2_sext(i32 %a, i32 %b) { +; LA32-LABEL: pick_i32_2_sext: +; LA32: # %bb.0: +; LA32-NEXT: slli.w $a0, $a0, 16 +; LA32-NEXT: srli.w $a1, $a1, 16 +; LA32-NEXT: or $a0, $a1, $a0 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i32_2_sext: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 16 +; LA64-NEXT: bstrpick.d $a1, $a1, 31, 16 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %1 = lshr i32 %b, 16 + %2 = shl i32 %a, 16 + %3 = or i32 %1, %2 + ret i32 %3 +} + +;; a=00112233 b=44556677 +;; expected 33445566 +define i32 @pick_i32_3(i32 %a, i32 %b) { +; LA32-LABEL: pick_i32_3: +; LA32: # %bb.0: +; LA32-NEXT: slli.w $a0, $a0, 24 +; LA32-NEXT: srli.w $a1, $a1, 8 +; LA32-NEXT: or $a0, $a1, $a0 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i32_3: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 24 +; LA64-NEXT: bstrpick.d $a1, $a1, 31, 8 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: ret + %1 = lshr i32 %b, 8 + %2 = shl i32 %a, 24 + %3 = or i32 %1, %2 + ret i32 %3 +} + +;; a=00112233 b=44556677 +;; expected 33445566 +define signext i32 @pick_i32_3_sext(i32 %a, i32 %b) { +; LA32-LABEL: pick_i32_3_sext: +; LA32: # %bb.0: +; LA32-NEXT: slli.w $a0, $a0, 24 +; LA32-NEXT: srli.w $a1, $a1, 8 +; LA32-NEXT: or $a0, $a1, $a0 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i32_3_sext: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 24 +; LA64-NEXT: bstrpick.d $a1, $a1, 31, 8 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %1 = lshr i32 %b, 8 + %2 = shl i32 %a, 24 + %3 = or i32 %1, %2 + ret i32 %3 +} + +;; a=0011223344556677 b=8899aabbccddeeff +;; expected 1122334455667788 +define i64 @pick_i64_1(i64 %a, i64 %b) { +; LA32-LABEL: pick_i64_1: +; LA32: # %bb.0: +; LA32-NEXT: srli.w $a2, $a3, 24 +; LA32-NEXT: slli.w $a3, $a0, 8 +; LA32-NEXT: or $a2, $a2, $a3 +; LA32-NEXT: srli.w $a0, $a0, 24 +; LA32-NEXT: slli.w $a1, $a1, 8 +; LA32-NEXT: or $a1, $a1, $a0 +; LA32-NEXT: move $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i64_1: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 8 +; LA64-NEXT: srli.d $a1, $a1, 56 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: ret + %1 = lshr i64 %b, 56 + %2 = shl i64 %a, 8 + %3 = or i64 %1, %2 + ret i64 %3 +} + +;; a=0011223344556677 b=8899aabbccddeeff +;; expected 2233445566778899 +define i64 @pick_i64_2(i64 %a, i64 %b) { +; LA32-LABEL: pick_i64_2: +; LA32: # %bb.0: +; LA32-NEXT: srli.w $a2, $a3, 16 +; LA32-NEXT: slli.w $a3, $a0, 16 +; LA32-NEXT: or $a2, $a2, $a3 +; LA32-NEXT: srli.w $a0, $a0, 16 +; LA32-NEXT: slli.w $a1, $a1, 16 +; LA32-NEXT: or $a1, $a1, $a0 +; LA32-NEXT: move $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i64_2: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 16 +; LA64-NEXT: srli.d $a1, $a1, 48 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: ret + %1 = lshr i64 %b, 48 + %2 = shl i64 %a, 16 + %3 = or i64 %1, %2 + ret i64 %3 +} + +;; a=0011223344556677 b=8899aabbccddeeff +;; expected 33445566778899aa +define i64 @pick_i64_3(i64 %a, i64 %b) { +; LA32-LABEL: pick_i64_3: +; LA32: # %bb.0: +; LA32-NEXT: srli.w $a2, $a3, 8 +; LA32-NEXT: slli.w $a3, $a0, 24 +; LA32-NEXT: or $a2, $a2, $a3 +; LA32-NEXT: srli.w $a0, $a0, 8 +; LA32-NEXT: slli.w $a1, $a1, 24 +; LA32-NEXT: or $a1, $a1, $a0 +; LA32-NEXT: move $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i64_3: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 24 +; LA64-NEXT: srli.d $a1, $a1, 40 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: ret + %1 = lshr i64 %b, 40 + %2 = shl i64 %a, 24 + %3 = or i64 %1, %2 + ret i64 %3 +} + +;; a=0011223344556677 b=8899aabbccddeeff +;; expected 445566778899aabb +define i64 @pick_i64_4(i64 %a, i64 %b) { +; LA32-LABEL: pick_i64_4: +; LA32: # %bb.0: +; LA32-NEXT: move $a1, $a0 +; LA32-NEXT: move $a0, $a3 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i64_4: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 32 +; LA64-NEXT: srli.d $a1, $a1, 32 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: ret + %1 = lshr i64 %b, 32 + %2 = shl i64 %a, 32 + %3 = or i64 %1, %2 + ret i64 %3 +} + +;; a=0011223344556677 b=8899aabbccddeeff +;; expected 5566778899aabbcc +define i64 @pick_i64_5(i64 %a, i64 %b) { +; LA32-LABEL: pick_i64_5: +; LA32: # %bb.0: +; LA32-NEXT: srli.w $a1, $a2, 24 +; LA32-NEXT: slli.w $a2, $a3, 8 +; LA32-NEXT: or $a2, $a1, $a2 +; LA32-NEXT: slli.w $a0, $a0, 8 +; LA32-NEXT: srli.w $a1, $a3, 24 +; LA32-NEXT: or $a1, $a1, $a0 +; LA32-NEXT: move $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i64_5: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 40 +; LA64-NEXT: srli.d $a1, $a1, 24 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: ret + %1 = lshr i64 %b, 24 + %2 = shl i64 %a,40 + %3 = or i64 %1, %2 + ret i64 %3 +} + +;; a=0011223344556677 b=8899aabbccddeeff +;; expected 66778899aabbccdd +define i64 @pick_i64_6(i64 %a, i64 %b) { +; LA32-LABEL: pick_i64_6: +; LA32: # %bb.0: +; LA32-NEXT: srli.w $a1, $a2, 16 +; LA32-NEXT: slli.w $a2, $a3, 16 +; LA32-NEXT: or $a2, $a1, $a2 +; LA32-NEXT: slli.w $a0, $a0, 16 +; LA32-NEXT: srli.w $a1, $a3, 16 +; LA32-NEXT: or $a1, $a1, $a0 +; LA32-NEXT: move $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i64_6: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 48 +; LA64-NEXT: srli.d $a1, $a1, 16 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: ret + %1 = lshr i64 %b, 16 + %2 = shl i64 %a, 48 + %3 = or i64 %1, %2 + ret i64 %3 +} + +;; a=0011223344556677 b=8899aabbccddeeff +;; expected 778899aabbccddee +define i64 @pick_i64_7(i64 %a, i64 %b) { +; LA32-LABEL: pick_i64_7: +; LA32: # %bb.0: +; LA32-NEXT: srli.w $a1, $a2, 8 +; LA32-NEXT: slli.w $a2, $a3, 24 +; LA32-NEXT: or $a2, $a1, $a2 +; LA32-NEXT: slli.w $a0, $a0, 24 +; LA32-NEXT: srli.w $a1, $a3, 8 +; LA32-NEXT: or $a1, $a1, $a0 +; LA32-NEXT: move $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: pick_i64_7: +; LA64: # %bb.0: +; LA64-NEXT: slli.d $a0, $a0, 56 +; LA64-NEXT: srli.d $a1, $a1, 8 +; LA64-NEXT: or $a0, $a1, $a0 +; LA64-NEXT: ret + %1 = lshr i64 %b, 8 + %2 = shl i64 %a, 56 + %3 = or i64 %1, %2 + ret i64 %3 +}