11
11
define i8 @scalar_i8 (i8 %x , i8 %y , ptr %divdst ) nounwind {
12
12
; X86-LABEL: scalar_i8:
13
13
; X86: # %bb.0:
14
+ ; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
15
+ ; X86-NEXT: idivb {{[0-9]+}}(%esp)
14
16
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
15
- ; X86-NEXT: movb {{[0-9]+}}(%esp), %ch
16
- ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl
17
- ; X86-NEXT: movsbl %cl, %eax
18
- ; X86-NEXT: idivb %ch
17
+ ; X86-NEXT: movsbl %ah, %ecx
19
18
; X86-NEXT: movb %al, (%edx)
20
- ; X86-NEXT: mulb %ch
21
- ; X86-NEXT: subb %al, %cl
22
19
; X86-NEXT: movl %ecx, %eax
23
20
; X86-NEXT: retl
24
21
;
25
22
; X64-LABEL: scalar_i8:
26
23
; X64: # %bb.0:
27
- ; X64-NEXT: movsbl %dil, %ecx
28
- ; X64-NEXT: movl %ecx, %eax
24
+ ; X64-NEXT: movsbl %dil, %eax
29
25
; X64-NEXT: idivb %sil
26
+ ; X64-NEXT: movsbl %ah, %ecx
30
27
; X64-NEXT: movb %al, (%rdx)
31
- ; X64-NEXT: mulb %sil
32
- ; X64-NEXT: subb %al, %cl
33
28
; X64-NEXT: movl %ecx, %eax
34
29
; X64-NEXT: retq
35
30
%div = sdiv i8 %x , %y
@@ -42,34 +37,23 @@ define i8 @scalar_i8(i8 %x, i8 %y, ptr %divdst) nounwind {
42
37
define i16 @scalar_i16 (i16 %x , i16 %y , ptr %divdst ) nounwind {
43
38
; X86-LABEL: scalar_i16:
44
39
; X86: # %bb.0:
45
- ; X86-NEXT: pushl %edi
46
- ; X86-NEXT: pushl %esi
47
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
48
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
49
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
50
- ; X86-NEXT: movl %ecx, %eax
40
+ ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
51
41
; X86-NEXT: cwtd
52
- ; X86-NEXT: idivw %si
53
- ; X86-NEXT: # kill: def $ax killed $ax def $eax
54
- ; X86-NEXT: movw %ax, (%edi)
55
- ; X86-NEXT: imull %eax, %esi
56
- ; X86-NEXT: subl %esi, %ecx
57
- ; X86-NEXT: movl %ecx, %eax
58
- ; X86-NEXT: popl %esi
59
- ; X86-NEXT: popl %edi
42
+ ; X86-NEXT: idivw {{[0-9]+}}(%esp)
43
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
44
+ ; X86-NEXT: movw %ax, (%ecx)
45
+ ; X86-NEXT: movl %edx, %eax
60
46
; X86-NEXT: retl
61
47
;
62
48
; X64-LABEL: scalar_i16:
63
49
; X64: # %bb.0:
64
50
; X64-NEXT: movq %rdx, %rcx
65
51
; X64-NEXT: movl %edi, %eax
52
+ ; X64-NEXT: # kill: def $ax killed $ax killed $eax
66
53
; X64-NEXT: cwtd
67
54
; X64-NEXT: idivw %si
68
- ; X64-NEXT: # kill: def $ax killed $ax def $eax
69
55
; X64-NEXT: movw %ax, (%rcx)
70
- ; X64-NEXT: imull %eax, %esi
71
- ; X64-NEXT: subl %esi, %edi
72
- ; X64-NEXT: movl %edi, %eax
56
+ ; X64-NEXT: movl %edx, %eax
73
57
; X64-NEXT: retq
74
58
%div = sdiv i16 %x , %y
75
59
store i16 %div , ptr %divdst , align 4
@@ -81,20 +65,12 @@ define i16 @scalar_i16(i16 %x, i16 %y, ptr %divdst) nounwind {
81
65
define i32 @scalar_i32 (i32 %x , i32 %y , ptr %divdst ) nounwind {
82
66
; X86-LABEL: scalar_i32:
83
67
; X86: # %bb.0:
84
- ; X86-NEXT: pushl %edi
85
- ; X86-NEXT: pushl %esi
86
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
87
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
88
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
89
- ; X86-NEXT: movl %ecx, %eax
68
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
90
69
; X86-NEXT: cltd
91
- ; X86-NEXT: idivl %edi
92
- ; X86-NEXT: movl %eax, (%esi)
93
- ; X86-NEXT: imull %edi, %eax
94
- ; X86-NEXT: subl %eax, %ecx
95
- ; X86-NEXT: movl %ecx, %eax
96
- ; X86-NEXT: popl %esi
97
- ; X86-NEXT: popl %edi
70
+ ; X86-NEXT: idivl {{[0-9]+}}(%esp)
71
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
72
+ ; X86-NEXT: movl %eax, (%ecx)
73
+ ; X86-NEXT: movl %edx, %eax
98
74
; X86-NEXT: retl
99
75
;
100
76
; X64-LABEL: scalar_i32:
@@ -104,9 +80,7 @@ define i32 @scalar_i32(i32 %x, i32 %y, ptr %divdst) nounwind {
104
80
; X64-NEXT: cltd
105
81
; X64-NEXT: idivl %esi
106
82
; X64-NEXT: movl %eax, (%rcx)
107
- ; X64-NEXT: imull %esi, %eax
108
- ; X64-NEXT: subl %eax, %edi
109
- ; X64-NEXT: movl %edi, %eax
83
+ ; X64-NEXT: movl %edx, %eax
110
84
; X64-NEXT: retq
111
85
%div = sdiv i32 %x , %y
112
86
store i32 %div , ptr %divdst , align 4
@@ -158,9 +132,7 @@ define i64 @scalar_i64(i64 %x, i64 %y, ptr %divdst) nounwind {
158
132
; X64-NEXT: cqto
159
133
; X64-NEXT: idivq %rsi
160
134
; X64-NEXT: movq %rax, (%rcx)
161
- ; X64-NEXT: imulq %rsi, %rax
162
- ; X64-NEXT: subq %rax, %rdi
163
- ; X64-NEXT: movq %rdi, %rax
135
+ ; X64-NEXT: movq %rdx, %rax
164
136
; X64-NEXT: retq
165
137
%div = sdiv i64 %x , %y
166
138
store i64 %div , ptr %divdst , align 4
@@ -1194,39 +1166,53 @@ define <2 x i64> @vector_i128_i64(<2 x i64> %x, <2 x i64> %y, ptr %divdst) nounw
1194
1166
ret <2 x i64 > %t2
1195
1167
}
1196
1168
1169
+ define i32 @scalar_i32_const_pow2_divisor (i32 %0 , ptr %1 ) minsize nounwind {
1170
+ ; X86-LABEL: scalar_i32_const_pow2_divisor:
1171
+ ; X86: # %bb.0:
1172
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1173
+ ; X86-NEXT: movl $256, %ecx # imm = 0x100
1174
+ ; X86-NEXT: cltd
1175
+ ; X86-NEXT: idivl %ecx
1176
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
1177
+ ; X86-NEXT: movl %edx, (%ecx)
1178
+ ; X86-NEXT: retl
1179
+ ;
1180
+ ; X64-LABEL: scalar_i32_const_pow2_divisor:
1181
+ ; X64: # %bb.0:
1182
+ ; X64-NEXT: movl %edi, %eax
1183
+ ; X64-NEXT: movl $256, %ecx # imm = 0x100
1184
+ ; X64-NEXT: cltd
1185
+ ; X64-NEXT: idivl %ecx
1186
+ ; X64-NEXT: movl %edx, (%rsi)
1187
+ ; X64-NEXT: retq
1188
+ %3 = srem i32 %0 , 256
1189
+ store i32 %3 , ptr %1 , align 4
1190
+ %4 = sdiv i32 %0 , 256
1191
+ ret i32 %4
1192
+ }
1193
+
1197
1194
; Special tests.
1198
1195
1199
1196
define i32 @scalar_i32_commutative (i32 %x , ptr %ysrc , ptr %divdst ) nounwind {
1200
1197
; X86-LABEL: scalar_i32_commutative:
1201
1198
; X86: # %bb.0:
1202
- ; X86-NEXT: pushl %edi
1203
- ; X86-NEXT: pushl %esi
1204
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
1205
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
1206
1199
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1207
- ; X86-NEXT: movl (%eax), %edi
1208
- ; X86-NEXT: movl %ecx, %eax
1200
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
1209
1201
; X86-NEXT: cltd
1210
- ; X86-NEXT: idivl %edi
1211
- ; X86-NEXT: movl %eax, (%esi)
1212
- ; X86-NEXT: imull %eax, %edi
1213
- ; X86-NEXT: subl %edi, %ecx
1214
- ; X86-NEXT: movl %ecx, %eax
1215
- ; X86-NEXT: popl %esi
1216
- ; X86-NEXT: popl %edi
1202
+ ; X86-NEXT: idivl (%ecx)
1203
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
1204
+ ; X86-NEXT: movl %eax, (%ecx)
1205
+ ; X86-NEXT: movl %edx, %eax
1217
1206
; X86-NEXT: retl
1218
1207
;
1219
1208
; X64-LABEL: scalar_i32_commutative:
1220
1209
; X64: # %bb.0:
1221
1210
; X64-NEXT: movq %rdx, %rcx
1222
- ; X64-NEXT: movl (%rsi), %esi
1223
1211
; X64-NEXT: movl %edi, %eax
1224
1212
; X64-NEXT: cltd
1225
- ; X64-NEXT: idivl %esi
1213
+ ; X64-NEXT: idivl (%rsi)
1226
1214
; X64-NEXT: movl %eax, (%rcx)
1227
- ; X64-NEXT: imull %eax, %esi
1228
- ; X64-NEXT: subl %esi, %edi
1229
- ; X64-NEXT: movl %edi, %eax
1215
+ ; X64-NEXT: movl %edx, %eax
1230
1216
; X64-NEXT: retq
1231
1217
%y = load i32 , ptr %ysrc , align 4
1232
1218
%div = sdiv i32 %x , %y
@@ -1240,24 +1226,20 @@ define i32 @scalar_i32_commutative(i32 %x, ptr %ysrc, ptr %divdst) nounwind {
1240
1226
define i32 @extrause (i32 %x , i32 %y , ptr %divdst , ptr %t1dst ) nounwind {
1241
1227
; X86-LABEL: extrause:
1242
1228
; X86: # %bb.0:
1243
- ; X86-NEXT: pushl %ebx
1244
1229
; X86-NEXT: pushl %edi
1245
1230
; X86-NEXT: pushl %esi
1246
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
1247
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
1231
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1248
1232
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
1249
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
1250
- ; X86-NEXT: movl %ecx, %eax
1251
1233
; X86-NEXT: cltd
1252
- ; X86-NEXT: idivl %ebx
1234
+ ; X86-NEXT: idivl %ecx
1235
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
1236
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
1253
1237
; X86-NEXT: movl %eax, (%edi)
1254
- ; X86-NEXT: imull %ebx , %eax
1238
+ ; X86-NEXT: imull %ecx , %eax
1255
1239
; X86-NEXT: movl %eax, (%esi)
1256
- ; X86-NEXT: subl %eax, %ecx
1257
- ; X86-NEXT: movl %ecx, %eax
1240
+ ; X86-NEXT: movl %edx, %eax
1258
1241
; X86-NEXT: popl %esi
1259
1242
; X86-NEXT: popl %edi
1260
- ; X86-NEXT: popl %ebx
1261
1243
; X86-NEXT: retl
1262
1244
;
1263
1245
; X64-LABEL: extrause:
@@ -1269,8 +1251,7 @@ define i32 @extrause(i32 %x, i32 %y, ptr %divdst, ptr %t1dst) nounwind {
1269
1251
; X64-NEXT: movl %eax, (%r8)
1270
1252
; X64-NEXT: imull %esi, %eax
1271
1253
; X64-NEXT: movl %eax, (%rcx)
1272
- ; X64-NEXT: subl %eax, %edi
1273
- ; X64-NEXT: movl %edi, %eax
1254
+ ; X64-NEXT: movl %edx, %eax
1274
1255
; X64-NEXT: retq
1275
1256
%div = sdiv i32 %x , %y
1276
1257
store i32 %div , ptr %divdst , align 4
@@ -1296,14 +1277,14 @@ define i32 @multiple_bb(i32 %x, i32 %y, ptr %divdst, i1 zeroext %store_srem, ptr
1296
1277
; X86-NEXT: idivl %esi
1297
1278
; X86-NEXT: movl %eax, (%edi)
1298
1279
; X86-NEXT: testb %bl, %bl
1299
- ; X86-NEXT: je .LBB11_2
1280
+ ; X86-NEXT: je .LBB12_2
1300
1281
; X86-NEXT: # %bb.1: # %do_srem
1301
1282
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
1302
1283
; X86-NEXT: movl %eax, %edi
1303
1284
; X86-NEXT: imull %esi, %edi
1304
1285
; X86-NEXT: subl %edi, %ecx
1305
1286
; X86-NEXT: movl %ecx, (%edx)
1306
- ; X86-NEXT: .LBB11_2 : # %end
1287
+ ; X86-NEXT: .LBB12_2 : # %end
1307
1288
; X86-NEXT: popl %esi
1308
1289
; X86-NEXT: popl %edi
1309
1290
; X86-NEXT: popl %ebx
@@ -1317,13 +1298,13 @@ define i32 @multiple_bb(i32 %x, i32 %y, ptr %divdst, i1 zeroext %store_srem, ptr
1317
1298
; X64-NEXT: idivl %esi
1318
1299
; X64-NEXT: movl %eax, (%r9)
1319
1300
; X64-NEXT: testl %ecx, %ecx
1320
- ; X64-NEXT: je .LBB11_2
1301
+ ; X64-NEXT: je .LBB12_2
1321
1302
; X64-NEXT: # %bb.1: # %do_srem
1322
1303
; X64-NEXT: movl %eax, %ecx
1323
1304
; X64-NEXT: imull %esi, %ecx
1324
1305
; X64-NEXT: subl %ecx, %edi
1325
1306
; X64-NEXT: movl %edi, (%r8)
1326
- ; X64-NEXT: .LBB11_2 : # %end
1307
+ ; X64-NEXT: .LBB12_2 : # %end
1327
1308
; X64-NEXT: retq
1328
1309
%div = sdiv i32 %x , %y
1329
1310
store i32 %div , ptr %divdst , align 4
0 commit comments