@@ -166,6 +166,178 @@ define i64 @test_bswap_i64(i64 %a) nounwind {
166
166
ret i64 %tmp
167
167
}
168
168
169
+ define i7 @test_bitreverse_i7 (i7 %a ) nounwind {
170
+ ; RV32I-LABEL: test_bitreverse_i7:
171
+ ; RV32I: # %bb.0:
172
+ ; RV32I-NEXT: srli a1, a0, 8
173
+ ; RV32I-NEXT: lui a2, 16
174
+ ; RV32I-NEXT: srli a3, a0, 24
175
+ ; RV32I-NEXT: addi a2, a2, -256
176
+ ; RV32I-NEXT: and a1, a1, a2
177
+ ; RV32I-NEXT: and a2, a0, a2
178
+ ; RV32I-NEXT: slli a0, a0, 24
179
+ ; RV32I-NEXT: or a1, a1, a3
180
+ ; RV32I-NEXT: lui a3, 61681
181
+ ; RV32I-NEXT: slli a2, a2, 8
182
+ ; RV32I-NEXT: or a0, a0, a2
183
+ ; RV32I-NEXT: lui a2, 209715
184
+ ; RV32I-NEXT: addi a3, a3, -241
185
+ ; RV32I-NEXT: or a0, a0, a1
186
+ ; RV32I-NEXT: srli a1, a0, 4
187
+ ; RV32I-NEXT: and a0, a0, a3
188
+ ; RV32I-NEXT: and a1, a1, a3
189
+ ; RV32I-NEXT: lui a3, 344064
190
+ ; RV32I-NEXT: addi a2, a2, 819
191
+ ; RV32I-NEXT: slli a0, a0, 4
192
+ ; RV32I-NEXT: or a0, a1, a0
193
+ ; RV32I-NEXT: srli a1, a0, 2
194
+ ; RV32I-NEXT: and a0, a0, a2
195
+ ; RV32I-NEXT: and a1, a1, a2
196
+ ; RV32I-NEXT: lui a2, 348160
197
+ ; RV32I-NEXT: slli a0, a0, 2
198
+ ; RV32I-NEXT: or a0, a1, a0
199
+ ; RV32I-NEXT: srli a1, a0, 1
200
+ ; RV32I-NEXT: and a0, a0, a2
201
+ ; RV32I-NEXT: and a1, a1, a3
202
+ ; RV32I-NEXT: slli a0, a0, 1
203
+ ; RV32I-NEXT: or a0, a1, a0
204
+ ; RV32I-NEXT: srli a0, a0, 25
205
+ ; RV32I-NEXT: ret
206
+ ;
207
+ ; RV64I-LABEL: test_bitreverse_i7:
208
+ ; RV64I: # %bb.0:
209
+ ; RV64I-NEXT: srli a1, a0, 40
210
+ ; RV64I-NEXT: lui a2, 16
211
+ ; RV64I-NEXT: srli a3, a0, 56
212
+ ; RV64I-NEXT: srli a4, a0, 24
213
+ ; RV64I-NEXT: lui a5, 4080
214
+ ; RV64I-NEXT: srli a6, a0, 8
215
+ ; RV64I-NEXT: srliw a7, a0, 24
216
+ ; RV64I-NEXT: addiw a2, a2, -256
217
+ ; RV64I-NEXT: and a1, a1, a2
218
+ ; RV64I-NEXT: or a1, a1, a3
219
+ ; RV64I-NEXT: lui a3, 61681
220
+ ; RV64I-NEXT: and a4, a4, a5
221
+ ; RV64I-NEXT: srliw a6, a6, 24
222
+ ; RV64I-NEXT: slli a6, a6, 24
223
+ ; RV64I-NEXT: or a4, a6, a4
224
+ ; RV64I-NEXT: lui a6, 209715
225
+ ; RV64I-NEXT: and a5, a0, a5
226
+ ; RV64I-NEXT: slli a7, a7, 32
227
+ ; RV64I-NEXT: addiw a3, a3, -241
228
+ ; RV64I-NEXT: addiw a6, a6, 819
229
+ ; RV64I-NEXT: slli a5, a5, 24
230
+ ; RV64I-NEXT: or a5, a5, a7
231
+ ; RV64I-NEXT: slli a7, a3, 32
232
+ ; RV64I-NEXT: add a3, a3, a7
233
+ ; RV64I-NEXT: slli a7, a6, 32
234
+ ; RV64I-NEXT: add a6, a6, a7
235
+ ; RV64I-NEXT: or a1, a4, a1
236
+ ; RV64I-NEXT: and a2, a0, a2
237
+ ; RV64I-NEXT: slli a0, a0, 56
238
+ ; RV64I-NEXT: slli a2, a2, 40
239
+ ; RV64I-NEXT: or a0, a0, a2
240
+ ; RV64I-NEXT: li a2, 21
241
+ ; RV64I-NEXT: or a0, a0, a5
242
+ ; RV64I-NEXT: li a4, 85
243
+ ; RV64I-NEXT: slli a2, a2, 58
244
+ ; RV64I-NEXT: slli a4, a4, 56
245
+ ; RV64I-NEXT: or a0, a0, a1
246
+ ; RV64I-NEXT: srli a1, a0, 4
247
+ ; RV64I-NEXT: and a0, a0, a3
248
+ ; RV64I-NEXT: and a1, a1, a3
249
+ ; RV64I-NEXT: slli a0, a0, 4
250
+ ; RV64I-NEXT: or a0, a1, a0
251
+ ; RV64I-NEXT: srli a1, a0, 2
252
+ ; RV64I-NEXT: and a0, a0, a6
253
+ ; RV64I-NEXT: and a1, a1, a6
254
+ ; RV64I-NEXT: slli a0, a0, 2
255
+ ; RV64I-NEXT: or a0, a1, a0
256
+ ; RV64I-NEXT: srli a1, a0, 1
257
+ ; RV64I-NEXT: and a0, a0, a4
258
+ ; RV64I-NEXT: and a1, a1, a2
259
+ ; RV64I-NEXT: slli a0, a0, 1
260
+ ; RV64I-NEXT: or a0, a1, a0
261
+ ; RV64I-NEXT: srli a0, a0, 57
262
+ ; RV64I-NEXT: ret
263
+ ;
264
+ ; RV32ZBB-LABEL: test_bitreverse_i7:
265
+ ; RV32ZBB: # %bb.0:
266
+ ; RV32ZBB-NEXT: rev8 a0, a0
267
+ ; RV32ZBB-NEXT: lui a1, 61681
268
+ ; RV32ZBB-NEXT: srli a2, a0, 4
269
+ ; RV32ZBB-NEXT: addi a1, a1, -241
270
+ ; RV32ZBB-NEXT: and a2, a2, a1
271
+ ; RV32ZBB-NEXT: and a0, a0, a1
272
+ ; RV32ZBB-NEXT: lui a1, 209715
273
+ ; RV32ZBB-NEXT: addi a1, a1, 819
274
+ ; RV32ZBB-NEXT: slli a0, a0, 4
275
+ ; RV32ZBB-NEXT: or a0, a2, a0
276
+ ; RV32ZBB-NEXT: srli a2, a0, 2
277
+ ; RV32ZBB-NEXT: and a0, a0, a1
278
+ ; RV32ZBB-NEXT: and a1, a2, a1
279
+ ; RV32ZBB-NEXT: lui a2, 344064
280
+ ; RV32ZBB-NEXT: slli a0, a0, 2
281
+ ; RV32ZBB-NEXT: or a0, a1, a0
282
+ ; RV32ZBB-NEXT: lui a1, 348160
283
+ ; RV32ZBB-NEXT: and a1, a0, a1
284
+ ; RV32ZBB-NEXT: srli a0, a0, 1
285
+ ; RV32ZBB-NEXT: and a0, a0, a2
286
+ ; RV32ZBB-NEXT: slli a1, a1, 1
287
+ ; RV32ZBB-NEXT: or a0, a0, a1
288
+ ; RV32ZBB-NEXT: srli a0, a0, 25
289
+ ; RV32ZBB-NEXT: ret
290
+ ;
291
+ ; RV64ZBB-LABEL: test_bitreverse_i7:
292
+ ; RV64ZBB: # %bb.0:
293
+ ; RV64ZBB-NEXT: rev8 a0, a0
294
+ ; RV64ZBB-NEXT: lui a1, 61681
295
+ ; RV64ZBB-NEXT: lui a2, 209715
296
+ ; RV64ZBB-NEXT: addiw a1, a1, -241
297
+ ; RV64ZBB-NEXT: addiw a2, a2, 819
298
+ ; RV64ZBB-NEXT: slli a3, a1, 32
299
+ ; RV64ZBB-NEXT: add a1, a1, a3
300
+ ; RV64ZBB-NEXT: slli a3, a2, 32
301
+ ; RV64ZBB-NEXT: add a2, a2, a3
302
+ ; RV64ZBB-NEXT: srli a3, a0, 4
303
+ ; RV64ZBB-NEXT: and a3, a3, a1
304
+ ; RV64ZBB-NEXT: and a0, a0, a1
305
+ ; RV64ZBB-NEXT: li a1, 21
306
+ ; RV64ZBB-NEXT: slli a0, a0, 4
307
+ ; RV64ZBB-NEXT: or a0, a3, a0
308
+ ; RV64ZBB-NEXT: srli a3, a0, 2
309
+ ; RV64ZBB-NEXT: and a0, a0, a2
310
+ ; RV64ZBB-NEXT: and a2, a3, a2
311
+ ; RV64ZBB-NEXT: li a3, 85
312
+ ; RV64ZBB-NEXT: slli a1, a1, 58
313
+ ; RV64ZBB-NEXT: slli a3, a3, 56
314
+ ; RV64ZBB-NEXT: slli a0, a0, 2
315
+ ; RV64ZBB-NEXT: or a0, a2, a0
316
+ ; RV64ZBB-NEXT: srli a2, a0, 1
317
+ ; RV64ZBB-NEXT: and a0, a0, a3
318
+ ; RV64ZBB-NEXT: and a1, a2, a1
319
+ ; RV64ZBB-NEXT: slli a0, a0, 1
320
+ ; RV64ZBB-NEXT: or a0, a1, a0
321
+ ; RV64ZBB-NEXT: srli a0, a0, 57
322
+ ; RV64ZBB-NEXT: ret
323
+ ;
324
+ ; RV32ZBKB-LABEL: test_bitreverse_i7:
325
+ ; RV32ZBKB: # %bb.0:
326
+ ; RV32ZBKB-NEXT: slli a0, a0, 24
327
+ ; RV32ZBKB-NEXT: brev8 a0, a0
328
+ ; RV32ZBKB-NEXT: srli a0, a0, 25
329
+ ; RV32ZBKB-NEXT: ret
330
+ ;
331
+ ; RV64ZBKB-LABEL: test_bitreverse_i7:
332
+ ; RV64ZBKB: # %bb.0:
333
+ ; RV64ZBKB-NEXT: slli a0, a0, 56
334
+ ; RV64ZBKB-NEXT: brev8 a0, a0
335
+ ; RV64ZBKB-NEXT: srli a0, a0, 57
336
+ ; RV64ZBKB-NEXT: ret
337
+ %tmp = call i7 @llvm.bitreverse.i7 (i7 %a )
338
+ ret i7 %tmp
339
+ }
340
+
169
341
define i8 @test_bitreverse_i8 (i8 %a ) nounwind {
170
342
; RV32I-LABEL: test_bitreverse_i8:
171
343
; RV32I: # %bb.0:
@@ -245,16 +417,12 @@ define i8 @test_bitreverse_i8(i8 %a) nounwind {
245
417
;
246
418
; RV32ZBKB-LABEL: test_bitreverse_i8:
247
419
; RV32ZBKB: # %bb.0:
248
- ; RV32ZBKB-NEXT: slli a0, a0, 24
249
420
; RV32ZBKB-NEXT: brev8 a0, a0
250
- ; RV32ZBKB-NEXT: srli a0, a0, 24
251
421
; RV32ZBKB-NEXT: ret
252
422
;
253
423
; RV64ZBKB-LABEL: test_bitreverse_i8:
254
424
; RV64ZBKB: # %bb.0:
255
- ; RV64ZBKB-NEXT: slli a0, a0, 56
256
425
; RV64ZBKB-NEXT: brev8 a0, a0
257
- ; RV64ZBKB-NEXT: srli a0, a0, 56
258
426
; RV64ZBKB-NEXT: ret
259
427
%tmp = call i8 @llvm.bitreverse.i8 (i8 %a )
260
428
ret i8 %tmp
0 commit comments