1- ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
21; RUN: llc -mtriple=thumbv8 %s -o - | FileCheck %s --check-prefixes=CHECK,T2
32; RUN: llc -mtriple=thumbv8m.main %s -o - | FileCheck %s --check-prefixes=CHECK,T2
43; RUN: llc -mtriple=thumbv8m.base %s -o - | FileCheck %s --check-prefixes=CHECK,T1
1413
1514; Test sdiv i16
1615define dso_local signext i16 @f0 (i16 signext %F ) local_unnamed_addr #0 {
17- ; CHECK-LABEL: f0:
18- ; CHECK: @ %bb.0: @ %entry
19- ; CHECK-NEXT: movs r1, #2
20- ; CHECK-NEXT: sdiv r0, r0, r1
21- ; CHECK-NEXT: sxth r0, r0
22- ; CHECK-NEXT: bx lr
23- ;
24- ; V6M-LABEL: f0:
25- ; V6M: @ %bb.0: @ %entry
26- ; V6M-NEXT: movs r1, #255
27- ; V6M-NEXT: lsls r1, r1, #8
28- ; V6M-NEXT: ands r1, r0
29- ; V6M-NEXT: lsrs r1, r1, #15
30- ; V6M-NEXT: adds r0, r0, r1
31- ; V6M-NEXT: sxth r0, r0
32- ; V6M-NEXT: asrs r0, r0, #1
33- ; V6M-NEXT: bx lr
16+ ; CHECK-LABEL: f0
17+ ; CHECK: movs r1, #2
18+ ; CHECK-NEXT: sdiv r0, r0, r1
19+ ; CHECK-NEXT: sxth r0, r0
20+ ; CHECK-NEXT: bx lr
3421
3522entry:
3623 %0 = sdiv i16 %F , 2
@@ -39,19 +26,10 @@ entry:
3926
4027; Same as above, but now with i32
4128define dso_local i32 @f1 (i32 %F ) local_unnamed_addr #0 {
42- ; CHECK-LABEL: f1:
43- ; CHECK: @ %bb.0: @ %entry
44- ; CHECK-NEXT: movs r1, #4
45- ; CHECK-NEXT: sdiv r0, r0, r1
46- ; CHECK-NEXT: bx lr
47- ;
48- ; V6M-LABEL: f1:
49- ; V6M: @ %bb.0: @ %entry
50- ; V6M-NEXT: asrs r1, r0, #31
51- ; V6M-NEXT: lsrs r1, r1, #30
52- ; V6M-NEXT: adds r0, r0, r1
53- ; V6M-NEXT: asrs r0, r0, #2
54- ; V6M-NEXT: bx lr
29+ ; CHECK-LABEL: f1
30+ ; CHECK: movs r1, #4
31+ ; CHECK-NEXT: sdiv r0, r0, r1
32+ ; CHECK-NEXT: bx lr
5533
5634entry:
5735 %div = sdiv i32 %F , 4
@@ -60,18 +38,10 @@ entry:
6038
6139; The immediate is not a power of 2, so we expect a sdiv.
6240define dso_local i32 @f2 (i32 %F ) local_unnamed_addr #0 {
63- ; CHECK-LABEL: f2:
64- ; CHECK: @ %bb.0: @ %entry
65- ; CHECK-NEXT: movs r1, #5
66- ; CHECK-NEXT: sdiv r0, r0, r1
67- ; CHECK-NEXT: bx lr
68- ;
69- ; V6M-LABEL: f2:
70- ; V6M: @ %bb.0: @ %entry
71- ; V6M-NEXT: push {r7, lr}
72- ; V6M-NEXT: movs r1, #5
73- ; V6M-NEXT: bl __divsi3
74- ; V6M-NEXT: pop {r7, pc}
41+ ; CHECK-LABEL: f2
42+ ; CHECK: movs r1, #5
43+ ; CHECK-NEXT: sdiv r0, r0, r1
44+ ; CHECK-NEXT: bx lr
7545
7646entry:
7747 %div = sdiv i32 %F , 5
@@ -81,28 +51,8 @@ entry:
8151; Try a larger power of 2 immediate: immediates larger than
8252; 128 don't give any code size savings.
8353define dso_local i32 @f3 (i32 %F ) local_unnamed_addr #0 {
84- ; T2-LABEL: f3:
85- ; T2: @ %bb.0: @ %entry
86- ; T2-NEXT: asrs r1, r0, #31
87- ; T2-NEXT: add.w r0, r0, r1, lsr #24
88- ; T2-NEXT: asrs r0, r0, #8
89- ; T2-NEXT: bx lr
90- ;
91- ; T1-LABEL: f3:
92- ; T1: @ %bb.0: @ %entry
93- ; T1-NEXT: asrs r1, r0, #31
94- ; T1-NEXT: lsrs r1, r1, #24
95- ; T1-NEXT: adds r0, r0, r1
96- ; T1-NEXT: asrs r0, r0, #8
97- ; T1-NEXT: bx lr
98- ;
99- ; V6M-LABEL: f3:
100- ; V6M: @ %bb.0: @ %entry
101- ; V6M-NEXT: asrs r1, r0, #31
102- ; V6M-NEXT: lsrs r1, r1, #24
103- ; V6M-NEXT: adds r0, r0, r1
104- ; V6M-NEXT: asrs r0, r0, #8
105- ; V6M-NEXT: bx lr
54+ ; CHECK-LABEL: f3
55+ ; CHECK-NOT: sdiv
10656entry:
10757 %div = sdiv i32 %F , 256
10858 ret i32 %div
@@ -115,65 +65,39 @@ attributes #0 = { minsize norecurse nounwind optsize readnone }
11565; the sdiv to sdiv, but to the faster instruction sequence.
11666
11767define dso_local signext i16 @f4 (i16 signext %F ) {
118- ; T2-LABEL: f4:
119- ; T2: @ %bb.0: @ %entry
120- ; T2-NEXT: and r1, r0, #32768
121- ; T2-NEXT: add.w r0, r0, r1, lsr #15
122- ; T2-NEXT: sxth r0, r0
123- ; T2-NEXT: asrs r0, r0, #1
124- ; T2-NEXT: bx lr
125- ;
126- ; T1-LABEL: f4:
127- ; T1: @ %bb.0: @ %entry
128- ; T1-NEXT: movw r1, #65280
129- ; T1-NEXT: ands r1, r0
130- ; T1-NEXT: lsrs r1, r1, #15
131- ; T1-NEXT: adds r0, r0, r1
132- ; T1-NEXT: sxth r0, r0
133- ; T1-NEXT: asrs r0, r0, #1
134- ; T1-NEXT: bx lr
135- ;
136- ; V6M-LABEL: f4:
137- ; V6M: @ %bb.0: @ %entry
138- ; V6M-NEXT: movs r1, #255
139- ; V6M-NEXT: lsls r1, r1, #8
140- ; V6M-NEXT: ands r1, r0
141- ; V6M-NEXT: lsrs r1, r1, #15
142- ; V6M-NEXT: adds r0, r0, r1
143- ; V6M-NEXT: sxth r0, r0
144- ; V6M-NEXT: asrs r0, r0, #1
145- ; V6M-NEXT: bx lr
146-
68+ ; T2-LABEL: f4
69+ ; T2: uxth r1, r0
70+ ; T2-NEXT: add.w r0, r0, r1, lsr #15
71+ ; T2-NEXT: sxth r0, r0
72+ ; T2-NEXT: asrs r0, r0, #1
73+ ; T2-NEXT: bx lr
74+
75+ ; T1-LABEL: f4
76+ ; T1: uxth r1, r0
77+ ; T1-NEXT: lsrs r1, r1, #15
78+ ; T1-NEXT: adds r0, r0, r1
79+ ; T1-NEXT: sxth r0, r0
80+ ; T1-NEXT: asrs r0, r0, #1
81+ ; T1-NEXT: bx lr
14782
14883entry:
14984 %0 = sdiv i16 %F , 2
15085 ret i16 %0
15186}
15287
15388define dso_local i32 @f5 (i32 %F ) {
154- ; T2-LABEL: f5:
155- ; T2: @ %bb.0: @ %entry
156- ; T2-NEXT: asrs r1, r0, #31
157- ; T2-NEXT: add.w r0, r0, r1, lsr #30
158- ; T2-NEXT: asrs r0, r0, #2
159- ; T2-NEXT: bx lr
160- ;
161- ; T1-LABEL: f5:
162- ; T1: @ %bb.0: @ %entry
163- ; T1-NEXT: asrs r1, r0, #31
164- ; T1-NEXT: lsrs r1, r1, #30
165- ; T1-NEXT: adds r0, r0, r1
166- ; T1-NEXT: asrs r0, r0, #2
167- ; T1-NEXT: bx lr
168- ;
169- ; V6M-LABEL: f5:
170- ; V6M: @ %bb.0: @ %entry
171- ; V6M-NEXT: asrs r1, r0, #31
172- ; V6M-NEXT: lsrs r1, r1, #30
173- ; V6M-NEXT: adds r0, r0, r1
174- ; V6M-NEXT: asrs r0, r0, #2
175- ; V6M-NEXT: bx lr
176-
89+ ; T2-LABEL: f5
90+ ; T2: asrs r1, r0, #31
91+ ; T2-NEXT: add.w r0, r0, r1, lsr #30
92+ ; T2-NEXT: asrs r0, r0, #2
93+ ; T2-NEXT: bx lr
94+
95+ ; T1-LABEL: f5
96+ ; T1: asrs r1, r0, #31
97+ ; T1-NEXT: lsrs r1, r1, #30
98+ ; T1-NEXT: adds r0, r0, r1
99+ ; T1-NEXT: asrs r0, r0, #2
100+ ; T1-NEXT: bx lr
177101
178102entry:
179103 %div = sdiv i32 %F , 4
0 commit comments