[ARM] Enable shrink-wrapping by default.
[oota-llvm.git] / test / CodeGen / ARM / pack.ll
index 8cd392bcb8293107bad02458ce9a499462b6d18e..89abe28b0f5490312208e3d27265623fdc4abfb7 100644 (file)
-; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm -mattr=+v6 | \
-; RUN:   grep pkhbt | wc -l | grep 5
-; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm -mattr=+v6 | \
-; RUN:   grep pkhtb | wc -l | grep 4
-; END.
+; RUN: llc -mtriple=arm-eabi -mattr=+v6 %s -o - | FileCheck %s
 
-implementation   ; Functions:
+; CHECK: test1
+; CHECK: pkhbt   r0, r0, r1, lsl #16
+define i32 @test1(i32 %X, i32 %Y) {
+       %tmp1 = and i32 %X, 65535
+       %tmp4 = shl i32 %Y, 16
+       %tmp5 = or i32 %tmp4, %tmp1
+       ret i32 %tmp5
+}
 
-int %test1(int %X, int %Y) {
-       %tmp1 = and int %X, 65535               ; <int> [#uses=1]
-       %tmp4 = shl int %Y, ubyte 16            ; <int> [#uses=1]
-       %tmp5 = or int %tmp4, %tmp1             ; <int> [#uses=1]
-       ret int %tmp5
+; CHECK: test2
+; CHECK: pkhbt   r0, r0, r1, lsl #12
+define i32 @test2(i32 %X, i32 %Y) {
+       %tmp1 = and i32 %X, 65535
+       %tmp3 = shl i32 %Y, 12
+       %tmp4 = and i32 %tmp3, -65536
+       %tmp57 = or i32 %tmp4, %tmp1
+       ret i32 %tmp57
 }
 
-int %test1a(int %X, int %Y) {
-       %tmp19 = and int %X, 65535              ; <int> [#uses=1]
-       %tmp37 = shl int %Y, ubyte 16           ; <int> [#uses=1]
-       %tmp5 = or int %tmp37, %tmp19           ; <int> [#uses=1]
-       ret int %tmp5
+; CHECK: test3
+; CHECK: pkhbt   r0, r0, r1, lsl #18
+define i32 @test3(i32 %X, i32 %Y) {
+       %tmp19 = and i32 %X, 65535
+       %tmp37 = shl i32 %Y, 18
+       %tmp5 = or i32 %tmp37, %tmp19
+       ret i32 %tmp5
 }
 
-int %test2(int %X, int %Y) {
-       %tmp1 = and int %X, 65535               ; <int> [#uses=1]
-       %tmp3 = shl int %Y, ubyte 12            ; <int> [#uses=1]
-       %tmp4 = and int %tmp3, -65536           ; <int> [#uses=1]
-       %tmp57 = or int %tmp4, %tmp1            ; <int> [#uses=1]
-       ret int %tmp57
+; CHECK: test4
+; CHECK: pkhbt   r0, r0, r1
+define i32 @test4(i32 %X, i32 %Y) {
+       %tmp1 = and i32 %X, 65535
+       %tmp3 = and i32 %Y, -65536
+       %tmp46 = or i32 %tmp3, %tmp1
+       ret i32 %tmp46
 }
 
-int %test3(int %X, int %Y) {
-       %tmp19 = and int %X, 65535              ; <int> [#uses=1]
-       %tmp37 = shl int %Y, ubyte 18           ; <int> [#uses=1]
-       %tmp5 = or int %tmp37, %tmp19           ; <int> [#uses=1]
-       ret int %tmp5
+; CHECK: test5
+; CHECK: pkhtb   r0, r0, r1, asr #16
+define i32 @test5(i32 %X, i32 %Y) {
+       %tmp17 = and i32 %X, -65536
+       %tmp2 = bitcast i32 %Y to i32
+       %tmp4 = lshr i32 %tmp2, 16
+       %tmp5 = or i32 %tmp4, %tmp17
+       ret i32 %tmp5
 }
 
-int %test4(int %X, int %Y) {
-       %tmp1 = and int %X, 65535               ; <int> [#uses=1]
-       %tmp3 = and int %Y, -65536              ; <int> [#uses=1]
-       %tmp46 = or int %tmp3, %tmp1            ; <int> [#uses=1]
-       ret int %tmp46
+; CHECK: test5a
+; CHECK: pkhtb   r0, r0, r1, asr #16
+define i32 @test5a(i32 %X, i32 %Y) {
+       %tmp110 = and i32 %X, -65536
+       %tmp37 = lshr i32 %Y, 16
+       %tmp39 = bitcast i32 %tmp37 to i32
+       %tmp5 = or i32 %tmp39, %tmp110
+       ret i32 %tmp5
 }
 
-int %test5(int %X, int %Y) {
-       %tmp17 = and int %X, -65536             ; <int> [#uses=1]
-       %tmp2 = cast int %Y to uint             ; <uint> [#uses=1]
-       %tmp4 = shr uint %tmp2, ubyte 16                ; <uint> [#uses=1]
-       %tmp4 = cast uint %tmp4 to int          ; <int> [#uses=1]
-       %tmp5 = or int %tmp4, %tmp17            ; <int> [#uses=1]
-       ret int %tmp5
+; CHECK: test6
+; CHECK: pkhtb   r0, r0, r1, asr #12
+define i32 @test6(i32 %X, i32 %Y) {
+       %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
 }
 
-int %test5a(int %X, int %Y) {
-       %tmp110 = and int %X, -65536            ; <int> [#uses=1]
-       %Y = cast int %Y to uint                ; <uint> [#uses=1]
-       %tmp37 = shr uint %Y, ubyte 16          ; <uint> [#uses=1]
-       %tmp39 = cast uint %tmp37 to int                ; <int> [#uses=1]
-       %tmp5 = or int %tmp39, %tmp110          ; <int> [#uses=1]
-       ret int %tmp5
+; CHECK: test7
+; CHECK: pkhtb   r0, r0, r1, asr #18
+define i32 @test7(i32 %X, i32 %Y) {
+       %tmp1 = and i32 %X, -65536
+       %tmp3 = ashr i32 %Y, 18
+       %tmp4 = and i32 %tmp3, 65535
+       %tmp57 = or i32 %tmp4, %tmp1
+       ret i32 %tmp57
 }
 
-int %test6(int %X, int %Y) {
-       %tmp1 = and int %X, -65536              ; <int> [#uses=1]
-       %Y = cast int %Y to uint                ; <uint> [#uses=1]
-       %tmp37 = shr uint %Y, ubyte 12          ; <uint> [#uses=1]
-       %tmp38 = cast uint %tmp37 to int                ; <int> [#uses=1]
-       %tmp4 = and int %tmp38, 65535           ; <int> [#uses=1]
-       %tmp59 = or int %tmp4, %tmp1            ; <int> [#uses=1]
-       ret int %tmp59
+; 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
 }
 
-int %test7(int %X, int %Y) {
-       %tmp1 = and int %X, -65536              ; <int> [#uses=1]
-       %tmp3 = shr int %Y, ubyte 18            ; <int> [#uses=1]
-       %tmp4 = and int %tmp3, 65535            ; <int> [#uses=1]
-       %tmp57 = or int %tmp4, %tmp1            ; <int> [#uses=1]
-       ret int %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
+}