; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 < %s 2>%t | FileCheck %s ; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t ; If this check fails please read test/CodeGen/AArch64/README for instructions on how to resolve it. ; WARN-NOT: warning ; ; SHRNB ; define @shrnb_h( %a) { ; CHECK-LABEL: shrnb_h: ; CHECK: shrnb z0.b, z0.h, #8 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shrnb.nxv8i16( %a, i32 8) ret %out } define @shrnb_s( %a) { ; CHECK-LABEL: shrnb_s: ; CHECK: shrnb z0.h, z0.s, #16 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shrnb.nxv4i32( %a, i32 16) ret %out } define @shrnb_d( %a) { ; CHECK-LABEL: shrnb_d: ; CHECK: shrnb z0.s, z0.d, #32 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shrnb.nxv2i64( %a, i32 32) ret %out } ; ; UQSHRNB ; define @uqshrnb_h( %a) { ; CHECK-LABEL: uqshrnb_h: ; CHECK: uqshrnb z0.b, z0.h, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshrnb.nxv8i16( %a, i32 1) ret %out } define @uqshrnb_s( %a) { ; CHECK-LABEL: uqshrnb_s: ; CHECK: uqshrnb z0.h, z0.s, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshrnb.nxv4i32( %a, i32 1) ret %out } define @uqshrnb_d( %a) { ; CHECK-LABEL: uqshrnb_d: ; CHECK: uqshrnb z0.s, z0.d, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshrnb.nxv2i64( %a, i32 1) ret %out } ; ; SQSHRNB ; define @sqshrnb_h( %a) { ; CHECK-LABEL: sqshrnb_h: ; CHECK: sqshrnb z0.b, z0.h, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrnb.nxv8i16( %a, i32 1) ret %out } define @sqshrnb_s( %a) { ; CHECK-LABEL: sqshrnb_s: ; CHECK: sqshrnb z0.h, z0.s, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrnb.nxv4i32( %a, i32 1) ret %out } define @sqshrnb_d( %a) { ; CHECK-LABEL: sqshrnb_d: ; CHECK: sqshrnb z0.s, z0.d, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrnb.nxv2i64( %a, i32 1) ret %out } ; ; SQSHRUNB ; define @sqshrunb_h( %a) { ; CHECK-LABEL: qshrunb_h: ; CHECK: sqshrunb z0.b, z0.h, #7 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrunb.nxv8i16( %a, i32 7) ret %out } define @sqshrunb_s( %a) { ; CHECK-LABEL: sqshrunb_s: ; CHECK: sqshrunb z0.h, z0.s, #15 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrunb.nxv4i32( %a, i32 15) ret %out } define @sqshrunb_d( %a) { ; CHECK-LABEL: sqshrunb_d: ; CHECK: sqshrunb z0.s, z0.d, #31 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrunb.nxv2i64( %a, i32 31) ret %out } ; ; UQRSHRNB ; define @uqrshrnb_h( %a) { ; CHECK-LABEL: uqrshrnb_h: ; CHECK: uqrshrnb z0.b, z0.h, #2 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshrnb.nxv8i16( %a, i32 2) ret %out } define @uqrshrnb_s( %a) { ; CHECK-LABEL: uqrshrnb_s: ; CHECK: uqrshrnb z0.h, z0.s, #2 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshrnb.nxv4i32( %a, i32 2) ret %out } define @uqrshrnb_d( %a) { ; CHECK-LABEL: uqrshrnb_d: ; CHECK: uqrshrnb z0.s, z0.d, #2 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshrnb.nxv2i64( %a, i32 2) ret %out } ; ; SQRSHRNB ; define @sqrshrnb_h( %a) { ; CHECK-LABEL: sqrshrnb_h: ; CHECK: sqrshrnb z0.b, z0.h, #2 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrnb.nxv8i16( %a, i32 2) ret %out } define @sqrshrnb_s( %a) { ; CHECK-LABEL: sqrshrnb_s: ; CHECK: sqrshrnb z0.h, z0.s, #2 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrnb.nxv4i32( %a, i32 2) ret %out } define @sqrshrnb_d( %a) { ; CHECK-LABEL: sqrshrnb_d: ; CHECK: sqrshrnb z0.s, z0.d, #2 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrnb.nxv2i64( %a, i32 2) ret %out } ; ; SQRSHRUNB ; define @sqrshrunb_h( %a) { ; CHECK-LABEL: sqrshrunb_h: ; CHECK: sqrshrunb z0.b, z0.h, #6 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrunb.nxv8i16( %a, i32 6) ret %out } define @sqrshrunb_s( %a) { ; CHECK-LABEL: sqrshrunb_s: ; CHECK: sqrshrunb z0.h, z0.s, #14 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrunb.nxv4i32( %a, i32 14) ret %out } define @sqrshrunb_d( %a) { ; CHECK-LABEL: sqrshrunb_d: ; CHECK: sqrshrunb z0.s, z0.d, #30 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrunb.nxv2i64( %a, i32 30) ret %out } ; ; SHRNT ; define @shrnt_h( %a, %b) { ; CHECK-LABEL: shrnt_h: ; CHECK: shrnt z0.b, z1.h, #3 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shrnt.nxv8i16( %a, %b, i32 3) ret %out } define @shrnt_s( %a, %b) { ; CHECK-LABEL: shrnt_s: ; CHECK: shrnt z0.h, z1.s, #3 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shrnt.nxv4i32( %a, %b, i32 3) ret %out } define @shrnt_d( %a, %b) { ; CHECK-LABEL: shrnt_d: ; CHECK: shrnt z0.s, z1.d, #3 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shrnt.nxv2i64( %a, %b, i32 3) ret %out } ; ; UQSHRNT ; define @uqshrnt_h( %a, %b) { ; CHECK-LABEL: uqshrnt_h: ; CHECK: uqshrnt z0.b, z1.h, #5 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshrnt.nxv8i16( %a, %b, i32 5) ret %out } define @uqshrnt_s( %a, %b) { ; CHECK-LABEL: uqshrnt_s: ; CHECK: uqshrnt z0.h, z1.s, #13 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshrnt.nxv4i32( %a, %b, i32 13) ret %out } define @uqshrnt_d( %a, %b) { ; CHECK-LABEL: uqshrnt_d: ; CHECK: uqshrnt z0.s, z1.d, #29 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshrnt.nxv2i64( %a, %b, i32 29) ret %out } ; ; SQSHRNT ; define @sqshrnt_h( %a, %b) { ; CHECK-LABEL: sqshrnt_h: ; CHECK: sqshrnt z0.b, z1.h, #5 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrnt.nxv8i16( %a, %b, i32 5) ret %out } define @sqshrnt_s( %a, %b) { ; CHECK-LABEL: sqshrnt_s: ; CHECK: sqshrnt z0.h, z1.s, #13 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrnt.nxv4i32( %a, %b, i32 13) ret %out } define @sqshrnt_d( %a, %b) { ; CHECK-LABEL: sqshrnt_d: ; CHECK: sqshrnt z0.s, z1.d, #29 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrnt.nxv2i64( %a, %b, i32 29) ret %out } ; ; SQSHRUNT ; define @sqshrunt_h( %a, %b) { ; CHECK-LABEL: sqshrunt_h: ; CHECK: sqshrunt z0.b, z1.h, #4 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrunt.nxv8i16( %a, %b, i32 4) ret %out } define @sqshrunt_s( %a, %b) { ; CHECK-LABEL: sqshrunt_s: ; CHECK: sqshrunt z0.h, z1.s, #4 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrunt.nxv4i32( %a, %b, i32 4) ret %out } define @sqshrunt_d( %a, %b) { ; CHECK-LABEL: sqshrunt_d: ; CHECK: sqshrunt z0.s, z1.d, #4 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshrunt.nxv2i64( %a, %b, i32 4) ret %out } ; ; UQRSHRNT ; define @uqrshrnt_h( %a, %b) { ; CHECK-LABEL: uqrshrnt_h: ; CHECK: uqrshrnt z0.b, z1.h, #8 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshrnt.nxv8i16( %a, %b, i32 8) ret %out } define @uqrshrnt_s( %a, %b) { ; CHECK-LABEL: uqrshrnt_s: ; CHECK: uqrshrnt z0.h, z1.s, #12 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshrnt.nxv4i32( %a, %b, i32 12) ret %out } define @uqrshrnt_d( %a, %b) { ; CHECK-LABEL: uqrshrnt_d: ; CHECK: uqrshrnt z0.s, z1.d, #28 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshrnt.nxv2i64( %a, %b, i32 28) ret %out } ; ; SQRSHRNT ; define @sqrshrnt_h( %a, %b) { ; CHECK-LABEL: sqrshrnt_h: ; CHECK: sqrshrnt z0.b, z1.h, #8 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrnt.nxv8i16( %a, %b, i32 8) ret %out } define @sqrshrnt_s( %a, %b) { ; CHECK-LABEL: sqrshrnt_s: ; CHECK: sqrshrnt z0.h, z1.s, #12 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrnt.nxv4i32( %a, %b, i32 12) ret %out } define @sqrshrnt_d( %a, %b) { ; CHECK-LABEL: sqrshrnt_d: ; CHECK: sqrshrnt z0.s, z1.d, #28 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrnt.nxv2i64( %a, %b, i32 28) ret %out } ; ; SQRSHRUNT ; define @sqrshrunt_h( %a, %b) { ; CHECK-LABEL: sqrshrunt_h: ; CHECK: sqrshrunt z0.b, z1.h, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrunt.nxv8i16( %a, %b, i32 1) ret %out } define @sqrshrunt_s( %a, %b) { ; CHECK-LABEL: sqrshrunt_s: ; CHECK: sqrshrunt z0.h, z1.s, #5 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrunt.nxv4i32( %a, %b, i32 5) ret %out } define @sqrshrunt_d( %a, %b) { ; CHECK-LABEL: sqrshrunt_d: ; CHECK: sqrshrunt z0.s, z1.d, #5 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshrunt.nxv2i64( %a, %b, i32 5) ret %out } declare @llvm.aarch64.sve.shrnb.nxv8i16(, i32) declare @llvm.aarch64.sve.shrnb.nxv4i32(, i32) declare @llvm.aarch64.sve.shrnb.nxv2i64(, i32) declare @llvm.aarch64.sve.uqshrnb.nxv8i16(, i32) declare @llvm.aarch64.sve.uqshrnb.nxv4i32(, i32) declare @llvm.aarch64.sve.uqshrnb.nxv2i64(, i32) declare @llvm.aarch64.sve.sqshrnb.nxv8i16(, i32) declare @llvm.aarch64.sve.sqshrnb.nxv4i32(, i32) declare @llvm.aarch64.sve.sqshrnb.nxv2i64(, i32) declare @llvm.aarch64.sve.uqrshrnb.nxv8i16(, i32) declare @llvm.aarch64.sve.uqrshrnb.nxv4i32(, i32) declare @llvm.aarch64.sve.uqrshrnb.nxv2i64(, i32) declare @llvm.aarch64.sve.sqrshrnb.nxv8i16(, i32) declare @llvm.aarch64.sve.sqrshrnb.nxv4i32(, i32) declare @llvm.aarch64.sve.sqrshrnb.nxv2i64(, i32) declare @llvm.aarch64.sve.sqshrunb.nxv8i16(, i32) declare @llvm.aarch64.sve.sqshrunb.nxv4i32(, i32) declare @llvm.aarch64.sve.sqshrunb.nxv2i64(, i32) declare @llvm.aarch64.sve.sqrshrunb.nxv8i16(, i32) declare @llvm.aarch64.sve.sqrshrunb.nxv4i32(, i32) declare @llvm.aarch64.sve.sqrshrunb.nxv2i64(, i32) declare @llvm.aarch64.sve.shrnt.nxv8i16(, , i32) declare @llvm.aarch64.sve.shrnt.nxv4i32(, , i32) declare @llvm.aarch64.sve.shrnt.nxv2i64(, , i32) declare @llvm.aarch64.sve.uqshrnt.nxv8i16(, , i32) declare @llvm.aarch64.sve.uqshrnt.nxv4i32(, , i32) declare @llvm.aarch64.sve.uqshrnt.nxv2i64(, , i32) declare @llvm.aarch64.sve.sqshrnt.nxv8i16(, , i32) declare @llvm.aarch64.sve.sqshrnt.nxv4i32(, , i32) declare @llvm.aarch64.sve.sqshrnt.nxv2i64(, , i32) declare @llvm.aarch64.sve.sqshrunt.nxv8i16(, , i32) declare @llvm.aarch64.sve.sqshrunt.nxv4i32(, , i32) declare @llvm.aarch64.sve.sqshrunt.nxv2i64(, , i32) declare @llvm.aarch64.sve.uqrshrnt.nxv8i16(, , i32) declare @llvm.aarch64.sve.uqrshrnt.nxv4i32(, , i32) declare @llvm.aarch64.sve.uqrshrnt.nxv2i64(, , i32) declare @llvm.aarch64.sve.sqrshrnt.nxv8i16(, , i32) declare @llvm.aarch64.sve.sqrshrnt.nxv4i32(, , i32) declare @llvm.aarch64.sve.sqrshrnt.nxv2i64(, , i32) declare @llvm.aarch64.sve.sqrshrunt.nxv8i16(, , i32) declare @llvm.aarch64.sve.sqrshrunt.nxv4i32(, , i32) declare @llvm.aarch64.sve.sqrshrunt.nxv2i64(, , i32)