From c3c28f8599f56c91974000f8044bf392beb753e5 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Sun, 14 Apr 2013 05:10:36 +0000 Subject: [PATCH] Add support for the abs64 SPARC v9 code model. For when 16 TB just isn't enough. llvm-svn: 179474 --- llvm/lib/Target/Sparc/SparcISelLowering.cpp | 9 +++++++++ llvm/test/CodeGen/SPARC/constpool.ll | 10 ++++++++++ llvm/test/CodeGen/SPARC/globals.ll | 10 ++++++++++ 3 files changed, 29 insertions(+) diff --git a/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/llvm/lib/Target/Sparc/SparcISelLowering.cpp index 3300368..198d194a 100644 --- a/llvm/lib/Target/Sparc/SparcISelLowering.cpp +++ b/llvm/lib/Target/Sparc/SparcISelLowering.cpp @@ -1410,14 +1410,23 @@ SDValue SparcTargetLowering::makeAddress(SDValue Op, SelectionDAG &DAG) const { default: llvm_unreachable("Unsupported absolute code model"); case CodeModel::Small: + // abs32. return makeHiLoPair(Op, SPII::MO_HI, SPII::MO_LO, DAG); case CodeModel::Medium: { + // abs44. 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); } + case CodeModel::Large: { + // abs64. + SDValue Hi = makeHiLoPair(Op, SPII::MO_HH, SPII::MO_HM, DAG); + Hi = DAG.getNode(ISD::SHL, DL, VT, Hi, DAG.getIntPtrConstant(32)); + SDValue Lo = makeHiLoPair(Op, SPII::MO_HI, SPII::MO_LO, DAG); + return DAG.getNode(ISD::ADD, DL, VT, Hi, Lo); + } } } diff --git a/llvm/test/CodeGen/SPARC/constpool.ll b/llvm/test/CodeGen/SPARC/constpool.ll index 6c3a1bf..d93a53b 100644 --- a/llvm/test/CodeGen/SPARC/constpool.ll +++ b/llvm/test/CodeGen/SPARC/constpool.ll @@ -1,6 +1,7 @@ ; 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=sparcv9 -relocation-model=static -code-model=large | FileCheck --check-prefix=abs64 %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 @@ -21,6 +22,15 @@ entry: ; abs44: ld [%[[R3]]+%l44(.LCPI0_0)], %f1 ; abs44: jmp %i7+8 +; abs64: floatCP +; abs64: sethi %hi(.LCPI0_0), %[[R1:[gilo][0-7]]] +; abs64: add %[[R1]], %lo(.LCPI0_0), %[[R2:[gilo][0-7]]] +; abs64: sethi %hh(.LCPI0_0), %[[R3:[gilo][0-7]]] +; abs64: add %[[R3]], %hm(.LCPI0_0), %[[R4:[gilo][0-7]]] +; abs64: sllx %[[R4]], 32, %[[R5:[gilo][0-7]]] +; abs64: ld [%[[R5]]+%[[R2]]], %f1 +; abs64: jmp %i7+8 + ; v8pic32: floatCP ; v8pic32: _GLOBAL_OFFSET_TABLE_ ; v8pic32: sethi %hi(.LCPI0_0), %[[R1:[gilo][0-7]]] diff --git a/llvm/test/CodeGen/SPARC/globals.ll b/llvm/test/CodeGen/SPARC/globals.ll index 957059d..8d8de58 100644 --- a/llvm/test/CodeGen/SPARC/globals.ll +++ b/llvm/test/CodeGen/SPARC/globals.ll @@ -1,6 +1,7 @@ ; 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=sparcv9 -relocation-model=static -code-model=large | FileCheck --check-prefix=abs64 %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 @@ -23,6 +24,15 @@ define zeroext i8 @loadG() { ; abs44: ldub [%[[R3]]+%l44(G)], %i0 ; abs44: jmp %i7+8 +; abs64: loadG +; abs64: sethi %hi(G), %[[R1:[gilo][0-7]]] +; abs64: add %[[R1]], %lo(G), %[[R2:[gilo][0-7]]] +; abs64: sethi %hh(G), %[[R3:[gilo][0-7]]] +; abs64: add %[[R3]], %hm(G), %[[R4:[gilo][0-7]]] +; abs64: sllx %[[R4]], 32, %[[R5:[gilo][0-7]]] +; abs64: ldub [%[[R5]]+%[[R2]]], %i0 +; abs64: jmp %i7+8 + ; v8pic32: loadG ; v8pic32: _GLOBAL_OFFSET_TABLE_ ; v8pic32: sethi %hi(G), %[[R1:[gilo][0-7]]] -- 2.7.4