@@ -13,36 +13,44 @@ declare i32 @llvm.ctlz.i32(i32, i1)
13
13
declare i64 @llvm.ctlz.i64 (i64 , i1 )
14
14
15
15
define i8 @ctlo_i8 (i8 %x ) {
16
- ; X86-LABEL: ctlo_i8:
17
- ; X86: # %bb.0:
18
- ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
19
- ; X86-NEXT: xorb $-1, %al
20
- ; X86-NEXT: je .LBB0_1
21
- ; X86-NEXT: # %bb.2: # %cond.false
22
- ; X86-NEXT: movzbl %al, %eax
23
- ; X86-NEXT: bsrl %eax, %eax
24
- ; X86-NEXT: xorl $7, %eax
25
- ; X86-NEXT: # kill: def $al killed $al killed $eax
26
- ; X86-NEXT: retl
27
- ; X86-NEXT: .LBB0_1:
28
- ; X86-NEXT: movb $8, %al
29
- ; X86-NEXT: # kill: def $al killed $al killed $eax
30
- ; X86-NEXT: retl
16
+ ; X86-NOCMOV-LABEL: ctlo_i8:
17
+ ; X86-NOCMOV: # %bb.0:
18
+ ; X86-NOCMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax
19
+ ; X86-NOCMOV-NEXT: xorb $-1, %al
20
+ ; X86-NOCMOV-NEXT: je .LBB0_1
21
+ ; X86-NOCMOV-NEXT: # %bb.2: # %cond.false
22
+ ; X86-NOCMOV-NEXT: movzbl %al, %eax
23
+ ; X86-NOCMOV-NEXT: bsrl %eax, %eax
24
+ ; X86-NOCMOV-NEXT: xorl $7, %eax
25
+ ; X86-NOCMOV-NEXT: # kill: def $al killed $al killed $eax
26
+ ; X86-NOCMOV-NEXT: retl
27
+ ; X86-NOCMOV-NEXT: .LBB0_1:
28
+ ; X86-NOCMOV-NEXT: movb $8, %al
29
+ ; X86-NOCMOV-NEXT: # kill: def $al killed $al killed $eax
30
+ ; X86-NOCMOV-NEXT: retl
31
+ ;
32
+ ; X86-CMOV-LABEL: ctlo_i8:
33
+ ; X86-CMOV: # %bb.0:
34
+ ; X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax
35
+ ; X86-CMOV-NEXT: notb %al
36
+ ; X86-CMOV-NEXT: movzbl %al, %eax
37
+ ; X86-CMOV-NEXT: bsrl %eax, %ecx
38
+ ; X86-CMOV-NEXT: movl $15, %eax
39
+ ; X86-CMOV-NEXT: cmovnel %ecx, %eax
40
+ ; X86-CMOV-NEXT: xorl $7, %eax
41
+ ; X86-CMOV-NEXT: # kill: def $al killed $al killed $eax
42
+ ; X86-CMOV-NEXT: retl
31
43
;
32
44
; X64-LABEL: ctlo_i8:
33
45
; X64: # %bb.0:
34
- ; X64-NEXT: xorb $-1, %dil
35
- ; X64-NEXT: je .LBB0_1
36
- ; X64-NEXT: # %bb.2: # %cond.false
46
+ ; X64-NEXT: notb %dil
37
47
; X64-NEXT: movzbl %dil, %eax
38
- ; X64-NEXT: bsrl %eax, %eax
48
+ ; X64-NEXT: bsrl %eax, %ecx
49
+ ; X64-NEXT: movl $15, %eax
50
+ ; X64-NEXT: cmovnel %ecx, %eax
39
51
; X64-NEXT: xorl $7, %eax
40
52
; X64-NEXT: # kill: def $al killed $al killed $eax
41
53
; X64-NEXT: retq
42
- ; X64-NEXT: .LBB0_1:
43
- ; X64-NEXT: movb $8, %al
44
- ; X64-NEXT: # kill: def $al killed $al killed $eax
45
- ; X64-NEXT: retq
46
54
;
47
55
; X86-CLZ-LABEL: ctlo_i8:
48
56
; X86-CLZ: # %bb.0:
@@ -111,34 +119,41 @@ define i8 @ctlo_i8_undef(i8 %x) {
111
119
}
112
120
113
121
define i16 @ctlo_i16 (i16 %x ) {
114
- ; X86-LABEL: ctlo_i16:
115
- ; X86: # %bb.0:
116
- ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
117
- ; X86-NEXT: xorw $-1, %ax
118
- ; X86-NEXT: je .LBB2_1
119
- ; X86-NEXT: # %bb.2: # %cond.false
120
- ; X86-NEXT: bsrw %ax, %ax
121
- ; X86-NEXT: xorl $15, %eax
122
- ; X86-NEXT: # kill: def $ax killed $ax killed $eax
123
- ; X86-NEXT: retl
124
- ; X86-NEXT: .LBB2_1:
125
- ; X86-NEXT: movw $16, %ax
126
- ; X86-NEXT: # kill: def $ax killed $ax killed $eax
127
- ; X86-NEXT: retl
122
+ ; X86-NOCMOV-LABEL: ctlo_i16:
123
+ ; X86-NOCMOV: # %bb.0:
124
+ ; X86-NOCMOV-NEXT: movzwl {{[0-9]+}}(%esp), %eax
125
+ ; X86-NOCMOV-NEXT: xorw $-1, %ax
126
+ ; X86-NOCMOV-NEXT: je .LBB2_1
127
+ ; X86-NOCMOV-NEXT: # %bb.2: # %cond.false
128
+ ; X86-NOCMOV-NEXT: bsrw %ax, %ax
129
+ ; X86-NOCMOV-NEXT: xorl $15, %eax
130
+ ; X86-NOCMOV-NEXT: # kill: def $ax killed $ax killed $eax
131
+ ; X86-NOCMOV-NEXT: retl
132
+ ; X86-NOCMOV-NEXT: .LBB2_1:
133
+ ; X86-NOCMOV-NEXT: movw $16, %ax
134
+ ; X86-NOCMOV-NEXT: # kill: def $ax killed $ax killed $eax
135
+ ; X86-NOCMOV-NEXT: retl
136
+ ;
137
+ ; X86-CMOV-LABEL: ctlo_i16:
138
+ ; X86-CMOV: # %bb.0:
139
+ ; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
140
+ ; X86-CMOV-NEXT: notl %eax
141
+ ; X86-CMOV-NEXT: bsrw %ax, %cx
142
+ ; X86-CMOV-NEXT: movw $31, %ax
143
+ ; X86-CMOV-NEXT: cmovnew %cx, %ax
144
+ ; X86-CMOV-NEXT: xorl $15, %eax
145
+ ; X86-CMOV-NEXT: # kill: def $ax killed $ax killed $eax
146
+ ; X86-CMOV-NEXT: retl
128
147
;
129
148
; X64-LABEL: ctlo_i16:
130
149
; X64: # %bb.0:
131
- ; X64-NEXT: xorw $-1, %di
132
- ; X64-NEXT: je .LBB2_1
133
- ; X64-NEXT: # %bb.2: # %cond.false
134
- ; X64-NEXT: bsrw %di , %ax
150
+ ; X64-NEXT: notl %edi
151
+ ; X64-NEXT: bsrw %di, %cx
152
+ ; X64-NEXT: movw $31, %ax
153
+ ; X64-NEXT: cmovnew %cx , %ax
135
154
; X64-NEXT: xorl $15, %eax
136
155
; X64-NEXT: # kill: def $ax killed $ax killed $eax
137
156
; X64-NEXT: retq
138
- ; X64-NEXT: .LBB2_1:
139
- ; X64-NEXT: movw $16, %ax
140
- ; X64-NEXT: # kill: def $ax killed $ax killed $eax
141
- ; X64-NEXT: retq
142
157
;
143
158
; X86-CLZ-LABEL: ctlo_i16:
144
159
; X86-CLZ: # %bb.0:
@@ -193,30 +208,37 @@ define i16 @ctlo_i16_undef(i16 %x) {
193
208
}
194
209
195
210
define i32 @ctlo_i32 (i32 %x ) {
196
- ; X86-LABEL: ctlo_i32:
197
- ; X86: # %bb.0:
198
- ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
199
- ; X86-NEXT: xorl $-1, %eax
200
- ; X86-NEXT: je .LBB4_1
201
- ; X86-NEXT: # %bb.2: # %cond.false
202
- ; X86-NEXT: bsrl %eax, %eax
203
- ; X86-NEXT: xorl $31, %eax
204
- ; X86-NEXT: retl
205
- ; X86-NEXT: .LBB4_1:
206
- ; X86-NEXT: movl $32, %eax
207
- ; X86-NEXT: retl
211
+ ; X86-NOCMOV-LABEL: ctlo_i32:
212
+ ; X86-NOCMOV: # %bb.0:
213
+ ; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
214
+ ; X86-NOCMOV-NEXT: xorl $-1, %eax
215
+ ; X86-NOCMOV-NEXT: je .LBB4_1
216
+ ; X86-NOCMOV-NEXT: # %bb.2: # %cond.false
217
+ ; X86-NOCMOV-NEXT: bsrl %eax, %eax
218
+ ; X86-NOCMOV-NEXT: xorl $31, %eax
219
+ ; X86-NOCMOV-NEXT: retl
220
+ ; X86-NOCMOV-NEXT: .LBB4_1:
221
+ ; X86-NOCMOV-NEXT: movl $32, %eax
222
+ ; X86-NOCMOV-NEXT: retl
223
+ ;
224
+ ; X86-CMOV-LABEL: ctlo_i32:
225
+ ; X86-CMOV: # %bb.0:
226
+ ; X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
227
+ ; X86-CMOV-NEXT: notl %eax
228
+ ; X86-CMOV-NEXT: bsrl %eax, %ecx
229
+ ; X86-CMOV-NEXT: movl $63, %eax
230
+ ; X86-CMOV-NEXT: cmovnel %ecx, %eax
231
+ ; X86-CMOV-NEXT: xorl $31, %eax
232
+ ; X86-CMOV-NEXT: retl
208
233
;
209
234
; X64-LABEL: ctlo_i32:
210
235
; X64: # %bb.0:
211
- ; X64-NEXT: xorl $-1, %edi
212
- ; X64-NEXT: je .LBB4_1
213
- ; X64-NEXT: # %bb.2: # %cond.false
214
- ; X64-NEXT: bsrl %edi , %eax
236
+ ; X64-NEXT: notl %edi
237
+ ; X64-NEXT: bsrl %edi, %ecx
238
+ ; X64-NEXT: movl $63, %eax
239
+ ; X64-NEXT: cmovnel %ecx , %eax
215
240
; X64-NEXT: xorl $31, %eax
216
241
; X64-NEXT: retq
217
- ; X64-NEXT: .LBB4_1:
218
- ; X64-NEXT: movl $32, %eax
219
- ; X64-NEXT: retq
220
242
;
221
243
; X86-CLZ-LABEL: ctlo_i32:
222
244
; X86-CLZ: # %bb.0:
@@ -314,15 +336,12 @@ define i64 @ctlo_i64(i64 %x) {
314
336
;
315
337
; X64-LABEL: ctlo_i64:
316
338
; X64: # %bb.0:
317
- ; X64-NEXT: xorq $-1, %rdi
318
- ; X64-NEXT: je .LBB6_1
319
- ; X64-NEXT: # %bb.2: # %cond.false
320
- ; X64-NEXT: bsrq %rdi , %rax
339
+ ; X64-NEXT: notq %rdi
340
+ ; X64-NEXT: bsrq %rdi, %rcx
341
+ ; X64-NEXT: movl $127, %eax
342
+ ; X64-NEXT: cmovneq %rcx , %rax
321
343
; X64-NEXT: xorq $63, %rax
322
344
; X64-NEXT: retq
323
- ; X64-NEXT: .LBB6_1:
324
- ; X64-NEXT: movl $64, %eax
325
- ; X64-NEXT: retq
326
345
;
327
346
; X86-CLZ-LABEL: ctlo_i64:
328
347
; X86-CLZ: # %bb.0:
0 commit comments