@@ -260,7 +260,7 @@ define <8 x i16> @abdu_i_const_bothhigh() {
260
260
define <8 x i16 > @abdu_i_const_onehigh () {
261
261
; CHECK-LABEL: abdu_i_const_onehigh:
262
262
; CHECK: // %bb.0:
263
- ; CHECK-NEXT: mov w8, #32765
263
+ ; CHECK-NEXT: mov w8, #32765 // =0x7ffd
264
264
; CHECK-NEXT: dup v0.8h, w8
265
265
; CHECK-NEXT: ret
266
266
%result = call <8 x i16 > @llvm.aarch64.neon.uabd.v8i16 (<8 x i16 > <i16 32766 , i16 32766 , i16 32766 , i16 32766 , i16 32766 , i16 32766 , i16 32766 , i16 32766 >, <8 x i16 > <i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 >)
@@ -480,7 +480,7 @@ define <8 x i16> @abds_i_const_bothhigh() {
480
480
define <8 x i16 > @abds_i_const_onehigh () {
481
481
; CHECK-LABEL: abds_i_const_onehigh:
482
482
; CHECK: // %bb.0:
483
- ; CHECK-NEXT: mov w8, #32765
483
+ ; CHECK-NEXT: mov w8, #32765 // =0x7ffd
484
484
; CHECK-NEXT: dup v0.8h, w8
485
485
; CHECK-NEXT: ret
486
486
%result = call <8 x i16 > @llvm.aarch64.neon.sabd.v8i16 (<8 x i16 > <i16 32766 , i16 32766 , i16 32766 , i16 32766 , i16 32766 , i16 32766 , i16 32766 , i16 32766 >, <8 x i16 > <i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 >)
@@ -527,7 +527,33 @@ define <8 x i16> @abds_i_reassoc(<8 x i16> %src1) {
527
527
ret <8 x i16 > %result
528
528
}
529
529
530
+ define <1 x i64 > @recursive () {
531
+ ; CHECK-LABEL: recursive:
532
+ ; CHECK: // %bb.0:
533
+ ; CHECK-NEXT: movi v0.8b, #1
534
+ ; CHECK-NEXT: movi v1.2d, #0xffffffffffffffff
535
+ ; CHECK-NEXT: uabd v2.8b, v0.8b, v1.8b
536
+ ; CHECK-NEXT: uabdl v0.8h, v0.8b, v1.8b
537
+ ; CHECK-NEXT: dup v1.8b, v2.b[0]
538
+ ; CHECK-NEXT: saddlp v0.1d, v0.2s
539
+ ; CHECK-NEXT: orr v0.8b, v1.8b, v0.8b
540
+ ; CHECK-NEXT: ret
541
+ %1 = tail call <8 x i8 > @llvm.aarch64.neon.umax.v8i8 (<8 x i8 > zeroinitializer , <8 x i8 > <i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 >)
542
+ %2 = tail call <8 x i8 > @llvm.aarch64.neon.uabd.v8i8 (<8 x i8 > %1 , <8 x i8 > <i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 , i8 1 >)
543
+ %3 = zext <8 x i8 > %2 to <8 x i16 >
544
+ %4 = bitcast <8 x i16 > %3 to <4 x i32 >
545
+ %5 = shufflevector <4 x i32 > %4 , <4 x i32 > zeroinitializer , <2 x i32 > <i32 0 , i32 1 >
546
+ %6 = shufflevector <8 x i8 > %2 , <8 x i8 > zeroinitializer , <16 x i32 > <i32 0 , i32 0 , i32 0 , i32 0 , i32 0 , i32 0 , i32 0 , i32 0 , i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
547
+ %7 = bitcast <16 x i8 > %6 to <2 x i64 >
548
+ %8 = shufflevector <2 x i64 > %7 , <2 x i64 > zeroinitializer , <1 x i32 > zeroinitializer
549
+ %9 = tail call <1 x i64 > @llvm.aarch64.neon.saddlp.v1i64.v2i32 (<2 x i32 > %5 )
550
+ %10 = or <1 x i64 > %8 , %9
551
+ ret <1 x i64 > %10
552
+ }
530
553
554
+ declare <8 x i8 > @llvm.aarch64.neon.umax.v8i8 (<8 x i8 >, <8 x i8 >)
555
+ declare <1 x i64 > @llvm.aarch64.neon.saddlp.v1i64.v2i32 (<2 x i32 >)
556
+ declare <8 x i8 > @llvm.aarch64.neon.uabd.v8i8 (<8 x i8 >, <8 x i8 >)
531
557
declare <8 x i16 > @llvm.aarch64.neon.uabd.v8i16 (<8 x i16 >, <8 x i16 >)
532
558
declare <8 x i16 > @llvm.aarch64.neon.sabd.v8i16 (<8 x i16 >, <8 x i16 >)
533
559
declare <8 x i32 > @llvm.abs.v8i32 (<8 x i32 >, i1 )
0 commit comments