[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstr64Bit.td

Chris Lattner lattner at cs.uiuc.edu
Tue Jun 20 16:03:13 PDT 2006



Changes in directory llvm/lib/Target/PowerPC:

PPCInstr64Bit.td updated: 1.7 -> 1.8
---
Log message:

Add some more immediate patterns.  This allows us to compile:

void test6() {
  Y = 0xABCD0123BCDE4567;
}

into:

_test6:
        lis r2, -21555
        lis r3, ha16(_Y)
        ori r2, r2, 291
        rldicr r2, r2, 32, 31
        oris r2, r2, 48350
        ori r2, r2, 17767
        std r2, lo16(_Y)(r3)
        blr



---
Diffs of the changes:  (+30 -0)

 PPCInstr64Bit.td |   30 ++++++++++++++++++++++++++++++
 1 files changed, 30 insertions(+)


Index: llvm/lib/Target/PowerPC/PPCInstr64Bit.td
diff -u llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.7 llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.8
--- llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.7	Tue Jun 20 17:38:59 2006
+++ llvm/lib/Target/PowerPC/PPCInstr64Bit.td	Tue Jun 20 18:03:01 2006
@@ -215,6 +215,17 @@
 // Instruction Patterns
 //
 
+def HI32_48 : SDNodeXForm<imm, [{
+  // Transformation function: shift the immediate value down into the low bits.
+  return getI32Imm((unsigned short)(N->getValue() >> 32));
+}]>;
+
+def HI48_64 : SDNodeXForm<imm, [{
+  // Transformation function: shift the immediate value down into the low bits.
+  return getI32Imm((unsigned short)(N->getValue() >> 48));
+}]>;
+
+
 // Immediate support.
 // Handled above:
 //   sext(0x0000_0000_0000_FFFF,  i8) -> li imm
@@ -234,6 +245,25 @@
 def : Pat<(i64 zext_0x0000_0000_FFFF_7FFF_i16:$imm),
           (ORIS8 (LI8 (LO16 imm:$imm)), (HI16 imm:$imm))>;
 
+// zext(0x0000_0000_FFFF_FFFF, i16) -> oris (ori (li 0), lo16(imm)), imm>>16
+def zext_0x0000_0000_FFFF_FFFF_i16 : PatLeaf<(imm), [{
+  return (N->getValue() & 0xFFFFFFFF00000000ULL) == 0;
+}]>;
+def : Pat<(i64 zext_0x0000_0000_FFFF_FFFF_i16:$imm),
+          (ORIS8 (ORI8 (LI8 0), (LO16 imm:$imm)), (HI16 imm:$imm))>;
+
+
+// Fully general (and most expensive: 6 instructions!) immediate pattern.
+def : Pat<(i64 imm:$imm),
+          (ORI8 
+             (ORIS8 
+                (RLDICR
+                   (ORI8
+                      (LIS8 (HI48_64 imm:$imm)),
+                      (HI32_48 imm:$imm)),
+                   32, 31),
+                (HI16 imm:$imm)),
+             (LO16 imm:$imm))>;
 
 
 // Extensions and truncates to/from 32-bit regs.






More information about the llvm-commits mailing list