11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2- ; RUN: llc < %s -mtriple=aarch64 -aarch64-neon-syntax=generic | FileCheck %s -check-prefixes=CHECK,CHECK-SD
3- ; RUN: llc < %s -mtriple=aarch64 -global-isel=1 -global-isel-abort=2 - aarch64-neon-syntax=generic 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
2+ ; RUN: llc < %s -mtriple=aarch64 -aarch64-neon-syntax=generic | FileCheck %s -check-prefixes=CHECK,SDAG
3+ ; RUN: llc < %s -mtriple=aarch64 -global-isel=1 -aarch64-neon-syntax=generic | FileCheck %s --check-prefixes=CHECK,GISEL
44
55declare i8 @llvm.vector.reduce.add.v2i8 (<2 x i8 >)
66declare i8 @llvm.vector.reduce.add.v3i8 (<3 x i8 >)
@@ -22,15 +22,6 @@ declare i64 @llvm.vector.reduce.add.v3i64(<3 x i64>)
2222declare i64 @llvm.vector.reduce.add.v4i64 (<4 x i64 >)
2323declare i128 @llvm.vector.reduce.add.v2i128 (<2 x i128 >)
2424
25- ; CHECK-GI: warning: Instruction selection used fallback path for addv_v2i8
26- ; CHECK-GI-NEXT: warning: Instruction selection used fallback path for addv_v3i8
27- ; CHECK-GI-NEXT: warning: Instruction selection used fallback path for addv_v4i8
28- ; CHECK-GI-NEXT: warning: Instruction selection used fallback path for addv_v2i16
29- ; CHECK-GI-NEXT: warning: Instruction selection used fallback path for addv_v3i16
30- ; CHECK-GI-NEXT: warning: Instruction selection used fallback path for addv_v3i32
31- ; CHECK-GI-NEXT: warning: Instruction selection used fallback path for addv_v3i64
32- ; CHECK-GI-NEXT: warning: Instruction selection used fallback path for addv_v2i128
33-
3425
3526define i8 @add_B (ptr %arr ) {
3627; CHECK-LABEL: add_B:
@@ -256,15 +247,26 @@ entry:
256247}
257248
258249define i8 @addv_v3i8 (<3 x i8 > %a ) {
259- ; CHECK-LABEL: addv_v3i8:
260- ; CHECK: // %bb.0: // %entry
261- ; CHECK-NEXT: movi v0.2d, #0000000000000000
262- ; CHECK-NEXT: mov v0.h[0], w0
263- ; CHECK-NEXT: mov v0.h[1], w1
264- ; CHECK-NEXT: mov v0.h[2], w2
265- ; CHECK-NEXT: addv h0, v0.4h
266- ; CHECK-NEXT: fmov w0, s0
267- ; CHECK-NEXT: ret
250+ ; SDAG-LABEL: addv_v3i8:
251+ ; SDAG: // %bb.0: // %entry
252+ ; SDAG-NEXT: movi v0.2d, #0000000000000000
253+ ; SDAG-NEXT: mov v0.h[0], w0
254+ ; SDAG-NEXT: mov v0.h[1], w1
255+ ; SDAG-NEXT: mov v0.h[2], w2
256+ ; SDAG-NEXT: addv h0, v0.4h
257+ ; SDAG-NEXT: fmov w0, s0
258+ ; SDAG-NEXT: ret
259+ ;
260+ ; GISEL-LABEL: addv_v3i8:
261+ ; GISEL: // %bb.0: // %entry
262+ ; GISEL-NEXT: fmov s0, w0
263+ ; GISEL-NEXT: mov w8, #0 // =0x0
264+ ; GISEL-NEXT: mov v0.h[1], w1
265+ ; GISEL-NEXT: mov v0.h[2], w2
266+ ; GISEL-NEXT: mov v0.h[3], w8
267+ ; GISEL-NEXT: addv h0, v0.4h
268+ ; GISEL-NEXT: fmov w0, s0
269+ ; GISEL-NEXT: ret
268270entry:
269271 %arg1 = call i8 @llvm.vector.reduce.add.v3i8 (<3 x i8 > %a )
270272 ret i8 %arg1
@@ -327,13 +329,22 @@ entry:
327329}
328330
329331define i16 @addv_v3i16 (<3 x i16 > %a ) {
330- ; CHECK-LABEL: addv_v3i16:
331- ; CHECK: // %bb.0: // %entry
332- ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
333- ; CHECK-NEXT: mov v0.h[3], wzr
334- ; CHECK-NEXT: addv h0, v0.4h
335- ; CHECK-NEXT: fmov w0, s0
336- ; CHECK-NEXT: ret
332+ ; SDAG-LABEL: addv_v3i16:
333+ ; SDAG: // %bb.0: // %entry
334+ ; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0
335+ ; SDAG-NEXT: mov v0.h[3], wzr
336+ ; SDAG-NEXT: addv h0, v0.4h
337+ ; SDAG-NEXT: fmov w0, s0
338+ ; SDAG-NEXT: ret
339+ ;
340+ ; GISEL-LABEL: addv_v3i16:
341+ ; GISEL: // %bb.0: // %entry
342+ ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
343+ ; GISEL-NEXT: mov w8, #0 // =0x0
344+ ; GISEL-NEXT: mov v0.h[3], w8
345+ ; GISEL-NEXT: addv h0, v0.4h
346+ ; GISEL-NEXT: fmov w0, s0
347+ ; GISEL-NEXT: ret
337348entry:
338349 %arg1 = call i16 @llvm.vector.reduce.add.v3i16 (<3 x i16 > %a )
339350 ret i16 %arg1
@@ -431,17 +442,29 @@ entry:
431442}
432443
433444define i64 @addv_v3i64 (<3 x i64 > %a ) {
434- ; CHECK-LABEL: addv_v3i64:
435- ; CHECK: // %bb.0: // %entry
436- ; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2
437- ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
438- ; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1
439- ; CHECK-NEXT: mov v0.d[1], v1.d[0]
440- ; CHECK-NEXT: mov v2.d[1], xzr
441- ; CHECK-NEXT: add v0.2d, v0.2d, v2.2d
442- ; CHECK-NEXT: addp d0, v0.2d
443- ; CHECK-NEXT: fmov x0, d0
444- ; CHECK-NEXT: ret
445+ ; SDAG-LABEL: addv_v3i64:
446+ ; SDAG: // %bb.0: // %entry
447+ ; SDAG-NEXT: // kill: def $d2 killed $d2 def $q2
448+ ; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0
449+ ; SDAG-NEXT: // kill: def $d1 killed $d1 def $q1
450+ ; SDAG-NEXT: mov v0.d[1], v1.d[0]
451+ ; SDAG-NEXT: mov v2.d[1], xzr
452+ ; SDAG-NEXT: add v0.2d, v0.2d, v2.2d
453+ ; SDAG-NEXT: addp d0, v0.2d
454+ ; SDAG-NEXT: fmov x0, d0
455+ ; SDAG-NEXT: ret
456+ ;
457+ ; GISEL-LABEL: addv_v3i64:
458+ ; GISEL: // %bb.0: // %entry
459+ ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
460+ ; GISEL-NEXT: // kill: def $d2 killed $d2 def $q2
461+ ; GISEL-NEXT: // kill: def $d1 killed $d1 def $q1
462+ ; GISEL-NEXT: mov v0.d[1], v1.d[0]
463+ ; GISEL-NEXT: mov v2.d[1], xzr
464+ ; GISEL-NEXT: add v0.2d, v0.2d, v2.2d
465+ ; GISEL-NEXT: addp d0, v0.2d
466+ ; GISEL-NEXT: fmov x0, d0
467+ ; GISEL-NEXT: ret
445468entry:
446469 %arg1 = call i64 @llvm.vector.reduce.add.v3i64 (<3 x i64 > %a )
447470 ret i64 %arg1
0 commit comments