| Index: src/IceTargetLoweringX8632.cpp
|
| diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
|
| index 26d11b9208d84dde23ce57816bb0986be1c6a69d..47684932737e6154f463f5c6d9b50efe600a793c 100644
|
| --- a/src/IceTargetLoweringX8632.cpp
|
| +++ b/src/IceTargetLoweringX8632.cpp
|
| @@ -3398,14 +3398,32 @@ void computeAddressOpt(Variable *&Base, Variable *&Index, uint16_t &Shift,
|
| // swap(Index,Base)
|
| // Similar for Base=Const*Var and Base=Var<<Const
|
|
|
| - // Base is Base=Var+Const ==>
|
| + // Base is Base=Var+Const || Base is Base=Const+Var ==>
|
| // set Base=Var, Offset+=Const
|
| -
|
| - // Base is Base=Const+Var ==>
|
| - // set Base=Var, Offset+=Const
|
| -
|
| // Base is Base=Var-Const ==>
|
| // set Base=Var, Offset-=Const
|
| + const InstArithmetic *ArithInst =
|
| + llvm::dyn_cast_or_null<const InstArithmetic>(BaseInst);
|
| + if (ArithInst && (ArithInst->getOp() == InstArithmetic::Add ||
|
| + ArithInst->getOp() == InstArithmetic::Sub)) {
|
| + bool IsAdd = ArithInst->getOp() == InstArithmetic::Add;
|
| + Variable *Var = NULL;
|
| + ConstantInteger *Const = NULL;
|
| + if (Variable *VariableOperand =
|
| + llvm::dyn_cast<Variable>(ArithInst->getSrc(0))) {
|
| + Var = VariableOperand;
|
| + Const = llvm::dyn_cast<ConstantInteger>(ArithInst->getSrc(1));
|
| + } else if (IsAdd) {
|
| + Const = llvm::dyn_cast<ConstantInteger>(ArithInst->getSrc(0));
|
| + Var = llvm::dyn_cast<Variable>(ArithInst->getSrc(1));
|
| + }
|
| + if (!(Const && Var)) {
|
| + break;
|
| + }
|
| + Base = Var;
|
| + Offset += IsAdd ? Const->getValue() : -Const->getValue();
|
| + continue;
|
| + }
|
|
|
| // Index is Index=Var+Const ==>
|
| // set Index=Var, Offset+=(Const<<Shift)
|
| @@ -4039,7 +4057,7 @@ void TargetX8632::postLower() {
|
|
|
| template <> void ConstantInteger::emit(GlobalContext *Ctx) const {
|
| Ostream &Str = Ctx->getStrEmit();
|
| - Str << getValue();
|
| + Str << (int64_t) getValue();
|
| }
|
|
|
| template <> void ConstantFloat::emit(GlobalContext *Ctx) const {
|
|
|