1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumb-eabi -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: movs 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 readnone optsize { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker; CHECK: f2 22*9880d681SAndroid Build Coastguard Worker; CHECK: lsrs r1, r1, #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 readnone optsize { 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker; CHECK: f3 33*9880d681SAndroid Build Coastguard Worker; CHECK: lsrs {{.*}}, #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]], {{.*}}, #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://9177502 53*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i32 %a, i32 %b) nounwind readnone { 54*9880d681SAndroid Build Coastguard Workerentry: 55*9880d681SAndroid Build Coastguard Worker; CHECK: f5 56*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bfi r0, r2, #0, #1 57*9880d681SAndroid Build Coastguard Worker%and = and i32 %a, 2 58*9880d681SAndroid Build Coastguard Worker%b.masked = and i32 %b, -2 59*9880d681SAndroid Build Coastguard Worker%and3 = or i32 %b.masked, %and 60*9880d681SAndroid Build Coastguard Workerret i32 %and3 61*9880d681SAndroid Build Coastguard Worker} 62