diff options
-rw-r--r-- | lib/Target/Sparc/SparcISelLowering.cpp | 22 | ||||
-rw-r--r-- | test/CodeGen/SPARC/constpool.ll | 8 | ||||
-rw-r--r-- | test/CodeGen/SPARC/globals.ll | 8 |
3 files changed, 32 insertions, 6 deletions
diff --git a/lib/Target/Sparc/SparcISelLowering.cpp b/lib/Target/Sparc/SparcISelLowering.cpp index cfe3d4f..3300368 100644 --- a/lib/Target/Sparc/SparcISelLowering.cpp +++ b/lib/Target/Sparc/SparcISelLowering.cpp @@ -1392,12 +1392,13 @@ SDValue SparcTargetLowering::makeHiLoPair(SDValue Op, // 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(SDValue Op, SelectionDAG &DAG) const { } // 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, diff --git a/test/CodeGen/SPARC/constpool.ll b/test/CodeGen/SPARC/constpool.ll index 76c485e..6c3a1bf 100644 --- a/test/CodeGen/SPARC/constpool.ll +++ b/test/CodeGen/SPARC/constpool.ll @@ -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]]] diff --git a/test/CodeGen/SPARC/globals.ll b/test/CodeGen/SPARC/globals.ll index 882fe7f..957059d 100644 --- a/test/CodeGen/SPARC/globals.ll +++ b/test/CodeGen/SPARC/globals.ll @@ -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]]] |