[llvm] 7c82db3 - [ARC] Improve code generated for i32 ADDC/ADDE and SUBC/SUBE

Mark Schimmel via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 10 13:05:18 PDT 2021


Author: Mark Schimmel
Date: 2021-09-10T13:04:08-07:00
New Revision: 7c82db3634c1c8c0319816d4bbaa099c7a532b06

URL: https://github.com/llvm/llvm-project/commit/7c82db3634c1c8c0319816d4bbaa099c7a532b06
DIFF: https://github.com/llvm/llvm-project/commit/7c82db3634c1c8c0319816d4bbaa099c7a532b06.diff

LOG: [ARC] Improve code generated for i32 ADDC/ADDE and SUBC/SUBE
This change improves the code generated for long long addition and subtraction

Differential Revision: https://reviews.llvm.org/D109615

Added: 
    

Modified: 
    llvm/lib/Target/ARC/ARCISelLowering.cpp
    llvm/lib/Target/ARC/ARCInstrInfo.td
    llvm/test/CodeGen/ARC/alu.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/ARC/ARCISelLowering.cpp b/llvm/lib/Target/ARC/ARCISelLowering.cpp
index 7b13f800f2167..588fe5c844817 100644
--- a/llvm/lib/Target/ARC/ARCISelLowering.cpp
+++ b/llvm/lib/Target/ARC/ARCISelLowering.cpp
@@ -121,6 +121,11 @@ ARCTargetLowering::ARCTargetLowering(const TargetMachine &TM,
   setOperationAction(ISD::SMAX, MVT::i32, Legal);
   setOperationAction(ISD::SMIN, MVT::i32, Legal);
 
+  setOperationAction(ISD::ADDC, MVT::i32, Legal);
+  setOperationAction(ISD::ADDE, MVT::i32, Legal);
+  setOperationAction(ISD::SUBC, MVT::i32, Legal);
+  setOperationAction(ISD::SUBE, MVT::i32, Legal);
+
   // Need barrel shifter.
   setOperationAction(ISD::SHL, MVT::i32, Legal);
   setOperationAction(ISD::SRA, MVT::i32, Legal);

diff  --git a/llvm/lib/Target/ARC/ARCInstrInfo.td b/llvm/lib/Target/ARC/ARCInstrInfo.td
index 0b7a5a6db24e0..4a0bc5cf74215 100644
--- a/llvm/lib/Target/ARC/ARCInstrInfo.td
+++ b/llvm/lib/Target/ARC/ARCInstrInfo.td
@@ -328,6 +328,11 @@ defm : MultiPat<mul, MPY_rrr, MPY_rru6, MPY_rrlimm>;
 defm : MultiPat<mulhs, MPYM_rrr, MPYM_rru6, MPYM_rrlimm>;
 defm : MultiPat<mulhu, MPYMU_rrr, MPYMU_rru6, MPYMU_rrlimm>;
 
+defm : MultiPat<addc, ADD_f_rrr, ADD_f_rru6, ADD_f_rrlimm>;
+defm : MultiPat<adde, ADC_f_rrr, ADC_f_rru6, ADC_f_rrlimm>;
+defm : MultiPat<subc, SUB_f_rrr, SUB_f_rru6, SUB_f_rrlimm>;
+defm : MultiPat<sube, SBC_f_rrr, SBC_f_rru6, SBC_f_rrlimm>;
+
 // ---------------------------------------------------------------------------
 // Unary Instruction definitions.
 // ---------------------------------------------------------------------------

diff  --git a/llvm/test/CodeGen/ARC/alu.ll b/llvm/test/CodeGen/ARC/alu.ll
index a5e07636fec08..2315196d427ce 100644
--- a/llvm/test/CodeGen/ARC/alu.ll
+++ b/llvm/test/CodeGen/ARC/alu.ll
@@ -253,3 +253,20 @@ define i64 @muls64(i32 %a, i32 %b) nounwind {
   ret i64 %v
 }
 
+; CHECK-LABEL: long_long_add
+; CHECK:      add.f %r0, %r0, %r2
+; CHECK-NEXT: adc.f %r1, %r1, %r3
+define i64 @long_long_add(i64 inreg %a, i64 inreg %b) #0 {
+entry:
+  %add = add nsw i64 %a, %b
+  ret i64 %add
+}
+
+; CHECK-LABEL: long_long_sub
+; CHECK:      sub.f %r0, %r0, %r2
+; CHECK-NEXT: sbc.f %r1, %r1, %r3
+define i64 @long_long_sub(i64 inreg %a, i64 inreg %b) #0 {
+entry:
+  %sub = sub nsw i64 %a, %b
+  ret i64 %sub
+}


        


More information about the llvm-commits mailing list