1; RUN: llc -mtriple=arm-eabi -mattr=+v6 %s -o - | FileCheck %s 2 3; CHECK: test1 4; CHECK: pkhbt r0, r0, r1, lsl #16 5define 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 14define 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 24define 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 33define 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 42define 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 52define 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 62define 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 73define 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 86define 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 95define i32 @test9(i32 %src1, i32 %src2) { 96entry: 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 105define i32 @test10(i32 %src1, i32 %src2) { 106entry: 107 %tmp = and i32 %src1, -65536 108 %tmp2 = ashr i32 %src2, 17 109 %tmp3 = or i32 %tmp, %tmp2 110 ret i32 %tmp3 111} 112