1
1
; RUN: llc -mtriple armv7-none-eabi %s -o - | FileCheck %s --check-prefix=EABI
2
2
; RUN: llc -mtriple armv7-none-eabihf %s -o - | FileCheck %s --check-prefix=EABI
3
- ; Both "none- eabi" and "androideabi" must lower SREM/UREM to __aeabi_{u,i}divmod
3
+ ; All " eabi" (Bare, GNU and Android) must lower SREM/UREM to __aeabi_{u,i}divmod
4
4
; RUN: llc -mtriple armv7-linux-androideabi %s -o - | FileCheck %s --check-prefix=EABI
5
- ; RUN: llc -mtriple armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=GNU
5
+ ; RUN: llc -mtriple armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=EABI
6
6
; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefix=DARWIN
7
7
; FIXME: long-term, we will use "-apple-macho" and won't need this exception:
8
8
; RUN: llc -mtriple armv7-apple-darwin-eabi %s -o - | FileCheck %s --check-prefix=DARWIN
9
9
10
10
define signext i16 @f16 (i16 signext %a , i16 signext %b ) {
11
11
; EABI-LABEL: f16:
12
- ; GNU-LABEL: f16:
13
12
; DARWIN-LABEL: f16:
14
13
entry:
15
14
%conv = sext i16 %a to i32
@@ -19,189 +18,145 @@ entry:
19
18
; EABI: __aeabi_idivmod
20
19
; EABI: mov [[div:r[0-9]+]], r0
21
20
; EABI: mov [[rem:r[0-9]+]], r1
22
- ; GNU: __aeabi_idiv
23
- ; GNU: mov [[sum:r[0-9]+]], r0
24
- ; GNU: __modsi3
25
- ; GNU: add [[sum]]{{.*}}r0
26
21
; DARWIN: ___divsi3
27
22
; DARWIN: mov [[sum:r[0-9]+]], r0
28
23
; DARWIN: __modsi3
29
24
; DARWIN: add [[sum]]{{.*}}r0
30
25
%rem8 = srem i32 %conv1 , %conv
31
26
; EABI: __aeabi_idivmod
32
- ; GNU: __modsi3
33
27
; DARWIN: __modsi3
34
28
%add = add nsw i32 %rem , %div
35
29
%add13 = add nsw i32 %add , %rem8
36
30
%conv14 = trunc i32 %add13 to i16
37
31
; EABI: add r0{{.*}}r1
38
32
; EABI: sxth r0, r0
39
- ; GNU: add r0{{.*}}[[sum]]
40
- ; GNU: sxth r0, r0
41
33
; DARWIN: add r0{{.*}}[[sum]]
42
34
; DARWIN: sxth r0, r0
43
35
ret i16 %conv14
44
36
}
45
37
46
38
define i32 @f32 (i32 %a , i32 %b ) {
47
39
; EABI-LABEL: f32:
48
- ; GNU-LABEL: f32:
49
40
; DARWIN-LABEL: f32:
50
41
entry:
51
42
%div = sdiv i32 %a , %b
52
43
%rem = srem i32 %a , %b
53
44
; EABI: __aeabi_idivmod
54
45
; EABI: mov [[div:r[0-9]+]], r0
55
46
; EABI: mov [[rem:r[0-9]+]], r1
56
- ; GNU: __aeabi_idiv
57
- ; GNU: mov [[sum:r[0-9]+]], r0
58
- ; GNU: __modsi3
59
- ; GNU: add [[sum]]{{.*}}r0
60
47
; DARWIN: ___divsi3
61
48
; DARWIN: mov [[sum:r[0-9]+]], r0
62
49
; DARWIN: __modsi3
63
50
; DARWIN: add [[sum]]{{.*}}r0
64
51
%rem1 = srem i32 %b , %a
65
52
; EABI: __aeabi_idivmod
66
- ; GNU: __modsi3
67
53
; DARWIN: __modsi3
68
54
%add = add nsw i32 %rem , %div
69
55
%add2 = add nsw i32 %add , %rem1
70
56
; EABI: add r0{{.*}}r1
71
- ; GNU: add r0{{.*}}[[sum]]
72
57
; DARWIN: add r0{{.*}}[[sum]]
73
58
ret i32 %add2
74
59
}
75
60
76
61
define i32 @uf (i32 %a , i32 %b ) {
77
62
; EABI-LABEL: uf:
78
- ; GNU-LABEL: uf:
79
63
; DARWIN-LABEL: uf:
80
64
entry:
81
65
%div = udiv i32 %a , %b
82
66
%rem = urem i32 %a , %b
83
67
; EABI: __aeabi_uidivmod
84
- ; GNU: __aeabi_uidiv
85
- ; GNU: mov [[sum:r[0-9]+]], r0
86
- ; GNU: __umodsi3
87
- ; GNU: add [[sum]]{{.*}}r0
88
68
; DARWIN: ___udivsi3
89
69
; DARWIN: mov [[sum:r[0-9]+]], r0
90
70
; DARWIN: __umodsi3
91
71
; DARWIN: add [[sum]]{{.*}}r0
92
72
%rem1 = urem i32 %b , %a
93
73
; EABI: __aeabi_uidivmod
94
- ; GNU: __umodsi3
95
74
; DARWIN: __umodsi3
96
75
%add = add nuw i32 %rem , %div
97
76
%add2 = add nuw i32 %add , %rem1
98
77
; EABI: add r0{{.*}}r1
99
- ; GNU: add r0{{.*}}[[sum]]
100
78
; DARWIN: add r0{{.*}}[[sum]]
101
79
ret i32 %add2
102
80
}
103
81
104
82
; FIXME: AEABI is not lowering long u/srem into u/ldivmod
105
83
define i64 @longf (i64 %a , i64 %b ) {
106
84
; EABI-LABEL: longf:
107
- ; GNU-LABEL: longf:
108
85
; DARWIN-LABEL: longf:
109
86
entry:
110
87
%div = sdiv i64 %a , %b
111
88
%rem = srem i64 %a , %b
112
89
; EABI: __aeabi_ldivmod
113
- ; GNU: __aeabi_ldivmod
114
- ; GNU: mov [[div1:r[0-9]+]], r0
115
- ; GNU: mov [[div2:r[0-9]+]], r1
116
90
; DARWIN: ___divdi3
117
91
; DARWIN: mov [[div1:r[0-9]+]], r0
118
92
; DARWIN: mov [[div2:r[0-9]+]], r1
119
93
; DARWIN: __moddi3
120
94
%add = add nsw i64 %rem , %div
121
- ; GNU: adds r0{{.*}}[[div1]]
122
- ; GNU: adc r1{{.*}}[[div2]]
123
95
; DARWIN: adds r0{{.*}}[[div1]]
124
96
; DARWIN: adc r1{{.*}}[[div2]]
125
97
ret i64 %add
126
98
}
127
99
128
100
define i32 @g1 (i32 %a , i32 %b ) {
129
101
; EABI-LABEL: g1:
130
- ; GNU-LABEL: g1:
131
102
; DARWIN-LABEL: g1:
132
103
entry:
133
104
%div = sdiv i32 %a , %b
134
105
%rem = srem i32 %a , %b
135
106
; EABI: __aeabi_idivmod
136
- ; GNU: __aeabi_idiv
137
- ; GNU: mov [[sum:r[0-9]+]], r0
138
- ; GNU: __modsi3
139
107
; DARWIN: ___divsi3
140
108
; DARWIN: mov [[sum:r[0-9]+]], r0
141
109
; DARWIN: __modsi3
142
110
%add = add nsw i32 %rem , %div
143
111
; EABI: add r0{{.*}}r1
144
- ; GNU: add r0{{.*}}[[sum]]
145
112
; DARWIN: add r0{{.*}}[[sum]]
146
113
ret i32 %add
147
114
}
148
115
149
116
; On both Darwin and Gnu, this is just a call to __modsi3
150
117
define i32 @g2 (i32 %a , i32 %b ) {
151
118
; EABI-LABEL: g2:
152
- ; GNU-LABEL: g2:
153
119
; DARWIN-LABEL: g2:
154
120
entry:
155
121
%rem = srem i32 %a , %b
156
122
; EABI: __aeabi_idivmod
157
- ; GNU: __modsi3
158
123
; DARWIN: __modsi3
159
124
ret i32 %rem
160
125
; EABI: mov r0, r1
161
126
}
162
127
163
128
define i32 @g3 (i32 %a , i32 %b ) {
164
129
; EABI-LABEL: g3:
165
- ; GNU-LABEL: g3:
166
130
; DARWIN-LABEL: g3:
167
131
entry:
168
132
%rem = srem i32 %a , %b
169
133
; EABI: __aeabi_idivmod
170
134
; EABI: mov [[mod:r[0-9]+]], r1
171
- ; GNU: __modsi3
172
- ; GNU: mov [[sum:r[0-9]+]], r0
173
135
; DARWIN: __modsi3
174
136
; DARWIN: mov [[sum:r[0-9]+]], r0
175
137
%rem1 = srem i32 %b , %rem
176
138
; EABI: __aeabi_idivmod
177
- ; GNU: __modsi3
178
139
; DARWIN: __modsi3
179
140
%add = add nsw i32 %rem1 , %rem
180
141
; EABI: add r0, r1, [[mod]]
181
- ; GNU: add r0{{.*}}[[sum]]
182
142
; DARWIN: add r0{{.*}}[[sum]]
183
143
ret i32 %add
184
144
}
185
145
186
146
define i32 @g4 (i32 %a , i32 %b ) {
187
147
; EABI-LABEL: g4:
188
- ; GNU-LABEL: g4:
189
148
; DARWIN-LABEL: g4:
190
149
entry:
191
150
%div = sdiv i32 %a , %b
192
151
; EABI: __aeabi_idiv{{$}}
193
152
; EABI: mov [[div:r[0-9]+]], r0
194
- ; GNU: __aeabi_idiv
195
- ; GNU: mov [[sum:r[0-9]+]], r0
196
153
; DARWIN: ___divsi3
197
154
; DARWIN: mov [[sum:r[0-9]+]], r0
198
155
%rem = srem i32 %b , %div
199
156
; EABI: __aeabi_idivmod
200
- ; GNU: __modsi3
201
157
; DARWIN: __modsi3
202
158
%add = add nsw i32 %rem , %div
203
159
; EABI: add r0, r1, [[div]]
204
- ; GNU: add r0{{.*}}[[sum]]
205
160
; DARWIN: add r0{{.*}}[[sum]]
206
161
ret i32 %add
207
162
}
0 commit comments