projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
propagate fast-math-flags on DAG nodes
[oota-llvm.git]
/
lib
/
Target
/
ARM
/
ARMMCInstLower.cpp
diff --git
a/lib/Target/ARM/ARMMCInstLower.cpp
b/lib/Target/ARM/ARMMCInstLower.cpp
index e12c9c61ab14a4d104b7448a0e82f37d0eee801c..a2aca2d1a69ea86d35bdb147837958e0a911e7ce 100644
(file)
--- a/
lib/Target/ARM/ARMMCInstLower.cpp
+++ b/
lib/Target/ARM/ARMMCInstLower.cpp
@@
-14,52
+14,54
@@
#include "ARM.h"
#include "ARMAsmPrinter.h"
#include "ARM.h"
#include "ARMAsmPrinter.h"
+#include "MCTargetDesc/ARMBaseInfo.h"
#include "MCTargetDesc/ARMMCExpr.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/IR/Constants.h"
#include "MCTargetDesc/ARMMCExpr.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/IR/Constants.h"
+#include "llvm/IR/Mangler.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
-#include "llvm/Target/Mangler.h"
using namespace llvm;
MCOperand ARMAsmPrinter::GetSymbolRef(const MachineOperand &MO,
const MCSymbol *Symbol) {
const MCExpr *Expr;
using namespace llvm;
MCOperand ARMAsmPrinter::GetSymbolRef(const MachineOperand &MO,
const MCSymbol *Symbol) {
const MCExpr *Expr;
- switch (MO.getTargetFlags()) {
+ unsigned Option = MO.getTargetFlags() & ARMII::MO_OPTION_MASK;
+ switch (Option) {
default: {
default: {
- Expr = MCSymbolRefExpr::
C
reate(Symbol, MCSymbolRefExpr::VK_None,
+ Expr = MCSymbolRefExpr::
c
reate(Symbol, MCSymbolRefExpr::VK_None,
OutContext);
OutContext);
- switch (
MO.getTargetFlags()
) {
+ switch (
Option
) {
default: llvm_unreachable("Unknown target flag on symbol operand");
default: llvm_unreachable("Unknown target flag on symbol operand");
- case
0
:
+ case
ARMII::MO_NO_FLAG
:
break;
case ARMII::MO_LO16:
break;
case ARMII::MO_LO16:
- Expr = MCSymbolRefExpr::
C
reate(Symbol, MCSymbolRefExpr::VK_None,
+ Expr = MCSymbolRefExpr::
c
reate(Symbol, MCSymbolRefExpr::VK_None,
OutContext);
OutContext);
- Expr = ARMMCExpr::
C
reateLower16(Expr, OutContext);
+ Expr = ARMMCExpr::
c
reateLower16(Expr, OutContext);
break;
case ARMII::MO_HI16:
break;
case ARMII::MO_HI16:
- Expr = MCSymbolRefExpr::
C
reate(Symbol, MCSymbolRefExpr::VK_None,
+ Expr = MCSymbolRefExpr::
c
reate(Symbol, MCSymbolRefExpr::VK_None,
OutContext);
OutContext);
- Expr = ARMMCExpr::
C
reateUpper16(Expr, OutContext);
+ Expr = ARMMCExpr::
c
reateUpper16(Expr, OutContext);
break;
}
break;
}
case ARMII::MO_PLT:
break;
}
break;
}
case ARMII::MO_PLT:
- Expr = MCSymbolRefExpr::
Create(Symbol, MCSymbolRefExpr::VK_ARM
_PLT,
+ Expr = MCSymbolRefExpr::
create(Symbol, MCSymbolRefExpr::VK
_PLT,
OutContext);
break;
}
if (!MO.isJTI() && MO.getOffset())
OutContext);
break;
}
if (!MO.isJTI() && MO.getOffset())
- Expr = MCBinaryExpr::
C
reateAdd(Expr,
- MCConstantExpr::
C
reate(MO.getOffset(),
+ Expr = MCBinaryExpr::
c
reateAdd(Expr,
+ MCConstantExpr::
c
reate(MO.getOffset(),
OutContext),
OutContext);
OutContext),
OutContext);
- return MCOperand::
C
reateExpr(Expr);
+ return MCOperand::
c
reateExpr(Expr);
}
}
@@
-72,18
+74,20
@@
bool ARMAsmPrinter::lowerOperand(const MachineOperand &MO,
if (MO.isImplicit() && MO.getReg() != ARM::CPSR)
return false;
assert(!MO.getSubReg() && "Subregs should be eliminated!");
if (MO.isImplicit() && MO.getReg() != ARM::CPSR)
return false;
assert(!MO.getSubReg() && "Subregs should be eliminated!");
- MCOp = MCOperand::
C
reateReg(MO.getReg());
+ MCOp = MCOperand::
c
reateReg(MO.getReg());
break;
case MachineOperand::MO_Immediate:
break;
case MachineOperand::MO_Immediate:
- MCOp = MCOperand::
C
reateImm(MO.getImm());
+ MCOp = MCOperand::
c
reateImm(MO.getImm());
break;
case MachineOperand::MO_MachineBasicBlock:
break;
case MachineOperand::MO_MachineBasicBlock:
- MCOp = MCOperand::
CreateExpr(MCSymbolRefExpr::C
reate(
+ MCOp = MCOperand::
createExpr(MCSymbolRefExpr::c
reate(
MO.getMBB()->getSymbol(), OutContext));
break;
MO.getMBB()->getSymbol(), OutContext));
break;
- case MachineOperand::MO_GlobalAddress:
- MCOp = GetSymbolRef(MO, getSymbol(MO.getGlobal()));
+ case MachineOperand::MO_GlobalAddress: {
+ MCOp = GetSymbolRef(MO,
+ GetARMGVSymbol(MO.getGlobal(), MO.getTargetFlags()));
break;
break;
+ }
case MachineOperand::MO_ExternalSymbol:
MCOp = GetSymbolRef(MO,
GetExternalSymbolSymbol(MO.getSymbolName()));
case MachineOperand::MO_ExternalSymbol:
MCOp = GetSymbolRef(MO,
GetExternalSymbolSymbol(MO.getSymbolName()));
@@
-101,7
+105,7
@@
bool ARMAsmPrinter::lowerOperand(const MachineOperand &MO,
APFloat Val = MO.getFPImm()->getValueAPF();
bool ignored;
Val.convert(APFloat::IEEEdouble, APFloat::rmTowardZero, &ignored);
APFloat Val = MO.getFPImm()->getValueAPF();
bool ignored;
Val.convert(APFloat::IEEEdouble, APFloat::rmTowardZero, &ignored);
- MCOp = MCOperand::
C
reateFPImm(Val.convertToDouble());
+ MCOp = MCOperand::
c
reateFPImm(Val.convertToDouble());
break;
}
case MachineOperand::MO_RegisterMask:
break;
}
case MachineOperand::MO_RegisterMask:
@@
-115,11
+119,45
@@
void llvm::LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
ARMAsmPrinter &AP) {
OutMI.setOpcode(MI->getOpcode());
ARMAsmPrinter &AP) {
OutMI.setOpcode(MI->getOpcode());
+ // In the MC layer, we keep modified immediates in their encoded form
+ bool EncodeImms = false;
+ switch (MI->getOpcode()) {
+ default: break;
+ case ARM::MOVi:
+ case ARM::MVNi:
+ case ARM::CMPri:
+ case ARM::CMNri:
+ case ARM::TSTri:
+ case ARM::TEQri:
+ case ARM::MSRi:
+ case ARM::ADCri:
+ case ARM::ADDri:
+ case ARM::ADDSri:
+ case ARM::SBCri:
+ case ARM::SUBri:
+ case ARM::SUBSri:
+ case ARM::ANDri:
+ case ARM::ORRri:
+ case ARM::EORri:
+ case ARM::BICri:
+ case ARM::RSBri:
+ case ARM::RSBSri:
+ case ARM::RSCri:
+ EncodeImms = true;
+ break;
+ }
+
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
const MachineOperand &MO = MI->getOperand(i);
MCOperand MCOp;
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
const MachineOperand &MO = MI->getOperand(i);
MCOperand MCOp;
- if (AP.lowerOperand(MO, MCOp))
+ if (AP.lowerOperand(MO, MCOp)) {
+ if (MCOp.isImm() && EncodeImms) {
+ int32_t Enc = ARM_AM::getSOImmVal(MCOp.getImm());
+ if (Enc != -1)
+ MCOp.setImm(Enc);
+ }
OutMI.addOperand(MCOp);
OutMI.addOperand(MCOp);
+ }
}
}
}
}