1*ecc7dcb8SSjoerd Meijer; RUN: llc -mtriple=armv7a -mattr=+hwdiv-arm %s -o - | FileCheck %s --check-prefixes=CHECK,DIV 2*ecc7dcb8SSjoerd Meijer; RUN: llc -mtriple=armv7a -mattr=-hwdiv-arm %s -o - | FileCheck %s --check-prefixes=CHECK,NODIV 3*ecc7dcb8SSjoerd Meijer 4*ecc7dcb8SSjoerd Meijer; Check SREM 5*ecc7dcb8SSjoerd Meijerdefine dso_local i32 @test_rem(i32 %F) local_unnamed_addr #0 { 6*ecc7dcb8SSjoerd Meijer; CHECK-LABEL: test_rem 7*ecc7dcb8SSjoerd Meijer; CHECK: asr r1, r0, #31 8*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: add r1, r0, r1, lsr #30 9*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: bic r1, r1, #3 10*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: sub r0, r0, r1 11*ecc7dcb8SSjoerd Meijer 12*ecc7dcb8SSjoerd Meijerentry: 13*ecc7dcb8SSjoerd Meijer %div = srem i32 %F, 4 14*ecc7dcb8SSjoerd Meijer ret i32 %div 15*ecc7dcb8SSjoerd Meijer} 16*ecc7dcb8SSjoerd Meijer 17*ecc7dcb8SSjoerd Meijer; Try an i16 sdiv, with a small immediate. 18*ecc7dcb8SSjoerd Meijerdefine dso_local signext i16 @f0(i16 signext %F) local_unnamed_addr #0 { 19*ecc7dcb8SSjoerd Meijer; CHECK-LABEL: f0 20*ecc7dcb8SSjoerd Meijer 21*ecc7dcb8SSjoerd Meijer; DIV: mov r1, #2 22*ecc7dcb8SSjoerd Meijer; DIV-NEXT: sdiv r0, r0, r1 23*ecc7dcb8SSjoerd Meijer; DIV-NEXT: sxth r0, r0 24*ecc7dcb8SSjoerd Meijer; DIV-NEXT: bx lr 25*ecc7dcb8SSjoerd Meijer 26*ecc7dcb8SSjoerd Meijer; NODIV: uxth r1, r0 27*ecc7dcb8SSjoerd Meijer; NODIV-NEXT: add r0, r0, r1, lsr #15 28*ecc7dcb8SSjoerd Meijer; NODIV-NEXT: sxth r0, r0 29*ecc7dcb8SSjoerd Meijer; NODIV-NEXT: asr r0, r0, #1 30*ecc7dcb8SSjoerd Meijer; NODIV-NEXT: bx lr 31*ecc7dcb8SSjoerd Meijer 32*ecc7dcb8SSjoerd Meijerentry: 33*ecc7dcb8SSjoerd Meijer %0 = sdiv i16 %F, 2 34*ecc7dcb8SSjoerd Meijer ret i16 %0 35*ecc7dcb8SSjoerd Meijer} 36*ecc7dcb8SSjoerd Meijer 37*ecc7dcb8SSjoerd Meijer; Try an i32 sdiv, with a small immediate. 38*ecc7dcb8SSjoerd Meijerdefine dso_local i32 @f1(i32 %F) local_unnamed_addr #0 { 39*ecc7dcb8SSjoerd Meijer; CHECK-LABEL: f1 40*ecc7dcb8SSjoerd Meijer 41*ecc7dcb8SSjoerd Meijer; DIV: mov r1, #4 42*ecc7dcb8SSjoerd Meijer; DIV-NEXT: sdiv r0, r0, r1 43*ecc7dcb8SSjoerd Meijer; DIV-NEXT: bx lr 44*ecc7dcb8SSjoerd Meijer 45*ecc7dcb8SSjoerd Meijer; NODIV: asr r1, r0, #31 46*ecc7dcb8SSjoerd Meijer; NODIV-NEXT: add r0, r0, r1, lsr #30 47*ecc7dcb8SSjoerd Meijer; NODIV-NEXT: asr r0, r0, #2 48*ecc7dcb8SSjoerd Meijer; NODIV-NEXT: bx lr 49*ecc7dcb8SSjoerd Meijer 50*ecc7dcb8SSjoerd Meijerentry: 51*ecc7dcb8SSjoerd Meijer %div = sdiv i32 %F, 4 52*ecc7dcb8SSjoerd Meijer ret i32 %div 53*ecc7dcb8SSjoerd Meijer} 54*ecc7dcb8SSjoerd Meijer 55*ecc7dcb8SSjoerd Meijer; Try a large power of 2 immediate, which should also be materialised with 1 56*ecc7dcb8SSjoerd Meijer; move immediate instruction. 57*ecc7dcb8SSjoerd Meijerdefine dso_local i32 @f2(i32 %F) local_unnamed_addr #0 { 58*ecc7dcb8SSjoerd Meijer; CHECK-LABEL: f2 59*ecc7dcb8SSjoerd Meijer; DIV: mov r1, #131072 60*ecc7dcb8SSjoerd Meijer; DIV-NEXT: sdiv r0, r0, r1 61*ecc7dcb8SSjoerd Meijer; DIV-NEXT: bx lr 62*ecc7dcb8SSjoerd Meijerentry: 63*ecc7dcb8SSjoerd Meijer %div = sdiv i32 %F, 131072 64*ecc7dcb8SSjoerd Meijer ret i32 %div 65*ecc7dcb8SSjoerd Meijer} 66*ecc7dcb8SSjoerd Meijer 67*ecc7dcb8SSjoerd Meijer; MinSize not set, so should expand to the faster but longer sequence. 68*ecc7dcb8SSjoerd Meijerdefine dso_local i32 @f3(i32 %F) { 69*ecc7dcb8SSjoerd Meijer; CHECK-LABEL: f3 70*ecc7dcb8SSjoerd Meijer; CHECK: asr r1, r0, #31 71*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: add r0, r0, r1, lsr #30 72*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: asr r0, r0, #2 73*ecc7dcb8SSjoerd Meijer; CHECK-NEXT: bx lr 74*ecc7dcb8SSjoerd Meijerentry: 75*ecc7dcb8SSjoerd Meijer %div = sdiv i32 %F, 4 76*ecc7dcb8SSjoerd Meijer ret i32 %div 77*ecc7dcb8SSjoerd Meijer} 78*ecc7dcb8SSjoerd Meijer 79*ecc7dcb8SSjoerd Meijerattributes #0 = { minsize norecurse nounwind optsize readnone } 80