@@ -36,34 +36,20 @@ define <4 x float> @interleave_v2f32(<2 x float> %x, <2 x float> %y) {
36
36
; One vXf64 test case to very that we don't optimize it.
37
37
; FIXME: Is there better codegen we can do here?
38
38
define <4 x double > @interleave_v2f64 (<2 x double > %x , <2 x double > %y ) {
39
- ; RV32-V128-LABEL: interleave_v2f64:
40
- ; RV32-V128: # %bb.0:
41
- ; RV32-V128-NEXT: vmv1r.v v12, v9
42
- ; RV32-V128-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
43
- ; RV32-V128-NEXT: vid.v v9
44
- ; RV32-V128-NEXT: vsrl.vi v14, v9, 1
45
- ; RV32-V128-NEXT: vsetvli zero, zero, e64, m2, ta, ma
46
- ; RV32-V128-NEXT: vrgatherei16.vv v10, v8, v14
47
- ; RV32-V128-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
48
- ; RV32-V128-NEXT: vmv.v.i v0, 10
49
- ; RV32-V128-NEXT: vsetivli zero, 4, e64, m2, ta, mu
50
- ; RV32-V128-NEXT: vrgatherei16.vv v10, v12, v14, v0.t
51
- ; RV32-V128-NEXT: vmv.v.v v8, v10
52
- ; RV32-V128-NEXT: ret
53
- ;
54
- ; RV64-V128-LABEL: interleave_v2f64:
55
- ; RV64-V128: # %bb.0:
56
- ; RV64-V128-NEXT: vmv1r.v v12, v9
57
- ; RV64-V128-NEXT: vsetivli zero, 4, e64, m2, ta, ma
58
- ; RV64-V128-NEXT: vid.v v10
59
- ; RV64-V128-NEXT: vsrl.vi v14, v10, 1
60
- ; RV64-V128-NEXT: vrgather.vv v10, v8, v14
61
- ; RV64-V128-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
62
- ; RV64-V128-NEXT: vmv.v.i v0, 10
63
- ; RV64-V128-NEXT: vsetivli zero, 4, e64, m2, ta, mu
64
- ; RV64-V128-NEXT: vrgather.vv v10, v12, v14, v0.t
65
- ; RV64-V128-NEXT: vmv.v.v v8, v10
66
- ; RV64-V128-NEXT: ret
39
+ ; V128-LABEL: interleave_v2f64:
40
+ ; V128: # %bb.0:
41
+ ; V128-NEXT: vmv1r.v v12, v9
42
+ ; V128-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
43
+ ; V128-NEXT: vid.v v9
44
+ ; V128-NEXT: vsrl.vi v14, v9, 1
45
+ ; V128-NEXT: vsetvli zero, zero, e64, m2, ta, ma
46
+ ; V128-NEXT: vrgatherei16.vv v10, v8, v14
47
+ ; V128-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
48
+ ; V128-NEXT: vmv.v.i v0, 10
49
+ ; V128-NEXT: vsetivli zero, 4, e64, m2, ta, mu
50
+ ; V128-NEXT: vrgatherei16.vv v10, v12, v14, v0.t
51
+ ; V128-NEXT: vmv.v.v v8, v10
52
+ ; V128-NEXT: ret
67
53
;
68
54
; RV32-V512-LABEL: interleave_v2f64:
69
55
; RV32-V512: # %bb.0:
@@ -255,56 +241,34 @@ define <64 x float> @interleave_v32f32(<32 x float> %x, <32 x float> %y) {
255
241
; RV32-V128-NEXT: addi sp, sp, -16
256
242
; RV32-V128-NEXT: .cfi_def_cfa_offset 16
257
243
; RV32-V128-NEXT: csrr a0, vlenb
258
- ; RV32-V128-NEXT: li a1, 24
259
- ; RV32-V128-NEXT: mul a0, a0, a1
244
+ ; RV32-V128-NEXT: slli a0, a0, 2
260
245
; RV32-V128-NEXT: sub sp, sp, a0
261
- ; RV32-V128-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb
262
- ; RV32-V128-NEXT: csrr a0, vlenb
263
- ; RV32-V128-NEXT: slli a0, a0, 3
264
- ; RV32-V128-NEXT: add a0, sp, a0
265
- ; RV32-V128-NEXT: addi a0, a0, 16
266
- ; RV32-V128-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill
267
- ; RV32-V128-NEXT: addi a0, sp, 16
268
- ; RV32-V128-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
246
+ ; RV32-V128-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x04, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 4 * vlenb
269
247
; RV32-V128-NEXT: lui a0, %hi(.LCPI10_0)
270
248
; RV32-V128-NEXT: addi a0, a0, %lo(.LCPI10_0)
271
249
; RV32-V128-NEXT: li a1, 32
272
250
; RV32-V128-NEXT: vsetvli zero, a1, e32, m8, ta, mu
273
- ; RV32-V128-NEXT: vle32 .v v24 , (a0)
251
+ ; RV32-V128-NEXT: vle16 .v v4 , (a0)
274
252
; RV32-V128-NEXT: lui a0, %hi(.LCPI10_1)
275
253
; RV32-V128-NEXT: addi a0, a0, %lo(.LCPI10_1)
276
- ; RV32-V128-NEXT: vle32.v v16, (a0)
277
- ; RV32-V128-NEXT: csrr a0, vlenb
278
- ; RV32-V128-NEXT: slli a0, a0, 4
279
- ; RV32-V128-NEXT: add a0, sp, a0
280
- ; RV32-V128-NEXT: addi a0, a0, 16
281
- ; RV32-V128-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill
254
+ ; RV32-V128-NEXT: vle16.v v24, (a0)
255
+ ; RV32-V128-NEXT: addi a0, sp, 16
256
+ ; RV32-V128-NEXT: vs4r.v v24, (a0) # Unknown-size Folded Spill
282
257
; RV32-V128-NEXT: lui a0, 699051
283
258
; RV32-V128-NEXT: addi a0, a0, -1366
284
259
; RV32-V128-NEXT: vmv.s.x v0, a0
285
- ; RV32-V128-NEXT: vrgather.vv v16, v8, v24
286
- ; RV32-V128-NEXT: csrr a0, vlenb
287
- ; RV32-V128-NEXT: slli a0, a0, 4
288
- ; RV32-V128-NEXT: add a0, sp, a0
289
- ; RV32-V128-NEXT: addi a0, a0, 16
290
- ; RV32-V128-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
291
- ; RV32-V128-NEXT: csrr a0, vlenb
292
- ; RV32-V128-NEXT: slli a0, a0, 3
293
- ; RV32-V128-NEXT: add a0, sp, a0
294
- ; RV32-V128-NEXT: addi a0, a0, 16
295
- ; RV32-V128-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
296
- ; RV32-V128-NEXT: vrgather.vv v16, v8, v24, v0.t
297
- ; RV32-V128-NEXT: vsetivli zero, 16, e32, m4, ta, ma
298
- ; RV32-V128-NEXT: vmv4r.v v24, v8
260
+ ; RV32-V128-NEXT: vrgatherei16.vv v24, v8, v4
299
261
; RV32-V128-NEXT: addi a0, sp, 16
300
- ; RV32-V128-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
301
- ; RV32-V128-NEXT: vwaddu.vv v0, v8, v24
262
+ ; RV32-V128-NEXT: vl4r.v v12, (a0) # Unknown-size Folded Reload
263
+ ; RV32-V128-NEXT: vrgatherei16.vv v24, v16, v12, v0.t
264
+ ; RV32-V128-NEXT: vsetivli zero, 16, e32, m4, ta, ma
265
+ ; RV32-V128-NEXT: vwaddu.vv v0, v8, v16
302
266
; RV32-V128-NEXT: li a0, -1
303
- ; RV32-V128-NEXT: vwmaccu.vx v0, a0, v24
267
+ ; RV32-V128-NEXT: vwmaccu.vx v0, a0, v16
304
268
; RV32-V128-NEXT: vmv8r.v v8, v0
269
+ ; RV32-V128-NEXT: vmv8r.v v16, v24
305
270
; RV32-V128-NEXT: csrr a0, vlenb
306
- ; RV32-V128-NEXT: li a1, 24
307
- ; RV32-V128-NEXT: mul a0, a0, a1
271
+ ; RV32-V128-NEXT: slli a0, a0, 2
308
272
; RV32-V128-NEXT: add sp, sp, a0
309
273
; RV32-V128-NEXT: addi sp, sp, 16
310
274
; RV32-V128-NEXT: ret
@@ -314,56 +278,34 @@ define <64 x float> @interleave_v32f32(<32 x float> %x, <32 x float> %y) {
314
278
; RV64-V128-NEXT: addi sp, sp, -16
315
279
; RV64-V128-NEXT: .cfi_def_cfa_offset 16
316
280
; RV64-V128-NEXT: csrr a0, vlenb
317
- ; RV64-V128-NEXT: li a1, 24
318
- ; RV64-V128-NEXT: mul a0, a0, a1
281
+ ; RV64-V128-NEXT: slli a0, a0, 2
319
282
; RV64-V128-NEXT: sub sp, sp, a0
320
- ; RV64-V128-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb
321
- ; RV64-V128-NEXT: csrr a0, vlenb
322
- ; RV64-V128-NEXT: slli a0, a0, 3
323
- ; RV64-V128-NEXT: add a0, sp, a0
324
- ; RV64-V128-NEXT: addi a0, a0, 16
325
- ; RV64-V128-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill
326
- ; RV64-V128-NEXT: addi a0, sp, 16
327
- ; RV64-V128-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
283
+ ; RV64-V128-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x04, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 4 * vlenb
328
284
; RV64-V128-NEXT: lui a0, %hi(.LCPI10_0)
329
285
; RV64-V128-NEXT: addi a0, a0, %lo(.LCPI10_0)
330
286
; RV64-V128-NEXT: li a1, 32
331
287
; RV64-V128-NEXT: vsetvli zero, a1, e32, m8, ta, mu
332
- ; RV64-V128-NEXT: vle32 .v v24 , (a0)
288
+ ; RV64-V128-NEXT: vle16 .v v4 , (a0)
333
289
; RV64-V128-NEXT: lui a0, %hi(.LCPI10_1)
334
290
; RV64-V128-NEXT: addi a0, a0, %lo(.LCPI10_1)
335
- ; RV64-V128-NEXT: vle32.v v16, (a0)
336
- ; RV64-V128-NEXT: csrr a0, vlenb
337
- ; RV64-V128-NEXT: slli a0, a0, 4
338
- ; RV64-V128-NEXT: add a0, sp, a0
339
- ; RV64-V128-NEXT: addi a0, a0, 16
340
- ; RV64-V128-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill
291
+ ; RV64-V128-NEXT: vle16.v v24, (a0)
292
+ ; RV64-V128-NEXT: addi a0, sp, 16
293
+ ; RV64-V128-NEXT: vs4r.v v24, (a0) # Unknown-size Folded Spill
341
294
; RV64-V128-NEXT: lui a0, 699051
342
295
; RV64-V128-NEXT: addiw a0, a0, -1366
343
296
; RV64-V128-NEXT: vmv.s.x v0, a0
344
- ; RV64-V128-NEXT: vrgather.vv v16, v8, v24
345
- ; RV64-V128-NEXT: csrr a0, vlenb
346
- ; RV64-V128-NEXT: slli a0, a0, 4
347
- ; RV64-V128-NEXT: add a0, sp, a0
348
- ; RV64-V128-NEXT: addi a0, a0, 16
349
- ; RV64-V128-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
350
- ; RV64-V128-NEXT: csrr a0, vlenb
351
- ; RV64-V128-NEXT: slli a0, a0, 3
352
- ; RV64-V128-NEXT: add a0, sp, a0
353
- ; RV64-V128-NEXT: addi a0, a0, 16
354
- ; RV64-V128-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
355
- ; RV64-V128-NEXT: vrgather.vv v16, v8, v24, v0.t
356
- ; RV64-V128-NEXT: vsetivli zero, 16, e32, m4, ta, ma
357
- ; RV64-V128-NEXT: vmv4r.v v24, v8
297
+ ; RV64-V128-NEXT: vrgatherei16.vv v24, v8, v4
358
298
; RV64-V128-NEXT: addi a0, sp, 16
359
- ; RV64-V128-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
360
- ; RV64-V128-NEXT: vwaddu.vv v0, v8, v24
299
+ ; RV64-V128-NEXT: vl4r.v v12, (a0) # Unknown-size Folded Reload
300
+ ; RV64-V128-NEXT: vrgatherei16.vv v24, v16, v12, v0.t
301
+ ; RV64-V128-NEXT: vsetivli zero, 16, e32, m4, ta, ma
302
+ ; RV64-V128-NEXT: vwaddu.vv v0, v8, v16
361
303
; RV64-V128-NEXT: li a0, -1
362
- ; RV64-V128-NEXT: vwmaccu.vx v0, a0, v24
304
+ ; RV64-V128-NEXT: vwmaccu.vx v0, a0, v16
363
305
; RV64-V128-NEXT: vmv8r.v v8, v0
306
+ ; RV64-V128-NEXT: vmv8r.v v16, v24
364
307
; RV64-V128-NEXT: csrr a0, vlenb
365
- ; RV64-V128-NEXT: li a1, 24
366
- ; RV64-V128-NEXT: mul a0, a0, a1
308
+ ; RV64-V128-NEXT: slli a0, a0, 2
367
309
; RV64-V128-NEXT: add sp, sp, a0
368
310
; RV64-V128-NEXT: addi sp, sp, 16
369
311
; RV64-V128-NEXT: ret
@@ -450,10 +392,12 @@ define <4 x double> @unary_interleave_v4f64(<4 x double> %x) {
450
392
; RV64-V128: # %bb.0:
451
393
; RV64-V128-NEXT: lui a0, 12304
452
394
; RV64-V128-NEXT: addiw a0, a0, 512
453
- ; RV64-V128-NEXT: vsetivli zero, 4, e64, m2 , ta, ma
395
+ ; RV64-V128-NEXT: vsetivli zero, 4, e32, m1 , ta, ma
454
396
; RV64-V128-NEXT: vmv.s.x v10, a0
455
- ; RV64-V128-NEXT: vsext.vf8 v12, v10
456
- ; RV64-V128-NEXT: vrgather.vv v10, v8, v12
397
+ ; RV64-V128-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
398
+ ; RV64-V128-NEXT: vsext.vf2 v12, v10
399
+ ; RV64-V128-NEXT: vsetvli zero, zero, e64, m2, ta, ma
400
+ ; RV64-V128-NEXT: vrgatherei16.vv v10, v8, v12
457
401
; RV64-V128-NEXT: vmv.v.v v8, v10
458
402
; RV64-V128-NEXT: ret
459
403
;
0 commit comments