blob: a65d5e0e131f03d433a74bb9c9feccc0757a7c4b [file]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s
define <vscale x 4 x i32> @mul_i32_by_2(<vscale x 4 x i32> %x) {
; CHECK-LABEL: mul_i32_by_2:
; CHECK: // %bb.0:
; CHECK-NEXT: lsl z0.s, z0.s, #1
; CHECK-NEXT: ret
%out = mul <vscale x 4 x i32> %x, splat(i32 2)
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @mul_i32_by_3(<vscale x 4 x i32> %x) {
; CHECK-LABEL: mul_i32_by_3:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z0.s, lsl #1]
; CHECK-NEXT: ret
%out = mul <vscale x 4 x i32> %x, splat(i32 3)
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @mul_i32_by_5(<vscale x 4 x i32> %x) {
; CHECK-LABEL: mul_i32_by_5:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z0.s, lsl #2]
; CHECK-NEXT: ret
%out = mul <vscale x 4 x i32> %x, splat(i32 5)
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @mul_i32_by_9(<vscale x 4 x i32> %x) {
; CHECK-LABEL: mul_i32_by_9:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z0.s, lsl #3]
; CHECK-NEXT: ret
%out = mul <vscale x 4 x i32> %x, splat(i32 9)
ret <vscale x 4 x i32> %out
}
define <vscale x 2 x i64> @mul_i64_by_2_commuted(<vscale x 2 x i64> %x) {
; CHECK-LABEL: mul_i64_by_2_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: lsl z0.d, z0.d, #1
; CHECK-NEXT: ret
%out = mul <vscale x 2 x i64> splat(i64 2), %x
ret <vscale x 2 x i64> %out
}
define <vscale x 2 x i64> @mul_i64_by_3_commuted(<vscale x 2 x i64> %x) {
; CHECK-LABEL: mul_i64_by_3_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.d, [z0.d, z0.d, lsl #1]
; CHECK-NEXT: ret
%out = mul <vscale x 2 x i64> splat(i64 3), %x
ret <vscale x 2 x i64> %out
}
define <vscale x 2 x i64> @mul_i64_by_5_commuted(<vscale x 2 x i64> %x) {
; CHECK-LABEL: mul_i64_by_5_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.d, [z0.d, z0.d, lsl #2]
; CHECK-NEXT: ret
%out = mul <vscale x 2 x i64> splat(i64 5), %x
ret <vscale x 2 x i64> %out
}
define <vscale x 2 x i64> @mul_i64_by_9_commuted(<vscale x 2 x i64> %x) {
; CHECK-LABEL: mul_i64_by_9_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.d, [z0.d, z0.d, lsl #3]
; CHECK-NEXT: ret
%out = mul <vscale x 2 x i64> splat(i64 9), %x
ret <vscale x 2 x i64> %out
}
define <vscale x 4 x i32> @mla_i32_by_2(<vscale x 4 x i32> %a, <vscale x 4 x i32> %x) {
; CHECK-LABEL: mla_i32_by_2:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z1.s, lsl #1]
; CHECK-NEXT: ret
%mul = mul <vscale x 4 x i32> %x, splat(i32 2)
%out = add <vscale x 4 x i32> %a, %mul
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @mla_i32_by_4(<vscale x 4 x i32> %a, <vscale x 4 x i32> %x) {
; CHECK-LABEL: mla_i32_by_4:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z1.s, lsl #2]
; CHECK-NEXT: ret
%mul = mul <vscale x 4 x i32> %x, splat(i32 4)
%out = add <vscale x 4 x i32> %a, %mul
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @mla_i32_by_8(<vscale x 4 x i32> %a, <vscale x 4 x i32> %x) {
; CHECK-LABEL: mla_i32_by_8:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z1.s, lsl #3]
; CHECK-NEXT: ret
%mul = mul <vscale x 4 x i32> %x, splat(i32 8)
%out = add <vscale x 4 x i32> %a, %mul
ret <vscale x 4 x i32> %out
}
define <vscale x 2 x i64> @mla_i64_by_2_commuted(<vscale x 2 x i64> %a, <vscale x 2 x i64> %x) {
; CHECK-LABEL: mla_i64_by_2_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.d, [z0.d, z1.d, lsl #1]
; CHECK-NEXT: ret
%mul = mul <vscale x 2 x i64> splat(i64 2), %x
%out = add <vscale x 2 x i64> %a, %mul
ret <vscale x 2 x i64> %out
}
define <vscale x 2 x i64> @mla_i64_by_4_commuted(<vscale x 2 x i64> %a, <vscale x 2 x i64> %x) {
; CHECK-LABEL: mla_i64_by_4_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.d, [z0.d, z1.d, lsl #2]
; CHECK-NEXT: ret
%mul = mul <vscale x 2 x i64> splat(i64 4), %x
%out = add <vscale x 2 x i64> %a, %mul
ret <vscale x 2 x i64> %out
}
define <vscale x 2 x i64> @mla_i64_by_8_commuted(<vscale x 2 x i64> %a, <vscale x 2 x i64> %x) {
; CHECK-LABEL: mla_i64_by_8_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.d, [z0.d, z1.d, lsl #3]
; CHECK-NEXT: ret
%mul = mul <vscale x 2 x i64> splat(i64 8), %x
%out = add <vscale x 2 x i64> %a, %mul
ret <vscale x 2 x i64> %out
}
define <vscale x 4 x i32> @svmul_u_i32_by_2(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_u_i32_by_2:
; CHECK: // %bb.0:
; CHECK-NEXT: add z0.s, z0.s, z0.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 2))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_u_i32_by_3(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_u_i32_by_3:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z0.s, lsl #1]
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 3))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_u_i32_by_5(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_u_i32_by_5:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z0.s, lsl #2]
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 5))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_u_i32_by_9(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_u_i32_by_9:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z0.s, lsl #3]
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 9))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_m_partial_i32_by_2(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_m_partial_i32_by_2:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z1.s, #2 // =0x2
; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 2))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_m_partial_i32_by_3(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_m_partial_i32_by_3:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z1.s, #3 // =0x3
; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 3))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_m_partial_i32_by_5(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_m_partial_i32_by_5:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z1.s, #5 // =0x5
; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 5))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_m_partial_i32_by_9(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_m_partial_i32_by_9:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z1.s, #9 // =0x9
; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 9))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_u_i32_by_2_commuted(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_u_i32_by_2_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z1.s, #2 // =0x2
; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat(i32 2), <vscale x 4 x i32> %x)
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_u_i32_by_3_commuted(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_u_i32_by_3_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z1.s, #3 // =0x3
; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat(i32 3), <vscale x 4 x i32> %x)
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_u_i32_by_5_commuted(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_u_i32_by_5_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z1.s, #5 // =0x5
; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat(i32 5), <vscale x 4 x i32> %x)
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmul_u_i32_by_9_commuted(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmul_u_i32_by_9_commuted:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z1.s, #9 // =0x9
; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mul.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> splat(i32 9), <vscale x 4 x i32> %x)
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmla_u_i32_by_2(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmla_u_i32_by_2:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z1.s, lsl #1]
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mla.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 2))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmla_u_i32_by_4(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmla_u_i32_by_4:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z1.s, lsl #2]
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mla.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 4))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmla_u_i32_by_8(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmla_u_i32_by_8:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.s, [z0.s, z1.s, lsl #3]
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mla.u.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 8))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmla_m_partial_i32_by_2(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmla_m_partial_i32_by_2:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z2.s, #2 // =0x2
; CHECK-NEXT: mla z0.s, p0/m, z1.s, z2.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mla.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 2))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmla_m_partial_i32_by_4(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmla_m_partial_i32_by_4:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z2.s, #4 // =0x4
; CHECK-NEXT: mla z0.s, p0/m, z1.s, z2.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mla.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 4))
ret <vscale x 4 x i32> %out
}
define <vscale x 4 x i32> @svmla_m_partial_i32_by_8(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x) {
; CHECK-LABEL: svmla_m_partial_i32_by_8:
; CHECK: // %bb.0:
; CHECK-NEXT: mov z2.s, #8 // =0x8
; CHECK-NEXT: mla z0.s, p0/m, z1.s, z2.s
; CHECK-NEXT: ret
%out = call <vscale x 4 x i32> @llvm.aarch64.sve.mla.nxv4i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %x, <vscale x 4 x i32> splat(i32 8))
ret <vscale x 4 x i32> %out
}
define <vscale x 2 x i64> @svmla_u_i64_by_2(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %x) {
; CHECK-LABEL: svmla_u_i64_by_2:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.d, [z0.d, z1.d, lsl #1]
; CHECK-NEXT: ret
%out = call <vscale x 2 x i64> @llvm.aarch64.sve.mla.u.nxv2i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %x, <vscale x 2 x i64> splat(i64 2))
ret <vscale x 2 x i64> %out
}
define <vscale x 2 x i64> @svmla_u_i64_by_4(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %x) {
; CHECK-LABEL: svmla_u_i64_by_4:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.d, [z0.d, z1.d, lsl #2]
; CHECK-NEXT: ret
%out = call <vscale x 2 x i64> @llvm.aarch64.sve.mla.u.nxv2i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %x, <vscale x 2 x i64> splat(i64 4))
ret <vscale x 2 x i64> %out
}
define <vscale x 2 x i64> @svmla_u_i64_by_8(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %x) {
; CHECK-LABEL: svmla_u_i64_by_8:
; CHECK: // %bb.0:
; CHECK-NEXT: adr z0.d, [z0.d, z1.d, lsl #3]
; CHECK-NEXT: ret
%out = call <vscale x 2 x i64> @llvm.aarch64.sve.mla.u.nxv2i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %x, <vscale x 2 x i64> splat(i64 8))
ret <vscale x 2 x i64> %out
}