[PATCH] D65873: [ARM] Fix encoding of APSR in CLRM instruction

Momchil Velikov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 13 09:12:02 PDT 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rL368711: [ARM] Fix encoding of APSR in CLRM instruction (authored by chill, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D65873?vs=213877&id=214851#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D65873/new/

https://reviews.llvm.org/D65873

Files:
  llvm/trunk/lib/Target/ARM/ARMRegisterInfo.td
  llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
  llvm/trunk/test/MC/ARM/clrm-asm.s


Index: llvm/trunk/test/MC/ARM/clrm-asm.s
===================================================================
--- llvm/trunk/test/MC/ARM/clrm-asm.s
+++ llvm/trunk/test/MC/ARM/clrm-asm.s
@@ -9,13 +9,16 @@
 // ERROR-NOT: register list not in ascending order
 clrm {r3, r4, r1, r2}
 
-// CHECK: clrm            {r0, apsr, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, lr} @ encoding: [0x9f,0xe8,0xff,0xdf]
+// CHECK: clrm            {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, lr, apsr} @ encoding: [0x9f,0xe8,0xff,0xdf]
 clrm {r0-r12, lr, apsr}
 
-// CHECK: clrm            {apsr, lr} @ encoding: [0x9f,0xe8,0x00,0xc0]
+// CHECK: clrm            {lr, apsr} @ encoding: [0x9f,0xe8,0x00,0xc0]
 clrm {apsr, lr}
 
-// CHECK: clrm            {r0, apsr, r1, r2, r3, r4, lr} @ encoding: [0x9f,0xe8,0x1f,0xc0]
+// CHECK: clrm            {r0, r1, apsr}  @ encoding: [0x9f,0xe8,0x03,0x80]
+clrm {apsr, r1, r0}
+
+// CHECK: clrm            {r0, r1, r2, r3, r4, lr, apsr} @ encoding: [0x9f,0xe8,0x1f,0xc0]
 clrm {r0-r4, apsr, lr}
 
 // ERROR: invalid register in register list. Valid registers are r0-r12, lr/r14 and APSR.
Index: llvm/trunk/lib/Target/ARM/ARMRegisterInfo.td
===================================================================
--- llvm/trunk/lib/Target/ARM/ARMRegisterInfo.td
+++ llvm/trunk/lib/Target/ARM/ARMRegisterInfo.td
@@ -180,7 +180,7 @@
 // models the APSR when it's accessed by some special instructions. In such cases
 // it has the same encoding as PC.
 def CPSR       : ARMReg<0,  "cpsr">;
-def APSR       : ARMReg<1,  "apsr">;
+def APSR       : ARMReg<15, "apsr">;
 def APSR_NZCV  : ARMReg<15, "apsr_nzcv">;
 def SPSR       : ARMReg<2,  "spsr">;
 def FPSCR      : ARMReg<3,  "fpscr">;
Index: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
===================================================================
--- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
+++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
@@ -1720,7 +1720,6 @@
   unsigned Reg = MI.getOperand(Op).getReg();
   bool SPRRegs = ARMMCRegisterClasses[ARM::SPRRegClassID].contains(Reg);
   bool DPRRegs = ARMMCRegisterClasses[ARM::DPRRegClassID].contains(Reg);
-  bool CLRMRegs = MI.getOpcode() == ARM::t2CLRM;
 
   unsigned Binary = 0;
 
@@ -1739,21 +1738,13 @@
       Binary |= NumRegs * 2;
   } else {
     const MCRegisterInfo &MRI = *CTX.getRegisterInfo();
-    if (!CLRMRegs) {
-      assert(std::is_sorted(MI.begin() + Op, MI.end(),
-                            [&](const MCOperand &LHS, const MCOperand &RHS) {
-                              return MRI.getEncodingValue(LHS.getReg()) <
-                                     MRI.getEncodingValue(RHS.getReg());
-                            }));
-    }
-
+    assert(std::is_sorted(MI.begin() + Op, MI.end(),
+                          [&](const MCOperand &LHS, const MCOperand &RHS) {
+                            return MRI.getEncodingValue(LHS.getReg()) <
+                              MRI.getEncodingValue(RHS.getReg());
+                          }));
     for (unsigned I = Op, E = MI.getNumOperands(); I < E; ++I) {
-      unsigned RegNo;
-      if (CLRMRegs && MI.getOperand(I).getReg() == ARM::APSR) {
-        RegNo = 15;
-      } else {
-        RegNo = MRI.getEncodingValue(MI.getOperand(I).getReg());
-      }
+      unsigned RegNo = MRI.getEncodingValue(MI.getOperand(I).getReg());
       Binary |= 1 << RegNo;
     }
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D65873.214851.patch
Type: text/x-patch
Size: 3428 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190813/6a1b270d/attachment.bin>


More information about the llvm-commits mailing list