OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1097 // Call keyed load IC. It has arguments key and receiver in r0 and r1. | 1097 // Call keyed load IC. It has arguments key and receiver in r0 and r1. |
1098 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); | 1098 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); |
1099 __ Call(ic, RelocInfo::CODE_TARGET); | 1099 __ Call(ic, RelocInfo::CODE_TARGET); |
1100 Apply(context, r0); | 1100 Apply(context, r0); |
1101 } | 1101 } |
1102 } | 1102 } |
1103 | 1103 |
1104 | 1104 |
1105 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { | 1105 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { |
1106 Comment cmnt(masm_, "[ RegExpLiteral"); | 1106 Comment cmnt(masm_, "[ RegExpLiteral"); |
1107 Label done; | 1107 Label materialized; |
1108 // Registers will be used as follows: | 1108 // Registers will be used as follows: |
1109 // r4 = JS function, literals array | 1109 // r4 = JS function, literals array |
1110 // r3 = literal index | 1110 // r3 = literal index |
1111 // r2 = RegExp pattern | 1111 // r2 = RegExp pattern |
1112 // r1 = RegExp flags | 1112 // r1 = RegExp flags |
1113 // r0 = temp + return value (RegExp literal) | 1113 // r0 = temp + materialized value (RegExp literal) |
1114 __ ldr(r0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | 1114 __ ldr(r0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
1115 __ ldr(r4, FieldMemOperand(r0, JSFunction::kLiteralsOffset)); | 1115 __ ldr(r4, FieldMemOperand(r0, JSFunction::kLiteralsOffset)); |
1116 int literal_offset = | 1116 int literal_offset = |
1117 FixedArray::kHeaderSize + expr->literal_index() * kPointerSize; | 1117 FixedArray::kHeaderSize + expr->literal_index() * kPointerSize; |
1118 __ ldr(r0, FieldMemOperand(r4, literal_offset)); | 1118 __ ldr(r0, FieldMemOperand(r4, literal_offset)); |
1119 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); | 1119 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); |
1120 __ cmp(r0, ip); | 1120 __ cmp(r0, ip); |
1121 __ b(ne, &done); | 1121 __ b(ne, &materialized); |
1122 __ mov(r3, Operand(Smi::FromInt(expr->literal_index()))); | 1122 __ mov(r3, Operand(Smi::FromInt(expr->literal_index()))); |
1123 __ mov(r2, Operand(expr->pattern())); | 1123 __ mov(r2, Operand(expr->pattern())); |
1124 __ mov(r1, Operand(expr->flags())); | 1124 __ mov(r1, Operand(expr->flags())); |
1125 __ Push(r4, r3, r2, r1); | 1125 __ Push(r4, r3, r2, r1); |
1126 __ CallRuntime(Runtime::kMaterializeRegExpLiteral, 4); | 1126 __ CallRuntime(Runtime::kMaterializeRegExpLiteral, 4); |
1127 __ bind(&done); | 1127 __ bind(&materialized); |
| 1128 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; |
| 1129 __ push(r0); |
| 1130 __ mov(r0, Operand(Smi::FromInt(size))); |
| 1131 __ push(r0); |
| 1132 __ CallRuntime(Runtime::kAllocateInNewSpace, 1); |
| 1133 // After this, registers are used as follows: |
| 1134 // r0: Newly allocated regexp. |
| 1135 // r1: Materialized regexp |
| 1136 // r2: temp. |
| 1137 __ pop(r1); |
| 1138 __ CopyFields(r0, r1, r2.bit(), size / kPointerSize); |
1128 Apply(context_, r0); | 1139 Apply(context_, r0); |
1129 } | 1140 } |
1130 | 1141 |
1131 | 1142 |
1132 void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { | 1143 void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
1133 Comment cmnt(masm_, "[ ObjectLiteral"); | 1144 Comment cmnt(masm_, "[ ObjectLiteral"); |
1134 __ ldr(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | 1145 __ ldr(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
1135 __ ldr(r3, FieldMemOperand(r3, JSFunction::kLiteralsOffset)); | 1146 __ ldr(r3, FieldMemOperand(r3, JSFunction::kLiteralsOffset)); |
1136 __ mov(r2, Operand(Smi::FromInt(expr->literal_index()))); | 1147 __ mov(r2, Operand(Smi::FromInt(expr->literal_index()))); |
1137 __ mov(r1, Operand(expr->constant_properties())); | 1148 __ mov(r1, Operand(expr->constant_properties())); |
(...skipping 1421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2559 __ bind(¬_found); | 2570 __ bind(¬_found); |
2560 // Call runtime to perform the lookup. | 2571 // Call runtime to perform the lookup. |
2561 __ Push(cache, key); | 2572 __ Push(cache, key); |
2562 __ CallRuntime(Runtime::kGetFromCache, 2); | 2573 __ CallRuntime(Runtime::kGetFromCache, 2); |
2563 | 2574 |
2564 __ bind(&done); | 2575 __ bind(&done); |
2565 Apply(context_, r0); | 2576 Apply(context_, r0); |
2566 } | 2577 } |
2567 | 2578 |
2568 | 2579 |
| 2580 void FullCodeGenerator::EmitIsRegExpEquivalent(ZoneList<Expression*>* args) { |
| 2581 ASSERT_EQ(2, args->length()); |
| 2582 |
| 2583 Register right = r0; |
| 2584 Register left = r1; |
| 2585 Register tmp = r2; |
| 2586 Register tmp2 = r3; |
| 2587 |
| 2588 VisitForValue(args->at(0), kStack); |
| 2589 VisitForValue(args->at(1), kAccumulator); |
| 2590 __ pop(left); |
| 2591 |
| 2592 Label done, fail, ok; |
| 2593 __ cmp(left, Operand(right)); |
| 2594 __ b(eq, &ok); |
| 2595 // Fail if either is a non-HeapObject. |
| 2596 __ and_(tmp, left, Operand(right)); |
| 2597 __ tst(tmp, Operand(kSmiTagMask)); |
| 2598 __ b(eq, &fail); |
| 2599 __ ldr(tmp, FieldMemOperand(left, HeapObject::kMapOffset)); |
| 2600 __ ldrb(tmp2, FieldMemOperand(tmp, Map::kInstanceTypeOffset)); |
| 2601 __ cmp(tmp2, Operand(JS_REGEXP_TYPE)); |
| 2602 __ b(ne, &fail); |
| 2603 __ ldr(tmp2, FieldMemOperand(right, HeapObject::kMapOffset)); |
| 2604 __ cmp(tmp, Operand(tmp2)); |
| 2605 __ b(ne, &fail); |
| 2606 __ ldr(tmp, FieldMemOperand(left, JSRegExp::kDataOffset)); |
| 2607 __ ldr(tmp2, FieldMemOperand(right, JSRegExp::kDataOffset)); |
| 2608 __ cmp(tmp, tmp2); |
| 2609 __ b(eq, &ok); |
| 2610 __ bind(&fail); |
| 2611 __ LoadRoot(r0, Heap::kFalseValueRootIndex); |
| 2612 __ jmp(&done); |
| 2613 __ bind(&ok); |
| 2614 __ LoadRoot(r0, Heap::kTrueValueRootIndex); |
| 2615 __ bind(&done); |
| 2616 |
| 2617 Apply(context_, r0); |
| 2618 } |
| 2619 |
| 2620 |
2569 void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { | 2621 void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
2570 Handle<String> name = expr->name(); | 2622 Handle<String> name = expr->name(); |
2571 if (name->length() > 0 && name->Get(0) == '_') { | 2623 if (name->length() > 0 && name->Get(0) == '_') { |
2572 Comment cmnt(masm_, "[ InlineRuntimeCall"); | 2624 Comment cmnt(masm_, "[ InlineRuntimeCall"); |
2573 EmitInlineRuntimeCall(expr); | 2625 EmitInlineRuntimeCall(expr); |
2574 return; | 2626 return; |
2575 } | 2627 } |
2576 | 2628 |
2577 Comment cmnt(masm_, "[ CallRuntime"); | 2629 Comment cmnt(masm_, "[ CallRuntime"); |
2578 ZoneList<Expression*>* args = expr->arguments(); | 2630 ZoneList<Expression*>* args = expr->arguments(); |
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3169 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. | 3221 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. |
3170 __ add(pc, r1, Operand(masm_->CodeObject())); | 3222 __ add(pc, r1, Operand(masm_->CodeObject())); |
3171 } | 3223 } |
3172 | 3224 |
3173 | 3225 |
3174 #undef __ | 3226 #undef __ |
3175 | 3227 |
3176 } } // namespace v8::internal | 3228 } } // namespace v8::internal |
3177 | 3229 |
3178 #endif // V8_TARGET_ARCH_ARM | 3230 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |