| Index: src/compiler/ppc/instruction-selector-ppc.cc
 | 
| diff --git a/src/compiler/ppc/instruction-selector-ppc.cc b/src/compiler/ppc/instruction-selector-ppc.cc
 | 
| index dd81d8510b7a0c53520be9c42a508cbbd35c8d56..5abb5f14762b89615444513f1438f539a64cebbc 100644
 | 
| --- a/src/compiler/ppc/instruction-selector-ppc.cc
 | 
| +++ b/src/compiler/ppc/instruction-selector-ppc.cc
 | 
| @@ -863,6 +863,30 @@ void InstructionSelector::VisitWord32PairSar(Node* node) {
 | 
|  
 | 
|  #if V8_TARGET_ARCH_PPC64
 | 
|  void InstructionSelector::VisitWord64Sar(Node* node) {
 | 
| +  PPCOperandGenerator g(this);
 | 
| +  Int64BinopMatcher m(node);
 | 
| +  if (CanCover(m.node(), m.left().node()) && m.left().IsLoad() &&
 | 
| +      m.right().Is(32)) {
 | 
| +    // Just load and sign-extend the interesting 4 bytes instead. This happens,
 | 
| +    // for example, when we're loading and untagging SMIs.
 | 
| +    BaseWithIndexAndDisplacement64Matcher mleft(m.left().node(), true);
 | 
| +    if (mleft.matches() && mleft.index() == nullptr) {
 | 
| +      int64_t offset = 0;
 | 
| +      Node* displacement = mleft.displacement();
 | 
| +      if (displacement != nullptr) {
 | 
| +        Int64Matcher mdisplacement(displacement);
 | 
| +        DCHECK(mdisplacement.HasValue());
 | 
| +        offset = mdisplacement.Value();
 | 
| +      }
 | 
| +      offset = SmiWordOffset(offset);
 | 
| +      if (g.CanBeImmediate(offset, kInt16Imm_4ByteAligned)) {
 | 
| +        Emit(kPPC_LoadWordS32 | AddressingModeField::encode(kMode_MRI),
 | 
| +             g.DefineAsRegister(node), g.UseRegister(mleft.base()),
 | 
| +             g.TempImmediate(offset));
 | 
| +        return;
 | 
| +      }
 | 
| +    }
 | 
| +  }
 | 
|    VisitRRO(this, kPPC_ShiftRightAlg64, node, kShift64Imm);
 | 
|  }
 | 
|  #endif
 | 
| 
 |