1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
1
2
; RUN: llc -mtriple=aarch64-eabi %s -o - | FileCheck %s
2
3
3
4
; These tests just check that the plumbing is in place for @llvm.bitreverse.
@@ -6,13 +7,16 @@ declare <2 x i16> @llvm.bitreverse.v2i16(<2 x i16>) readnone
6
7
7
8
define <2 x i16 > @f (<2 x i16 > %a ) {
8
9
; CHECK-LABEL: f:
9
- ; CHECK: fmov [[REG1:w[0-9]+]], s0
10
- ; CHECK-DAG: rbit [[REG2:w[0-9]+]], [[REG1]]
11
- ; CHECK-DAG: fmov s0, [[REG2]]
12
- ; CHECK-DAG: mov [[REG3:w[0-9]+]], v0.s[1]
13
- ; CHECK-DAG: rbit [[REG4:w[0-9]+]], [[REG3]]
14
- ; CHECK-DAG: mov v0.s[1], [[REG4]]
15
- ; CHECK-DAG: ushr v0.2s, v0.2s, #16
10
+ ; CHECK: // %bb.0:
11
+ ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
12
+ ; CHECK-NEXT: fmov w8, s0
13
+ ; CHECK-NEXT: rbit w8, w8
14
+ ; CHECK-NEXT: mov w9, v0.s[1]
15
+ ; CHECK-NEXT: fmov s0, w8
16
+ ; CHECK-NEXT: rbit w8, w9
17
+ ; CHECK-NEXT: mov v0.s[1], w8
18
+ ; CHECK-NEXT: ushr v0.2s, v0.2s, #16
19
+ ; CHECK-NEXT: ret
16
20
%b = call <2 x i16 > @llvm.bitreverse.v2i16 (<2 x i16 > %a )
17
21
ret <2 x i16 > %b
18
22
}
@@ -21,41 +25,161 @@ declare i8 @llvm.bitreverse.i8(i8) readnone
21
25
22
26
define i8 @g (i8 %a ) {
23
27
; CHECK-LABEL: g:
24
- ; CHECK: rbit [[REG:w[0-9]+]], w0
25
- ; CHECK-NEXT: lsr w0, [[REG]], #24
26
- ; CHECK-NEXT: ret
28
+ ; CHECK: // %bb.0:
29
+ ; CHECK-NEXT: rbit w8, w0
30
+ ; CHECK-NEXT: lsr w0, w8, #24
31
+ ; CHECK-NEXT: ret
27
32
%b = call i8 @llvm.bitreverse.i8 (i8 %a )
28
33
ret i8 %b
29
34
}
30
35
36
+ declare i16 @llvm.bitreverse.i16 (i16 ) readnone
37
+
38
+ define i16 @g_16 (i16 %a ) {
39
+ ; CHECK-LABEL: g_16:
40
+ ; CHECK: // %bb.0:
41
+ ; CHECK-NEXT: rbit w8, w0
42
+ ; CHECK-NEXT: lsr w0, w8, #16
43
+ ; CHECK-NEXT: ret
44
+ %b = call i16 @llvm.bitreverse.i16 (i16 %a )
45
+ ret i16 %b
46
+ }
47
+
48
+ declare i32 @llvm.bitreverse.i32 (i32 ) readnone
49
+
50
+ define i32 @g_32 (i32 %a ) {
51
+ ; CHECK-LABEL: g_32:
52
+ ; CHECK: // %bb.0:
53
+ ; CHECK-NEXT: rbit w0, w0
54
+ ; CHECK-NEXT: ret
55
+ %b = call i32 @llvm.bitreverse.i32 (i32 %a )
56
+ ret i32 %b
57
+ }
58
+
59
+ declare i64 @llvm.bitreverse.i64 (i64 ) readnone
60
+
61
+ define i64 @g_64 (i64 %a ) {
62
+ ; CHECK-LABEL: g_64:
63
+ ; CHECK: // %bb.0:
64
+ ; CHECK-NEXT: rbit x0, x0
65
+ ; CHECK-NEXT: ret
66
+ %b = call i64 @llvm.bitreverse.i64 (i64 %a )
67
+ ret i64 %b
68
+ }
69
+
31
70
declare <8 x i8 > @llvm.bitreverse.v8i8 (<8 x i8 >) readnone
32
71
33
72
define <8 x i8 > @g_vec (<8 x i8 > %a ) {
34
- ; CHECK-DAG: movi [[M1:v.*]], #15
35
- ; CHECK-DAG: movi [[M2:v.*]], #240
36
- ; CHECK: and [[A1:v.*]], v0.8b, [[M1]]
37
- ; CHECK: and [[A2:v.*]], v0.8b, [[M2]]
38
- ; CHECK-DAG: shl [[L4:v.*]], [[A1]], #4
39
- ; CHECK-DAG: ushr [[R4:v.*]], [[A2]], #4
40
- ; CHECK-DAG: orr [[V4:v.*]], [[R4]], [[L4]]
41
-
42
- ; CHECK-DAG: movi [[M3:v.*]], #51
43
- ; CHECK-DAG: movi [[M4:v.*]], #204
44
- ; CHECK: and [[A3:v.*]], [[V4]], [[M3]]
45
- ; CHECK: and [[A4:v.*]], [[V4]], [[M4]]
46
- ; CHECK-DAG: shl [[L2:v.*]], [[A3]], #2
47
- ; CHECK-DAG: ushr [[R2:v.*]], [[A4]], #2
48
- ; CHECK-DAG: orr [[V2:v.*]], [[R2]], [[L2]]
49
-
50
- ; CHECK-DAG: movi [[M5:v.*]], #85
51
- ; CHECK-DAG: movi [[M6:v.*]], #170
52
- ; CHECK: and [[A5:v.*]], [[V2]], [[M5]]
53
- ; CHECK: and [[A6:v.*]], [[V2]], [[M6]]
54
- ; CHECK-DAG: shl [[L1:v.*]], [[A5]], #1
55
- ; CHECK-DAG: ushr [[R1:v.*]], [[A6]], #1
56
- ; CHECK: orr [[V1:v.*]], [[R1]], [[L1]]
57
-
58
- ; CHECK: ret
73
+ ; CHECK-LABEL: g_vec:
74
+ ; CHECK: // %bb.0:
75
+ ; CHECK-NEXT: rbit v0.8b, v0.8b
76
+ ; CHECK-NEXT: ret
59
77
%b = call <8 x i8 > @llvm.bitreverse.v8i8 (<8 x i8 > %a )
60
78
ret <8 x i8 > %b
61
79
}
80
+
81
+ declare <16 x i8 > @llvm.bitreverse.v16i8 (<16 x i8 >) readnone
82
+
83
+ define <16 x i8 > @g_vec_16x8 (<16 x i8 > %a ) {
84
+ ; CHECK-LABEL: g_vec_16x8:
85
+ ; CHECK: // %bb.0:
86
+ ; CHECK-NEXT: rbit v0.16b, v0.16b
87
+ ; CHECK-NEXT: ret
88
+ %b = call <16 x i8 > @llvm.bitreverse.v16i8 (<16 x i8 > %a )
89
+ ret <16 x i8 > %b
90
+ }
91
+
92
+ declare <4 x i16 > @llvm.bitreverse.v4i16 (<4 x i16 >) readnone
93
+
94
+ define <4 x i16 > @g_vec_4x16 (<4 x i16 > %a ) {
95
+ ; CHECK-LABEL: g_vec_4x16:
96
+ ; CHECK: // %bb.0:
97
+ ; CHECK-NEXT: rev16 v0.8b, v0.8b
98
+ ; CHECK-NEXT: rbit v0.8b, v0.8b
99
+ ; CHECK-NEXT: ret
100
+ %b = call <4 x i16 > @llvm.bitreverse.v4i16 (<4 x i16 > %a )
101
+ ret <4 x i16 > %b
102
+ }
103
+
104
+ declare <8 x i16 > @llvm.bitreverse.v8i16 (<8 x i16 >) readnone
105
+
106
+ define <8 x i16 > @g_vec_8x16 (<8 x i16 > %a ) {
107
+ ; CHECK-LABEL: g_vec_8x16:
108
+ ; CHECK: // %bb.0:
109
+ ; CHECK-NEXT: rev16 v0.16b, v0.16b
110
+ ; CHECK-NEXT: rbit v0.16b, v0.16b
111
+ ; CHECK-NEXT: ret
112
+ %b = call <8 x i16 > @llvm.bitreverse.v8i16 (<8 x i16 > %a )
113
+ ret <8 x i16 > %b
114
+ }
115
+
116
+ declare <2 x i32 > @llvm.bitreverse.v2i32 (<2 x i32 >) readnone
117
+
118
+ define <2 x i32 > @g_vec_2x32 (<2 x i32 > %a ) {
119
+ ; CHECK-LABEL: g_vec_2x32:
120
+ ; CHECK: // %bb.0:
121
+ ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
122
+ ; CHECK-NEXT: fmov w8, s0
123
+ ; CHECK-NEXT: rbit w8, w8
124
+ ; CHECK-NEXT: mov w9, v0.s[1]
125
+ ; CHECK-NEXT: fmov s0, w8
126
+ ; CHECK-NEXT: rbit w8, w9
127
+ ; CHECK-NEXT: mov v0.s[1], w8
128
+ ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
129
+ ; CHECK-NEXT: ret
130
+
131
+ %b = call <2 x i32 > @llvm.bitreverse.v2i32 (<2 x i32 > %a )
132
+ ret <2 x i32 > %b
133
+ }
134
+
135
+ declare <4 x i32 > @llvm.bitreverse.v4i32 (<4 x i32 >) readnone
136
+
137
+ define <4 x i32 > @g_vec_4x32 (<4 x i32 > %a ) {
138
+ ; CHECK-LABEL: g_vec_4x32:
139
+ ; CHECK: // %bb.0:
140
+ ; CHECK-NEXT: fmov w10, s0
141
+ ; CHECK-NEXT: mov w8, v0.s[1]
142
+ ; CHECK-NEXT: rbit w10, w10
143
+ ; CHECK-NEXT: mov w9, v0.s[2]
144
+ ; CHECK-NEXT: mov w11, v0.s[3]
145
+ ; CHECK-NEXT: fmov s0, w10
146
+ ; CHECK-NEXT: rbit w8, w8
147
+ ; CHECK-NEXT: rbit w9, w9
148
+ ; CHECK-NEXT: mov v0.s[1], w8
149
+ ; CHECK-NEXT: mov v0.s[2], w9
150
+ ; CHECK-NEXT: rbit w8, w11
151
+ ; CHECK-NEXT: mov v0.s[3], w8
152
+ ; CHECK-NEXT: ret
153
+ %b = call <4 x i32 > @llvm.bitreverse.v4i32 (<4 x i32 > %a )
154
+ ret <4 x i32 > %b
155
+ }
156
+
157
+ declare <1 x i64 > @llvm.bitreverse.v1i64 (<1 x i64 >) readnone
158
+
159
+ define <1 x i64 > @g_vec_1x64 (<1 x i64 > %a ) {
160
+ ; CHECK-LABEL: g_vec_1x64:
161
+ ; CHECK: // %bb.0:
162
+ ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
163
+ ; CHECK-NEXT: fmov x8, d0
164
+ ; CHECK-NEXT: rbit x8, x8
165
+ ; CHECK-NEXT: fmov d0, x8
166
+ ; CHECK-NEXT: ret
167
+ %b = call <1 x i64 > @llvm.bitreverse.v1i64 (<1 x i64 > %a )
168
+ ret <1 x i64 > %b
169
+ }
170
+
171
+ declare <2 x i64 > @llvm.bitreverse.v2i64 (<2 x i64 >) readnone
172
+
173
+ define <2 x i64 > @g_vec_2x64 (<2 x i64 > %a ) {
174
+ ; CHECK-LABEL: g_vec_2x64:
175
+ ; CHECK: // %bb.0:
176
+ ; CHECK-NEXT: fmov x8, d0
177
+ ; CHECK-NEXT: rbit x8, x8
178
+ ; CHECK-NEXT: mov x9, v0.d[1]
179
+ ; CHECK-NEXT: fmov d0, x8
180
+ ; CHECK-NEXT: rbit x8, x9
181
+ ; CHECK-NEXT: mov v0.d[1], x8
182
+ ; CHECK-NEXT: ret
183
+ %b = call <2 x i64 > @llvm.bitreverse.v2i64 (<2 x i64 > %a )
184
+ ret <2 x i64 > %b
185
+ }
0 commit comments