summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/Thumb2/thumb2-pack.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/Thumb2/thumb2-pack.ll')
-rw-r--r--llvm/test/CodeGen/Thumb2/thumb2-pack.ll25
1 files changed, 24 insertions, 1 deletions
diff --git a/llvm/test/CodeGen/Thumb2/thumb2-pack.ll b/llvm/test/CodeGen/Thumb2/thumb2-pack.ll
index 2e8bb1d6093..5deae1bf8f2 100644
--- a/llvm/test/CodeGen/Thumb2/thumb2-pack.ll
+++ b/llvm/test/CodeGen/Thumb2/thumb2-pack.ll
@@ -88,10 +88,33 @@ define i32 @test7(i32 %X, i32 %Y) {
}
; CHECK: test8
-; CHECK: pkhtb r0, r0, r1, asr #22
+; CHECK-NOT: pkhtb r0, r0, r1, asr #22
+; pkhtb does an arithmetic shift, not a logical shift. Make sure we don't
+; use it for problematic cases when whether sign bits would be shifted in
+; would matter.
define i32 @test8(i32 %X, i32 %Y) {
%tmp1 = and i32 %X, -65536
%tmp3 = lshr i32 %Y, 22
%tmp57 = or i32 %tmp3, %tmp1
ret i32 %tmp57
}
+
+; CHECK: test9:
+; CHECK: pkhtb r0, r0, r1, asr #16
+define i32 @test9(i32 %src1, i32 %src2) {
+entry:
+ %tmp = and i32 %src1, -65536
+ %tmp2 = lshr i32 %src2, 16
+ %tmp3 = or i32 %tmp, %tmp2
+ ret i32 %tmp3
+}
+
+; CHECK: test10
+; CHECK: pkhtb r0, r0, r1, asr #22
+define i32 @test10(i32 %X, i32 %Y) {
+ %tmp1 = and i32 %X, -65536
+ %tmp3 = ashr i32 %Y, 22
+ %tmp57 = or i32 %tmp3, %tmp1
+ ret i32 %tmp57
+}
+
OpenPOWER on IntegriCloud