@@ -21,13 +21,15 @@ define i8 @test_ctlz_i8(i8 %a) nounwind {
2121; LA32R: # %bb.0:
2222; LA32R-NEXT: andi $a1, $a0, 254
2323; LA32R-NEXT: srli.w $a1, $a1, 1
24+ ; LA32R-NEXT: nor $a2, $a0, $a1
2425; LA32R-NEXT: or $a0, $a0, $a1
2526; LA32R-NEXT: andi $a1, $a0, 252
2627; LA32R-NEXT: srli.w $a1, $a1, 2
28+ ; LA32R-NEXT: andn $a2, $a2, $a1
2729; LA32R-NEXT: or $a0, $a0, $a1
28- ; LA32R-NEXT: andi $a1 , $a0, 240
29- ; LA32R-NEXT: srli.w $a1 , $a1 , 4
30- ; LA32R-NEXT: nor $a0, $a0 , $a1
30+ ; LA32R-NEXT: andi $a0 , $a0, 240
31+ ; LA32R-NEXT: srli.w $a0 , $a0 , 4
32+ ; LA32R-NEXT: andn $a0, $a2 , $a0
3133; LA32R-NEXT: srli.w $a1, $a0, 1
3234; LA32R-NEXT: andi $a1, $a1, 85
3335; LA32R-NEXT: sub.w $a0, $a0, $a1
@@ -60,23 +62,28 @@ define i8 @test_ctlz_i8(i8 %a) nounwind {
6062define i16 @test_ctlz_i16 (i16 %a ) nounwind {
6163; LA32R-LABEL: test_ctlz_i16:
6264; LA32R: # %bb.0:
65+ ; LA32R-NEXT: srli.w $a1, $a0, 1
66+ ; LA32R-NEXT: lu12i.w $a2, 7
67+ ; LA32R-NEXT: ori $a2, $a2, 4095
68+ ; LA32R-NEXT: and $a1, $a1, $a2
69+ ; LA32R-NEXT: nor $a2, $a0, $zero
70+ ; LA32R-NEXT: andn $a2, $a2, $a1
71+ ; LA32R-NEXT: or $a0, $a0, $a1
6372; LA32R-NEXT: lu12i.w $a1, 15
64- ; LA32R-NEXT: ori $a2, $a1, 4094
65- ; LA32R-NEXT: and $a2, $a0, $a2
66- ; LA32R-NEXT: srli.w $a2, $a2, 1
67- ; LA32R-NEXT: or $a0, $a0, $a2
68- ; LA32R-NEXT: ori $a2, $a1, 4092
69- ; LA32R-NEXT: and $a2, $a0, $a2
70- ; LA32R-NEXT: srli.w $a2, $a2, 2
71- ; LA32R-NEXT: or $a0, $a0, $a2
72- ; LA32R-NEXT: ori $a2, $a1, 4080
73- ; LA32R-NEXT: and $a2, $a0, $a2
74- ; LA32R-NEXT: srli.w $a2, $a2, 4
75- ; LA32R-NEXT: or $a0, $a0, $a2
73+ ; LA32R-NEXT: ori $a3, $a1, 4092
74+ ; LA32R-NEXT: and $a3, $a0, $a3
75+ ; LA32R-NEXT: srli.w $a3, $a3, 2
76+ ; LA32R-NEXT: andn $a2, $a2, $a3
77+ ; LA32R-NEXT: or $a0, $a0, $a3
78+ ; LA32R-NEXT: ori $a3, $a1, 4080
79+ ; LA32R-NEXT: and $a3, $a0, $a3
80+ ; LA32R-NEXT: srli.w $a3, $a3, 4
81+ ; LA32R-NEXT: andn $a2, $a2, $a3
82+ ; LA32R-NEXT: or $a0, $a0, $a3
7683; LA32R-NEXT: ori $a1, $a1, 3840
77- ; LA32R-NEXT: and $a1 , $a0, $a1
78- ; LA32R-NEXT: srli.w $a1 , $a1 , 8
79- ; LA32R-NEXT: nor $a0, $a0 , $a1
84+ ; LA32R-NEXT: and $a0 , $a0, $a1
85+ ; LA32R-NEXT: srli.w $a0 , $a0 , 8
86+ ; LA32R-NEXT: andn $a0, $a2 , $a0
8087; LA32R-NEXT: srli.w $a1, $a0, 1
8188; LA32R-NEXT: lu12i.w $a2, 5
8289; LA32R-NEXT: ori $a2, $a2, 1365
@@ -117,15 +124,19 @@ define i32 @test_ctlz_i32(i32 %a) nounwind {
117124; LA32R-LABEL: test_ctlz_i32:
118125; LA32R: # %bb.0:
119126; LA32R-NEXT: srli.w $a1, $a0, 1
127+ ; LA32R-NEXT: nor $a2, $a0, $a1
120128; LA32R-NEXT: or $a0, $a0, $a1
121129; LA32R-NEXT: srli.w $a1, $a0, 2
130+ ; LA32R-NEXT: andn $a2, $a2, $a1
122131; LA32R-NEXT: or $a0, $a0, $a1
123132; LA32R-NEXT: srli.w $a1, $a0, 4
133+ ; LA32R-NEXT: andn $a2, $a2, $a1
124134; LA32R-NEXT: or $a0, $a0, $a1
125135; LA32R-NEXT: srli.w $a1, $a0, 8
136+ ; LA32R-NEXT: andn $a2, $a2, $a1
126137; LA32R-NEXT: or $a0, $a0, $a1
127- ; LA32R-NEXT: srli.w $a1 , $a0, 16
128- ; LA32R-NEXT: nor $a0, $a0 , $a1
138+ ; LA32R-NEXT: srli.w $a0 , $a0, 16
139+ ; LA32R-NEXT: andn $a0, $a2 , $a0
129140; LA32R-NEXT: srli.w $a1, $a0, 1
130141; LA32R-NEXT: lu12i.w $a2, 349525
131142; LA32R-NEXT: ori $a2, $a2, 1365
@@ -175,15 +186,19 @@ define i64 @test_ctlz_i64(i64 %a) nounwind {
175186; LA32R-NEXT: bne $a1, $zero, .LBB3_2
176187; LA32R-NEXT: # %bb.1:
177188; LA32R-NEXT: srli.w $a1, $a0, 1
189+ ; LA32R-NEXT: nor $a6, $a0, $a1
178190; LA32R-NEXT: or $a0, $a0, $a1
179191; LA32R-NEXT: srli.w $a1, $a0, 2
192+ ; LA32R-NEXT: andn $a6, $a6, $a1
180193; LA32R-NEXT: or $a0, $a0, $a1
181194; LA32R-NEXT: srli.w $a1, $a0, 4
195+ ; LA32R-NEXT: andn $a6, $a6, $a1
182196; LA32R-NEXT: or $a0, $a0, $a1
183197; LA32R-NEXT: srli.w $a1, $a0, 8
198+ ; LA32R-NEXT: andn $a6, $a6, $a1
184199; LA32R-NEXT: or $a0, $a0, $a1
185- ; LA32R-NEXT: srli.w $a1 , $a0, 16
186- ; LA32R-NEXT: nor $a0, $a0 , $a1
200+ ; LA32R-NEXT: srli.w $a0 , $a0, 16
201+ ; LA32R-NEXT: andn $a0, $a6 , $a0
187202; LA32R-NEXT: srli.w $a1, $a0, 1
188203; LA32R-NEXT: and $a1, $a1, $a5
189204; LA32R-NEXT: sub.w $a0, $a0, $a1
@@ -201,15 +216,19 @@ define i64 @test_ctlz_i64(i64 %a) nounwind {
201216; LA32R-NEXT: ret
202217; LA32R-NEXT: .LBB3_2:
203218; LA32R-NEXT: srli.w $a0, $a1, 1
219+ ; LA32R-NEXT: nor $a6, $a1, $a0
204220; LA32R-NEXT: or $a0, $a1, $a0
205221; LA32R-NEXT: srli.w $a1, $a0, 2
222+ ; LA32R-NEXT: andn $a6, $a6, $a1
206223; LA32R-NEXT: or $a0, $a0, $a1
207224; LA32R-NEXT: srli.w $a1, $a0, 4
225+ ; LA32R-NEXT: andn $a6, $a6, $a1
208226; LA32R-NEXT: or $a0, $a0, $a1
209227; LA32R-NEXT: srli.w $a1, $a0, 8
228+ ; LA32R-NEXT: andn $a6, $a6, $a1
210229; LA32R-NEXT: or $a0, $a0, $a1
211- ; LA32R-NEXT: srli.w $a1 , $a0, 16
212- ; LA32R-NEXT: nor $a0, $a0 , $a1
230+ ; LA32R-NEXT: srli.w $a0 , $a0, 16
231+ ; LA32R-NEXT: andn $a0, $a6 , $a0
213232; LA32R-NEXT: srli.w $a1, $a0, 1
214233; LA32R-NEXT: and $a1, $a1, $a5
215234; LA32R-NEXT: sub.w $a0, $a0, $a1
@@ -250,14 +269,17 @@ define i8 @test_not_ctlz_i8(i8 %a) nounwind {
250269; LA32R: # %bb.0:
251270; LA32R-NEXT: ori $a1, $zero, 254
252271; LA32R-NEXT: andn $a1, $a1, $a0
272+ ; LA32R-NEXT: nor $a2, $a0, $zero
253273; LA32R-NEXT: srli.w $a1, $a1, 1
274+ ; LA32R-NEXT: nor $a2, $a2, $a1
254275; LA32R-NEXT: orn $a0, $a1, $a0
255276; LA32R-NEXT: andi $a1, $a0, 252
256277; LA32R-NEXT: srli.w $a1, $a1, 2
278+ ; LA32R-NEXT: andn $a2, $a2, $a1
257279; LA32R-NEXT: or $a0, $a0, $a1
258- ; LA32R-NEXT: andi $a1 , $a0, 240
259- ; LA32R-NEXT: srli.w $a1 , $a1 , 4
260- ; LA32R-NEXT: nor $a0, $a0 , $a1
280+ ; LA32R-NEXT: andi $a0 , $a0, 240
281+ ; LA32R-NEXT: srli.w $a0 , $a0 , 4
282+ ; LA32R-NEXT: andn $a0, $a2 , $a0
261283; LA32R-NEXT: srli.w $a1, $a0, 1
262284; LA32R-NEXT: andi $a1, $a1, 85
263285; LA32R-NEXT: sub.w $a0, $a0, $a1
@@ -293,19 +315,22 @@ define i16 @test_not_ctlz_i16(i16 %a) nounwind {
293315; LA32R-NEXT: ori $a2, $a1, 4094
294316; LA32R-NEXT: andn $a2, $a2, $a0
295317; LA32R-NEXT: srli.w $a2, $a2, 1
318+ ; LA32R-NEXT: andn $a3, $a0, $a2
296319; LA32R-NEXT: orn $a0, $a2, $a0
297320; LA32R-NEXT: ori $a2, $a1, 4092
298321; LA32R-NEXT: and $a2, $a0, $a2
299322; LA32R-NEXT: srli.w $a2, $a2, 2
323+ ; LA32R-NEXT: andn $a3, $a3, $a2
300324; LA32R-NEXT: or $a0, $a0, $a2
301325; LA32R-NEXT: ori $a2, $a1, 4080
302326; LA32R-NEXT: and $a2, $a0, $a2
303327; LA32R-NEXT: srli.w $a2, $a2, 4
328+ ; LA32R-NEXT: andn $a3, $a3, $a2
304329; LA32R-NEXT: or $a0, $a0, $a2
305330; LA32R-NEXT: ori $a1, $a1, 3840
306- ; LA32R-NEXT: and $a1 , $a0, $a1
307- ; LA32R-NEXT: srli.w $a1 , $a1 , 8
308- ; LA32R-NEXT: nor $a0, $a0 , $a1
331+ ; LA32R-NEXT: and $a0 , $a0, $a1
332+ ; LA32R-NEXT: srli.w $a0 , $a0 , 8
333+ ; LA32R-NEXT: andn $a0, $a3 , $a0
309334; LA32R-NEXT: srli.w $a1, $a0, 1
310335; LA32R-NEXT: lu12i.w $a2, 5
311336; LA32R-NEXT: ori $a2, $a2, 1365
@@ -345,16 +370,20 @@ define i32 @test_not_ctlz_i32(i32 %a) nounwind {
345370; LA32R-LABEL: test_not_ctlz_i32:
346371; LA32R: # %bb.0:
347372; LA32R-NEXT: nor $a1, $a0, $zero
348- ; LA32R-NEXT: srli.w $a1, $a1, 1
349- ; LA32R-NEXT: orn $a0, $a1, $a0
350- ; LA32R-NEXT: srli.w $a1, $a0, 2
351- ; LA32R-NEXT: or $a0, $a0, $a1
352- ; LA32R-NEXT: srli.w $a1, $a0, 4
353- ; LA32R-NEXT: or $a0, $a0, $a1
354- ; LA32R-NEXT: srli.w $a1, $a0, 8
355- ; LA32R-NEXT: or $a0, $a0, $a1
356- ; LA32R-NEXT: srli.w $a1, $a0, 16
357- ; LA32R-NEXT: nor $a0, $a0, $a1
373+ ; LA32R-NEXT: srli.w $a2, $a1, 1
374+ ; LA32R-NEXT: nor $a1, $a1, $a2
375+ ; LA32R-NEXT: orn $a0, $a2, $a0
376+ ; LA32R-NEXT: srli.w $a2, $a0, 2
377+ ; LA32R-NEXT: andn $a1, $a1, $a2
378+ ; LA32R-NEXT: or $a0, $a0, $a2
379+ ; LA32R-NEXT: srli.w $a2, $a0, 4
380+ ; LA32R-NEXT: andn $a1, $a1, $a2
381+ ; LA32R-NEXT: or $a0, $a0, $a2
382+ ; LA32R-NEXT: srli.w $a2, $a0, 8
383+ ; LA32R-NEXT: andn $a1, $a1, $a2
384+ ; LA32R-NEXT: or $a0, $a0, $a2
385+ ; LA32R-NEXT: srli.w $a0, $a0, 16
386+ ; LA32R-NEXT: andn $a0, $a1, $a0
358387; LA32R-NEXT: srli.w $a1, $a0, 1
359388; LA32R-NEXT: lu12i.w $a2, 349525
360389; LA32R-NEXT: ori $a2, $a2, 1365
@@ -406,16 +435,20 @@ define i64 @test_not_ctlz_i64(i64 %a) nounwind {
406435; LA32R-NEXT: bne $a6, $zero, .LBB7_2
407436; LA32R-NEXT: # %bb.1:
408437; LA32R-NEXT: nor $a1, $a0, $zero
409- ; LA32R-NEXT: srli.w $a1, $a1, 1
410- ; LA32R-NEXT: orn $a0, $a1, $a0
411- ; LA32R-NEXT: srli.w $a1, $a0, 2
412- ; LA32R-NEXT: or $a0, $a0, $a1
413- ; LA32R-NEXT: srli.w $a1, $a0, 4
414- ; LA32R-NEXT: or $a0, $a0, $a1
415- ; LA32R-NEXT: srli.w $a1, $a0, 8
416- ; LA32R-NEXT: or $a0, $a0, $a1
417- ; LA32R-NEXT: srli.w $a1, $a0, 16
418- ; LA32R-NEXT: nor $a0, $a0, $a1
438+ ; LA32R-NEXT: srli.w $a6, $a1, 1
439+ ; LA32R-NEXT: nor $a1, $a1, $a6
440+ ; LA32R-NEXT: orn $a0, $a6, $a0
441+ ; LA32R-NEXT: srli.w $a6, $a0, 2
442+ ; LA32R-NEXT: andn $a1, $a1, $a6
443+ ; LA32R-NEXT: or $a0, $a0, $a6
444+ ; LA32R-NEXT: srli.w $a6, $a0, 4
445+ ; LA32R-NEXT: andn $a1, $a1, $a6
446+ ; LA32R-NEXT: or $a0, $a0, $a6
447+ ; LA32R-NEXT: srli.w $a6, $a0, 8
448+ ; LA32R-NEXT: andn $a1, $a1, $a6
449+ ; LA32R-NEXT: or $a0, $a0, $a6
450+ ; LA32R-NEXT: srli.w $a0, $a0, 16
451+ ; LA32R-NEXT: andn $a0, $a1, $a0
419452; LA32R-NEXT: srli.w $a1, $a0, 1
420453; LA32R-NEXT: and $a1, $a1, $a5
421454; LA32R-NEXT: sub.w $a0, $a0, $a1
@@ -433,15 +466,19 @@ define i64 @test_not_ctlz_i64(i64 %a) nounwind {
433466; LA32R-NEXT: ret
434467; LA32R-NEXT: .LBB7_2:
435468; LA32R-NEXT: srli.w $a0, $a6, 1
469+ ; LA32R-NEXT: nor $a6, $a6, $a0
436470; LA32R-NEXT: orn $a0, $a0, $a1
437471; LA32R-NEXT: srli.w $a1, $a0, 2
472+ ; LA32R-NEXT: andn $a6, $a6, $a1
438473; LA32R-NEXT: or $a0, $a0, $a1
439474; LA32R-NEXT: srli.w $a1, $a0, 4
475+ ; LA32R-NEXT: andn $a6, $a6, $a1
440476; LA32R-NEXT: or $a0, $a0, $a1
441477; LA32R-NEXT: srli.w $a1, $a0, 8
478+ ; LA32R-NEXT: andn $a6, $a6, $a1
442479; LA32R-NEXT: or $a0, $a0, $a1
443- ; LA32R-NEXT: srli.w $a1 , $a0, 16
444- ; LA32R-NEXT: nor $a0, $a0 , $a1
480+ ; LA32R-NEXT: srli.w $a0 , $a0, 16
481+ ; LA32R-NEXT: andn $a0, $a6 , $a0
445482; LA32R-NEXT: srli.w $a1, $a0, 1
446483; LA32R-NEXT: and $a1, $a1, $a5
447484; LA32R-NEXT: sub.w $a0, $a0, $a1
0 commit comments