Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit bff2e82

Browse files
committed
AArch64: match correct order in subtraction pattern.
The accumulator in multiply-and-subtract instructions is actually subtracted *from* so these patterns were computing the wrong value. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260131 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent c5e1c37 commit bff2e82

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

lib/Target/AArch64/AArch64InstrInfo.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -766,12 +766,12 @@ def : Pat<(i64 (add (mul (sext_inreg GPR64:$Rn, i32), (s64imm_32bit:$C)),
766766
(SMADDLrrr (i32 (EXTRACT_SUBREG GPR64:$Rn, sub_32)),
767767
(MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>;
768768

769-
def : Pat<(i64 (sub (mul (sext GPR32:$Rn), (s64imm_32bit:$C)), GPR64:$Ra)),
769+
def : Pat<(i64 (sub GPR64:$Ra, (mul (sext GPR32:$Rn), (s64imm_32bit:$C)))),
770770
(SMSUBLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>;
771-
def : Pat<(i64 (sub (mul (zext GPR32:$Rn), (i64imm_32bit:$C)), GPR64:$Ra)),
771+
def : Pat<(i64 (sub GPR64:$Ra, (mul (zext GPR32:$Rn), (i64imm_32bit:$C)))),
772772
(UMSUBLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>;
773-
def : Pat<(i64 (sub (mul (sext_inreg GPR64:$Rn, i32), (s64imm_32bit:$C)),
774-
GPR64:$Ra)),
773+
def : Pat<(i64 (sub GPR64:$Ra, (mul (sext_inreg GPR64:$Rn, i32),
774+
(s64imm_32bit:$C)))),
775775
(SMSUBLrrr (i32 (EXTRACT_SUBREG GPR64:$Rn, sub_32)),
776776
(MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>;
777777
} // AddedComplexity = 5

test/CodeGen/AArch64/arm64-mul.ll

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,16 @@ entry:
137137
; CHECK: umsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
138138
%tmp1 = zext i32 %a to i64
139139
%tmp3 = mul i64 %tmp1, 12345678
140-
%tmp4 = sub i64 %tmp3, %b
140+
%tmp4 = sub i64 %b, %tmp3
141+
ret i64 %tmp4
142+
}
143+
144+
define i64 @t14(i32 %a, i64 %b) nounwind {
145+
entry:
146+
; CHECK-LABEL: t14:
147+
; CHECK: smsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
148+
%tmp1 = sext i32 %a to i64
149+
%tmp3 = mul i64 %tmp1, -12345678
150+
%tmp4 = sub i64 %b, %tmp3
141151
ret i64 %tmp4
142152
}

0 commit comments

Comments
 (0)