[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp

Nate Begeman natebegeman at mac.com
Thu Oct 14 17:50:56 PDT 2004



Changes in directory llvm/lib/Target/PowerPC:

PPC32ISelSimple.cpp updated: 1.90 -> 1.91
---
Log message:

Better codegen of binary integer ops with 32 bit immediate operands.
This transformation fires a few dozen times across the testsuite.

For example, int test2(int X) { return X ^ 0x0FF00FF0; }
Old:
_test2:
        lis r2, 4080
        ori r2, r2, 4080
        xor r3, r3, r2
        blr

New:
_test2:
        xoris r3, r3, 4080
        xori r3, r3, 4080
        blr



---
Diffs of the changes:  (+22 -2)

Index: llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp
diff -u llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp:1.90 llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp:1.91
--- llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp:1.90	Thu Oct  7 21:49:24 2004
+++ llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp	Thu Oct 14 19:50:19 2004
@@ -32,7 +32,7 @@
 using namespace llvm;
 
 namespace {
-  Statistic<> NumClear("ppc-codegen", "Number of AND turned into mask");
+  Statistic<> NumHiAndLo("ppc-codegen", "Number of 32b imms not loaded");
 
   /// TypeClass - Used by the PowerPC backend to group LLVM types by their basic
   /// PPC Representation.
@@ -2128,13 +2128,19 @@
   if (Opcode == 2) {
     unsigned MB, ME, mask = CI->getRawValue();
     if (isRunOfOnes(mask, MB, ME)) {
-      ++NumClear;
       BuildMI(*MBB, IP, PPC::RLWINM, 4, DestReg).addReg(Op0Reg).addImm(0)
         .addImm(MB).addImm(ME);
       return;
     }
   }
 
+  // PowerPC 16 bit signed immediates are sign extended before use by the
+  // instruction.  Therefore, we can only split up an add of a reg with a 32 bit
+  // immediate into addis and addi if the sign bit of the low 16 bits is cleared
+  // so that for register A, const imm X, we don't end up with
+  // A + XXXX0000 + FFFFXXXX.
+  bool WontSignExtend = (0 == (Op1->getRawValue() & 0x8000));
+
   // For Add, Sub, and SubF the instruction takes a signed immediate.  For And,
   // Or, and Xor, the instruction takes an unsigned immediate.  There is no 
   // shifted immediate form of SubF so disallow its opcode for those constants.
@@ -2152,6 +2158,20 @@
     else
       BuildMI(*MBB, IP, ImmOpTab[1][Opcode], 2, DestReg).addReg(Op0Reg)
         .addZImm(Op1->getRawValue() >> 16);
+  } else if ((Opcode < 2 && WontSignExtend) || Opcode == 3 || Opcode == 4) {
+    unsigned TmpReg = makeAnotherReg(Op1->getType());
+    ++NumHiAndLo;
+    if (Opcode < 2) {
+      BuildMI(*MBB, IP, ImmOpTab[1][Opcode], 2, TmpReg).addReg(Op0Reg)
+        .addSImm(Op1->getRawValue() >> 16);
+      BuildMI(*MBB, IP, ImmOpTab[0][Opcode], 2, DestReg).addReg(TmpReg)
+        .addSImm(Op1->getRawValue());
+    } else {
+      BuildMI(*MBB, IP, ImmOpTab[1][Opcode], 2, TmpReg).addReg(Op0Reg)
+        .addZImm(Op1->getRawValue() >> 16);
+      BuildMI(*MBB, IP, ImmOpTab[0][Opcode], 2, DestReg).addReg(TmpReg)
+        .addZImm(Op1->getRawValue());
+    }
   } else {
     unsigned Op1Reg = getReg(Op1, MBB, IP);
     BuildMI(*MBB, IP, OpTab[Opcode], 2, DestReg).addReg(Op0Reg).addReg(Op1Reg);






More information about the llvm-commits mailing list