xref: /llvm-project/llvm/test/CodeGen/ARM/sdiv-pow2-thumb-size.ll (revision ecc7dcb879c3917f8e2092969511aa5776dcb398)
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