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

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

Issue 147203: X64 implementation: Store to lookup slots (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 6 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 3852 matching lines...) Expand 10 before | Expand all | Expand 10 after
3863 __ movq(temp.reg(), SlotOperand(slot, temp.reg())); 3863 __ movq(temp.reg(), SlotOperand(slot, temp.reg()));
3864 frame_->Push(&temp); 3864 frame_->Push(&temp);
3865 } 3865 }
3866 } 3866 }
3867 3867
3868 3868
3869 void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) { 3869 void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) {
3870 // TODO(X64): Enable more types of slot. 3870 // TODO(X64): Enable more types of slot.
3871 3871
3872 if (slot->type() == Slot::LOOKUP) { 3872 if (slot->type() == Slot::LOOKUP) {
3873 UNIMPLEMENTED();
3874 /*
3875 ASSERT(slot->var()->is_dynamic()); 3873 ASSERT(slot->var()->is_dynamic());
3876 3874
3877 // For now, just do a runtime call. Since the call is inevitable, 3875 // For now, just do a runtime call. Since the call is inevitable,
3878 // we eagerly sync the virtual frame so we can directly push the 3876 // we eagerly sync the virtual frame so we can directly push the
3879 // arguments into place. 3877 // arguments into place.
3880 frame_->SyncRange(0, frame_->element_count() - 1); 3878 frame_->SyncRange(0, frame_->element_count() - 1);
3881 3879
3882 frame_->EmitPush(esi); 3880 frame_->EmitPush(rsi);
3883 frame_->EmitPush(Immediate(slot->var()->name())); 3881 frame_->EmitPush(slot->var()->name());
3884 3882
3885 Result value; 3883 Result value;
3886 if (init_state == CONST_INIT) { 3884 if (init_state == CONST_INIT) {
3887 // Same as the case for a normal store, but ignores attribute 3885 // Same as the case for a normal store, but ignores attribute
3888 // (e.g. READ_ONLY) of context slot so that we can initialize const 3886 // (e.g. READ_ONLY) of context slot so that we can initialize const
3889 // properties (introduced via eval("const foo = (some expr);")). Also, 3887 // properties (introduced via eval("const foo = (some expr);")). Also,
3890 // uses the current function context instead of the top context. 3888 // uses the current function context instead of the top context.
3891 // 3889 //
3892 // Note that we must declare the foo upon entry of eval(), via a 3890 // Note that we must declare the foo upon entry of eval(), via a
3893 // context slot declaration, but we cannot initialize it at the same 3891 // context slot declaration, but we cannot initialize it at the same
3894 // time, because the const declaration may be at the end of the eval 3892 // time, because the const declaration may be at the end of the eval
3895 // code (sigh...) and the const variable may have been used before 3893 // code (sigh...) and the const variable may have been used before
3896 // (where its value is 'undefined'). Thus, we can only do the 3894 // (where its value is 'undefined'). Thus, we can only do the
3897 // initialization when we actually encounter the expression and when 3895 // initialization when we actually encounter the expression and when
3898 // the expression operands are defined and valid, and thus we need the 3896 // the expression operands are defined and valid, and thus we need the
3899 // split into 2 operations: declaration of the context slot followed 3897 // split into 2 operations: declaration of the context slot followed
3900 // by initialization. 3898 // by initialization.
3901 value = frame_->CallRuntime(Runtime::kInitializeConstContextSlot, 3); 3899 value = frame_->CallRuntime(Runtime::kInitializeConstContextSlot, 3);
3902 } else { 3900 } else {
3903 value = frame_->CallRuntime(Runtime::kStoreContextSlot, 3); 3901 value = frame_->CallRuntime(Runtime::kStoreContextSlot, 3);
3904 } 3902 }
3905 // Storing a variable must keep the (new) value on the expression 3903 // Storing a variable must keep the (new) value on the expression
3906 // stack. This is necessary for compiling chained assignment 3904 // stack. This is necessary for compiling chained assignment
3907 // expressions. 3905 // expressions.
3908 frame_->Push(&value); 3906 frame_->Push(&value);
3909 */
3910 } else { 3907 } else {
3911 ASSERT(!slot->var()->is_dynamic()); 3908 ASSERT(!slot->var()->is_dynamic());
3912 3909
3913 JumpTarget exit; 3910 JumpTarget exit;
3914 if (init_state == CONST_INIT) { 3911 if (init_state == CONST_INIT) {
3915 ASSERT(slot->var()->mode() == Variable::CONST); 3912 ASSERT(slot->var()->mode() == Variable::CONST);
3916 // Only the first const initialization must be executed (the slot 3913 // Only the first const initialization must be executed (the slot
3917 // still contains 'the hole' value). When the assignment is executed, 3914 // still contains 'the hole' value). When the assignment is executed,
3918 // the code is identical to a normal store (see below). 3915 // the code is identical to a normal store (see below).
3919 // 3916 //
(...skipping 2836 matching lines...) Expand 10 before | Expand all | Expand 10 after
6756 break; 6753 break;
6757 default: 6754 default:
6758 UNREACHABLE(); 6755 UNREACHABLE();
6759 } 6756 }
6760 } 6757 }
6761 6758
6762 6759
6763 #undef __ 6760 #undef __
6764 6761
6765 } } // namespace v8::internal 6762 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698