OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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_ARM | 5 #if V8_TARGET_ARCH_ARM |
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 1443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1454 __ CallRuntime(function_id, 2); | 1454 __ CallRuntime(function_id, 2); |
1455 __ bind(&done); | 1455 __ bind(&done); |
1456 context()->Plug(r0); | 1456 context()->Plug(r0); |
1457 } | 1457 } |
1458 } | 1458 } |
1459 } | 1459 } |
1460 | 1460 |
1461 | 1461 |
1462 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { | 1462 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { |
1463 Comment cmnt(masm_, "[ RegExpLiteral"); | 1463 Comment cmnt(masm_, "[ RegExpLiteral"); |
1464 Label materialized; | 1464 __ ldr(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
1465 // Registers will be used as follows: | 1465 __ mov(r2, Operand(Smi::FromInt(expr->literal_index()))); |
1466 // r5 = materialized value (RegExp literal) | 1466 __ mov(r1, Operand(expr->pattern())); |
1467 // r4 = JS function, literals array | 1467 __ mov(r0, Operand(expr->flags())); |
1468 // r3 = literal index | 1468 FastCloneRegExpStub stub(isolate()); |
1469 // r2 = RegExp pattern | 1469 __ CallStub(&stub); |
1470 // r1 = RegExp flags | |
1471 // r0 = RegExp literal clone | |
1472 __ ldr(r0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | |
1473 __ ldr(r4, FieldMemOperand(r0, JSFunction::kLiteralsOffset)); | |
1474 int literal_offset = LiteralsArray::OffsetOfLiteralAt(expr->literal_index()); | |
1475 __ ldr(r5, FieldMemOperand(r4, literal_offset)); | |
1476 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); | |
1477 __ cmp(r5, ip); | |
1478 __ b(ne, &materialized); | |
1479 | |
1480 // Create regexp literal using runtime function. | |
1481 // Result will be in r0. | |
1482 __ mov(r3, Operand(Smi::FromInt(expr->literal_index()))); | |
1483 __ mov(r2, Operand(expr->pattern())); | |
1484 __ mov(r1, Operand(expr->flags())); | |
1485 __ Push(r4, r3, r2, r1); | |
1486 __ CallRuntime(Runtime::kMaterializeRegExpLiteral, 4); | |
1487 __ mov(r5, r0); | |
1488 | |
1489 __ bind(&materialized); | |
1490 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; | |
1491 Label allocated, runtime_allocate; | |
1492 __ Allocate(size, r0, r2, r3, &runtime_allocate, TAG_OBJECT); | |
1493 __ jmp(&allocated); | |
1494 | |
1495 __ bind(&runtime_allocate); | |
1496 __ mov(r0, Operand(Smi::FromInt(size))); | |
1497 __ Push(r5, r0); | |
1498 __ CallRuntime(Runtime::kAllocateInNewSpace, 1); | |
1499 __ pop(r5); | |
1500 | |
1501 __ bind(&allocated); | |
1502 // After this, registers are used as follows: | |
1503 // r0: Newly allocated regexp. | |
1504 // r5: Materialized regexp. | |
1505 // r2: temp. | |
1506 __ CopyFields(r0, r5, d0, size / kPointerSize); | |
1507 context()->Plug(r0); | 1470 context()->Plug(r0); |
1508 } | 1471 } |
1509 | 1472 |
1510 | 1473 |
1511 void FullCodeGenerator::EmitAccessor(ObjectLiteralProperty* property) { | 1474 void FullCodeGenerator::EmitAccessor(ObjectLiteralProperty* property) { |
1512 Expression* expression = (property == NULL) ? NULL : property->value(); | 1475 Expression* expression = (property == NULL) ? NULL : property->value(); |
1513 if (expression == NULL) { | 1476 if (expression == NULL) { |
1514 __ LoadRoot(r1, Heap::kNullValueRootIndex); | 1477 __ LoadRoot(r1, Heap::kNullValueRootIndex); |
1515 __ push(r1); | 1478 __ push(r1); |
1516 } else { | 1479 } else { |
(...skipping 3531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5048 DCHECK(interrupt_address == | 5011 DCHECK(interrupt_address == |
5049 isolate->builtins()->OsrAfterStackCheck()->entry()); | 5012 isolate->builtins()->OsrAfterStackCheck()->entry()); |
5050 return OSR_AFTER_STACK_CHECK; | 5013 return OSR_AFTER_STACK_CHECK; |
5051 } | 5014 } |
5052 | 5015 |
5053 | 5016 |
5054 } // namespace internal | 5017 } // namespace internal |
5055 } // namespace v8 | 5018 } // namespace v8 |
5056 | 5019 |
5057 #endif // V8_TARGET_ARCH_ARM | 5020 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |