Skip to content

Commit 3ce9b86

Browse files
committed
[AArch64][NFC] Pre-commit Test for Combine MUL(AND(LSHR)) to CMLTz (#92915)
1 parent 8e12904 commit 3ce9b86

File tree

1 file changed

+105
-30
lines changed

1 file changed

+105
-30
lines changed

llvm/test/CodeGen/AArch64/mulcmle.ll

Lines changed: 105 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,153 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s
2+
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+
; RUN: llc -mtriple=aarch64 %s -o - -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
34

45
define <1 x i64> @v1i64(<1 x i64> %a) {
5-
; CHECK-LABEL: v1i64:
6-
; CHECK: // %bb.0:
7-
; CHECK-NEXT: cmlt v0.2s, v0.2s, #0
8-
; CHECK-NEXT: ret
6+
; CHECK-SD-LABEL: v1i64:
7+
; CHECK-SD: // %bb.0:
8+
; CHECK-SD-NEXT: cmlt v0.2s, v0.2s, #0
9+
; CHECK-SD-NEXT: ret
10+
;
11+
; CHECK-GI-LABEL: v1i64:
12+
; CHECK-GI: // %bb.0:
13+
; CHECK-GI-NEXT: fmov x8, d0
14+
; CHECK-GI-NEXT: lsr x8, x8, #31
15+
; CHECK-GI-NEXT: and x8, x8, #0x100000001
16+
; CHECK-GI-NEXT: lsl x9, x8, #32
17+
; CHECK-GI-NEXT: sub x8, x9, x8
18+
; CHECK-GI-NEXT: fmov d0, x8
19+
; CHECK-GI-NEXT: ret
920
%b = lshr <1 x i64> %a, <i64 31>
1021
%c = and <1 x i64> %b, <i64 4294967297>
1122
%d = mul nuw <1 x i64> %c, <i64 4294967295>
1223
ret <1 x i64> %d
1324
}
1425

1526
define <2 x i64> @v2i64(<2 x i64> %a) {
16-
; CHECK-LABEL: v2i64:
17-
; CHECK: // %bb.0:
18-
; CHECK-NEXT: cmlt v0.4s, v0.4s, #0
19-
; CHECK-NEXT: ret
27+
; CHECK-SD-LABEL: v2i64:
28+
; CHECK-SD: // %bb.0:
29+
; CHECK-SD-NEXT: cmlt v0.4s, v0.4s, #0
30+
; CHECK-SD-NEXT: ret
31+
;
32+
; CHECK-GI-LABEL: v2i64:
33+
; CHECK-GI: // %bb.0:
34+
; CHECK-GI-NEXT: movi v1.4s, #1
35+
; CHECK-GI-NEXT: ushr v0.2d, v0.2d, #31
36+
; CHECK-GI-NEXT: movi v2.2d, #0x000000ffffffff
37+
; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b
38+
; CHECK-GI-NEXT: fmov x11, d2
39+
; CHECK-GI-NEXT: mov x9, v2.d[1]
40+
; CHECK-GI-NEXT: fmov x10, d0
41+
; CHECK-GI-NEXT: mov x8, v0.d[1]
42+
; CHECK-GI-NEXT: mul x10, x10, x11
43+
; CHECK-GI-NEXT: mul x8, x8, x9
44+
; CHECK-GI-NEXT: fmov d0, x10
45+
; CHECK-GI-NEXT: mov v0.d[1], x8
46+
; CHECK-GI-NEXT: ret
2047
%b = lshr <2 x i64> %a, <i64 31, i64 31>
2148
%c = and <2 x i64> %b, <i64 4294967297, i64 4294967297>
2249
%d = mul nuw <2 x i64> %c, <i64 4294967295, i64 4294967295>
2350
ret <2 x i64> %d
2451
}
2552

2653
define <2 x i32> @v2i32(<2 x i32> %a) {
27-
; CHECK-LABEL: v2i32:
28-
; CHECK: // %bb.0:
29-
; CHECK-NEXT: cmlt v0.4h, v0.4h, #0
30-
; CHECK-NEXT: ret
54+
; CHECK-SD-LABEL: v2i32:
55+
; CHECK-SD: // %bb.0:
56+
; CHECK-SD-NEXT: cmlt v0.4h, v0.4h, #0
57+
; CHECK-SD-NEXT: ret
58+
;
59+
; CHECK-GI-LABEL: v2i32:
60+
; CHECK-GI: // %bb.0:
61+
; CHECK-GI-NEXT: movi v1.4h, #1
62+
; CHECK-GI-NEXT: ushr v0.2s, v0.2s, #15
63+
; CHECK-GI-NEXT: movi d2, #0x00ffff0000ffff
64+
; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b
65+
; CHECK-GI-NEXT: mul v0.2s, v0.2s, v2.2s
66+
; CHECK-GI-NEXT: ret
3167
%b = lshr <2 x i32> %a, <i32 15, i32 15>
3268
%c = and <2 x i32> %b, <i32 65537, i32 65537>
3369
%d = mul nuw <2 x i32> %c, <i32 65535, i32 65535>
3470
ret <2 x i32> %d
3571
}
3672

3773
define <4 x i32> @v4i32(<4 x i32> %a) {
38-
; CHECK-LABEL: v4i32:
39-
; CHECK: // %bb.0:
40-
; CHECK-NEXT: cmlt v0.8h, v0.8h, #0
41-
; CHECK-NEXT: ret
74+
; CHECK-SD-LABEL: v4i32:
75+
; CHECK-SD: // %bb.0:
76+
; CHECK-SD-NEXT: cmlt v0.8h, v0.8h, #0
77+
; CHECK-SD-NEXT: ret
78+
;
79+
; CHECK-GI-LABEL: v4i32:
80+
; CHECK-GI: // %bb.0:
81+
; CHECK-GI-NEXT: movi v1.8h, #1
82+
; CHECK-GI-NEXT: ushr v0.4s, v0.4s, #15
83+
; CHECK-GI-NEXT: movi v2.2d, #0x00ffff0000ffff
84+
; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b
85+
; CHECK-GI-NEXT: mul v0.4s, v0.4s, v2.4s
86+
; CHECK-GI-NEXT: ret
4287
%b = lshr <4 x i32> %a, <i32 15, i32 15, i32 15, i32 15>
4388
%c = and <4 x i32> %b, <i32 65537, i32 65537, i32 65537, i32 65537>
4489
%d = mul nuw <4 x i32> %c, <i32 65535, i32 65535, i32 65535, i32 65535>
4590
ret <4 x i32> %d
4691
}
4792

4893
define <8 x i32> @v8i32(<8 x i32> %a) {
49-
; CHECK-LABEL: v8i32:
50-
; CHECK: // %bb.0:
51-
; CHECK-NEXT: cmlt v0.8h, v0.8h, #0
52-
; CHECK-NEXT: cmlt v1.8h, v1.8h, #0
53-
; CHECK-NEXT: ret
94+
; CHECK-SD-LABEL: v8i32:
95+
; CHECK-SD: // %bb.0:
96+
; CHECK-SD-NEXT: cmlt v0.8h, v0.8h, #0
97+
; CHECK-SD-NEXT: cmlt v1.8h, v1.8h, #0
98+
; CHECK-SD-NEXT: ret
99+
;
100+
; CHECK-GI-LABEL: v8i32:
101+
; CHECK-GI: // %bb.0:
102+
; CHECK-GI-NEXT: movi v2.8h, #1
103+
; CHECK-GI-NEXT: ushr v0.4s, v0.4s, #15
104+
; CHECK-GI-NEXT: ushr v1.4s, v1.4s, #15
105+
; CHECK-GI-NEXT: movi v3.2d, #0x00ffff0000ffff
106+
; CHECK-GI-NEXT: and v0.16b, v0.16b, v2.16b
107+
; CHECK-GI-NEXT: and v1.16b, v1.16b, v2.16b
108+
; CHECK-GI-NEXT: mul v0.4s, v0.4s, v3.4s
109+
; CHECK-GI-NEXT: mul v1.4s, v1.4s, v3.4s
110+
; CHECK-GI-NEXT: ret
54111
%b = lshr <8 x i32> %a, <i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15>
55112
%c = and <8 x i32> %b, <i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537>
56113
%d = mul nuw <8 x i32> %c, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
57114
ret <8 x i32> %d
58115
}
59116

60117
define <4 x i16> @v4i16(<4 x i16> %a) {
61-
; CHECK-LABEL: v4i16:
62-
; CHECK: // %bb.0:
63-
; CHECK-NEXT: cmlt v0.8b, v0.8b, #0
64-
; CHECK-NEXT: ret
118+
; CHECK-SD-LABEL: v4i16:
119+
; CHECK-SD: // %bb.0:
120+
; CHECK-SD-NEXT: cmlt v0.8b, v0.8b, #0
121+
; CHECK-SD-NEXT: ret
122+
;
123+
; CHECK-GI-LABEL: v4i16:
124+
; CHECK-GI: // %bb.0:
125+
; CHECK-GI-NEXT: movi v1.8b, #1
126+
; CHECK-GI-NEXT: ushr v0.4h, v0.4h, #7
127+
; CHECK-GI-NEXT: movi d2, #0xff00ff00ff00ff
128+
; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b
129+
; CHECK-GI-NEXT: mul v0.4h, v0.4h, v2.4h
130+
; CHECK-GI-NEXT: ret
65131
%b = lshr <4 x i16> %a, <i16 7, i16 7, i16 7, i16 7>
66132
%c = and <4 x i16> %b, <i16 257, i16 257, i16 257, i16 257>
67133
%d = mul nuw <4 x i16> %c, <i16 255, i16 255, i16 255, i16 255>
68134
ret <4 x i16> %d
69135
}
70136

71137
define <8 x i16> @v8i16(<8 x i16> %a) {
72-
; CHECK-LABEL: v8i16:
73-
; CHECK: // %bb.0:
74-
; CHECK-NEXT: cmlt v0.16b, v0.16b, #0
75-
; CHECK-NEXT: ret
138+
; CHECK-SD-LABEL: v8i16:
139+
; CHECK-SD: // %bb.0:
140+
; CHECK-SD-NEXT: cmlt v0.16b, v0.16b, #0
141+
; CHECK-SD-NEXT: ret
142+
;
143+
; CHECK-GI-LABEL: v8i16:
144+
; CHECK-GI: // %bb.0:
145+
; CHECK-GI-NEXT: movi v1.16b, #1
146+
; CHECK-GI-NEXT: ushr v0.8h, v0.8h, #7
147+
; CHECK-GI-NEXT: movi v2.2d, #0xff00ff00ff00ff
148+
; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b
149+
; CHECK-GI-NEXT: mul v0.8h, v0.8h, v2.8h
150+
; CHECK-GI-NEXT: ret
76151
%b = lshr <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
77152
%c = and <8 x i16> %b, <i16 257, i16 257, i16 257, i16 257, i16 257, i16 257, i16 257, i16 257>
78153
%d = mul nuw <8 x i16> %c, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>

0 commit comments

Comments
 (0)