1 ; RUN: llc < %s -march=arm -mattr=+v6 | FileCheck %s 2 3 ; CHECK: test1 4 ; CHECK: pkhbt r0, r0, r1, lsl #16 5 define i32 @test1(i32 %X, i32 %Y) { 6 %tmp1 = and i32 %X, 65535 7 %tmp4 = shl i32 %Y, 16 8 %tmp5 = or i32 %tmp4, %tmp1 9 ret i32 %tmp5 10 } 11 12 ; CHECK: test2 13 ; CHECK: pkhbt r0, r0, r1, lsl #12 14 define i32 @test2(i32 %X, i32 %Y) { 15 %tmp1 = and i32 %X, 65535 16 %tmp3 = shl i32 %Y, 12 17 %tmp4 = and i32 %tmp3, -65536 18 %tmp57 = or i32 %tmp4, %tmp1 19 ret i32 %tmp57 20 } 21 22 ; CHECK: test3 23 ; CHECK: pkhbt r0, r0, r1, lsl #18 24 define i32 @test3(i32 %X, i32 %Y) { 25 %tmp19 = and i32 %X, 65535 26 %tmp37 = shl i32 %Y, 18 27 %tmp5 = or i32 %tmp37, %tmp19 28 ret i32 %tmp5 29 } 30 31 ; CHECK: test4 32 ; CHECK: pkhbt r0, r0, r1 33 define i32 @test4(i32 %X, i32 %Y) { 34 %tmp1 = and i32 %X, 65535 35 %tmp3 = and i32 %Y, -65536 36 %tmp46 = or i32 %tmp3, %tmp1 37 ret i32 %tmp46 38 } 39 40 ; CHECK: test5 41 ; CHECK: pkhtb r0, r0, r1, asr #16 42 define i32 @test5(i32 %X, i32 %Y) { 43 %tmp17 = and i32 %X, -65536 44 %tmp2 = bitcast i32 %Y to i32 45 %tmp4 = lshr i32 %tmp2, 16 46 %tmp5 = or i32 %tmp4, %tmp17 47 ret i32 %tmp5 48 } 49 50 ; CHECK: test5a 51 ; CHECK: pkhtb r0, r0, r1, asr #16 52 define i32 @test5a(i32 %X, i32 %Y) { 53 %tmp110 = and i32 %X, -65536 54 %tmp37 = lshr i32 %Y, 16 55 %tmp39 = bitcast i32 %tmp37 to i32 56 %tmp5 = or i32 %tmp39, %tmp110 57 ret i32 %tmp5 58 } 59 60 ; CHECK: test6 61 ; CHECK: pkhtb r0, r0, r1, asr #12 62 define i32 @test6(i32 %X, i32 %Y) { 63 %tmp1 = and i32 %X, -65536 64 %tmp37 = lshr i32 %Y, 12 65 %tmp38 = bitcast i32 %tmp37 to i32 66 %tmp4 = and i32 %tmp38, 65535 67 %tmp59 = or i32 %tmp4, %tmp1 68 ret i32 %tmp59 69 } 70 71 ; CHECK: test7 72 ; CHECK: pkhtb r0, r0, r1, asr #18 73 define i32 @test7(i32 %X, i32 %Y) { 74 %tmp1 = and i32 %X, -65536 75 %tmp3 = ashr i32 %Y, 18 76 %tmp4 = and i32 %tmp3, 65535 77 %tmp57 = or i32 %tmp4, %tmp1 78 ret i32 %tmp57 79 } 80 81 ; Arithmetic and logic right shift does not have the same semantics if shifting 82 ; by more than 16 in this context. 83 84 ; CHECK: test8 85 ; CHECK-NOT: pkhtb r0, r0, r1, asr #22 86 define i32 @test8(i32 %X, i32 %Y) { 87 %tmp1 = and i32 %X, -65536 88 %tmp3 = lshr i32 %Y, 22 89 %tmp57 = or i32 %tmp3, %tmp1 90 ret i32 %tmp57 91 } 92 93 ; CHECK-LABEL: test9: 94 ; CHECK: pkhtb r0, r0, r1, asr #16 95 define i32 @test9(i32 %src1, i32 %src2) { 96 entry: 97 %tmp = and i32 %src1, -65536 98 %tmp2 = lshr i32 %src2, 16 99 %tmp3 = or i32 %tmp, %tmp2 100 ret i32 %tmp3 101 } 102 103 ; CHECK-LABEL: test10: 104 ; CHECK: pkhtb r0, r0, r1, asr #17 105 define i32 @test10(i32 %src1, i32 %src2) { 106 entry: 107 %tmp = and i32 %src1, -65536 108 %tmp2 = ashr i32 %src2, 17 109 %tmp3 = or i32 %tmp, %tmp2 110 ret i32 %tmp3 111 } 112