mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-26 07:24:25 +00:00
[Sparc] Use SparcMCExpr::VariantKind itself as MachineOperand's target flags.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200960 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -13,7 +13,6 @@
|
|||||||
|
|
||||||
#define DEBUG_TYPE "asm-printer"
|
#define DEBUG_TYPE "asm-printer"
|
||||||
#include "SparcInstPrinter.h"
|
#include "SparcInstPrinter.h"
|
||||||
#include "MCTargetDesc/SparcBaseInfo.h"
|
|
||||||
#include "Sparc.h"
|
#include "Sparc.h"
|
||||||
#include "llvm/MC/MCExpr.h"
|
#include "llvm/MC/MCExpr.h"
|
||||||
#include "llvm/MC/MCInst.h"
|
#include "llvm/MC/MCInst.h"
|
||||||
|
@ -1,82 +0,0 @@
|
|||||||
//===-- SparcBaseInfo.h - Top level definitions for Sparc ---- --*- C++ -*-===//
|
|
||||||
//
|
|
||||||
// The LLVM Compiler Infrastructure
|
|
||||||
//
|
|
||||||
// This file is distributed under the University of Illinois Open Source
|
|
||||||
// License. See LICENSE.TXT for details.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
//
|
|
||||||
// This file contains small standalone helper functions and enum definitions
|
|
||||||
// for the Sparc target useful for the compiler back-end and the MC libraries.
|
|
||||||
// As such, it deliberately does not include references to LLVM core code gen
|
|
||||||
// types, passes, etc..
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
|
|
||||||
#ifndef SPARCBASEINFO_H
|
|
||||||
#define SPARCBASEINFO_H
|
|
||||||
|
|
||||||
namespace llvm {
|
|
||||||
|
|
||||||
/// SPII - This namespace holds target specific flags for instruction info.
|
|
||||||
namespace SPII {
|
|
||||||
|
|
||||||
/// Target Operand Flags. Sparc specific TargetFlags for MachineOperands and
|
|
||||||
/// SDNodes.
|
|
||||||
enum TOF {
|
|
||||||
MO_NO_FLAG,
|
|
||||||
|
|
||||||
// Extract the low 10 bits of an address.
|
|
||||||
// Assembler: %lo(addr)
|
|
||||||
MO_LO,
|
|
||||||
|
|
||||||
// Extract bits 31-10 of an address. Only for sethi.
|
|
||||||
// Assembler: %hi(addr) or %lm(addr)
|
|
||||||
MO_HI,
|
|
||||||
|
|
||||||
// Extract bits 43-22 of an address. Only for sethi.
|
|
||||||
// Assembler: %h44(addr)
|
|
||||||
MO_H44,
|
|
||||||
|
|
||||||
// Extract bits 21-12 of an address.
|
|
||||||
// Assembler: %m44(addr)
|
|
||||||
MO_M44,
|
|
||||||
|
|
||||||
// Extract bits 11-0 of an address.
|
|
||||||
// Assembler: %l44(addr)
|
|
||||||
MO_L44,
|
|
||||||
|
|
||||||
// Extract bits 63-42 of an address. Only for sethi.
|
|
||||||
// Assembler: %hh(addr)
|
|
||||||
MO_HH,
|
|
||||||
|
|
||||||
// Extract bits 41-32 of an address.
|
|
||||||
// Assembler: %hm(addr)
|
|
||||||
MO_HM,
|
|
||||||
|
|
||||||
// TargetFlags for Thread Local Storage.
|
|
||||||
MO_TLS_GD_HI22,
|
|
||||||
MO_TLS_GD_LO10,
|
|
||||||
MO_TLS_GD_ADD,
|
|
||||||
MO_TLS_GD_CALL,
|
|
||||||
MO_TLS_LDM_HI22,
|
|
||||||
MO_TLS_LDM_LO10,
|
|
||||||
MO_TLS_LDM_ADD,
|
|
||||||
MO_TLS_LDM_CALL,
|
|
||||||
MO_TLS_LDO_HIX22,
|
|
||||||
MO_TLS_LDO_LOX10,
|
|
||||||
MO_TLS_LDO_ADD,
|
|
||||||
MO_TLS_IE_HI22,
|
|
||||||
MO_TLS_IE_LO10,
|
|
||||||
MO_TLS_IE_LD,
|
|
||||||
MO_TLS_IE_LDX,
|
|
||||||
MO_TLS_IE_ADD,
|
|
||||||
MO_TLS_LE_HIX22,
|
|
||||||
MO_TLS_LE_LOX10
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace SPII
|
|
||||||
} // end namespace llvm
|
|
||||||
|
|
||||||
#endif
|
|
@ -29,7 +29,20 @@ SparcMCExpr::Create(VariantKind Kind, const MCExpr *Expr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void SparcMCExpr::PrintImpl(raw_ostream &OS) const
|
void SparcMCExpr::PrintImpl(raw_ostream &OS) const
|
||||||
|
{
|
||||||
|
|
||||||
|
bool closeParen = printVariantKind(OS, Kind);
|
||||||
|
|
||||||
|
const MCExpr *Expr = getSubExpr();
|
||||||
|
Expr->print(OS);
|
||||||
|
|
||||||
|
if (closeParen)
|
||||||
|
OS << ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SparcMCExpr::printVariantKind(raw_ostream &OS, VariantKind Kind)
|
||||||
{
|
{
|
||||||
bool closeParen = true;
|
bool closeParen = true;
|
||||||
switch (Kind) {
|
switch (Kind) {
|
||||||
@ -61,11 +74,7 @@ void SparcMCExpr::PrintImpl(raw_ostream &OS) const
|
|||||||
case VK_Sparc_TLS_LE_HIX22: OS << "%tle_hix22("; break;
|
case VK_Sparc_TLS_LE_HIX22: OS << "%tle_hix22("; break;
|
||||||
case VK_Sparc_TLS_LE_LOX10: OS << "%tle_lox10("; break;
|
case VK_Sparc_TLS_LE_LOX10: OS << "%tle_lox10("; break;
|
||||||
}
|
}
|
||||||
|
return closeParen;
|
||||||
const MCExpr *Expr = getSubExpr();
|
|
||||||
Expr->print(OS);
|
|
||||||
if (closeParen)
|
|
||||||
OS << ')';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SparcMCExpr::VariantKind SparcMCExpr::parseVariantKind(StringRef name)
|
SparcMCExpr::VariantKind SparcMCExpr::parseVariantKind(StringRef name)
|
||||||
|
@ -93,7 +93,7 @@ public:
|
|||||||
static bool classof(const SparcMCExpr *) { return true; }
|
static bool classof(const SparcMCExpr *) { return true; }
|
||||||
|
|
||||||
static VariantKind parseVariantKind(StringRef name);
|
static VariantKind parseVariantKind(StringRef name);
|
||||||
|
static bool printVariantKind(raw_ostream &OS, VariantKind Kind);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace llvm.
|
} // end namespace llvm.
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
#define DEBUG_TYPE "asm-printer"
|
#define DEBUG_TYPE "asm-printer"
|
||||||
#include "Sparc.h"
|
#include "Sparc.h"
|
||||||
#include "InstPrinter/SparcInstPrinter.h"
|
#include "InstPrinter/SparcInstPrinter.h"
|
||||||
#include "MCTargetDesc/SparcBaseInfo.h"
|
|
||||||
#include "MCTargetDesc/SparcMCExpr.h"
|
#include "MCTargetDesc/SparcMCExpr.h"
|
||||||
#include "SparcInstrInfo.h"
|
#include "SparcInstrInfo.h"
|
||||||
#include "SparcTargetMachine.h"
|
#include "SparcTargetMachine.h"
|
||||||
@ -298,82 +297,59 @@ void SparcAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
|
|||||||
raw_ostream &O) {
|
raw_ostream &O) {
|
||||||
const DataLayout *DL = TM.getDataLayout();
|
const DataLayout *DL = TM.getDataLayout();
|
||||||
const MachineOperand &MO = MI->getOperand (opNum);
|
const MachineOperand &MO = MI->getOperand (opNum);
|
||||||
unsigned TF = MO.getTargetFlags();
|
SparcMCExpr::VariantKind TF = (SparcMCExpr::VariantKind) MO.getTargetFlags();
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
// Verify the target flags.
|
// Verify the target flags.
|
||||||
if (MO.isGlobal() || MO.isSymbol() || MO.isCPI()) {
|
if (MO.isGlobal() || MO.isSymbol() || MO.isCPI()) {
|
||||||
if (MI->getOpcode() == SP::CALL)
|
if (MI->getOpcode() == SP::CALL)
|
||||||
assert(TF == SPII::MO_NO_FLAG &&
|
assert(TF == SparcMCExpr::VK_Sparc_None &&
|
||||||
"Cannot handle target flags on call address");
|
"Cannot handle target flags on call address");
|
||||||
else if (MI->getOpcode() == SP::SETHIi || MI->getOpcode() == SP::SETHIXi)
|
else if (MI->getOpcode() == SP::SETHIi || MI->getOpcode() == SP::SETHIXi)
|
||||||
assert((TF == SPII::MO_HI || TF == SPII::MO_H44 || TF == SPII::MO_HH
|
assert((TF == SparcMCExpr::VK_Sparc_HI
|
||||||
|| TF == SPII::MO_TLS_GD_HI22
|
|| TF == SparcMCExpr::VK_Sparc_H44
|
||||||
|| TF == SPII::MO_TLS_LDM_HI22
|
|| TF == SparcMCExpr::VK_Sparc_HH
|
||||||
|| TF == SPII::MO_TLS_LDO_HIX22
|
|| TF == SparcMCExpr::VK_Sparc_TLS_GD_HI22
|
||||||
|| TF == SPII::MO_TLS_IE_HI22
|
|| TF == SparcMCExpr::VK_Sparc_TLS_LDM_HI22
|
||||||
|| TF == SPII::MO_TLS_LE_HIX22) &&
|
|| TF == SparcMCExpr::VK_Sparc_TLS_LDO_HIX22
|
||||||
|
|| TF == SparcMCExpr::VK_Sparc_TLS_IE_HI22
|
||||||
|
|| TF == SparcMCExpr::VK_Sparc_TLS_LE_HIX22) &&
|
||||||
"Invalid target flags for address operand on sethi");
|
"Invalid target flags for address operand on sethi");
|
||||||
else if (MI->getOpcode() == SP::TLS_CALL)
|
else if (MI->getOpcode() == SP::TLS_CALL)
|
||||||
assert((TF == SPII::MO_NO_FLAG
|
assert((TF == SparcMCExpr::VK_Sparc_None
|
||||||
|| TF == SPII::MO_TLS_GD_CALL
|
|| TF == SparcMCExpr::VK_Sparc_TLS_GD_CALL
|
||||||
|| TF == SPII::MO_TLS_LDM_CALL) &&
|
|| TF == SparcMCExpr::VK_Sparc_TLS_LDM_CALL) &&
|
||||||
"Cannot handle target flags on tls call address");
|
"Cannot handle target flags on tls call address");
|
||||||
else if (MI->getOpcode() == SP::TLS_ADDrr)
|
else if (MI->getOpcode() == SP::TLS_ADDrr)
|
||||||
assert((TF == SPII::MO_TLS_GD_ADD || TF == SPII::MO_TLS_LDM_ADD
|
assert((TF == SparcMCExpr::VK_Sparc_TLS_GD_ADD
|
||||||
|| TF == SPII::MO_TLS_LDO_ADD || TF == SPII::MO_TLS_IE_ADD) &&
|
|| TF == SparcMCExpr::VK_Sparc_TLS_LDM_ADD
|
||||||
|
|| TF == SparcMCExpr::VK_Sparc_TLS_LDO_ADD
|
||||||
|
|| TF == SparcMCExpr::VK_Sparc_TLS_IE_ADD) &&
|
||||||
"Cannot handle target flags on add for TLS");
|
"Cannot handle target flags on add for TLS");
|
||||||
else if (MI->getOpcode() == SP::TLS_LDrr)
|
else if (MI->getOpcode() == SP::TLS_LDrr)
|
||||||
assert(TF == SPII::MO_TLS_IE_LD &&
|
assert(TF == SparcMCExpr::VK_Sparc_TLS_IE_LD &&
|
||||||
"Cannot handle target flags on ld for TLS");
|
"Cannot handle target flags on ld for TLS");
|
||||||
else if (MI->getOpcode() == SP::TLS_LDXrr)
|
else if (MI->getOpcode() == SP::TLS_LDXrr)
|
||||||
assert(TF == SPII::MO_TLS_IE_LDX &&
|
assert(TF == SparcMCExpr::VK_Sparc_TLS_IE_LDX &&
|
||||||
"Cannot handle target flags on ldx for TLS");
|
"Cannot handle target flags on ldx for TLS");
|
||||||
else if (MI->getOpcode() == SP::XORri || MI->getOpcode() == SP::XORXri)
|
else if (MI->getOpcode() == SP::XORri || MI->getOpcode() == SP::XORXri)
|
||||||
assert((TF == SPII::MO_TLS_LDO_LOX10 || TF == SPII::MO_TLS_LE_LOX10) &&
|
assert((TF == SparcMCExpr::VK_Sparc_TLS_LDO_LOX10
|
||||||
|
|| TF == SparcMCExpr::VK_Sparc_TLS_LE_LOX10) &&
|
||||||
"Cannot handle target flags on xor for TLS");
|
"Cannot handle target flags on xor for TLS");
|
||||||
else
|
else
|
||||||
assert((TF == SPII::MO_LO || TF == SPII::MO_M44 || TF == SPII::MO_L44
|
assert((TF == SparcMCExpr::VK_Sparc_LO
|
||||||
|| TF == SPII::MO_HM
|
|| TF == SparcMCExpr::VK_Sparc_M44
|
||||||
|| TF == SPII::MO_TLS_GD_LO10
|
|| TF == SparcMCExpr::VK_Sparc_L44
|
||||||
|| TF == SPII::MO_TLS_LDM_LO10
|
|| TF == SparcMCExpr::VK_Sparc_HM
|
||||||
|| TF == SPII::MO_TLS_IE_LO10 ) &&
|
|| TF == SparcMCExpr::VK_Sparc_TLS_GD_LO10
|
||||||
|
|| TF == SparcMCExpr::VK_Sparc_TLS_LDM_LO10
|
||||||
|
|| TF == SparcMCExpr::VK_Sparc_TLS_IE_LO10 ) &&
|
||||||
"Invalid target flags for small address operand");
|
"Invalid target flags for small address operand");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool CloseParen = true;
|
|
||||||
switch (TF) {
|
bool CloseParen = SparcMCExpr::printVariantKind(O, TF);
|
||||||
default:
|
|
||||||
llvm_unreachable("Unknown target flags on operand");
|
|
||||||
case SPII::MO_NO_FLAG:
|
|
||||||
CloseParen = false;
|
|
||||||
break;
|
|
||||||
case SPII::MO_LO: O << "%lo("; break;
|
|
||||||
case SPII::MO_HI: O << "%hi("; break;
|
|
||||||
case SPII::MO_H44: O << "%h44("; break;
|
|
||||||
case SPII::MO_M44: O << "%m44("; break;
|
|
||||||
case SPII::MO_L44: O << "%l44("; break;
|
|
||||||
case SPII::MO_HH: O << "%hh("; break;
|
|
||||||
case SPII::MO_HM: O << "%hm("; break;
|
|
||||||
case SPII::MO_TLS_GD_HI22: O << "%tgd_hi22("; break;
|
|
||||||
case SPII::MO_TLS_GD_LO10: O << "%tgd_lo10("; break;
|
|
||||||
case SPII::MO_TLS_GD_ADD: O << "%tgd_add("; break;
|
|
||||||
case SPII::MO_TLS_GD_CALL: O << "%tgd_call("; break;
|
|
||||||
case SPII::MO_TLS_LDM_HI22: O << "%tldm_hi22("; break;
|
|
||||||
case SPII::MO_TLS_LDM_LO10: O << "%tldm_lo10("; break;
|
|
||||||
case SPII::MO_TLS_LDM_ADD: O << "%tldm_add("; break;
|
|
||||||
case SPII::MO_TLS_LDM_CALL: O << "%tldm_call("; break;
|
|
||||||
case SPII::MO_TLS_LDO_HIX22: O << "%tldo_hix22("; break;
|
|
||||||
case SPII::MO_TLS_LDO_LOX10: O << "%tldo_lox10("; break;
|
|
||||||
case SPII::MO_TLS_LDO_ADD: O << "%tldo_add("; break;
|
|
||||||
case SPII::MO_TLS_IE_HI22: O << "%tie_hi22("; break;
|
|
||||||
case SPII::MO_TLS_IE_LO10: O << "%tie_lo10("; break;
|
|
||||||
case SPII::MO_TLS_IE_LD: O << "%tie_ld("; break;
|
|
||||||
case SPII::MO_TLS_IE_LDX: O << "%tie_ldx("; break;
|
|
||||||
case SPII::MO_TLS_IE_ADD: O << "%tie_add("; break;
|
|
||||||
case SPII::MO_TLS_LE_HIX22: O << "%tle_hix22("; break;
|
|
||||||
case SPII::MO_TLS_LE_LOX10: O << "%tle_lox10("; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (MO.getType()) {
|
switch (MO.getType()) {
|
||||||
case MachineOperand::MO_Register:
|
case MachineOperand::MO_Register:
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#define DEBUG_TYPE "jit"
|
#define DEBUG_TYPE "jit"
|
||||||
#include "Sparc.h"
|
#include "Sparc.h"
|
||||||
#include "MCTargetDesc/SparcBaseInfo.h"
|
#include "MCTargetDesc/SparcMCExpr.h"
|
||||||
#include "SparcRelocations.h"
|
#include "SparcRelocations.h"
|
||||||
#include "SparcTargetMachine.h"
|
#include "SparcTargetMachine.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
@ -204,14 +204,14 @@ unsigned SparcCodeEmitter::getRelocation(const MachineInstr &MI,
|
|||||||
unsigned TF = MO.getTargetFlags();
|
unsigned TF = MO.getTargetFlags();
|
||||||
switch (TF) {
|
switch (TF) {
|
||||||
default:
|
default:
|
||||||
case SPII::MO_NO_FLAG: break;
|
case SparcMCExpr::VK_Sparc_None: break;
|
||||||
case SPII::MO_LO: return SP::reloc_sparc_lo;
|
case SparcMCExpr::VK_Sparc_LO: return SP::reloc_sparc_lo;
|
||||||
case SPII::MO_HI: return SP::reloc_sparc_hi;
|
case SparcMCExpr::VK_Sparc_HI: return SP::reloc_sparc_hi;
|
||||||
case SPII::MO_H44: return SP::reloc_sparc_h44;
|
case SparcMCExpr::VK_Sparc_H44: return SP::reloc_sparc_h44;
|
||||||
case SPII::MO_M44: return SP::reloc_sparc_m44;
|
case SparcMCExpr::VK_Sparc_M44: return SP::reloc_sparc_m44;
|
||||||
case SPII::MO_L44: return SP::reloc_sparc_l44;
|
case SparcMCExpr::VK_Sparc_L44: return SP::reloc_sparc_l44;
|
||||||
case SPII::MO_HH: return SP::reloc_sparc_hh;
|
case SparcMCExpr::VK_Sparc_HH: return SP::reloc_sparc_hh;
|
||||||
case SPII::MO_HM: return SP::reloc_sparc_hm;
|
case SparcMCExpr::VK_Sparc_HM: return SP::reloc_sparc_hm;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Opc = MI.getOpcode();
|
unsigned Opc = MI.getOpcode();
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "SparcISelLowering.h"
|
#include "SparcISelLowering.h"
|
||||||
#include "MCTargetDesc/SparcBaseInfo.h"
|
#include "MCTargetDesc/SparcMCExpr.h"
|
||||||
#include "SparcMachineFunctionInfo.h"
|
#include "SparcMachineFunctionInfo.h"
|
||||||
#include "SparcRegisterInfo.h"
|
#include "SparcRegisterInfo.h"
|
||||||
#include "SparcTargetMachine.h"
|
#include "SparcTargetMachine.h"
|
||||||
@ -1798,7 +1798,8 @@ SDValue SparcTargetLowering::makeAddress(SDValue Op, SelectionDAG &DAG) const {
|
|||||||
// Handle PIC mode first.
|
// Handle PIC mode first.
|
||||||
if (getTargetMachine().getRelocationModel() == Reloc::PIC_) {
|
if (getTargetMachine().getRelocationModel() == Reloc::PIC_) {
|
||||||
// This is the pic32 code model, the GOT is known to be smaller than 4GB.
|
// 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);
|
SDValue HiLo = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_HI,
|
||||||
|
SparcMCExpr::VK_Sparc_LO, DAG);
|
||||||
SDValue GlobalBase = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, VT);
|
SDValue GlobalBase = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, VT);
|
||||||
SDValue AbsAddr = DAG.getNode(ISD::ADD, DL, VT, GlobalBase, HiLo);
|
SDValue AbsAddr = DAG.getNode(ISD::ADD, DL, VT, GlobalBase, HiLo);
|
||||||
// GLOBAL_BASE_REG codegen'ed with call. Inform MFI that this
|
// GLOBAL_BASE_REG codegen'ed with call. Inform MFI that this
|
||||||
@ -1815,20 +1816,24 @@ SDValue SparcTargetLowering::makeAddress(SDValue Op, SelectionDAG &DAG) const {
|
|||||||
llvm_unreachable("Unsupported absolute code model");
|
llvm_unreachable("Unsupported absolute code model");
|
||||||
case CodeModel::Small:
|
case CodeModel::Small:
|
||||||
// abs32.
|
// abs32.
|
||||||
return makeHiLoPair(Op, SPII::MO_HI, SPII::MO_LO, DAG);
|
return makeHiLoPair(Op, SparcMCExpr::VK_Sparc_HI,
|
||||||
|
SparcMCExpr::VK_Sparc_LO, DAG);
|
||||||
case CodeModel::Medium: {
|
case CodeModel::Medium: {
|
||||||
// abs44.
|
// abs44.
|
||||||
SDValue H44 = makeHiLoPair(Op, SPII::MO_H44, SPII::MO_M44, DAG);
|
SDValue H44 = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_H44,
|
||||||
|
SparcMCExpr::VK_Sparc_M44, DAG);
|
||||||
H44 = DAG.getNode(ISD::SHL, DL, VT, H44, DAG.getConstant(12, MVT::i32));
|
H44 = DAG.getNode(ISD::SHL, DL, VT, H44, DAG.getConstant(12, MVT::i32));
|
||||||
SDValue L44 = withTargetFlags(Op, SPII::MO_L44, DAG);
|
SDValue L44 = withTargetFlags(Op, SparcMCExpr::VK_Sparc_L44, DAG);
|
||||||
L44 = DAG.getNode(SPISD::Lo, DL, VT, L44);
|
L44 = DAG.getNode(SPISD::Lo, DL, VT, L44);
|
||||||
return DAG.getNode(ISD::ADD, DL, VT, H44, L44);
|
return DAG.getNode(ISD::ADD, DL, VT, H44, L44);
|
||||||
}
|
}
|
||||||
case CodeModel::Large: {
|
case CodeModel::Large: {
|
||||||
// abs64.
|
// abs64.
|
||||||
SDValue Hi = makeHiLoPair(Op, SPII::MO_HH, SPII::MO_HM, DAG);
|
SDValue Hi = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_HH,
|
||||||
|
SparcMCExpr::VK_Sparc_HM, DAG);
|
||||||
Hi = DAG.getNode(ISD::SHL, DL, VT, Hi, DAG.getConstant(32, MVT::i32));
|
Hi = DAG.getNode(ISD::SHL, DL, VT, Hi, DAG.getConstant(32, MVT::i32));
|
||||||
SDValue Lo = makeHiLoPair(Op, SPII::MO_HI, SPII::MO_LO, DAG);
|
SDValue Lo = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_HI,
|
||||||
|
SparcMCExpr::VK_Sparc_LO, DAG);
|
||||||
return DAG.getNode(ISD::ADD, DL, VT, Hi, Lo);
|
return DAG.getNode(ISD::ADD, DL, VT, Hi, Lo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1860,14 +1865,18 @@ SDValue SparcTargetLowering::LowerGlobalTLSAddress(SDValue Op,
|
|||||||
TLSModel::Model model = getTargetMachine().getTLSModel(GV);
|
TLSModel::Model model = getTargetMachine().getTLSModel(GV);
|
||||||
|
|
||||||
if (model == TLSModel::GeneralDynamic || model == TLSModel::LocalDynamic) {
|
if (model == TLSModel::GeneralDynamic || model == TLSModel::LocalDynamic) {
|
||||||
unsigned HiTF = ((model == TLSModel::GeneralDynamic)? SPII::MO_TLS_GD_HI22
|
unsigned HiTF = ((model == TLSModel::GeneralDynamic)
|
||||||
: SPII::MO_TLS_LDM_HI22);
|
? SparcMCExpr::VK_Sparc_TLS_GD_HI22
|
||||||
unsigned LoTF = ((model == TLSModel::GeneralDynamic)? SPII::MO_TLS_GD_LO10
|
: SparcMCExpr::VK_Sparc_TLS_LDM_HI22);
|
||||||
: SPII::MO_TLS_LDM_LO10);
|
unsigned LoTF = ((model == TLSModel::GeneralDynamic)
|
||||||
unsigned addTF = ((model == TLSModel::GeneralDynamic)? SPII::MO_TLS_GD_ADD
|
? SparcMCExpr::VK_Sparc_TLS_GD_LO10
|
||||||
: SPII::MO_TLS_LDM_ADD);
|
: SparcMCExpr::VK_Sparc_TLS_LDM_LO10);
|
||||||
unsigned callTF = ((model == TLSModel::GeneralDynamic)? SPII::MO_TLS_GD_CALL
|
unsigned addTF = ((model == TLSModel::GeneralDynamic)
|
||||||
: SPII::MO_TLS_LDM_CALL);
|
? SparcMCExpr::VK_Sparc_TLS_GD_ADD
|
||||||
|
: SparcMCExpr::VK_Sparc_TLS_LDM_ADD);
|
||||||
|
unsigned callTF = ((model == TLSModel::GeneralDynamic)
|
||||||
|
? SparcMCExpr::VK_Sparc_TLS_GD_CALL
|
||||||
|
: SparcMCExpr::VK_Sparc_TLS_LDM_CALL);
|
||||||
|
|
||||||
SDValue HiLo = makeHiLoPair(Op, HiTF, LoTF, DAG);
|
SDValue HiLo = makeHiLoPair(Op, HiTF, LoTF, DAG);
|
||||||
SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT);
|
SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT);
|
||||||
@ -1905,17 +1914,17 @@ SDValue SparcTargetLowering::LowerGlobalTLSAddress(SDValue Op,
|
|||||||
return Ret;
|
return Ret;
|
||||||
|
|
||||||
SDValue Hi = DAG.getNode(SPISD::Hi, DL, PtrVT,
|
SDValue Hi = DAG.getNode(SPISD::Hi, DL, PtrVT,
|
||||||
withTargetFlags(Op, SPII::MO_TLS_LDO_HIX22, DAG));
|
withTargetFlags(Op, SparcMCExpr::VK_Sparc_TLS_LDO_HIX22, DAG));
|
||||||
SDValue Lo = DAG.getNode(SPISD::Lo, DL, PtrVT,
|
SDValue Lo = DAG.getNode(SPISD::Lo, DL, PtrVT,
|
||||||
withTargetFlags(Op, SPII::MO_TLS_LDO_LOX10, DAG));
|
withTargetFlags(Op, SparcMCExpr::VK_Sparc_TLS_LDO_LOX10, DAG));
|
||||||
HiLo = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo);
|
HiLo = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo);
|
||||||
return DAG.getNode(SPISD::TLS_ADD, DL, PtrVT, Ret, HiLo,
|
return DAG.getNode(SPISD::TLS_ADD, DL, PtrVT, Ret, HiLo,
|
||||||
withTargetFlags(Op, SPII::MO_TLS_LDO_ADD, DAG));
|
withTargetFlags(Op, SparcMCExpr::VK_Sparc_TLS_LDO_ADD, DAG));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (model == TLSModel::InitialExec) {
|
if (model == TLSModel::InitialExec) {
|
||||||
unsigned ldTF = ((PtrVT == MVT::i64)? SPII::MO_TLS_IE_LDX
|
unsigned ldTF = ((PtrVT == MVT::i64)? SparcMCExpr::VK_Sparc_TLS_IE_LDX
|
||||||
: SPII::MO_TLS_IE_LD);
|
: SparcMCExpr::VK_Sparc_TLS_IE_LD);
|
||||||
|
|
||||||
SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT);
|
SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT);
|
||||||
|
|
||||||
@ -1925,21 +1934,23 @@ SDValue SparcTargetLowering::LowerGlobalTLSAddress(SDValue Op,
|
|||||||
MFI->setHasCalls(true);
|
MFI->setHasCalls(true);
|
||||||
|
|
||||||
SDValue TGA = makeHiLoPair(Op,
|
SDValue TGA = makeHiLoPair(Op,
|
||||||
SPII::MO_TLS_IE_HI22, SPII::MO_TLS_IE_LO10, DAG);
|
SparcMCExpr::VK_Sparc_TLS_IE_HI22,
|
||||||
|
SparcMCExpr::VK_Sparc_TLS_IE_LO10, DAG);
|
||||||
SDValue Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Base, TGA);
|
SDValue Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Base, TGA);
|
||||||
SDValue Offset = DAG.getNode(SPISD::TLS_LD,
|
SDValue Offset = DAG.getNode(SPISD::TLS_LD,
|
||||||
DL, PtrVT, Ptr,
|
DL, PtrVT, Ptr,
|
||||||
withTargetFlags(Op, ldTF, DAG));
|
withTargetFlags(Op, ldTF, DAG));
|
||||||
return DAG.getNode(SPISD::TLS_ADD, DL, PtrVT,
|
return DAG.getNode(SPISD::TLS_ADD, DL, PtrVT,
|
||||||
DAG.getRegister(SP::G7, PtrVT), Offset,
|
DAG.getRegister(SP::G7, PtrVT), Offset,
|
||||||
withTargetFlags(Op, SPII::MO_TLS_IE_ADD, DAG));
|
withTargetFlags(Op,
|
||||||
|
SparcMCExpr::VK_Sparc_TLS_IE_ADD, DAG));
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(model == TLSModel::LocalExec);
|
assert(model == TLSModel::LocalExec);
|
||||||
SDValue Hi = DAG.getNode(SPISD::Hi, DL, PtrVT,
|
SDValue Hi = DAG.getNode(SPISD::Hi, DL, PtrVT,
|
||||||
withTargetFlags(Op, SPII::MO_TLS_LE_HIX22, DAG));
|
withTargetFlags(Op, SparcMCExpr::VK_Sparc_TLS_LE_HIX22, DAG));
|
||||||
SDValue Lo = DAG.getNode(SPISD::Lo, DL, PtrVT,
|
SDValue Lo = DAG.getNode(SPISD::Lo, DL, PtrVT,
|
||||||
withTargetFlags(Op, SPII::MO_TLS_LE_LOX10, DAG));
|
withTargetFlags(Op, SparcMCExpr::VK_Sparc_TLS_LE_LOX10, DAG));
|
||||||
SDValue Offset = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo);
|
SDValue Offset = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo);
|
||||||
|
|
||||||
return DAG.getNode(ISD::ADD, DL, PtrVT,
|
return DAG.getNode(ISD::ADD, DL, PtrVT,
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "Sparc.h"
|
#include "Sparc.h"
|
||||||
#include "MCTargetDesc/SparcBaseInfo.h"
|
|
||||||
#include "MCTargetDesc/SparcMCExpr.h"
|
#include "MCTargetDesc/SparcMCExpr.h"
|
||||||
#include "llvm/ADT/SmallString.h"
|
#include "llvm/ADT/SmallString.h"
|
||||||
#include "llvm/CodeGen/AsmPrinter.h"
|
#include "llvm/CodeGen/AsmPrinter.h"
|
||||||
@ -33,41 +32,10 @@ static MCOperand LowerSymbolOperand(const MachineInstr *MI,
|
|||||||
const MachineOperand &MO,
|
const MachineOperand &MO,
|
||||||
AsmPrinter &AP) {
|
AsmPrinter &AP) {
|
||||||
|
|
||||||
SparcMCExpr::VariantKind Kind;
|
SparcMCExpr::VariantKind Kind =
|
||||||
|
(SparcMCExpr::VariantKind)MO.getTargetFlags();
|
||||||
const MCSymbol *Symbol = 0;
|
const MCSymbol *Symbol = 0;
|
||||||
|
|
||||||
unsigned TF = MO.getTargetFlags();
|
|
||||||
|
|
||||||
switch(TF) {
|
|
||||||
default: llvm_unreachable("Unknown target flags on operand");
|
|
||||||
case SPII::MO_NO_FLAG: Kind = SparcMCExpr::VK_Sparc_None; break;
|
|
||||||
case SPII::MO_LO: Kind = SparcMCExpr::VK_Sparc_LO; break;
|
|
||||||
case SPII::MO_HI: Kind = SparcMCExpr::VK_Sparc_HI; break;
|
|
||||||
case SPII::MO_H44: Kind = SparcMCExpr::VK_Sparc_H44; break;
|
|
||||||
case SPII::MO_M44: Kind = SparcMCExpr::VK_Sparc_M44; break;
|
|
||||||
case SPII::MO_L44: Kind = SparcMCExpr::VK_Sparc_L44; break;
|
|
||||||
case SPII::MO_HH: Kind = SparcMCExpr::VK_Sparc_HH; break;
|
|
||||||
case SPII::MO_HM: Kind = SparcMCExpr::VK_Sparc_HM; break;
|
|
||||||
case SPII::MO_TLS_GD_HI22: Kind = SparcMCExpr::VK_Sparc_TLS_GD_HI22; break;
|
|
||||||
case SPII::MO_TLS_GD_LO10: Kind = SparcMCExpr::VK_Sparc_TLS_GD_LO10; break;
|
|
||||||
case SPII::MO_TLS_GD_ADD: Kind = SparcMCExpr::VK_Sparc_TLS_GD_ADD; break;
|
|
||||||
case SPII::MO_TLS_GD_CALL: Kind = SparcMCExpr::VK_Sparc_TLS_GD_CALL; break;
|
|
||||||
case SPII::MO_TLS_LDM_HI22: Kind = SparcMCExpr::VK_Sparc_TLS_LDM_HI22; break;
|
|
||||||
case SPII::MO_TLS_LDM_LO10: Kind = SparcMCExpr::VK_Sparc_TLS_LDM_LO10; break;
|
|
||||||
case SPII::MO_TLS_LDM_ADD: Kind = SparcMCExpr::VK_Sparc_TLS_LDM_ADD; break;
|
|
||||||
case SPII::MO_TLS_LDM_CALL: Kind = SparcMCExpr::VK_Sparc_TLS_LDM_CALL; break;
|
|
||||||
case SPII::MO_TLS_LDO_HIX22:Kind = SparcMCExpr::VK_Sparc_TLS_LDO_HIX22; break;
|
|
||||||
case SPII::MO_TLS_LDO_LOX10:Kind = SparcMCExpr::VK_Sparc_TLS_LDO_LOX10; break;
|
|
||||||
case SPII::MO_TLS_LDO_ADD: Kind = SparcMCExpr::VK_Sparc_TLS_LDO_ADD; break;
|
|
||||||
case SPII::MO_TLS_IE_HI22: Kind = SparcMCExpr::VK_Sparc_TLS_IE_HI22; break;
|
|
||||||
case SPII::MO_TLS_IE_LO10: Kind = SparcMCExpr::VK_Sparc_TLS_IE_LO10; break;
|
|
||||||
case SPII::MO_TLS_IE_LD: Kind = SparcMCExpr::VK_Sparc_TLS_IE_LD; break;
|
|
||||||
case SPII::MO_TLS_IE_LDX: Kind = SparcMCExpr::VK_Sparc_TLS_IE_LDX; break;
|
|
||||||
case SPII::MO_TLS_IE_ADD: Kind = SparcMCExpr::VK_Sparc_TLS_IE_ADD; break;
|
|
||||||
case SPII::MO_TLS_LE_HIX22: Kind = SparcMCExpr::VK_Sparc_TLS_LE_HIX22; break;
|
|
||||||
case SPII::MO_TLS_LE_LOX10: Kind = SparcMCExpr::VK_Sparc_TLS_LE_LOX10; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(MO.getType()) {
|
switch(MO.getType()) {
|
||||||
default: llvm_unreachable("Unknown type in LowerSymbolOperand");
|
default: llvm_unreachable("Unknown type in LowerSymbolOperand");
|
||||||
case MachineOperand::MO_MachineBasicBlock:
|
case MachineOperand::MO_MachineBasicBlock:
|
||||||
|
Reference in New Issue
Block a user