[llvm] r179473 - Add support for the SPARC v9 abs44 code model.

Jakob Stoklund Olesen stoklund at 2pi.dk
Sat Apr 13 21:57:52 PDT 2013


Author: stoklund
Date: Sat Apr 13 23:57:51 2013
New Revision: 179473

URL: http://llvm.org/viewvc/llvm-project?rev=179473&view=rev
Log:
Add support for the SPARC v9 abs44 code model.

This is the default model for non-PIC 64-bit code. It supports
text+data+bss linked anywhere in the low 16 TB of the address space.

Modified:
    llvm/trunk/lib/Target/Sparc/SparcISelLowering.cpp
    llvm/trunk/test/CodeGen/SPARC/constpool.ll
    llvm/trunk/test/CodeGen/SPARC/globals.ll

Modified: llvm/trunk/lib/Target/Sparc/SparcISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcISelLowering.cpp?rev=179473&r1=179472&r2=179473&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Sparc/SparcISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/Sparc/SparcISelLowering.cpp Sat Apr 13 23:57:51 2013
@@ -1392,12 +1392,13 @@ SDValue SparcTargetLowering::makeHiLoPai
 // Build SDNodes for producing an address from a GlobalAddress, ConstantPool,
 // or ExternalSymbol SDNode.
 SDValue SparcTargetLowering::makeAddress(SDValue Op, SelectionDAG &DAG) const {
+  DebugLoc DL = Op.getDebugLoc();
+  EVT VT = getPointerTy();
+
   // Handle PIC mode first.
   if (getTargetMachine().getRelocationModel() == Reloc::PIC_) {
     // This is the pic32 code model, the GOT is known to be smaller than 4GB.
     SDValue HiLo = makeHiLoPair(Op, SPII::MO_HI, SPII::MO_LO, DAG);
-    DebugLoc DL = Op.getDebugLoc();
-    EVT VT = getPointerTy();
     SDValue GlobalBase = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, VT);
     SDValue AbsAddr = DAG.getNode(ISD::ADD, DL, VT, GlobalBase, HiLo);
     return DAG.getLoad(VT, DL, DAG.getEntryNode(), AbsAddr,
@@ -1405,10 +1406,19 @@ SDValue SparcTargetLowering::makeAddress
   }
 
   // This is one of the absolute code models.
-  assert(getTargetMachine().getCodeModel() == CodeModel::Small &&
-         "Only the abs32 code model is supported");
-
-  return makeHiLoPair(Op, SPII::MO_HI, SPII::MO_LO, DAG);
+  switch(getTargetMachine().getCodeModel()) {
+  default:
+    llvm_unreachable("Unsupported absolute code model");
+  case CodeModel::Small:
+    return makeHiLoPair(Op, SPII::MO_HI, SPII::MO_LO, DAG);
+  case CodeModel::Medium: {
+    SDValue H44 = makeHiLoPair(Op, SPII::MO_H44, SPII::MO_M44, DAG);
+    H44 = DAG.getNode(ISD::SHL, DL, VT, H44, DAG.getIntPtrConstant(12));
+    SDValue L44 = withTargetFlags(Op, SPII::MO_L44, DAG);
+    L44 = DAG.getNode(SPISD::Lo, DL, VT, L44);
+    return DAG.getNode(ISD::ADD, DL, VT, H44, L44);
+  }
+  }
 }
 
 SDValue SparcTargetLowering::LowerGlobalAddress(SDValue Op,

Modified: llvm/trunk/test/CodeGen/SPARC/constpool.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/SPARC/constpool.ll?rev=179473&r1=179472&r2=179473&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/SPARC/constpool.ll (original)
+++ llvm/trunk/test/CodeGen/SPARC/constpool.ll Sat Apr 13 23:57:51 2013
@@ -1,5 +1,6 @@
 ; RUN: llc < %s -march=sparc   -relocation-model=static -code-model=small  | FileCheck --check-prefix=abs32 %s
 ; RUN: llc < %s -march=sparcv9 -relocation-model=static -code-model=small  | FileCheck --check-prefix=abs32 %s
+; RUN: llc < %s -march=sparcv9 -relocation-model=static -code-model=medium | FileCheck --check-prefix=abs44 %s
 ; RUN: llc < %s -march=sparc   -relocation-model=pic    -code-model=medium | FileCheck --check-prefix=v8pic32 %s
 ; RUN: llc < %s -march=sparcv9 -relocation-model=pic    -code-model=medium | FileCheck --check-prefix=v9pic32 %s
 
@@ -13,6 +14,13 @@ entry:
 ; abs32: ld [%[[R]]+%lo(.LCPI0_0)], %f
 ; abs32: jmp %i7+8
 
+; abs44: floatCP
+; abs44: sethi %h44(.LCPI0_0), %[[R1:[gilo][0-7]]]
+; abs44: add %[[R1]], %m44(.LCPI0_0), %[[R2:[gilo][0-7]]]
+; abs44: sllx %[[R2]], 12, %[[R3:[gilo][0-7]]]
+; abs44: ld [%[[R3]]+%l44(.LCPI0_0)], %f1
+; abs44: jmp %i7+8
+
 ; v8pic32: floatCP
 ; v8pic32: _GLOBAL_OFFSET_TABLE_
 ; v8pic32: sethi %hi(.LCPI0_0), %[[R1:[gilo][0-7]]]

Modified: llvm/trunk/test/CodeGen/SPARC/globals.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/SPARC/globals.ll?rev=179473&r1=179472&r2=179473&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/SPARC/globals.ll (original)
+++ llvm/trunk/test/CodeGen/SPARC/globals.ll Sat Apr 13 23:57:51 2013
@@ -1,5 +1,6 @@
 ; RUN: llc < %s -march=sparc   -relocation-model=static -code-model=small  | FileCheck --check-prefix=abs32 %s
 ; RUN: llc < %s -march=sparcv9 -relocation-model=static -code-model=small  | FileCheck --check-prefix=abs32 %s
+; RUN: llc < %s -march=sparcv9 -relocation-model=static -code-model=medium | FileCheck --check-prefix=abs44 %s
 ; RUN: llc < %s -march=sparc   -relocation-model=pic    -code-model=medium | FileCheck --check-prefix=v8pic32 %s
 ; RUN: llc < %s -march=sparcv9 -relocation-model=pic    -code-model=medium | FileCheck --check-prefix=v9pic32 %s
 
@@ -15,6 +16,13 @@ define zeroext i8 @loadG() {
 ; abs32: ldub [%[[R]]+%lo(G)], %i0
 ; abs32: jmp %i7+8
 
+; abs44: loadG
+; abs44: sethi %h44(G), %[[R1:[gilo][0-7]]]
+; abs44: add %[[R1]], %m44(G), %[[R2:[gilo][0-7]]]
+; abs44: sllx %[[R2]], 12, %[[R3:[gilo][0-7]]]
+; abs44: ldub [%[[R3]]+%l44(G)], %i0
+; abs44: jmp %i7+8
+
 ; v8pic32: loadG
 ; v8pic32: _GLOBAL_OFFSET_TABLE_
 ; v8pic32: sethi %hi(G), %[[R1:[gilo][0-7]]]





More information about the llvm-commits mailing list