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

Side by Side Diff: src/arm/codegen-arm.cc

Issue 115744: This patch much improves our tracking of whether function is... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-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 1039 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 smi.Bind(); 1050 smi.Bind();
1051 __ cmp(r1, Operand(r0)); 1051 __ cmp(r1, Operand(r0));
1052 1052
1053 exit.Bind(); 1053 exit.Bind();
1054 cc_reg_ = cc; 1054 cc_reg_ = cc;
1055 } 1055 }
1056 1056
1057 1057
1058 class CallFunctionStub: public CodeStub { 1058 class CallFunctionStub: public CodeStub {
1059 public: 1059 public:
1060 explicit CallFunctionStub(int argc) : argc_(argc) {} 1060 CallFunctionStub(int argc, InlineCacheInLoop in_loop)
Kevin Millikin (Chromium) 2009/05/25 11:00:42 I like a name that indicates flaggishness. InLoop
1061 : argc_(argc), in_loop_(in_loop) {}
1061 1062
1062 void Generate(MacroAssembler* masm); 1063 void Generate(MacroAssembler* masm);
1063 1064
1064 private: 1065 private:
1065 int argc_; 1066 int argc_;
1067 InlineCacheInLoop in_loop_;
1066 1068
1067 #if defined(DEBUG) 1069 #if defined(DEBUG)
1068 void Print() { PrintF("CallFunctionStub (argc %d)\n", argc_); } 1070 void Print() { PrintF("CallFunctionStub (argc %d)\n", argc_); }
1069 #endif // defined(DEBUG) 1071 #endif // defined(DEBUG)
1070 1072
1071 Major MajorKey() { return CallFunction; } 1073 Major MajorKey() { return CallFunction; }
1072 int MinorKey() { return argc_; } 1074 int MinorKey() { return argc_; }
1075 InlineCacheInLoop InLoop() { return in_loop_; }
1073 }; 1076 };
1074 1077
1075 1078
1076 // Call the function on the stack with the given arguments. 1079 // Call the function on the stack with the given arguments.
1077 void CodeGenerator::CallWithArguments(ZoneList<Expression*>* args, 1080 void CodeGenerator::CallWithArguments(ZoneList<Expression*>* args,
1078 int position) { 1081 int position) {
1079 VirtualFrame::SpilledScope spilled_scope; 1082 VirtualFrame::SpilledScope spilled_scope;
1080 // Push the arguments ("left-to-right") on the stack. 1083 // Push the arguments ("left-to-right") on the stack.
1081 int arg_count = args->length(); 1084 int arg_count = args->length();
1082 for (int i = 0; i < arg_count; i++) { 1085 for (int i = 0; i < arg_count; i++) {
1083 LoadAndSpill(args->at(i)); 1086 LoadAndSpill(args->at(i));
1084 } 1087 }
1085 1088
1086 // Record the position for debugging purposes. 1089 // Record the position for debugging purposes.
1087 CodeForSourcePosition(position); 1090 CodeForSourcePosition(position);
1088 1091
1089 // Use the shared code stub to call the function. 1092 // Use the shared code stub to call the function.
1090 CallFunctionStub call_function(arg_count); 1093 InlineCacheInLoop in_loop = loop_nesting() > 0 ? IN_LOOP : NOT_IN_LOOP;
1094 CallFunctionStub call_function(arg_count, in_loop);
1091 frame_->CallStub(&call_function, arg_count + 1); 1095 frame_->CallStub(&call_function, arg_count + 1);
1092 1096
1093 // Restore context and pop function from the stack. 1097 // Restore context and pop function from the stack.
1094 __ ldr(cp, frame_->Context()); 1098 __ ldr(cp, frame_->Context());
1095 frame_->Drop(); // discard the TOS 1099 frame_->Drop(); // discard the TOS
1096 } 1100 }
1097 1101
1098 1102
1099 void CodeGenerator::Branch(bool if_true, JumpTarget* target) { 1103 void CodeGenerator::Branch(bool if_true, JumpTarget* target) {
1100 VirtualFrame::SpilledScope spilled_scope; 1104 VirtualFrame::SpilledScope spilled_scope;
(...skipping 1942 matching lines...) Expand 10 before | Expand all | Expand 10 after
3043 // invoked function. 3047 // invoked function.
3044 LoadGlobal(); 3048 LoadGlobal();
3045 3049
3046 // Load the arguments. 3050 // Load the arguments.
3047 int arg_count = args->length(); 3051 int arg_count = args->length();
3048 for (int i = 0; i < arg_count; i++) { 3052 for (int i = 0; i < arg_count; i++) {
3049 LoadAndSpill(args->at(i)); 3053 LoadAndSpill(args->at(i));
3050 } 3054 }
3051 3055
3052 // Setup the receiver register and call the IC initialization code. 3056 // Setup the receiver register and call the IC initialization code.
3053 Handle<Code> stub = ComputeCallInitialize(arg_count); 3057 InlineCacheInLoop in_loop = loop_nesting() > 0 ? IN_LOOP : NOT_IN_LOOP;
3058 Handle<Code> stub = ComputeCallInitialize(arg_count, in_loop);
3054 CodeForSourcePosition(node->position()); 3059 CodeForSourcePosition(node->position());
3055 frame_->CallCodeObject(stub, RelocInfo::CODE_TARGET_CONTEXT, 3060 frame_->CallCodeObject(stub, RelocInfo::CODE_TARGET_CONTEXT,
3056 arg_count + 1); 3061 arg_count + 1);
3057 __ ldr(cp, frame_->Context()); 3062 __ ldr(cp, frame_->Context());
3058 // Remove the function from the stack. 3063 // Remove the function from the stack.
3059 frame_->Drop(); 3064 frame_->Drop();
3060 frame_->EmitPush(r0); 3065 frame_->EmitPush(r0);
3061 3066
3062 } else if (var != NULL && var->slot() != NULL && 3067 } else if (var != NULL && var->slot() != NULL &&
3063 var->slot()->type() == Slot::LOOKUP) { 3068 var->slot()->type() == Slot::LOOKUP) {
(...skipping 30 matching lines...) Expand all
3094 frame_->EmitPush(r0); 3099 frame_->EmitPush(r0);
3095 LoadAndSpill(property->obj()); 3100 LoadAndSpill(property->obj());
3096 3101
3097 // Load the arguments. 3102 // Load the arguments.
3098 int arg_count = args->length(); 3103 int arg_count = args->length();
3099 for (int i = 0; i < arg_count; i++) { 3104 for (int i = 0; i < arg_count; i++) {
3100 LoadAndSpill(args->at(i)); 3105 LoadAndSpill(args->at(i));
3101 } 3106 }
3102 3107
3103 // Set the receiver register and call the IC initialization code. 3108 // Set the receiver register and call the IC initialization code.
3104 Handle<Code> stub = ComputeCallInitialize(arg_count); 3109 InlineCacheInLoop in_loop = loop_nesting() > 0 ? IN_LOOP : NOT_IN_LOOP;
3110 Handle<Code> stub = ComputeCallInitialize(arg_count, in_loop);
3105 CodeForSourcePosition(node->position()); 3111 CodeForSourcePosition(node->position());
3106 frame_->CallCodeObject(stub, RelocInfo::CODE_TARGET, arg_count + 1); 3112 frame_->CallCodeObject(stub, RelocInfo::CODE_TARGET, arg_count + 1);
3107 __ ldr(cp, frame_->Context()); 3113 __ ldr(cp, frame_->Context());
3108 3114
3109 // Remove the function from the stack. 3115 // Remove the function from the stack.
3110 frame_->Drop(); 3116 frame_->Drop();
3111 3117
3112 frame_->EmitPush(r0); // push after get rid of function from the stack 3118 frame_->EmitPush(r0); // push after get rid of function from the stack
3113 3119
3114 } else { 3120 } else {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
3192 3198
3193 // Touch up stack with the right values for the function and the receiver. 3199 // Touch up stack with the right values for the function and the receiver.
3194 __ ldr(r1, FieldMemOperand(r0, FixedArray::kHeaderSize)); 3200 __ ldr(r1, FieldMemOperand(r0, FixedArray::kHeaderSize));
3195 __ str(r1, MemOperand(sp, (arg_count + 1) * kPointerSize)); 3201 __ str(r1, MemOperand(sp, (arg_count + 1) * kPointerSize));
3196 __ ldr(r1, FieldMemOperand(r0, FixedArray::kHeaderSize + kPointerSize)); 3202 __ ldr(r1, FieldMemOperand(r0, FixedArray::kHeaderSize + kPointerSize));
3197 __ str(r1, MemOperand(sp, arg_count * kPointerSize)); 3203 __ str(r1, MemOperand(sp, arg_count * kPointerSize));
3198 3204
3199 // Call the function. 3205 // Call the function.
3200 CodeForSourcePosition(node->position()); 3206 CodeForSourcePosition(node->position());
3201 3207
3202 CallFunctionStub call_function(arg_count); 3208 InlineCacheInLoop in_loop = loop_nesting() > 0 ? IN_LOOP : NOT_IN_LOOP;
3209 CallFunctionStub call_function(arg_count, in_loop);
3203 frame_->CallStub(&call_function, arg_count + 1); 3210 frame_->CallStub(&call_function, arg_count + 1);
3204 3211
3205 __ ldr(cp, frame_->Context()); 3212 __ ldr(cp, frame_->Context());
3206 // Remove the function from the stack. 3213 // Remove the function from the stack.
3207 frame_->Drop(); 3214 frame_->Drop();
3208 frame_->EmitPush(r0); 3215 frame_->EmitPush(r0);
3209 ASSERT(frame_->height() == original_height + 1); 3216 ASSERT(frame_->height() == original_height + 1);
3210 } 3217 }
3211 3218
3212 3219
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
3454 } 3461 }
3455 3462
3456 // Push the arguments ("left-to-right"). 3463 // Push the arguments ("left-to-right").
3457 int arg_count = args->length(); 3464 int arg_count = args->length();
3458 for (int i = 0; i < arg_count; i++) { 3465 for (int i = 0; i < arg_count; i++) {
3459 LoadAndSpill(args->at(i)); 3466 LoadAndSpill(args->at(i));
3460 } 3467 }
3461 3468
3462 if (function == NULL) { 3469 if (function == NULL) {
3463 // Call the JS runtime function. 3470 // Call the JS runtime function.
3464 Handle<Code> stub = ComputeCallInitialize(arg_count); 3471 InlineCacheInLoop in_loop = loop_nesting() > 0 ? IN_LOOP : NOT_IN_LOOP;
3472 Handle<Code> stub = ComputeCallInitialize(arg_count, in_loop);
3465 frame_->CallCodeObject(stub, RelocInfo::CODE_TARGET, arg_count + 1); 3473 frame_->CallCodeObject(stub, RelocInfo::CODE_TARGET, arg_count + 1);
3466 __ ldr(cp, frame_->Context()); 3474 __ ldr(cp, frame_->Context());
3467 frame_->Drop(); 3475 frame_->Drop();
3468 frame_->EmitPush(r0); 3476 frame_->EmitPush(r0);
3469 } else { 3477 } else {
3470 // Call the C runtime function. 3478 // Call the C runtime function.
3471 frame_->CallRuntime(function, arg_count); 3479 frame_->CallRuntime(function, arg_count);
3472 frame_->EmitPush(r0); 3480 frame_->EmitPush(r0);
3473 } 3481 }
3474 ASSERT(frame_->height() == original_height + 1); 3482 ASSERT(frame_->height() == original_height + 1);
(...skipping 1705 matching lines...) Expand 10 before | Expand all | Expand 10 after
5180 __ mov(r2, Operand(0)); 5188 __ mov(r2, Operand(0));
5181 __ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION); 5189 __ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION);
5182 __ Jump(Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)), 5190 __ Jump(Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)),
5183 RelocInfo::CODE_TARGET); 5191 RelocInfo::CODE_TARGET);
5184 } 5192 }
5185 5193
5186 5194
5187 #undef __ 5195 #undef __
5188 5196
5189 } } // namespace v8::internal 5197 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/codegen-arm.h ('k') | src/arm/ic-arm.cc » ('j') | src/arm/ic-arm.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698