1*ecc7dcb8SSjoerd Meijer; RUN: llc -mtriple=thumbv8 %s -o - | FileCheck %s --check-prefixes=CHECK,T2 2*ecc7dcb8SSjoerd Meijer; RUN: llc -mtriple=thumbv8m.main %s -o - | FileCheck %s --check-prefixes=CHECK,T2 3*ecc7dcb8SSjoerd Meijer; RUN: llc -mtriple=thumbv8m.base %s -o - | FileCheck %s --check-prefixes=CHECK,T1 4*ecc7dcb8SSjoerd Meijer; RUN: llc -mtriple=thumbv7em %s -o - | FileCheck %s --check-prefixes=CHECK,T2 5*ecc7dcb8SSjoerd Meijer; RUN: llc -mtriple=thumbv6m %s -o - | FileCheck %s --check-prefixes=V6M 6*ecc7dcb8SSjoerd Meijer 7*ecc7dcb8SSjoerd Meijer; Armv6m targets don't have a sdiv instruction, so sdiv should not appear at 8*ecc7dcb8SSjoerd Meijer; all in the output: 9*ecc7dcb8SSjoerd Meijer 10*ecc7dcb8SSjoerd Meijer; V6M: .file {{.*}} 11*ecc7dcb8SSjoerd Meijer; V6M-NOT: sdiv 12*ecc7dcb8SSjoerd Meijer; V6M-NOT: idiv 13*ecc7dcb8SSjoerd Meijer 14*ecc7dcb8SSjoerd Meijer; Test sdiv i16 15*ecc7dcb8SSjoerd Meijerdefine dso_local signext i16 @f0(i16 signext %F) local_unnamed_addr #0 { 16*ecc7dcb8SSjoerd Meijer; CHECK-LABEL: f0 17*ecc7dcb8SSjoerd Meijer; CHECK: movs r1, #2 18*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: sdiv r0, r0, r1 19*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: sxth r0, r0 20*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: bx lr 21*ecc7dcb8SSjoerd Meijer 22*ecc7dcb8SSjoerd Meijerentry: 23*ecc7dcb8SSjoerd Meijer %0 = sdiv i16 %F, 2 24*ecc7dcb8SSjoerd Meijer ret i16 %0 25*ecc7dcb8SSjoerd Meijer} 26*ecc7dcb8SSjoerd Meijer 27*ecc7dcb8SSjoerd Meijer; Same as above, but now with i32 28*ecc7dcb8SSjoerd Meijerdefine dso_local i32 @f1(i32 %F) local_unnamed_addr #0 { 29*ecc7dcb8SSjoerd Meijer; CHECK-LABEL: f1 30*ecc7dcb8SSjoerd Meijer; CHECK: movs r1, #4 31*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: sdiv r0, r0, r1 32*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: bx lr 33*ecc7dcb8SSjoerd Meijer 34*ecc7dcb8SSjoerd Meijerentry: 35*ecc7dcb8SSjoerd Meijer %div = sdiv i32 %F, 4 36*ecc7dcb8SSjoerd Meijer ret i32 %div 37*ecc7dcb8SSjoerd Meijer} 38*ecc7dcb8SSjoerd Meijer 39*ecc7dcb8SSjoerd Meijer; The immediate is not a power of 2, so we expect a sdiv. 40*ecc7dcb8SSjoerd Meijerdefine dso_local i32 @f2(i32 %F) local_unnamed_addr #0 { 41*ecc7dcb8SSjoerd Meijer; CHECK-LABEL: f2 42*ecc7dcb8SSjoerd Meijer; CHECK: movs r1, #5 43*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: sdiv r0, r0, r1 44*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: bx lr 45*ecc7dcb8SSjoerd Meijer 46*ecc7dcb8SSjoerd Meijerentry: 47*ecc7dcb8SSjoerd Meijer %div = sdiv i32 %F, 5 48*ecc7dcb8SSjoerd Meijer ret i32 %div 49*ecc7dcb8SSjoerd Meijer} 50*ecc7dcb8SSjoerd Meijer 51*ecc7dcb8SSjoerd Meijer; Try a larger power of 2 immediate: immediates larger than 52*ecc7dcb8SSjoerd Meijer; 128 don't give any code size savings. 53*ecc7dcb8SSjoerd Meijerdefine dso_local i32 @f3(i32 %F) local_unnamed_addr #0 { 54*ecc7dcb8SSjoerd Meijer; CHECK-LABEL: f3 55*ecc7dcb8SSjoerd Meijer; CHECK-NOT: sdiv 56*ecc7dcb8SSjoerd Meijerentry: 57*ecc7dcb8SSjoerd Meijer %div = sdiv i32 %F, 256 58*ecc7dcb8SSjoerd Meijer ret i32 %div 59*ecc7dcb8SSjoerd Meijer} 60*ecc7dcb8SSjoerd Meijer 61*ecc7dcb8SSjoerd Meijerattributes #0 = { minsize norecurse nounwind optsize readnone } 62*ecc7dcb8SSjoerd Meijer 63*ecc7dcb8SSjoerd Meijer 64*ecc7dcb8SSjoerd Meijer; These functions don't have the minsize attribute set, so should not lower 65*ecc7dcb8SSjoerd Meijer; the sdiv to sdiv, but to the faster instruction sequence. 66*ecc7dcb8SSjoerd Meijer 67*ecc7dcb8SSjoerd Meijerdefine dso_local signext i16 @f4(i16 signext %F) { 68*ecc7dcb8SSjoerd Meijer; T2-LABEL: f4 69*ecc7dcb8SSjoerd Meijer; T2: uxth r1, r0 70*ecc7dcb8SSjoerd Meijer; T2-NEXT: add.w r0, r0, r1, lsr #15 71*ecc7dcb8SSjoerd Meijer; T2-NEXT: sxth r0, r0 72*ecc7dcb8SSjoerd Meijer; T2-NEXT: asrs r0, r0, #1 73*ecc7dcb8SSjoerd Meijer; T2-NEXT: bx lr 74*ecc7dcb8SSjoerd Meijer 75*ecc7dcb8SSjoerd Meijer; T1-LABEL: f4 76*ecc7dcb8SSjoerd Meijer; T1: uxth r1, r0 77*ecc7dcb8SSjoerd Meijer; T1-NEXT: lsrs r1, r1, #15 78*ecc7dcb8SSjoerd Meijer; T1-NEXT: adds r0, r0, r1 79*ecc7dcb8SSjoerd Meijer; T1-NEXT: sxth r0, r0 80*ecc7dcb8SSjoerd Meijer; T1-NEXT: asrs r0, r0, #1 81*ecc7dcb8SSjoerd Meijer; T1-NEXT: bx lr 82*ecc7dcb8SSjoerd Meijer 83*ecc7dcb8SSjoerd Meijerentry: 84*ecc7dcb8SSjoerd Meijer %0 = sdiv i16 %F, 2 85*ecc7dcb8SSjoerd Meijer ret i16 %0 86*ecc7dcb8SSjoerd Meijer} 87*ecc7dcb8SSjoerd Meijer 88*ecc7dcb8SSjoerd Meijerdefine dso_local i32 @f5(i32 %F) { 89*ecc7dcb8SSjoerd Meijer; T2-LABEL: f5 90*ecc7dcb8SSjoerd Meijer; T2: asrs r1, r0, #31 91*ecc7dcb8SSjoerd Meijer; T2-NEXT: add.w r0, r0, r1, lsr #30 92*ecc7dcb8SSjoerd Meijer; T2-NEXT: asrs r0, r0, #2 93*ecc7dcb8SSjoerd Meijer; T2-NEXT: bx lr 94*ecc7dcb8SSjoerd Meijer 95*ecc7dcb8SSjoerd Meijer; T1-LABEL: f5 96*ecc7dcb8SSjoerd Meijer; T1: asrs r1, r0, #31 97*ecc7dcb8SSjoerd Meijer; T1-NEXT: lsrs r1, r1, #30 98*ecc7dcb8SSjoerd Meijer; T1-NEXT: adds r0, r0, r1 99*ecc7dcb8SSjoerd Meijer; T1-NEXT: asrs r0, r0, #2 100*ecc7dcb8SSjoerd Meijer; T1-NEXT: bx lr 101*ecc7dcb8SSjoerd Meijer 102*ecc7dcb8SSjoerd Meijerentry: 103*ecc7dcb8SSjoerd Meijer %div = sdiv i32 %F, 4 104*ecc7dcb8SSjoerd Meijer ret i32 %div 105*ecc7dcb8SSjoerd Meijer} 106