80 lines · plain
1; RUN: llc -mtriple=armv7a -mattr=+hwdiv-arm %s -o - | FileCheck %s --check-prefixes=CHECK,DIV2; RUN: llc -mtriple=armv7a -mattr=-hwdiv-arm %s -o - | FileCheck %s --check-prefixes=CHECK,NODIV3 4; Check SREM5define dso_local i32 @test_rem(i32 %F) local_unnamed_addr #0 {6; CHECK-LABEL: test_rem 7; CHECK: asr r1, r0, #318; CHECK-NEXT: add r1, r0, r1, lsr #309; CHECK-NEXT: bic r1, r1, #310; CHECK-NEXT: sub r0, r0, r111 12entry:13 %div = srem i32 %F, 414 ret i32 %div15}16 17; Try an i16 sdiv, with a small immediate.18define dso_local signext i16 @f0(i16 signext %F) local_unnamed_addr #0 {19; CHECK-LABEL: f020 21; DIV: mov r1, #222; DIV-NEXT: sdiv r0, r0, r123; DIV-NEXT: sxth r0, r024; DIV-NEXT: bx lr25 26; NODIV: uxth r1, r027; NODIV-NEXT: add r0, r0, r1, lsr #1528; NODIV-NEXT: sxth r0, r029; NODIV-NEXT: asr r0, r0, #130; NODIV-NEXT: bx lr31 32entry:33 %0 = sdiv i16 %F, 234 ret i16 %035}36 37; Try an i32 sdiv, with a small immediate.38define dso_local i32 @f1(i32 %F) local_unnamed_addr #0 {39; CHECK-LABEL: f140 41; DIV: mov r1, #442; DIV-NEXT: sdiv r0, r0, r143; DIV-NEXT: bx lr44 45; NODIV: asr r1, r0, #3146; NODIV-NEXT: add r0, r0, r1, lsr #3047; NODIV-NEXT: asr r0, r0, #248; NODIV-NEXT: bx lr49 50entry:51 %div = sdiv i32 %F, 452 ret i32 %div53}54 55; Try a large power of 2 immediate, which should also be materialised with 156; move immediate instruction.57define dso_local i32 @f2(i32 %F) local_unnamed_addr #0 {58; CHECK-LABEL: f259; DIV: mov r1, #13107260; DIV-NEXT: sdiv r0, r0, r161; DIV-NEXT: bx lr62entry:63 %div = sdiv i32 %F, 13107264 ret i32 %div65}66 67; MinSize not set, so should expand to the faster but longer sequence.68define dso_local i32 @f3(i32 %F) {69; CHECK-LABEL: f370; CHECK: asr r1, r0, #3171; CHECK-NEXT: add r0, r0, r1, lsr #3072; CHECK-NEXT: asr r0, r0, #273; CHECK-NEXT: bx lr74entry:75 %div = sdiv i32 %F, 476 ret i32 %div77}78 79attributes #0 = { minsize norecurse nounwind optsize readnone }80