summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/PowerPC/PPCMCInstLower.cpp
diff options
context:
space:
mode:
authorUlrich Weigand <ulrich.weigand@de.ibm.com>2013-06-20 16:23:52 +0000
committerUlrich Weigand <ulrich.weigand@de.ibm.com>2013-06-20 16:23:52 +0000
commit96e65783957e8ca3c5eb305f4bd2822e4edb31e8 (patch)
treee370ebd9adf48f8524c8dd19dc2ba22cf470e739 /llvm/lib/Target/PowerPC/PPCMCInstLower.cpp
parent865a1efc137320c235290ce0bce57e0d87ace715 (diff)
downloadbcm5719-llvm-96e65783957e8ca3c5eb305f4bd2822e4edb31e8.tar.gz
bcm5719-llvm-96e65783957e8ca3c5eb305f4bd2822e4edb31e8.zip
[PowerPC] Optimize @ha/@l constructs
This patch adds support for having the assembler optimize fixups to constructs like "symbol@ha" or "symbol@l" if "symbol" can be resolved at assembler time. This optimization is already present in the PPCMCExpr.cpp code for handling PPC_HA16/PPC_LO16 target expressions. However, those target expression were used only on Darwin targets. This patch changes target expression code so that they are usable also with the GNU assembler (using the @ha / @l syntax instead of the ha16() / lo16() syntax), and changes the MCInst lowering code to generate those target expressions where appropriate. It also changes the asm parser to generate HA16/LO16 target expressions when parsing assembler source that uses the @ha / @l modifiers. The effect is that now the above- mentioned optimization automatically becomes available for those situations too. llvm-svn: 184436
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCMCInstLower.cpp')
-rw-r--r--llvm/lib/Target/PowerPC/PPCMCInstLower.cpp58
1 files changed, 24 insertions, 34 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCMCInstLower.cpp b/llvm/lib/Target/PowerPC/PPCMCInstLower.cpp
index ba7efc18802..7cecf2506a6 100644
--- a/llvm/lib/Target/PowerPC/PPCMCInstLower.cpp
+++ b/llvm/lib/Target/PowerPC/PPCMCInstLower.cpp
@@ -111,30 +111,22 @@ static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol,
unsigned access = MO.getTargetFlags() & PPCII::MO_ACCESS_MASK;
- if (!isDarwin) {
- switch (access) {
- case PPCII::MO_HA16:
- RefKind = MCSymbolRefExpr::VK_PPC_ADDR16_HA;
- break;
- case PPCII::MO_LO16:
- RefKind = MCSymbolRefExpr::VK_PPC_ADDR16_LO;
- break;
- case PPCII::MO_TPREL16_HA:
- RefKind = MCSymbolRefExpr::VK_PPC_TPREL16_HA;
- break;
- case PPCII::MO_TPREL16_LO:
- RefKind = MCSymbolRefExpr::VK_PPC_TPREL16_LO;
- break;
- case PPCII::MO_DTPREL16_LO:
- RefKind = MCSymbolRefExpr::VK_PPC_DTPREL16_LO;
- break;
- case PPCII::MO_TLSLD16_LO:
- RefKind = MCSymbolRefExpr::VK_PPC_GOT_TLSLD16_LO;
- break;
- case PPCII::MO_TOC16_LO:
- RefKind = MCSymbolRefExpr::VK_PPC_TOC16_LO;
- break;
- }
+ switch (access) {
+ case PPCII::MO_TPREL16_HA:
+ RefKind = MCSymbolRefExpr::VK_PPC_TPREL16_HA;
+ break;
+ case PPCII::MO_TPREL16_LO:
+ RefKind = MCSymbolRefExpr::VK_PPC_TPREL16_LO;
+ break;
+ case PPCII::MO_DTPREL16_LO:
+ RefKind = MCSymbolRefExpr::VK_PPC_DTPREL16_LO;
+ break;
+ case PPCII::MO_TLSLD16_LO:
+ RefKind = MCSymbolRefExpr::VK_PPC_GOT_TLSLD16_LO;
+ break;
+ case PPCII::MO_TOC16_LO:
+ RefKind = MCSymbolRefExpr::VK_PPC_TOC16_LO;
+ break;
}
const MCExpr *Expr = MCSymbolRefExpr::Create(Symbol, RefKind, Ctx);
@@ -152,16 +144,14 @@ static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol,
Expr = MCBinaryExpr::CreateSub(Expr, PB, Ctx);
}
- // Add Darwin ha16() / lo16() markers if required.
- if (isDarwin) {
- switch (access) {
- case PPCII::MO_HA16:
- Expr = PPCMCExpr::CreateHa16(Expr, Ctx);
- break;
- case PPCII::MO_LO16:
- Expr = PPCMCExpr::CreateLo16(Expr, Ctx);
- break;
- }
+ // Add ha16() / lo16() markers if required.
+ switch (access) {
+ case PPCII::MO_HA16:
+ Expr = PPCMCExpr::CreateHa16(Expr, Ctx);
+ break;
+ case PPCII::MO_LO16:
+ Expr = PPCMCExpr::CreateLo16(Expr, Ctx);
+ break;
}
return MCOperand::CreateExpr(Expr);
OpenPOWER on IntegriCloud