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

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

Issue 5753005: Make closures optimizable by Crankshaft compiler. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressing next round of Florian's comments Created 10 years 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 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 1799 matching lines...) Expand 10 before | Expand all | Expand 10 after
1810 } 1810 }
1811 } 1811 }
1812 1812
1813 1813
1814 void LCodeGen::DoStoreGlobal(LStoreGlobal* instr) { 1814 void LCodeGen::DoStoreGlobal(LStoreGlobal* instr) {
1815 Register value = ToRegister(instr->input()); 1815 Register value = ToRegister(instr->input());
1816 __ mov(Operand::Cell(instr->hydrogen()->cell()), value); 1816 __ mov(Operand::Cell(instr->hydrogen()->cell()), value);
1817 } 1817 }
1818 1818
1819 1819
1820 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) {
1821 // TODO(antonm): load a context with a separate instruction.
1822 Register result = ToRegister(instr->result());
1823 HLoadContextSlot* hinstr = instr->hydrogen();
Kevin Millikin (Chromium) 2010/12/20 12:05:44 It's typical for the Lithium instructions to have
antonm 2010/12/20 20:39:24 Done.
1824 Comment(";;; Load context slot %d at %d",
Kevin Millikin (Chromium) 2010/12/20 12:05:44 There will automatically be a comment with the pri
antonm 2010/12/20 20:39:24 Done.
1825 hinstr->slot_index(), hinstr->context_chain_length());
1826 __ LoadContext(result, hinstr->context_chain_length());
1827 __ mov(result, ContextOperand(result, hinstr->slot_index()));
1828 }
1829
1830
1820 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { 1831 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
1821 Register object = ToRegister(instr->input()); 1832 Register object = ToRegister(instr->input());
1822 Register result = ToRegister(instr->result()); 1833 Register result = ToRegister(instr->result());
1823 if (instr->hydrogen()->is_in_object()) { 1834 if (instr->hydrogen()->is_in_object()) {
1824 __ mov(result, FieldOperand(object, instr->hydrogen()->offset())); 1835 __ mov(result, FieldOperand(object, instr->hydrogen()->offset()));
1825 } else { 1836 } else {
1826 __ mov(result, FieldOperand(object, JSObject::kPropertiesOffset)); 1837 __ mov(result, FieldOperand(object, JSObject::kPropertiesOffset));
1827 __ mov(result, FieldOperand(result, instr->hydrogen()->offset())); 1838 __ mov(result, FieldOperand(result, instr->hydrogen()->offset()));
1828 } 1839 }
1829 } 1840 }
(...skipping 1073 matching lines...) Expand 10 before | Expand all | Expand 10 after
2903 void LCodeGen::DoCheckMap(LCheckMap* instr) { 2914 void LCodeGen::DoCheckMap(LCheckMap* instr) {
2904 LOperand* input = instr->input(); 2915 LOperand* input = instr->input();
2905 ASSERT(input->IsRegister()); 2916 ASSERT(input->IsRegister());
2906 Register reg = ToRegister(input); 2917 Register reg = ToRegister(input);
2907 __ cmp(FieldOperand(reg, HeapObject::kMapOffset), 2918 __ cmp(FieldOperand(reg, HeapObject::kMapOffset),
2908 instr->hydrogen()->map()); 2919 instr->hydrogen()->map());
2909 DeoptimizeIf(not_equal, instr->environment()); 2920 DeoptimizeIf(not_equal, instr->environment());
2910 } 2921 }
2911 2922
2912 2923
2913 void LCodeGen::LoadPrototype(Register result, Handle<JSObject> prototype) { 2924 void LCodeGen::LoadHeapObject(Register result, Handle<HeapObject> object) {
2914 if (Heap::InNewSpace(*prototype)) { 2925 if (Heap::InNewSpace(*object)) {
2915 Handle<JSGlobalPropertyCell> cell = 2926 Handle<JSGlobalPropertyCell> cell =
2916 Factory::NewJSGlobalPropertyCell(prototype); 2927 Factory::NewJSGlobalPropertyCell(object);
2917 __ mov(result, Operand::Cell(cell)); 2928 __ mov(result, Operand::Cell(cell));
2918 } else { 2929 } else {
2919 __ mov(result, prototype); 2930 __ mov(result, object);
2920 } 2931 }
2921 } 2932 }
2922 2933
2923 2934
2924 void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { 2935 void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
2925 Register reg = ToRegister(instr->temp()); 2936 Register reg = ToRegister(instr->temp());
2926 2937
2927 Handle<JSObject> holder = instr->holder(); 2938 Handle<JSObject> holder = instr->holder();
2928 Handle<Map> receiver_map = instr->receiver_map(); 2939 Handle<Map> receiver_map = instr->receiver_map();
2929 Handle<JSObject> current_prototype(JSObject::cast(receiver_map->prototype())); 2940 Handle<JSObject> current_prototype(JSObject::cast(receiver_map->prototype()));
2930 2941
2931 // Load prototype object. 2942 // Load prototype object.
2932 LoadPrototype(reg, current_prototype); 2943 LoadHeapObject(reg, current_prototype);
2933 2944
2934 // Check prototype maps up to the holder. 2945 // Check prototype maps up to the holder.
2935 while (!current_prototype.is_identical_to(holder)) { 2946 while (!current_prototype.is_identical_to(holder)) {
2936 __ cmp(FieldOperand(reg, HeapObject::kMapOffset), 2947 __ cmp(FieldOperand(reg, HeapObject::kMapOffset),
2937 Handle<Map>(current_prototype->map())); 2948 Handle<Map>(current_prototype->map()));
2938 DeoptimizeIf(not_equal, instr->environment()); 2949 DeoptimizeIf(not_equal, instr->environment());
2939 current_prototype = 2950 current_prototype =
2940 Handle<JSObject>(JSObject::cast(current_prototype->GetPrototype())); 2951 Handle<JSObject>(JSObject::cast(current_prototype->GetPrototype()));
2941 // Load next prototype object. 2952 // Load next prototype object.
2942 LoadPrototype(reg, current_prototype); 2953 LoadHeapObject(reg, current_prototype);
2943 } 2954 }
2944 2955
2945 // Check the holder map. 2956 // Check the holder map.
2946 __ cmp(FieldOperand(reg, HeapObject::kMapOffset), 2957 __ cmp(FieldOperand(reg, HeapObject::kMapOffset),
2947 Handle<Map>(current_prototype->map())); 2958 Handle<Map>(current_prototype->map()));
2948 DeoptimizeIf(not_equal, instr->environment()); 2959 DeoptimizeIf(not_equal, instr->environment());
2949 } 2960 }
2950 2961
2951 2962
2952 void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) { 2963 void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) {
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
3246 ASSERT(!environment->HasBeenRegistered()); 3257 ASSERT(!environment->HasBeenRegistered());
3247 RegisterEnvironmentForDeoptimization(environment); 3258 RegisterEnvironmentForDeoptimization(environment);
3248 ASSERT(osr_pc_offset_ == -1); 3259 ASSERT(osr_pc_offset_ == -1);
3249 osr_pc_offset_ = masm()->pc_offset(); 3260 osr_pc_offset_ = masm()->pc_offset();
3250 } 3261 }
3251 3262
3252 3263
3253 #undef __ 3264 #undef __
3254 3265
3255 } } // namespace v8::internal 3266 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698