1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm -mattr=+v6t2 %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker%struct.F = type { [3 x i8], i8 } 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker@X = common global %struct.F zeroinitializer, align 4 ; <%struct.F*> [#uses=1] 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine void @f1([1 x i32] %f.coerce0) nounwind { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker; CHECK: f1 10*9880d681SAndroid Build Coastguard Worker; CHECK: mov r2, #10 11*9880d681SAndroid Build Coastguard Worker; CHECK: bfi r1, r2, #22, #4 12*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* bitcast (%struct.F* @X to i32*), align 4 ; <i32> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker %1 = and i32 %0, -62914561 ; <i32> [#uses=1] 14*9880d681SAndroid Build Coastguard Worker %2 = or i32 %1, 41943040 ; <i32> [#uses=1] 15*9880d681SAndroid Build Coastguard Worker store i32 %2, i32* bitcast (%struct.F* @X to i32*), align 4 16*9880d681SAndroid Build Coastguard Worker ret void 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %A, i32 %B) nounwind { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker; CHECK: f2 22*9880d681SAndroid Build Coastguard Worker; CHECK: lsr{{.*}}#7 23*9880d681SAndroid Build Coastguard Worker; CHECK: bfi r0, r1, #7, #16 24*9880d681SAndroid Build Coastguard Worker %and = and i32 %A, -8388481 ; <i32> [#uses=1] 25*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %B, 8388480 ; <i32> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker %or = or i32 %and2, %and ; <i32> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker ret i32 %or 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %A, i32 %B) nounwind { 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker; CHECK: f3 33*9880d681SAndroid Build Coastguard Worker; CHECK: lsr{{.*}} #7 34*9880d681SAndroid Build Coastguard Worker; CHECK: bfi {{.*}}, #7, #16 35*9880d681SAndroid Build Coastguard Worker %and = and i32 %A, 8388480 ; <i32> [#uses=1] 36*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %B, -8388481 ; <i32> [#uses=1] 37*9880d681SAndroid Build Coastguard Worker %or = or i32 %and2, %and ; <i32> [#uses=1] 38*9880d681SAndroid Build Coastguard Worker ret i32 %or 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; rdar://8752056 42*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %a) nounwind { 43*9880d681SAndroid Build Coastguard Worker; CHECK: f4 44*9880d681SAndroid Build Coastguard Worker; CHECK: movw [[R1:r[0-9]+]], #3137 45*9880d681SAndroid Build Coastguard Worker; CHECK: bfi [[R1]], {{r[0-9]+}}, #15, #5 46*9880d681SAndroid Build Coastguard Worker %1 = shl i32 %a, 15 47*9880d681SAndroid Build Coastguard Worker %ins7 = and i32 %1, 1015808 48*9880d681SAndroid Build Coastguard Worker %ins12 = or i32 %ins7, 3137 49*9880d681SAndroid Build Coastguard Worker ret i32 %ins12 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; rdar://8458663 53*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i32 %a, i32 %b) nounwind { 54*9880d681SAndroid Build Coastguard Workerentry: 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 56*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bfc 57*9880d681SAndroid Build Coastguard Worker; CHECK: bfi r0, r1, #20, #4 58*9880d681SAndroid Build Coastguard Worker %0 = and i32 %a, -15728641 59*9880d681SAndroid Build Coastguard Worker %1 = shl i32 %b, 20 60*9880d681SAndroid Build Coastguard Worker %2 = and i32 %1, 15728640 61*9880d681SAndroid Build Coastguard Worker %3 = or i32 %2, %0 62*9880d681SAndroid Build Coastguard Worker ret i32 %3 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; rdar://9609030 66*9880d681SAndroid Build Coastguard Workerdefine i32 @f6(i32 %a, i32 %b) nounwind readnone { 67*9880d681SAndroid Build Coastguard Workerentry: 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bic 70*9880d681SAndroid Build Coastguard Worker; CHECK: bfi r0, r1, #8, #9 71*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, -130817 72*9880d681SAndroid Build Coastguard Worker %and2 = shl i32 %b, 8 73*9880d681SAndroid Build Coastguard Worker %shl = and i32 %and2, 130816 74*9880d681SAndroid Build Coastguard Worker %or = or i32 %shl, %and 75*9880d681SAndroid Build Coastguard Worker ret i32 %or 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine i32 @f7(i32 %x, i32 %y) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 80*9880d681SAndroid Build Coastguard Worker; CHECK: bfi r1, r0, #4, #1 81*9880d681SAndroid Build Coastguard Worker %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00 82*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 4 83*9880d681SAndroid Build Coastguard Worker %or = or i32 %y2, 16 84*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %and, 0 85*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 %or, i32 %y2 86*9880d681SAndroid Build Coastguard Worker ret i32 %sel 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine i32 @f8(i32 %x, i32 %y) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 91*9880d681SAndroid Build Coastguard Worker; CHECK: bfi r1, r0, #4, #1 92*9880d681SAndroid Build Coastguard Worker; CHECK: bfi r1, r0, #5, #1 93*9880d681SAndroid Build Coastguard Worker %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00 94*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 4 95*9880d681SAndroid Build Coastguard Worker %or = or i32 %y2, 48 96*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %and, 0 97*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 %or, i32 %y2 98*9880d681SAndroid Build Coastguard Worker ret i32 %sel 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine i32 @f9(i32 %x, i32 %y) { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 103*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bfi 104*9880d681SAndroid Build Coastguard Worker %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00 105*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 4 106*9880d681SAndroid Build Coastguard Worker %or = or i32 %y2, 48 107*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %and, 0 108*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 %y2, i32 %or 109*9880d681SAndroid Build Coastguard Worker ret i32 %sel 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdefine i32 @f10(i32 %x, i32 %y) { 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 114*9880d681SAndroid Build Coastguard Worker; CHECK: bfi r1, r0, #4, #2 115*9880d681SAndroid Build Coastguard Worker %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00 116*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 4 117*9880d681SAndroid Build Coastguard Worker %or = or i32 %y2, 32 118*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %and, 0 119*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 %or, i32 %y2 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker %aand = and i32 %x, 2 122*9880d681SAndroid Build Coastguard Worker %aor = or i32 %sel, 16 123*9880d681SAndroid Build Coastguard Worker %acmp = icmp ne i32 %aand, 0 124*9880d681SAndroid Build Coastguard Worker %asel = select i1 %acmp, i32 %aor, i32 %sel 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker ret i32 %asel 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerdefine i32 @f11(i32 %x, i32 %y) { 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 131*9880d681SAndroid Build Coastguard Worker; CHECK: bfi r1, r0, #4, #3 132*9880d681SAndroid Build Coastguard Worker %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00 133*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 4 134*9880d681SAndroid Build Coastguard Worker %or = or i32 %y2, 32 135*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %and, 0 136*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 %or, i32 %y2 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker %aand = and i32 %x, 2 139*9880d681SAndroid Build Coastguard Worker %aor = or i32 %sel, 16 140*9880d681SAndroid Build Coastguard Worker %acmp = icmp ne i32 %aand, 0 141*9880d681SAndroid Build Coastguard Worker %asel = select i1 %acmp, i32 %aor, i32 %sel 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker %band = and i32 %x, 8 144*9880d681SAndroid Build Coastguard Worker %bor = or i32 %asel, 64 145*9880d681SAndroid Build Coastguard Worker %bcmp = icmp ne i32 %band, 0 146*9880d681SAndroid Build Coastguard Worker %bsel = select i1 %bcmp, i32 %bor, i32 %asel 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker ret i32 %bsel 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine i32 @f12(i32 %x, i32 %y) { 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 153*9880d681SAndroid Build Coastguard Worker; CHECK: bfi r1, r0, #4, #1 154*9880d681SAndroid Build Coastguard Worker %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00 155*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 4 156*9880d681SAndroid Build Coastguard Worker %or = or i32 %y2, 16 157*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 158*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 %y2, i32 %or 159*9880d681SAndroid Build Coastguard Worker ret i32 %sel 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerdefine i32 @f13(i32 %x, i32 %y) { 163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 164*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bfi 165*9880d681SAndroid Build Coastguard Worker %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00 166*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 4 167*9880d681SAndroid Build Coastguard Worker %or = or i32 %y2, 16 168*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 42 ; Not comparing against zero! 169*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 %y2, i32 %or 170*9880d681SAndroid Build Coastguard Worker ret i32 %sel 171*9880d681SAndroid Build Coastguard Worker} 172