diff --git a/lib/Target/ARM64/ARM64InstrInfo.td b/lib/Target/ARM64/ARM64InstrInfo.td index 8416fad9344..da4d7261eab 100644 --- a/lib/Target/ARM64/ARM64InstrInfo.td +++ b/lib/Target/ARM64/ARM64InstrInfo.td @@ -2525,6 +2525,15 @@ defm SQDMULL : SIMDThreeScalarMixedHS<0, 0b11010, "sqdmull", defm SQDMLAL : SIMDThreeScalarMixedTiedHS<0, 0b10010, "sqdmlal">; defm SQDMLSL : SIMDThreeScalarMixedTiedHS<0, 0b10110, "sqdmlsl">; +def : Pat<(i64 (int_arm64_neon_sqadd (i64 FPR64:$Rd), + (i64 (int_arm64_neon_sqdmulls_scalar (i32 FPR32:$Rn), + (i32 FPR32:$Rm))))), + (SQDMLALi32 FPR64:$Rd, FPR32:$Rn, FPR32:$Rm)>; +def : Pat<(i64 (int_arm64_neon_sqsub (i64 FPR64:$Rd), + (i64 (int_arm64_neon_sqdmulls_scalar (i32 FPR32:$Rn), + (i32 FPR32:$Rm))))), + (SQDMLSLi32 FPR64:$Rd, FPR32:$Rn, FPR32:$Rm)>; + //===----------------------------------------------------------------------===// // Advanced SIMD two scalar instructions. //===----------------------------------------------------------------------===// diff --git a/test/CodeGen/ARM64/vmul.ll b/test/CodeGen/ARM64/vmul.ll index aeaea98f936..433c09d37f8 100644 --- a/test/CodeGen/ARM64/vmul.ll +++ b/test/CodeGen/ARM64/vmul.ll @@ -1967,3 +1967,19 @@ define <1 x double> @test_fdiv_v1f64(<1 x double> %L, <1 x double> %R) nounwind %prod = fdiv <1 x double> %L, %R ret <1 x double> %prod } + +define i64 @sqdmlal_d(i32 %A, i32 %B, i64 %C) nounwind { +;CHECK-LABEL: sqdmlal_d: +;CHECK: sqdmlal + %tmp4 = call i64 @llvm.arm64.neon.sqdmulls.scalar(i32 %A, i32 %B) + %tmp5 = call i64 @llvm.arm64.neon.sqadd.i64(i64 %C, i64 %tmp4) + ret i64 %tmp5 +} + +define i64 @sqdmlsl_d(i32 %A, i32 %B, i64 %C) nounwind { +;CHECK-LABEL: sqdmlsl_d: +;CHECK: sqdmlsl + %tmp4 = call i64 @llvm.arm64.neon.sqdmulls.scalar(i32 %A, i32 %B) + %tmp5 = call i64 @llvm.arm64.neon.sqsub.i64(i64 %C, i64 %tmp4) + ret i64 %tmp5 +}