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-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/debug/debug.h" | 10 #include "src/debug/debug.h" |
(...skipping 1432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1443 __ Bind(&done); | 1443 __ Bind(&done); |
1444 context()->Plug(x0); | 1444 context()->Plug(x0); |
1445 break; | 1445 break; |
1446 } | 1446 } |
1447 } | 1447 } |
1448 } | 1448 } |
1449 | 1449 |
1450 | 1450 |
1451 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { | 1451 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { |
1452 Comment cmnt(masm_, "[ RegExpLiteral"); | 1452 Comment cmnt(masm_, "[ RegExpLiteral"); |
1453 Label materialized; | 1453 __ Ldr(x3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
1454 // Registers will be used as follows: | 1454 __ Mov(x2, Smi::FromInt(expr->literal_index())); |
1455 // x5 = materialized value (RegExp literal) | 1455 __ Mov(x1, Operand(expr->pattern())); |
1456 // x4 = JS function, literals array | 1456 __ Mov(x0, Operand(expr->flags())); |
1457 // x3 = literal index | 1457 FastCloneRegExpStub stub(isolate()); |
1458 // x2 = RegExp pattern | 1458 __ CallStub(&stub); |
1459 // x1 = RegExp flags | |
1460 // x0 = RegExp literal clone | |
1461 __ Ldr(x10, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | |
1462 __ Ldr(x4, FieldMemOperand(x10, JSFunction::kLiteralsOffset)); | |
1463 int literal_offset = LiteralsArray::OffsetOfLiteralAt(expr->literal_index()); | |
1464 __ Ldr(x5, FieldMemOperand(x4, literal_offset)); | |
1465 __ JumpIfNotRoot(x5, Heap::kUndefinedValueRootIndex, &materialized); | |
1466 | |
1467 // Create regexp literal using runtime function. | |
1468 // Result will be in x0. | |
1469 __ Mov(x3, Smi::FromInt(expr->literal_index())); | |
1470 __ Mov(x2, Operand(expr->pattern())); | |
1471 __ Mov(x1, Operand(expr->flags())); | |
1472 __ Push(x4, x3, x2, x1); | |
1473 __ CallRuntime(Runtime::kMaterializeRegExpLiteral, 4); | |
1474 __ Mov(x5, x0); | |
1475 | |
1476 __ Bind(&materialized); | |
1477 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; | |
1478 Label allocated, runtime_allocate; | |
1479 __ Allocate(size, x0, x2, x3, &runtime_allocate, TAG_OBJECT); | |
1480 __ B(&allocated); | |
1481 | |
1482 __ Bind(&runtime_allocate); | |
1483 __ Mov(x10, Smi::FromInt(size)); | |
1484 __ Push(x5, x10); | |
1485 __ CallRuntime(Runtime::kAllocateInNewSpace, 1); | |
1486 __ Pop(x5); | |
1487 | |
1488 __ Bind(&allocated); | |
1489 // After this, registers are used as follows: | |
1490 // x0: Newly allocated regexp. | |
1491 // x5: Materialized regexp. | |
1492 // x10, x11, x12: temps. | |
1493 __ CopyFields(x0, x5, CPURegList(x10, x11, x12), size / kPointerSize); | |
1494 context()->Plug(x0); | 1459 context()->Plug(x0); |
1495 } | 1460 } |
1496 | 1461 |
1497 | 1462 |
1498 void FullCodeGenerator::EmitAccessor(ObjectLiteralProperty* property) { | 1463 void FullCodeGenerator::EmitAccessor(ObjectLiteralProperty* property) { |
1499 Expression* expression = (property == NULL) ? NULL : property->value(); | 1464 Expression* expression = (property == NULL) ? NULL : property->value(); |
1500 if (expression == NULL) { | 1465 if (expression == NULL) { |
1501 __ LoadRoot(x10, Heap::kNullValueRootIndex); | 1466 __ LoadRoot(x10, Heap::kNullValueRootIndex); |
1502 __ Push(x10); | 1467 __ Push(x10); |
1503 } else { | 1468 } else { |
(...skipping 3532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5036 } | 5001 } |
5037 | 5002 |
5038 return INTERRUPT; | 5003 return INTERRUPT; |
5039 } | 5004 } |
5040 | 5005 |
5041 | 5006 |
5042 } // namespace internal | 5007 } // namespace internal |
5043 } // namespace v8 | 5008 } // namespace v8 |
5044 | 5009 |
5045 #endif // V8_TARGET_ARCH_ARM64 | 5010 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |