@@ -1,5 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -force-streaming-compatible-sve < %s | FileCheck %s
; RUN: llc -mattr=+sve -force-streaming-compatible-sve < %s | FileCheck %s --check-prefixes=CHECK,SVE
; RUN: llc -mattr=+sve2 -force-streaming-compatible-sve < %s | FileCheck %s --check-prefixes=CHECK,SVE2
target triple = "aarch64-unknown-linux-gnu"
Expand All
@@ -10,7 +11,7 @@ target triple = "aarch64-unknown-linux-gnu"
; NOTE: Covers the scenario where a SIGN_EXTEND_INREG is required, whose inreg
; type's element type is not byte based and thus cannot be lowered directly to
; an SVE instruction.
define void @sext_v8i1_v8i32 (<8 x i1 > %a , ptr %out ) # 0 {
define void @sext_v8i1_v8i32 (<8 x i1 > %a , ptr %out ) {
; CHECK-LABEL: sext_v8i1_v8i32:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
Expand All
@@ -36,7 +37,7 @@ define void @sext_v8i1_v8i32(<8 x i1> %a, ptr %out) #0 {
; NOTE: Covers the scenario where a SIGN_EXTEND_INREG is required, whose inreg
; type's element type is not power-of-2 based and thus cannot be lowered
; directly to an SVE instruction.
define void @sext_v4i3_v4i64 (<4 x i3 > %a , ptr %out ) # 0 {
define void @sext_v4i3_v4i64 (<4 x i3 > %a , ptr %out ) {
; CHECK-LABEL: sext_v4i3_v4i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
Expand All
@@ -59,7 +60,7 @@ define void @sext_v4i3_v4i64(<4 x i3> %a, ptr %out) #0 {
; sext i8 -> i16
;
define void @sext_v16i8_v16i16 (<16 x i8 > %a , ptr %out ) # 0 {
define void @sext_v16i8_v16i16 (<16 x i8 > %a , ptr %out ) {
; CHECK-LABEL: sext_v16i8_v16i16:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand All
@@ -74,7 +75,7 @@ define void @sext_v16i8_v16i16(<16 x i8> %a, ptr %out) #0 {
}
; NOTE: Extra 'add' is to prevent the extend being combined with the load.
define void @sext_v32i8_v32i16 (ptr %in , ptr %out ) # 0 {
define void @sext_v32i8_v32i16 (ptr %in , ptr %out ) {
; CHECK-LABEL: sext_v32i8_v32i16:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand All
@@ -100,7 +101,7 @@ define void @sext_v32i8_v32i16(ptr %in, ptr %out) #0 {
; sext i8 -> i32
;
define void @sext_v8i8_v8i32 (<8 x i8 > %a , ptr %out ) # 0 {
define void @sext_v8i8_v8i32 (<8 x i8 > %a , ptr %out ) {
; CHECK-LABEL: sext_v8i8_v8i32:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
Expand All
@@ -115,7 +116,7 @@ define void @sext_v8i8_v8i32(<8 x i8> %a, ptr %out) #0 {
ret void
}
define void @sext_v16i8_v16i32 (<16 x i8 > %a , ptr %out ) # 0 {
define void @sext_v16i8_v16i32 (<16 x i8 > %a , ptr %out ) {
; CHECK-LABEL: sext_v16i8_v16i32:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand All
@@ -136,7 +137,7 @@ define void @sext_v16i8_v16i32(<16 x i8> %a, ptr %out) #0 {
ret void
}
define void @sext_v32i8_v32i32 (ptr %in , ptr %out ) # 0 {
define void @sext_v32i8_v32i32 (ptr %in , ptr %out ) {
; CHECK-LABEL: sext_v32i8_v32i32:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand Down
Expand Up
@@ -179,7 +180,7 @@ define void @sext_v32i8_v32i32(ptr %in, ptr %out) #0 {
; NOTE: v4i8 is an unpacked typed stored within a v4i16 container. The sign
; extend is a two step process where the container is any_extend'd with the
; result feeding an inreg sign extend.
define void @sext_v4i8_v4i64 (<4 x i8 > %a , ptr %out ) # 0 {
define void @sext_v4i8_v4i64 (<4 x i8 > %a , ptr %out ) {
; CHECK-LABEL: sext_v4i8_v4i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
Expand All
@@ -197,7 +198,7 @@ define void @sext_v4i8_v4i64(<4 x i8> %a, ptr %out) #0 {
ret void
}
define void @sext_v8i8_v8i64 (<8 x i8 > %a , ptr %out ) # 0 {
define void @sext_v8i8_v8i64 (<8 x i8 > %a , ptr %out ) {
; CHECK-LABEL: sext_v8i8_v8i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
Expand All
@@ -219,7 +220,7 @@ define void @sext_v8i8_v8i64(<8 x i8> %a, ptr %out) #0 {
ret void
}
define void @sext_v16i8_v16i64 (<16 x i8 > %a , ptr %out ) # 0 {
define void @sext_v16i8_v16i64 (<16 x i8 > %a , ptr %out ) {
; CHECK-LABEL: sext_v16i8_v16i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand Down
Expand Up
@@ -254,7 +255,7 @@ define void @sext_v16i8_v16i64(<16 x i8> %a, ptr %out) #0 {
ret void
}
define void @sext_v32i8_v32i64 (ptr %in , ptr %out ) # 0 {
define void @sext_v32i8_v32i64 (ptr %in , ptr %out ) {
; CHECK-LABEL: sext_v32i8_v32i64:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand Down
Expand Up
@@ -322,7 +323,7 @@ define void @sext_v32i8_v32i64(ptr %in, ptr %out) #0 {
; sext i16 -> i32
;
define void @sext_v8i16_v8i32 (<8 x i16 > %a , ptr %out ) # 0 {
define void @sext_v8i16_v8i32 (<8 x i16 > %a , ptr %out ) {
; CHECK-LABEL: sext_v8i16_v8i32:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand All
@@ -336,7 +337,7 @@ define void @sext_v8i16_v8i32(<8 x i16> %a, ptr %out) #0 {
ret void
}
define void @sext_v16i16_v16i32 (ptr %in , ptr %out ) # 0 {
define void @sext_v16i16_v16i32 (ptr %in , ptr %out ) {
; CHECK-LABEL: sext_v16i16_v16i32:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand All
@@ -362,7 +363,7 @@ define void @sext_v16i16_v16i32(ptr %in, ptr %out) #0 {
; sext i16 -> i64
;
define void @sext_v4i16_v4i64 (<4 x i16 > %a , ptr %out ) # 0 {
define void @sext_v4i16_v4i64 (<4 x i16 > %a , ptr %out ) {
; CHECK-LABEL: sext_v4i16_v4i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
Expand All
@@ -377,7 +378,7 @@ define void @sext_v4i16_v4i64(<4 x i16> %a, ptr %out) #0 {
ret void
}
define void @sext_v8i16_v8i64 (<8 x i16 > %a , ptr %out ) # 0 {
define void @sext_v8i16_v8i64 (<8 x i16 > %a , ptr %out ) {
; CHECK-LABEL: sext_v8i16_v8i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand All
@@ -398,7 +399,7 @@ define void @sext_v8i16_v8i64(<8 x i16> %a, ptr %out) #0 {
ret void
}
define void @sext_v16i16_v16i64 (ptr %in , ptr %out ) # 0 {
define void @sext_v16i16_v16i64 (ptr %in , ptr %out ) {
; CHECK-LABEL: sext_v16i16_v16i64:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand Down
Expand Up
@@ -438,7 +439,7 @@ define void @sext_v16i16_v16i64(ptr %in, ptr %out) #0 {
; sext i32 -> i64
;
define void @sext_v4i32_v4i64 (<4 x i32 > %a , ptr %out ) # 0 {
define void @sext_v4i32_v4i64 (<4 x i32 > %a , ptr %out ) {
; CHECK-LABEL: sext_v4i32_v4i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand All
@@ -452,7 +453,7 @@ define void @sext_v4i32_v4i64(<4 x i32> %a, ptr %out) #0 {
ret void
}
define void @sext_v8i32_v8i64 (ptr %in , ptr %out ) # 0 {
define void @sext_v8i32_v8i64 (ptr %in , ptr %out ) {
; CHECK-LABEL: sext_v8i32_v8i64:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand All
@@ -478,7 +479,7 @@ define void @sext_v8i32_v8i64(ptr %in, ptr %out) #0 {
; zext i8 -> i16
;
define void @zext_v16i8_v16i16 (<16 x i8 > %a , ptr %out ) # 0 {
define void @zext_v16i8_v16i16 (<16 x i8 > %a , ptr %out ) {
; CHECK-LABEL: zext_v16i8_v16i16:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand All
@@ -493,7 +494,7 @@ define void @zext_v16i8_v16i16(<16 x i8> %a, ptr %out) #0 {
}
; NOTE: Extra 'add' is to prevent the extend being combined with the load.
define void @zext_v32i8_v32i16 (ptr %in , ptr %out ) # 0 {
define void @zext_v32i8_v32i16 (ptr %in , ptr %out ) {
; CHECK-LABEL: zext_v32i8_v32i16:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand All
@@ -519,7 +520,7 @@ define void @zext_v32i8_v32i16(ptr %in, ptr %out) #0 {
; zext i8 -> i32
;
define void @zext_v8i8_v8i32 (<8 x i8 > %a , ptr %out ) # 0 {
define void @zext_v8i8_v8i32 (<8 x i8 > %a , ptr %out ) {
; CHECK-LABEL: zext_v8i8_v8i32:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
Expand All
@@ -534,7 +535,7 @@ define void @zext_v8i8_v8i32(<8 x i8> %a, ptr %out) #0 {
ret void
}
define void @zext_v16i8_v16i32 (<16 x i8 > %a , ptr %out ) # 0 {
define void @zext_v16i8_v16i32 (<16 x i8 > %a , ptr %out ) {
; CHECK-LABEL: zext_v16i8_v16i32:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand All
@@ -555,7 +556,7 @@ define void @zext_v16i8_v16i32(<16 x i8> %a, ptr %out) #0 {
ret void
}
define void @zext_v32i8_v32i32 (ptr %in , ptr %out ) # 0 {
define void @zext_v32i8_v32i32 (ptr %in , ptr %out ) {
; CHECK-LABEL: zext_v32i8_v32i32:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand Down
Expand Up
@@ -598,7 +599,7 @@ define void @zext_v32i8_v32i32(ptr %in, ptr %out) #0 {
; NOTE: v4i8 is an unpacked typed stored within a v4i16 container. The zero
; extend is a two step process where the container is zero_extend_inreg'd with
; the result feeding a normal zero extend from halfs to doublewords.
define void @zext_v4i8_v4i64 (<4 x i8 > %a , ptr %out ) # 0 {
define void @zext_v4i8_v4i64 (<4 x i8 > %a , ptr %out ) {
; CHECK-LABEL: zext_v4i8_v4i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
Expand All
@@ -614,7 +615,7 @@ define void @zext_v4i8_v4i64(<4 x i8> %a, ptr %out) #0 {
ret void
}
define void @zext_v8i8_v8i64 (<8 x i8 > %a , ptr %out ) # 0 {
define void @zext_v8i8_v8i64 (<8 x i8 > %a , ptr %out ) {
; CHECK-LABEL: zext_v8i8_v8i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
Expand All
@@ -636,7 +637,7 @@ define void @zext_v8i8_v8i64(<8 x i8> %a, ptr %out) #0 {
ret void
}
define void @zext_v16i8_v16i64 (<16 x i8 > %a , ptr %out ) # 0 {
define void @zext_v16i8_v16i64 (<16 x i8 > %a , ptr %out ) {
; CHECK-LABEL: zext_v16i8_v16i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand Down
Expand Up
@@ -671,7 +672,7 @@ define void @zext_v16i8_v16i64(<16 x i8> %a, ptr %out) #0 {
ret void
}
define void @zext_v32i8_v32i64 (ptr %in , ptr %out ) # 0 {
define void @zext_v32i8_v32i64 (ptr %in , ptr %out ) {
; CHECK-LABEL: zext_v32i8_v32i64:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand Down
Expand Up
@@ -739,7 +740,7 @@ define void @zext_v32i8_v32i64(ptr %in, ptr %out) #0 {
; zext i16 -> i32
;
define void @zext_v8i16_v8i32 (<8 x i16 > %a , ptr %out ) # 0 {
define void @zext_v8i16_v8i32 (<8 x i16 > %a , ptr %out ) {
; CHECK-LABEL: zext_v8i16_v8i32:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand All
@@ -753,7 +754,7 @@ define void @zext_v8i16_v8i32(<8 x i16> %a, ptr %out) #0 {
ret void
}
define void @zext_v16i16_v16i32 (ptr %in , ptr %out ) # 0 {
define void @zext_v16i16_v16i32 (ptr %in , ptr %out ) {
; CHECK-LABEL: zext_v16i16_v16i32:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand All
@@ -779,7 +780,7 @@ define void @zext_v16i16_v16i32(ptr %in, ptr %out) #0 {
; zext i16 -> i64
;
define void @zext_v4i16_v4i64 (<4 x i16 > %a , ptr %out ) # 0 {
define void @zext_v4i16_v4i64 (<4 x i16 > %a , ptr %out ) {
; CHECK-LABEL: zext_v4i16_v4i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
Expand All
@@ -794,7 +795,7 @@ define void @zext_v4i16_v4i64(<4 x i16> %a, ptr %out) #0 {
ret void
}
define void @zext_v8i16_v8i64 (<8 x i16 > %a , ptr %out ) # 0 {
define void @zext_v8i16_v8i64 (<8 x i16 > %a , ptr %out ) {
; CHECK-LABEL: zext_v8i16_v8i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand All
@@ -815,7 +816,7 @@ define void @zext_v8i16_v8i64(<8 x i16> %a, ptr %out) #0 {
ret void
}
define void @zext_v16i16_v16i64 (ptr %in , ptr %out ) # 0 {
define void @zext_v16i16_v16i64 (ptr %in , ptr %out ) {
; CHECK-LABEL: zext_v16i16_v16i64:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand Down
Expand Up
@@ -855,7 +856,7 @@ define void @zext_v16i16_v16i64(ptr %in, ptr %out) #0 {
; zext i32 -> i64
;
define void @zext_v4i32_v4i64 (<4 x i32 > %a , ptr %out ) # 0 {
define void @zext_v4i32_v4i64 (<4 x i32 > %a , ptr %out ) {
; CHECK-LABEL: zext_v4i32_v4i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
Expand All
@@ -869,7 +870,7 @@ define void @zext_v4i32_v4i64(<4 x i32> %a, ptr %out) #0 {
ret void
}
define void @zext_v8i32_v8i64 (ptr %in , ptr %out ) # 0 {
define void @zext_v8i32_v8i64 (ptr %in , ptr %out ) {
; CHECK-LABEL: zext_v8i32_v8i64:
; CHECK: // %bb.0:
; CHECK-NEXT: ldp q0, q1, [x0]
Expand All
@@ -891,16 +892,25 @@ define void @zext_v8i32_v8i64(ptr %in, ptr %out) #0 {
ret void
}
define void @extend_and_mul (i32 %0 , <2 x i64 > %1 , ptr %2 ) #0 {
; CHECK-LABEL: extend_and_mul:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z1.s, w0
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
; CHECK-NEXT: ptrue p0.d, vl2
; CHECK-NEXT: uunpklo z1.d, z1.s
; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d
; CHECK-NEXT: str q0, [x1]
; CHECK-NEXT: ret
define void @extend_and_mul (i32 %0 , <2 x i64 > %1 , ptr %2 ) {
; SVE-LABEL: extend_and_mul:
; SVE: // %bb.0:
; SVE-NEXT: mov z1.s, w0
; SVE-NEXT: // kill: def $q0 killed $q0 def $z0
; SVE-NEXT: ptrue p0.d, vl2
; SVE-NEXT: uunpklo z1.d, z1.s
; SVE-NEXT: mul z0.d, p0/m, z0.d, z1.d
; SVE-NEXT: str q0, [x1]
; SVE-NEXT: ret
;
; SVE2-LABEL: extend_and_mul:
; SVE2: // %bb.0:
; SVE2-NEXT: mov z1.s, w0
; SVE2-NEXT: // kill: def $q0 killed $q0 def $z0
; SVE2-NEXT: uunpklo z1.d, z1.s
; SVE2-NEXT: mul z0.d, z1.d, z0.d
; SVE2-NEXT: str q0, [x1]
; SVE2-NEXT: ret
%broadcast.splatinsert2 = insertelement <2 x i32 > poison, i32 %0 , i64 0
%broadcast.splat3 = shufflevector <2 x i32 > %broadcast.splatinsert2 , <2 x i32 > poison, <2 x i32 > zeroinitializer
%4 = zext <2 x i32 > %broadcast.splat3 to <2 x i64 >
Expand All
@@ -909,7 +919,7 @@ define void @extend_and_mul(i32 %0, <2 x i64> %1, ptr %2) #0 {
ret void
}
define void @extend_no_mul (i32 %0 , <2 x i64 > %1 , ptr %2 ) # 0 {
define void @extend_no_mul (i32 %0 , <2 x i64 > %1 , ptr %2 ) {
; CHECK-LABEL: extend_no_mul:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mov w8, w0
Expand All
@@ -923,5 +933,3 @@ entry:
store <2 x i64 > %3 , ptr %2 , align 2
ret void
}
attributes #0 = { nounwind "target-features" ="+sve" }