[ARM] Enable shrink-wrapping by default.
[oota-llvm.git] / test / CodeGen / ARM / pack.ll
index 151beac3efce04e5539ebd24482435a47897fc85..89abe28b0f5490312208e3d27265623fdc4abfb7 100644 (file)
-; RUN: llvm-as < %s | llc -march=arm -mattr=+v6 | \
-; RUN:   grep pkhbt | count 5
-; RUN: llvm-as < %s | llc -march=arm -mattr=+v6 | \
-; RUN:   grep pkhtb | count 4
+; RUN: llc -mtriple=arm-eabi -mattr=+v6 %s -o - | FileCheck %s
 
+; CHECK: test1
+; CHECK: pkhbt   r0, r0, r1, lsl #16
 define i32 @test1(i32 %X, i32 %Y) {
-       %tmp1 = and i32 %X, 65535               ; <i32> [#uses=1]
-       %tmp4 = shl i32 %Y, 16          ; <i32> [#uses=1]
-       %tmp5 = or i32 %tmp4, %tmp1             ; <i32> [#uses=1]
-       ret i32 %tmp5
-}
-
-define i32 @test1a(i32 %X, i32 %Y) {
-       %tmp19 = and i32 %X, 65535              ; <i32> [#uses=1]
-       %tmp37 = shl i32 %Y, 16         ; <i32> [#uses=1]
-       %tmp5 = or i32 %tmp37, %tmp19           ; <i32> [#uses=1]
+       %tmp1 = and i32 %X, 65535
+       %tmp4 = shl i32 %Y, 16
+       %tmp5 = or i32 %tmp4, %tmp1
        ret i32 %tmp5
 }
 
+; CHECK: test2
+; CHECK: pkhbt   r0, r0, r1, lsl #12
 define i32 @test2(i32 %X, i32 %Y) {
-       %tmp1 = and i32 %X, 65535               ; <i32> [#uses=1]
-       %tmp3 = shl i32 %Y, 12          ; <i32> [#uses=1]
-       %tmp4 = and i32 %tmp3, -65536           ; <i32> [#uses=1]
-       %tmp57 = or i32 %tmp4, %tmp1            ; <i32> [#uses=1]
+       %tmp1 = and i32 %X, 65535
+       %tmp3 = shl i32 %Y, 12
+       %tmp4 = and i32 %tmp3, -65536
+       %tmp57 = or i32 %tmp4, %tmp1
        ret i32 %tmp57
 }
 
+; CHECK: test3
+; CHECK: pkhbt   r0, r0, r1, lsl #18
 define i32 @test3(i32 %X, i32 %Y) {
-       %tmp19 = and i32 %X, 65535              ; <i32> [#uses=1]
-       %tmp37 = shl i32 %Y, 18         ; <i32> [#uses=1]
-       %tmp5 = or i32 %tmp37, %tmp19           ; <i32> [#uses=1]
+       %tmp19 = and i32 %X, 65535
+       %tmp37 = shl i32 %Y, 18
+       %tmp5 = or i32 %tmp37, %tmp19
        ret i32 %tmp5
 }
 
+; CHECK: test4
+; CHECK: pkhbt   r0, r0, r1
 define i32 @test4(i32 %X, i32 %Y) {
-       %tmp1 = and i32 %X, 65535               ; <i32> [#uses=1]
-       %tmp3 = and i32 %Y, -65536              ; <i32> [#uses=1]
-       %tmp46 = or i32 %tmp3, %tmp1            ; <i32> [#uses=1]
+       %tmp1 = and i32 %X, 65535
+       %tmp3 = and i32 %Y, -65536
+       %tmp46 = or i32 %tmp3, %tmp1
        ret i32 %tmp46
 }
 
+; CHECK: test5
+; CHECK: pkhtb   r0, r0, r1, asr #16
 define i32 @test5(i32 %X, i32 %Y) {
-       %tmp17 = and i32 %X, -65536             ; <i32> [#uses=1]
-       %tmp2 = bitcast i32 %Y to i32           ; <i32> [#uses=1]
-       %tmp4 = lshr i32 %tmp2, 16              ; <i32> [#uses=2]
-       %tmp5 = or i32 %tmp4, %tmp17            ; <i32> [#uses=1]
+       %tmp17 = and i32 %X, -65536
+       %tmp2 = bitcast i32 %Y to i32
+       %tmp4 = lshr i32 %tmp2, 16
+       %tmp5 = or i32 %tmp4, %tmp17
        ret i32 %tmp5
 }
 
+; CHECK: test5a
+; CHECK: pkhtb   r0, r0, r1, asr #16
 define i32 @test5a(i32 %X, i32 %Y) {
-       %tmp110 = and i32 %X, -65536            ; <i32> [#uses=1]
-       %tmp37 = lshr i32 %Y, 16                ; <i32> [#uses=1]
-       %tmp39 = bitcast i32 %tmp37 to i32              ; <i32> [#uses=1]
-       %tmp5 = or i32 %tmp39, %tmp110          ; <i32> [#uses=1]
+       %tmp110 = and i32 %X, -65536
+       %tmp37 = lshr i32 %Y, 16
+       %tmp39 = bitcast i32 %tmp37 to i32
+       %tmp5 = or i32 %tmp39, %tmp110
        ret i32 %tmp5
 }
 
+; CHECK: test6
+; CHECK: pkhtb   r0, r0, r1, asr #12
 define i32 @test6(i32 %X, i32 %Y) {
-       %tmp1 = and i32 %X, -65536              ; <i32> [#uses=1]
-       %tmp37 = lshr i32 %Y, 12                ; <i32> [#uses=1]
-       %tmp38 = bitcast i32 %tmp37 to i32              ; <i32> [#uses=1]
-       %tmp4 = and i32 %tmp38, 65535           ; <i32> [#uses=1]
-       %tmp59 = or i32 %tmp4, %tmp1            ; <i32> [#uses=1]
+       %tmp1 = and i32 %X, -65536
+       %tmp37 = lshr i32 %Y, 12
+       %tmp38 = bitcast i32 %tmp37 to i32
+       %tmp4 = and i32 %tmp38, 65535
+       %tmp59 = or i32 %tmp4, %tmp1
        ret i32 %tmp59
 }
 
+; CHECK: test7
+; CHECK: pkhtb   r0, r0, r1, asr #18
 define i32 @test7(i32 %X, i32 %Y) {
-       %tmp1 = and i32 %X, -65536              ; <i32> [#uses=1]
-       %tmp3 = ashr i32 %Y, 18         ; <i32> [#uses=1]
-       %tmp4 = and i32 %tmp3, 65535            ; <i32> [#uses=1]
-       %tmp57 = or i32 %tmp4, %tmp1            ; <i32> [#uses=1]
+       %tmp1 = and i32 %X, -65536
+       %tmp3 = ashr i32 %Y, 18
+       %tmp4 = and i32 %tmp3, 65535
+       %tmp57 = or i32 %tmp4, %tmp1
        ret i32 %tmp57
 }
+
+; Arithmetic and logic right shift does not have the same semantics if shifting
+; by more than 16 in this context.
+
+; CHECK: test8
+; CHECK-NOT: pkhtb   r0, r0, r1, asr #22
+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-LABEL: 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-LABEL: test10:
+; CHECK: pkhtb r0, r0, r1, asr #17
+define i32 @test10(i32 %src1, i32 %src2) {
+entry:
+    %tmp = and i32 %src1, -65536
+    %tmp2 = ashr i32 %src2, 17
+    %tmp3 = or i32 %tmp, %tmp2
+    ret i32 %tmp3
+}