| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if V8_TARGET_ARCH_ARM64 | 5 #if V8_TARGET_ARCH_ARM64 |
| 6 | 6 |
| 7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
| 8 #include "src/api-arguments.h" | 8 #include "src/api-arguments.h" |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 1267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1278 LoadWithVectorDescriptor::SlotRegister())); | 1278 LoadWithVectorDescriptor::SlotRegister())); |
| 1279 | 1279 |
| 1280 NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, x10, | 1280 NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, x10, |
| 1281 x11, &miss); | 1281 x11, &miss); |
| 1282 | 1282 |
| 1283 __ Bind(&miss); | 1283 __ Bind(&miss); |
| 1284 PropertyAccessCompiler::TailCallBuiltin( | 1284 PropertyAccessCompiler::TailCallBuiltin( |
| 1285 masm, PropertyAccessCompiler::MissBuiltin(Code::LOAD_IC)); | 1285 masm, PropertyAccessCompiler::MissBuiltin(Code::LOAD_IC)); |
| 1286 } | 1286 } |
| 1287 | 1287 |
| 1288 | |
| 1289 void LoadIndexedStringStub::Generate(MacroAssembler* masm) { | |
| 1290 // Return address is in lr. | |
| 1291 Label miss; | |
| 1292 | |
| 1293 Register receiver = LoadDescriptor::ReceiverRegister(); | |
| 1294 Register index = LoadDescriptor::NameRegister(); | |
| 1295 Register result = x0; | |
| 1296 Register scratch = x10; | |
| 1297 DCHECK(!scratch.is(receiver) && !scratch.is(index)); | |
| 1298 DCHECK(!scratch.is(LoadWithVectorDescriptor::VectorRegister()) && | |
| 1299 result.is(LoadWithVectorDescriptor::SlotRegister())); | |
| 1300 | |
| 1301 // StringCharAtGenerator doesn't use the result register until it's passed | |
| 1302 // the different miss possibilities. If it did, we would have a conflict | |
| 1303 // when FLAG_vector_ics is true. | |
| 1304 StringCharAtGenerator char_at_generator(receiver, index, scratch, result, | |
| 1305 &miss, // When not a string. | |
| 1306 &miss, // When not a number. | |
| 1307 &miss, // When index out of range. | |
| 1308 RECEIVER_IS_STRING); | |
| 1309 char_at_generator.GenerateFast(masm); | |
| 1310 __ Ret(); | |
| 1311 | |
| 1312 StubRuntimeCallHelper call_helper; | |
| 1313 char_at_generator.GenerateSlow(masm, PART_OF_IC_HANDLER, call_helper); | |
| 1314 | |
| 1315 __ Bind(&miss); | |
| 1316 PropertyAccessCompiler::TailCallBuiltin( | |
| 1317 masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC)); | |
| 1318 } | |
| 1319 | |
| 1320 | |
| 1321 void RegExpExecStub::Generate(MacroAssembler* masm) { | 1288 void RegExpExecStub::Generate(MacroAssembler* masm) { |
| 1322 #ifdef V8_INTERPRETED_REGEXP | 1289 #ifdef V8_INTERPRETED_REGEXP |
| 1323 __ TailCallRuntime(Runtime::kRegExpExec); | 1290 __ TailCallRuntime(Runtime::kRegExpExec); |
| 1324 #else // V8_INTERPRETED_REGEXP | 1291 #else // V8_INTERPRETED_REGEXP |
| 1325 | 1292 |
| 1326 // Stack frame on entry. | 1293 // Stack frame on entry. |
| 1327 // jssp[0]: last_match_info (expected JSArray) | 1294 // jssp[0]: last_match_info (expected JSArray) |
| 1328 // jssp[8]: previous index | 1295 // jssp[8]: previous index |
| 1329 // jssp[16]: subject string | 1296 // jssp[16]: subject string |
| 1330 // jssp[24]: JSRegExp object | 1297 // jssp[24]: JSRegExp object |
| (...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2049 __ SmiTag(index_); | 2016 __ SmiTag(index_); |
| 2050 __ Push(object_, index_); | 2017 __ Push(object_, index_); |
| 2051 __ CallRuntime(Runtime::kStringCharCodeAtRT); | 2018 __ CallRuntime(Runtime::kStringCharCodeAtRT); |
| 2052 __ Mov(result_, x0); | 2019 __ Mov(result_, x0); |
| 2053 call_helper.AfterCall(masm); | 2020 call_helper.AfterCall(masm); |
| 2054 __ B(&exit_); | 2021 __ B(&exit_); |
| 2055 | 2022 |
| 2056 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase); | 2023 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase); |
| 2057 } | 2024 } |
| 2058 | 2025 |
| 2059 | |
| 2060 void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) { | |
| 2061 __ JumpIfNotSmi(code_, &slow_case_); | |
| 2062 __ Cmp(code_, Smi::FromInt(String::kMaxOneByteCharCode)); | |
| 2063 __ B(hi, &slow_case_); | |
| 2064 | |
| 2065 __ LoadRoot(result_, Heap::kSingleCharacterStringCacheRootIndex); | |
| 2066 // At this point code register contains smi tagged one-byte char code. | |
| 2067 __ Add(result_, result_, Operand::UntagSmiAndScale(code_, kPointerSizeLog2)); | |
| 2068 __ Ldr(result_, FieldMemOperand(result_, FixedArray::kHeaderSize)); | |
| 2069 __ JumpIfRoot(result_, Heap::kUndefinedValueRootIndex, &slow_case_); | |
| 2070 __ Bind(&exit_); | |
| 2071 } | |
| 2072 | |
| 2073 | |
| 2074 void StringCharFromCodeGenerator::GenerateSlow( | |
| 2075 MacroAssembler* masm, | |
| 2076 const RuntimeCallHelper& call_helper) { | |
| 2077 __ Abort(kUnexpectedFallthroughToCharFromCodeSlowCase); | |
| 2078 | |
| 2079 __ Bind(&slow_case_); | |
| 2080 call_helper.BeforeCall(masm); | |
| 2081 __ Push(code_); | |
| 2082 __ CallRuntime(Runtime::kStringCharFromCode); | |
| 2083 __ Mov(result_, x0); | |
| 2084 call_helper.AfterCall(masm); | |
| 2085 __ B(&exit_); | |
| 2086 | |
| 2087 __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase); | |
| 2088 } | |
| 2089 | |
| 2090 | |
| 2091 void CompareICStub::GenerateBooleans(MacroAssembler* masm) { | 2026 void CompareICStub::GenerateBooleans(MacroAssembler* masm) { |
| 2092 // Inputs are in x0 (lhs) and x1 (rhs). | 2027 // Inputs are in x0 (lhs) and x1 (rhs). |
| 2093 DCHECK_EQ(CompareICState::BOOLEAN, state()); | 2028 DCHECK_EQ(CompareICState::BOOLEAN, state()); |
| 2094 ASM_LOCATION("CompareICStub[Booleans]"); | 2029 ASM_LOCATION("CompareICStub[Booleans]"); |
| 2095 Label miss; | 2030 Label miss; |
| 2096 | 2031 |
| 2097 __ CheckMap(x1, x2, Heap::kBooleanMapRootIndex, &miss, DO_SMI_CHECK); | 2032 __ CheckMap(x1, x2, Heap::kBooleanMapRootIndex, &miss, DO_SMI_CHECK); |
| 2098 __ CheckMap(x0, x3, Heap::kBooleanMapRootIndex, &miss, DO_SMI_CHECK); | 2033 __ CheckMap(x0, x3, Heap::kBooleanMapRootIndex, &miss, DO_SMI_CHECK); |
| 2099 if (!Token::IsEqualityOp(op())) { | 2034 if (!Token::IsEqualityOp(op())) { |
| 2100 __ Ldr(x1, FieldMemOperand(x1, Oddball::kToNumberOffset)); | 2035 __ Ldr(x1, FieldMemOperand(x1, Oddball::kToNumberOffset)); |
| (...skipping 1590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3691 kStackUnwindSpace, NULL, spill_offset, | 3626 kStackUnwindSpace, NULL, spill_offset, |
| 3692 return_value_operand, NULL); | 3627 return_value_operand, NULL); |
| 3693 } | 3628 } |
| 3694 | 3629 |
| 3695 #undef __ | 3630 #undef __ |
| 3696 | 3631 |
| 3697 } // namespace internal | 3632 } // namespace internal |
| 3698 } // namespace v8 | 3633 } // namespace v8 |
| 3699 | 3634 |
| 3700 #endif // V8_TARGET_ARCH_ARM64 | 3635 #endif // V8_TARGET_ARCH_ARM64 |
| OLD | NEW |