@@ -7,11 +7,9 @@ target triple = "aarch64-unknown-linux-gnu"
77define i1 @extract_icmp_v4i32_const_splat_rhs (<4 x i32 > %a ) {
88; CHECK-LABEL: extract_icmp_v4i32_const_splat_rhs:
99; CHECK: // %bb.0:
10- ; CHECK-NEXT: movi v1.4s, #5
11- ; CHECK-NEXT: cmhi v0.4s, v1.4s, v0.4s
12- ; CHECK-NEXT: xtn v0.4h, v0.4s
13- ; CHECK-NEXT: umov w8, v0.h[1]
14- ; CHECK-NEXT: and w0, w8, #0x1
10+ ; CHECK-NEXT: mov w8, v0.s[1]
11+ ; CHECK-NEXT: cmp w8, #5
12+ ; CHECK-NEXT: cset w0, lo
1513; CHECK-NEXT: ret
1614 %icmp = icmp ult <4 x i32 > %a , splat (i32 5 )
1715 %ext = extractelement <4 x i1 > %icmp , i32 1
@@ -21,11 +19,9 @@ define i1 @extract_icmp_v4i32_const_splat_rhs(<4 x i32> %a) {
2119define i1 @extract_icmp_v4i32_const_splat_lhs (<4 x i32 > %a ) {
2220; CHECK-LABEL: extract_icmp_v4i32_const_splat_lhs:
2321; CHECK: // %bb.0:
24- ; CHECK-NEXT: movi v1.4s, #7
25- ; CHECK-NEXT: cmhi v0.4s, v0.4s, v1.4s
26- ; CHECK-NEXT: xtn v0.4h, v0.4s
27- ; CHECK-NEXT: umov w8, v0.h[1]
28- ; CHECK-NEXT: and w0, w8, #0x1
22+ ; CHECK-NEXT: mov w8, v0.s[1]
23+ ; CHECK-NEXT: cmp w8, #7
24+ ; CHECK-NEXT: cset w0, hi
2925; CHECK-NEXT: ret
3026 %icmp = icmp ult <4 x i32 > splat(i32 7 ), %a
3127 %ext = extractelement <4 x i1 > %icmp , i32 1
@@ -35,12 +31,9 @@ define i1 @extract_icmp_v4i32_const_splat_lhs(<4 x i32> %a) {
3531define i1 @extract_icmp_v4i32_const_vec_rhs (<4 x i32 > %a ) {
3632; CHECK-LABEL: extract_icmp_v4i32_const_vec_rhs:
3733; CHECK: // %bb.0:
38- ; CHECK-NEXT: adrp x8, .LCPI2_0
39- ; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI2_0]
40- ; CHECK-NEXT: cmhi v0.4s, v1.4s, v0.4s
41- ; CHECK-NEXT: xtn v0.4h, v0.4s
42- ; CHECK-NEXT: umov w8, v0.h[1]
43- ; CHECK-NEXT: and w0, w8, #0x1
34+ ; CHECK-NEXT: mov w8, v0.s[1]
35+ ; CHECK-NEXT: cmp w8, #234
36+ ; CHECK-NEXT: cset w0, lo
4437; CHECK-NEXT: ret
4538 %icmp = icmp ult <4 x i32 > %a , <i32 5 , i32 234 , i32 -1 , i32 7 >
4639 %ext = extractelement <4 x i1 > %icmp , i32 1
@@ -50,27 +43,25 @@ define i1 @extract_icmp_v4i32_const_vec_rhs(<4 x i32> %a) {
5043define i1 @extract_fcmp_v4f32_const_splat_rhs (<4 x float > %a ) {
5144; CHECK-LABEL: extract_fcmp_v4f32_const_splat_rhs:
5245; CHECK: // %bb.0:
53- ; CHECK-NEXT: fmov v1.4s, #4.00000000
54- ; CHECK-NEXT: fcmge v0.4s, v0.4s, v1.4s
55- ; CHECK-NEXT: mvn v0.16b, v0.16b
56- ; CHECK-NEXT: xtn v0.4h, v0.4s
57- ; CHECK-NEXT: umov w8, v0.h[1]
58- ; CHECK-NEXT: and w0, w8, #0x1
46+ ; CHECK-NEXT: mov s0, v0.s[1]
47+ ; CHECK-NEXT: fmov s1, #4.00000000
48+ ; CHECK-NEXT: fcmp s0, s1
49+ ; CHECK-NEXT: cset w0, lt
5950; CHECK-NEXT: ret
6051 %fcmp = fcmp ult <4 x float > %a , splat(float 4 .0e+0 )
6152 %ext = extractelement <4 x i1 > %fcmp , i32 1
6253 ret i1 %ext
6354}
6455
56+ ; Tests the code in ExpandIntRes_SETCC
6557define i128 @extract_icmp_v1i128 (ptr %p ) {
6658; CHECK-LABEL: extract_icmp_v1i128:
6759; CHECK: // %bb.0:
6860; CHECK-NEXT: ldp x9, x8, [x0]
61+ ; CHECK-NEXT: mov x1, xzr
6962; CHECK-NEXT: orr x8, x9, x8
7063; CHECK-NEXT: cmp x8, #0
71- ; CHECK-NEXT: cset w8, eq
72- ; CHECK-NEXT: sbfx x0, x8, #0, #1
73- ; CHECK-NEXT: mov x1, x0
64+ ; CHECK-NEXT: cset w0, eq
7465; CHECK-NEXT: ret
7566 %load = load <1 x i128 >, ptr %p , align 16
7667 %cmp = icmp eq <1 x i128 > %load , zeroinitializer
@@ -83,39 +74,34 @@ define void @vector_loop_with_icmp(ptr nocapture noundef writeonly %dest) {
8374; CHECK-LABEL: vector_loop_with_icmp:
8475; CHECK: // %bb.0: // %entry
8576; CHECK-NEXT: index z0.d, #0, #1
86- ; CHECK-NEXT: mov w8, #15 // =0xf
87- ; CHECK-NEXT: mov w9, #2 // =0x2
77+ ; CHECK-NEXT: mov w8, #2 // =0x2
78+ ; CHECK-NEXT: mov w9, #16 // =0x10
8879; CHECK-NEXT: dup v1.2d, x8
89- ; CHECK-NEXT: dup v2.2d, x9
90- ; CHECK-NEXT: add x9, x0, #4
91- ; CHECK-NEXT: mov w10, #16 // =0x10
92- ; CHECK-NEXT: mov w11, #1 // =0x1
80+ ; CHECK-NEXT: add x8, x0, #4
81+ ; CHECK-NEXT: mov w10, #1 // =0x1
9382; CHECK-NEXT: b .LBB5_2
9483; CHECK-NEXT: .LBB5_1: // %pred.store.continue6
9584; CHECK-NEXT: // in Loop: Header=BB5_2 Depth=1
96- ; CHECK-NEXT: add v0.2d, v0.2d, v2 .2d
97- ; CHECK-NEXT: subs x10, x10 , #2
98- ; CHECK-NEXT: add x9, x9 , #8
85+ ; CHECK-NEXT: add v0.2d, v0.2d, v1 .2d
86+ ; CHECK-NEXT: subs x9, x9 , #2
87+ ; CHECK-NEXT: add x8, x8 , #8
9988; CHECK-NEXT: b.eq .LBB5_6
10089; CHECK-NEXT: .LBB5_2: // %vector.body
10190; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
102- ; CHECK-NEXT: cmhi v3.2d, v1.2d, v0.2d
103- ; CHECK-NEXT: xtn v3.2s, v3.2d
104- ; CHECK-NEXT: fmov w12, s3
105- ; CHECK-NEXT: tbz w12, #0, .LBB5_4
91+ ; CHECK-NEXT: fmov x11, d0
92+ ; CHECK-NEXT: cmp x11, #14
93+ ; CHECK-NEXT: b.hi .LBB5_4
10694; CHECK-NEXT: // %bb.3: // %pred.store.if
10795; CHECK-NEXT: // in Loop: Header=BB5_2 Depth=1
108- ; CHECK-NEXT: stur w11 , [x9 , #-4]
96+ ; CHECK-NEXT: stur w10 , [x8 , #-4]
10997; CHECK-NEXT: .LBB5_4: // %pred.store.continue
11098; CHECK-NEXT: // in Loop: Header=BB5_2 Depth=1
111- ; CHECK-NEXT: dup v3.2d, x8
112- ; CHECK-NEXT: cmhi v3.2d, v3.2d, v0.2d
113- ; CHECK-NEXT: xtn v3.2s, v3.2d
114- ; CHECK-NEXT: mov w12, v3.s[1]
115- ; CHECK-NEXT: tbz w12, #0, .LBB5_1
99+ ; CHECK-NEXT: mov x11, v0.d[1]
100+ ; CHECK-NEXT: cmp x11, #14
101+ ; CHECK-NEXT: b.hi .LBB5_1
116102; CHECK-NEXT: // %bb.5: // %pred.store.if5
117103; CHECK-NEXT: // in Loop: Header=BB5_2 Depth=1
118- ; CHECK-NEXT: str w11 , [x9 ]
104+ ; CHECK-NEXT: str w10 , [x8 ]
119105; CHECK-NEXT: b .LBB5_1
120106; CHECK-NEXT: .LBB5_6: // %for.cond.cleanup
121107; CHECK-NEXT: ret
@@ -215,3 +201,4 @@ define i1 @extract_icmp_v4i32_splat_rhs_unknown_idx(<4 x i32> %a, i32 %c) {
215201 %ext = extractelement <4 x i1 > %icmp , i32 %c
216202 ret i1 %ext
217203}
204+
0 commit comments