Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Side by Side Diff: src/ia32/full-codegen-ia32.cc

Issue 3078033: Version 2.3.6 (Closed)
Patch Set: Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ia32/codegen-ia32.cc ('k') | src/ia32/ic-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1189 // call. It is treated specially by the LoadIC code. 1189 // call. It is treated specially by the LoadIC code.
1190 __ nop(); 1190 __ nop();
1191 // Drop key and object left on the stack by IC. 1191 // Drop key and object left on the stack by IC.
1192 Apply(context, eax); 1192 Apply(context, eax);
1193 } 1193 }
1194 } 1194 }
1195 1195
1196 1196
1197 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { 1197 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) {
1198 Comment cmnt(masm_, "[ RegExpLiteral"); 1198 Comment cmnt(masm_, "[ RegExpLiteral");
1199 Label done; 1199 Label materialized;
1200 // Registers will be used as follows: 1200 // Registers will be used as follows:
1201 // edi = JS function. 1201 // edi = JS function.
1202 // ebx = literals array. 1202 // ecx = literals array.
1203 // eax = regexp literal. 1203 // ebx = regexp literal.
1204 // eax = regexp literal clone.
1204 __ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); 1205 __ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
1205 __ mov(ebx, FieldOperand(edi, JSFunction::kLiteralsOffset)); 1206 __ mov(ecx, FieldOperand(edi, JSFunction::kLiteralsOffset));
1206 int literal_offset = 1207 int literal_offset =
1207 FixedArray::kHeaderSize + expr->literal_index() * kPointerSize; 1208 FixedArray::kHeaderSize + expr->literal_index() * kPointerSize;
1208 __ mov(eax, FieldOperand(ebx, literal_offset)); 1209 __ mov(ebx, FieldOperand(ecx, literal_offset));
1209 __ cmp(eax, Factory::undefined_value()); 1210 __ cmp(ebx, Factory::undefined_value());
1210 __ j(not_equal, &done); 1211 __ j(not_equal, &materialized);
1212
1211 // Create regexp literal using runtime function 1213 // Create regexp literal using runtime function
1212 // Result will be in eax. 1214 // Result will be in eax.
1213 __ push(ebx); 1215 __ push(ecx);
1214 __ push(Immediate(Smi::FromInt(expr->literal_index()))); 1216 __ push(Immediate(Smi::FromInt(expr->literal_index())));
1215 __ push(Immediate(expr->pattern())); 1217 __ push(Immediate(expr->pattern()));
1216 __ push(Immediate(expr->flags())); 1218 __ push(Immediate(expr->flags()));
1217 __ CallRuntime(Runtime::kMaterializeRegExpLiteral, 4); 1219 __ CallRuntime(Runtime::kMaterializeRegExpLiteral, 4);
1218 // Label done: 1220 __ mov(ebx, eax);
1219 __ bind(&done); 1221
1222 __ bind(&materialized);
1223 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize;
1224 Label allocated, runtime_allocate;
1225 __ AllocateInNewSpace(size, eax, ecx, edx, &runtime_allocate, TAG_OBJECT);
1226 __ jmp(&allocated);
1227
1228 __ bind(&runtime_allocate);
1229 __ push(ebx);
1230 __ push(Immediate(Smi::FromInt(size)));
1231 __ CallRuntime(Runtime::kAllocateInNewSpace, 1);
1232 __ pop(ebx);
1233
1234 __ bind(&allocated);
1235 // Copy the content into the newly allocated memory.
1236 // (Unroll copy loop once for better throughput).
1237 for (int i = 0; i < size - kPointerSize; i += 2 * kPointerSize) {
1238 __ mov(edx, FieldOperand(ebx, i));
1239 __ mov(ecx, FieldOperand(ebx, i + kPointerSize));
1240 __ mov(FieldOperand(eax, i), edx);
1241 __ mov(FieldOperand(eax, i + kPointerSize), ecx);
1242 }
1243 if ((size % (2 * kPointerSize)) != 0) {
1244 __ mov(edx, FieldOperand(ebx, size - kPointerSize));
1245 __ mov(FieldOperand(eax, size - kPointerSize), edx);
1246 }
1220 Apply(context_, eax); 1247 Apply(context_, eax);
1221 } 1248 }
1222 1249
1223 1250
1224 void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { 1251 void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
1225 Comment cmnt(masm_, "[ ObjectLiteral"); 1252 Comment cmnt(masm_, "[ ObjectLiteral");
1226 __ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); 1253 __ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
1227 __ push(FieldOperand(edi, JSFunction::kLiteralsOffset)); 1254 __ push(FieldOperand(edi, JSFunction::kLiteralsOffset));
1228 __ push(Immediate(Smi::FromInt(expr->literal_index()))); 1255 __ push(Immediate(Smi::FromInt(expr->literal_index())));
1229 __ push(Immediate(expr->constant_properties())); 1256 __ push(Immediate(expr->constant_properties()));
(...skipping 1413 matching lines...) Expand 10 before | Expand all | Expand 10 after
2643 // Call runtime to perform the lookup. 2670 // Call runtime to perform the lookup.
2644 __ push(cache); 2671 __ push(cache);
2645 __ push(key); 2672 __ push(key);
2646 __ CallRuntime(Runtime::kGetFromCache, 2); 2673 __ CallRuntime(Runtime::kGetFromCache, 2);
2647 2674
2648 __ bind(&done); 2675 __ bind(&done);
2649 Apply(context_, eax); 2676 Apply(context_, eax);
2650 } 2677 }
2651 2678
2652 2679
2680 void FullCodeGenerator::EmitIsRegExpEquivalent(ZoneList<Expression*>* args) {
2681 ASSERT_EQ(2, args->length());
2682
2683 Register right = eax;
2684 Register left = ebx;
2685 Register tmp = ecx;
2686
2687 VisitForValue(args->at(0), kStack);
2688 VisitForValue(args->at(1), kAccumulator);
2689 __ pop(left);
2690
2691 Label done, fail, ok;
2692 __ cmp(left, Operand(right));
2693 __ j(equal, &ok);
2694 // Fail if either is a non-HeapObject.
2695 __ mov(tmp, left);
2696 __ and_(Operand(tmp), right);
2697 __ test(Operand(tmp), Immediate(kSmiTagMask));
2698 __ j(zero, &fail);
2699 __ mov(tmp, FieldOperand(left, HeapObject::kMapOffset));
2700 __ cmpb(FieldOperand(tmp, Map::kInstanceTypeOffset),
2701 static_cast<int8_t>(JS_REGEXP_TYPE));
2702 __ j(not_equal, &fail);
2703 __ cmp(tmp, FieldOperand(right, HeapObject::kMapOffset));
2704 __ j(not_equal, &fail);
2705 __ mov(tmp, FieldOperand(left, JSRegExp::kDataOffset));
2706 __ cmp(tmp, FieldOperand(right, JSRegExp::kDataOffset));
2707 __ j(equal, &ok);
2708 __ bind(&fail);
2709 __ mov(eax, Immediate(Factory::false_value()));
2710 __ jmp(&done);
2711 __ bind(&ok);
2712 __ mov(eax, Immediate(Factory::true_value()));
2713 __ bind(&done);
2714
2715 Apply(context_, eax);
2716 }
2717
2718
2653 void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { 2719 void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) {
2654 Handle<String> name = expr->name(); 2720 Handle<String> name = expr->name();
2655 if (name->length() > 0 && name->Get(0) == '_') { 2721 if (name->length() > 0 && name->Get(0) == '_') {
2656 Comment cmnt(masm_, "[ InlineRuntimeCall"); 2722 Comment cmnt(masm_, "[ InlineRuntimeCall");
2657 EmitInlineRuntimeCall(expr); 2723 EmitInlineRuntimeCall(expr);
2658 return; 2724 return;
2659 } 2725 }
2660 2726
2661 Comment cmnt(masm_, "[ CallRuntime"); 2727 Comment cmnt(masm_, "[ CallRuntime");
2662 ZoneList<Expression*>* args = expr->arguments(); 2728 ZoneList<Expression*>* args = expr->arguments();
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after
3272 // And return. 3338 // And return.
3273 __ ret(0); 3339 __ ret(0);
3274 } 3340 }
3275 3341
3276 3342
3277 #undef __ 3343 #undef __
3278 3344
3279 } } // namespace v8::internal 3345 } } // namespace v8::internal
3280 3346
3281 #endif // V8_TARGET_ARCH_IA32 3347 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/codegen-ia32.cc ('k') | src/ia32/ic-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698