mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-16 14:31:59 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179473 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cab0abd03d
commit
87ce01739b
@ -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,
|
||||
|
@ -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]]]
|
||||
|
@ -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]]]
|
||||
|
Loading…
x
Reference in New Issue
Block a user