| Index: src/code-stub-assembler.cc | 
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc | 
| index d5e6bbdbcb1b25426b5113ea84073e37a8100a13..5537d0a9b0f3412325cf5f315344b6cd74269bda 100644 | 
| --- a/src/code-stub-assembler.cc | 
| +++ b/src/code-stub-assembler.cc | 
| @@ -8212,14 +8212,16 @@ Node* CodeStubAssembler::IsDetachedBuffer(Node* buffer) { | 
| return IsSetWord32<JSArrayBuffer::WasNeutered>(buffer_bit_field); | 
| } | 
|  | 
| -CodeStubArguments::CodeStubArguments(CodeStubAssembler* assembler, Node* argc) | 
| +CodeStubArguments::CodeStubArguments(CodeStubAssembler* assembler, Node* argc, | 
| +                                     Node* fp, | 
| +                                     CodeStubAssembler::ParameterMode mode) | 
| : assembler_(assembler), | 
| +      argc_mode_(mode), | 
| argc_(argc), | 
| arguments_(nullptr), | 
| -      fp_(assembler->LoadFramePointer()) { | 
| -  argc_ = assembler->ChangeUint32ToWord(argc_); | 
| +      fp_(fp != nullptr ? fp : assembler->LoadFramePointer()) { | 
| Node* offset = assembler->ElementOffsetFromIndex( | 
| -      argc_, FAST_ELEMENTS, CodeStubAssembler::INTPTR_PARAMETERS, | 
| +      argc_, FAST_ELEMENTS, mode, | 
| (StandardFrameConstants::kFixedSlotCountAboveFp - 1) * kPointerSize); | 
| arguments_ = assembler_->IntPtrAdd(fp_, offset); | 
| } | 
| @@ -8229,19 +8231,22 @@ Node* CodeStubArguments::GetReceiver() const { | 
| assembler_->IntPtrConstant(kPointerSize)); | 
| } | 
|  | 
| -Node* CodeStubArguments::AtIndex(Node* index, | 
| -                                 CodeStubAssembler::ParameterMode mode) const { | 
| +Node* CodeStubArguments::AtIndexPtr( | 
| +    Node* index, CodeStubAssembler::ParameterMode mode) const { | 
| typedef compiler::Node Node; | 
| -  CSA_ASSERT(assembler_, assembler_->UintPtrLessThan( | 
| -                             mode == CodeStubAssembler::INTPTR_PARAMETERS | 
| -                                 ? index | 
| -                                 : assembler_->SmiUntag(index), | 
| -                             GetLength())); | 
| -  Node* negated_index = | 
| -      assembler_->IntPtrSub(assembler_->IntPtrOrSmiConstant(0, mode), index); | 
| +  Node* negated_index = assembler_->IntPtrOrSmiSub( | 
| +      assembler_->IntPtrOrSmiConstant(0, mode), index, mode); | 
| Node* offset = | 
| assembler_->ElementOffsetFromIndex(negated_index, FAST_ELEMENTS, mode, 0); | 
| -  return assembler_->Load(MachineType::AnyTagged(), arguments_, offset); | 
| +  return assembler_->IntPtrAdd(arguments_, offset); | 
| +} | 
| + | 
| +Node* CodeStubArguments::AtIndex(Node* index, | 
| +                                 CodeStubAssembler::ParameterMode mode) const { | 
| +  DCHECK_EQ(argc_mode_, mode); | 
| +  CSA_ASSERT(assembler_, | 
| +             assembler_->UintPtrOrSmiLessThan(index, GetLength(), mode)); | 
| +  return assembler_->Load(MachineType::AnyTagged(), AtIndexPtr(index, mode)); | 
| } | 
|  | 
| Node* CodeStubArguments::AtIndex(int index) const { | 
| @@ -8253,12 +8258,11 @@ void CodeStubArguments::ForEach( | 
| const CodeStubArguments::ForEachBodyFunction& body, Node* first, Node* last, | 
| CodeStubAssembler::ParameterMode mode) { | 
| assembler_->Comment("CodeStubArguments::ForEach"); | 
| -  DCHECK_IMPLIES(first == nullptr || last == nullptr, | 
| -                 mode == CodeStubAssembler::INTPTR_PARAMETERS); | 
| if (first == nullptr) { | 
| first = assembler_->IntPtrOrSmiConstant(0, mode); | 
| } | 
| if (last == nullptr) { | 
| +    DCHECK_EQ(mode, argc_mode_); | 
| last = argc_; | 
| } | 
| Node* start = assembler_->IntPtrSub( | 
|  |