1
- ; RUN: llc < %s -asm-verbose=0 -mtriple=arm64-eabi -mattr=+bf16 | FileCheck %s
2
- ; RUN: llc < %s -asm-verbose=0 -mtriple=aarch64 -mattr=+bf16 | FileCheck %s
1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2
+ ; RUN: llc < %s -mtriple=arm64-eabi -mattr=+bf16 | FileCheck %s
3
+ ; RUN: llc < %s -mtriple=aarch64 -mattr=+bf16 | FileCheck %s
3
4
4
5
; test argument passing and simple load/store
5
6
6
7
define bfloat @test_load (ptr %p ) nounwind {
7
8
; CHECK-LABEL: test_load:
8
- ; CHECK-NEXT: ldr h0, [x0]
9
- ; CHECK-NEXT: ret
9
+ ; CHECK: // %bb.0:
10
+ ; CHECK-NEXT: ldr h0, [x0]
11
+ ; CHECK-NEXT: ret
10
12
%tmp1 = load bfloat, ptr %p , align 16
11
13
ret bfloat %tmp1
12
14
}
13
15
14
16
define bfloat @test_load_offset1 (ptr %p ) nounwind {
15
17
; CHECK-LABEL: test_load_offset1:
16
- ; CHECK-NEXT: ldur h0, [x0, #1]
17
- ; CHECK-NEXT: ret
18
+ ; CHECK: // %bb.0:
19
+ ; CHECK-NEXT: ldur h0, [x0, #1]
20
+ ; CHECK-NEXT: ret
18
21
%g = getelementptr inbounds i8 , ptr %p , i64 1
19
22
%tmp1 = load bfloat, ptr %g , align 2
20
23
ret bfloat %tmp1
21
24
}
22
25
23
26
define bfloat @test_load_offset2 (ptr %p ) nounwind {
24
27
; CHECK-LABEL: test_load_offset2:
25
- ; CHECK-NEXT: ldr h0, [x0, #2]
26
- ; CHECK-NEXT: ret
28
+ ; CHECK: // %bb.0:
29
+ ; CHECK-NEXT: ldr h0, [x0, #2]
30
+ ; CHECK-NEXT: ret
27
31
%g = getelementptr inbounds i8 , ptr %p , i64 2
28
32
%tmp1 = load bfloat, ptr %g , align 2
29
33
ret bfloat %tmp1
30
34
}
31
35
32
36
define <4 x bfloat> @test_vec_load (ptr %p ) nounwind {
33
37
; CHECK-LABEL: test_vec_load:
34
- ; CHECK-NEXT: ldr d0, [x0]
35
- ; CHECK-NEXT: ret
38
+ ; CHECK: // %bb.0:
39
+ ; CHECK-NEXT: ldr d0, [x0]
40
+ ; CHECK-NEXT: ret
36
41
%tmp1 = load <4 x bfloat>, ptr %p , align 16
37
42
ret <4 x bfloat> %tmp1
38
43
}
39
44
40
45
define void @test_store (ptr %a , bfloat %b ) nounwind {
41
46
; CHECK-LABEL: test_store:
42
- ; CHECK-NEXT: str h0, [x0]
43
- ; CHECK-NEXT: ret
47
+ ; CHECK: // %bb.0:
48
+ ; CHECK-NEXT: str h0, [x0]
49
+ ; CHECK-NEXT: ret
44
50
store bfloat %b , ptr %a , align 16
45
51
ret void
46
52
}
47
53
48
54
define void @test_store_negative_offset (ptr %a , bfloat %b ) nounwind {
49
55
; CHECK-LABEL: test_store_negative_offset:
50
- ; CHECK-NEXT: stur h0, [x0, #-4]
51
- ; CHECK-NEXT: ret
56
+ ; CHECK: // %bb.0: // %entry
57
+ ; CHECK-NEXT: stur h0, [x0, #-4]
58
+ ; CHECK-NEXT: ret
52
59
entry:
53
60
%0 = getelementptr inbounds bfloat, ptr %a , i64 -2
54
61
store bfloat %b , ptr %0 , align 2
@@ -58,69 +65,179 @@ entry:
58
65
; Simple store of v4bf16
59
66
define void @test_vec_store (ptr %a , <4 x bfloat> %b ) nounwind {
60
67
; CHECK-LABEL: test_vec_store:
61
- ; CHECK-NEXT: str d0, [x0]
62
- ; CHECK-NEXT: ret
68
+ ; CHECK: // %bb.0: // %entry
69
+ ; CHECK-NEXT: str d0, [x0]
70
+ ; CHECK-NEXT: ret
63
71
entry:
64
72
store <4 x bfloat> %b , ptr %a , align 16
65
73
ret void
66
74
}
67
75
68
76
define <8 x bfloat> @test_build_vector_const () {
69
77
; CHECK-LABEL: test_build_vector_const:
70
- ; CHECK: mov [[TMP:w[0-9]+]], #16256
71
- ; CHECK: dup v0.8h, [[TMP]]
78
+ ; CHECK: // %bb.0:
79
+ ; CHECK-NEXT: mov w8, #16256 // =0x3f80
80
+ ; CHECK-NEXT: dup v0.8h, w8
81
+ ; CHECK-NEXT: ret
72
82
ret <8 x bfloat> <bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80>
73
83
}
74
84
75
- define { bfloat, ptr } @test_store_post (bfloat %val , ptr %ptr ) {
85
+ define ptr @test_store_post (bfloat %val , ptr %ptr ) {
76
86
; CHECK-LABEL: test_store_post:
77
- ; CHECK: str h0, [x0], #2
78
-
87
+ ; CHECK: // %bb.0:
88
+ ; CHECK-NEXT: str h0, [x0], #2
89
+ ; CHECK-NEXT: ret
79
90
store bfloat %val , ptr %ptr
80
- %res.tmp = insertvalue { bfloat, ptr } undef , bfloat %val , 0
91
+ %next = getelementptr bfloat, ptr %ptr , i32 1
92
+ ret ptr %next
93
+ }
94
+
95
+ define ptr @test_store_post_v4bf16 (<4 x bfloat> %val , ptr %ptr ) {
96
+ ; CHECK-LABEL: test_store_post_v4bf16:
97
+ ; CHECK: // %bb.0:
98
+ ; CHECK-NEXT: str d0, [x0], #8
99
+ ; CHECK-NEXT: ret
100
+ store <4 x bfloat> %val , ptr %ptr
101
+ %next = getelementptr <4 x bfloat>, ptr %ptr , i32 1
102
+ ret ptr %next
103
+ }
104
+
105
+ define ptr @test_store_post_v8bf16 (<8 x bfloat> %val , ptr %ptr ) {
106
+ ; CHECK-LABEL: test_store_post_v8bf16:
107
+ ; CHECK: // %bb.0:
108
+ ; CHECK-NEXT: str q0, [x0], #16
109
+ ; CHECK-NEXT: ret
110
+ store <8 x bfloat> %val , ptr %ptr
111
+ %next = getelementptr <8 x bfloat>, ptr %ptr , i32 1
112
+ ret ptr %next
113
+ }
81
114
115
+ define { bfloat, ptr } @test_load_post (ptr %ptr ) {
116
+ ; CHECK-LABEL: test_load_post:
117
+ ; CHECK: // %bb.0:
118
+ ; CHECK-NEXT: ldr h0, [x0], #2
119
+ ; CHECK-NEXT: ret
120
+ %val = load bfloat, ptr %ptr
121
+ %res.tmp = insertvalue { bfloat, ptr } undef , bfloat %val , 0
82
122
%next = getelementptr bfloat, ptr %ptr , i32 1
83
123
%res = insertvalue { bfloat, ptr } %res.tmp , ptr %next , 1
84
-
85
124
ret { bfloat, ptr } %res
86
125
}
87
126
88
- define { <4 x bfloat>, ptr } @test_store_post_v4bf16 (<4 x bfloat> %val , ptr %ptr ) {
89
- ; CHECK-LABEL: test_store_post_v4bf16:
90
- ; CHECK: str d0, [x0], #8
91
-
92
- store <4 x bfloat> %val , ptr %ptr
127
+ define { <4 x bfloat>, ptr } @test_load_post_v4bf16 (ptr %ptr ) {
128
+ ; CHECK-LABEL: test_load_post_v4bf16:
129
+ ; CHECK: // %bb.0:
130
+ ; CHECK-NEXT: ldr d0, [x0], #8
131
+ ; CHECK-NEXT: ret
132
+ %val = load <4 x bfloat>, ptr %ptr
93
133
%res.tmp = insertvalue { <4 x bfloat>, ptr } undef , <4 x bfloat> %val , 0
94
-
95
134
%next = getelementptr <4 x bfloat>, ptr %ptr , i32 1
96
135
%res = insertvalue { <4 x bfloat>, ptr } %res.tmp , ptr %next , 1
97
-
98
136
ret { <4 x bfloat>, ptr } %res
99
137
}
100
138
101
- define { <8 x bfloat>, ptr } @test_store_post_v8bf16 (<8 x bfloat> %val , ptr %ptr ) {
102
- ; CHECK-LABEL: test_store_post_v8bf16:
103
- ; CHECK: str q0, [x0], #16
104
-
105
- store <8 x bfloat> %val , ptr %ptr
139
+ define { <8 x bfloat>, ptr } @test_load_post_v8bf16 (ptr %ptr ) {
140
+ ; CHECK-LABEL: test_load_post_v8bf16:
141
+ ; CHECK: // %bb.0:
142
+ ; CHECK-NEXT: ldr q0, [x0], #16
143
+ ; CHECK-NEXT: ret
144
+ %val = load <8 x bfloat>, ptr %ptr
106
145
%res.tmp = insertvalue { <8 x bfloat>, ptr } undef , <8 x bfloat> %val , 0
107
-
108
146
%next = getelementptr <8 x bfloat>, ptr %ptr , i32 1
109
147
%res = insertvalue { <8 x bfloat>, ptr } %res.tmp , ptr %next , 1
148
+ ret { <8 x bfloat>, ptr } %res
149
+ }
110
150
151
+ define ptr @test_store_pre (bfloat %val , ptr %ptr ) {
152
+ ; CHECK-LABEL: test_store_pre:
153
+ ; CHECK: // %bb.0:
154
+ ; CHECK-NEXT: str h0, [x0, #2]!
155
+ ; CHECK-NEXT: ret
156
+ %next = getelementptr bfloat, ptr %ptr , i32 1
157
+ store bfloat %val , ptr %next
158
+ ret ptr %next
159
+ }
160
+
161
+ define ptr @test_store_pre_v4bf16 (<4 x bfloat> %val , ptr %ptr ) {
162
+ ; CHECK-LABEL: test_store_pre_v4bf16:
163
+ ; CHECK: // %bb.0:
164
+ ; CHECK-NEXT: str d0, [x0, #8]!
165
+ ; CHECK-NEXT: ret
166
+ %next = getelementptr <4 x bfloat>, ptr %ptr , i32 1
167
+ store <4 x bfloat> %val , ptr %next
168
+ ret ptr %next
169
+ }
170
+
171
+ define ptr @test_store_pre_v8bf16 (<8 x bfloat> %val , ptr %ptr ) {
172
+ ; CHECK-LABEL: test_store_pre_v8bf16:
173
+ ; CHECK: // %bb.0:
174
+ ; CHECK-NEXT: str q0, [x0, #16]!
175
+ ; CHECK-NEXT: ret
176
+ %next = getelementptr <8 x bfloat>, ptr %ptr , i32 1
177
+ store <8 x bfloat> %val , ptr %next
178
+ ret ptr %next
179
+ }
180
+
181
+ define ptr @test_store_pre_v8bf16_trunc (ptr %ptr ) {
182
+ ; CHECK-LABEL: test_store_pre_v8bf16_trunc:
183
+ ; CHECK: // %bb.0:
184
+ ; CHECK-NEXT: ldr q0, [x0]
185
+ ; CHECK-NEXT: str q0, [x0, #16]!
186
+ ; CHECK-NEXT: ret
187
+ %t = load <8 x bfloat>, ptr %ptr
188
+ %next = getelementptr <8 x bfloat>, ptr %ptr , i32 1
189
+ store <8 x bfloat> %t , ptr %next
190
+ ret ptr %next
191
+ }
192
+
193
+ define { bfloat, ptr } @test_load_pre (ptr %ptr ) {
194
+ ; CHECK-LABEL: test_load_pre:
195
+ ; CHECK: // %bb.0:
196
+ ; CHECK-NEXT: ldr h0, [x0, #2]!
197
+ ; CHECK-NEXT: ret
198
+ %next = getelementptr bfloat, ptr %ptr , i32 1
199
+ %val = load bfloat, ptr %next
200
+ %res.tmp = insertvalue { bfloat, ptr } undef , bfloat %val , 0
201
+ %res = insertvalue { bfloat, ptr } %res.tmp , ptr %next , 1
202
+ ret { bfloat, ptr } %res
203
+ }
204
+
205
+ define { <4 x bfloat>, ptr } @test_load_pre_v4bf16 (ptr %ptr ) {
206
+ ; CHECK-LABEL: test_load_pre_v4bf16:
207
+ ; CHECK: // %bb.0:
208
+ ; CHECK-NEXT: ldr d0, [x0, #8]!
209
+ ; CHECK-NEXT: ret
210
+ %next = getelementptr <4 x bfloat>, ptr %ptr , i32 1
211
+ %val = load <4 x bfloat>, ptr %next
212
+ %res.tmp = insertvalue { <4 x bfloat>, ptr } undef , <4 x bfloat> %val , 0
213
+ %res = insertvalue { <4 x bfloat>, ptr } %res.tmp , ptr %next , 1
214
+ ret { <4 x bfloat>, ptr } %res
215
+ }
216
+
217
+ define { <8 x bfloat>, ptr } @test_load_pre_v8bf16 (ptr %ptr ) {
218
+ ; CHECK-LABEL: test_load_pre_v8bf16:
219
+ ; CHECK: // %bb.0:
220
+ ; CHECK-NEXT: ldr q0, [x0, #16]!
221
+ ; CHECK-NEXT: ret
222
+ %next = getelementptr <8 x bfloat>, ptr %ptr , i32 1
223
+ %val = load <8 x bfloat>, ptr %next
224
+ %res.tmp = insertvalue { <8 x bfloat>, ptr } undef , <8 x bfloat> %val , 0
225
+ %res = insertvalue { <8 x bfloat>, ptr } %res.tmp , ptr %next , 1
111
226
ret { <8 x bfloat>, ptr } %res
112
227
}
113
228
114
229
define bfloat @test_bitcast_halftobfloat (half %a ) nounwind {
115
230
; CHECK-LABEL: test_bitcast_halftobfloat:
116
- ; CHECK-NEXT: ret
231
+ ; CHECK: // %bb.0:
232
+ ; CHECK-NEXT: ret
117
233
%r = bitcast half %a to bfloat
118
234
ret bfloat %r
119
235
}
120
236
121
237
define half @test_bitcast_bfloattohalf (bfloat %a ) nounwind {
122
238
; CHECK-LABEL: test_bitcast_bfloattohalf:
123
- ; CHECK-NEXT: ret
239
+ ; CHECK: // %bb.0:
240
+ ; CHECK-NEXT: ret
124
241
%r = bitcast bfloat %a to half
125
242
ret half %r
126
243
}
0 commit comments