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

Side by Side Diff: src/x64/code-stubs-x64.cc

Issue 6529014: Fix FastPixelArrayStore on X64 platform. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 10 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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 4819 matching lines...) Expand 10 before | Expand all | Expand 10 after
4830 __ CheckMap(elements, Factory::pixel_array_map(), not_pixel_array, true); 4830 __ CheckMap(elements, Factory::pixel_array_map(), not_pixel_array, true);
4831 } else { 4831 } else {
4832 if (FLAG_debug_code) { 4832 if (FLAG_debug_code) {
4833 // Map check should have already made sure that elements is a pixel array. 4833 // Map check should have already made sure that elements is a pixel array.
4834 __ Cmp(FieldOperand(elements, HeapObject::kMapOffset), 4834 __ Cmp(FieldOperand(elements, HeapObject::kMapOffset),
4835 Factory::pixel_array_map()); 4835 Factory::pixel_array_map());
4836 __ Assert(equal, "Elements isn't a pixel array"); 4836 __ Assert(equal, "Elements isn't a pixel array");
4837 } 4837 }
4838 } 4838 }
4839 4839
4840 // Some callers already have verified that the key is a smi. key_not_smi is
4841 // set to NULL as a sentinel for that case. Otherwise, add an explicit check
4842 // to ensure the key is a smi must be added.
4843 if (key_not_smi != NULL) {
4844 __ JumpIfNotSmi(key, key_not_smi);
4845 } else {
4846 if (FLAG_debug_code) {
4847 __ AbortIfNotSmi(key);
4848 }
4849 }
4850
4851 // Key must be a smi and it must be in range. 4840 // Key must be a smi and it must be in range.
4852 if (key_is_untagged) { 4841 if (key_is_untagged) {
4853 untagged_key = key; 4842 untagged_key = key;
4854 } else { 4843 } else {
4844 // Some callers already have verified that the key is a smi. key_not_smi is
4845 // set to NULL as a sentinel for that case. Otherwise, add an explicit
4846 // check to ensure the key is a smi.
4847 if (key_not_smi != NULL) {
4848 __ JumpIfNotSmi(key, key_not_smi);
4849 } else {
4850 if (FLAG_debug_code) {
4851 __ AbortIfNotSmi(key);
4852 }
4853 }
4855 __ SmiToInteger32(untagged_key, key); 4854 __ SmiToInteger32(untagged_key, key);
4856 } 4855 }
4857 __ cmpl(untagged_key, FieldOperand(elements, PixelArray::kLengthOffset)); 4856 __ cmpl(untagged_key, FieldOperand(elements, PixelArray::kLengthOffset));
4858 __ j(above_equal, out_of_range); // unsigned check handles negative keys. 4857 __ j(above_equal, out_of_range); // unsigned check handles negative keys.
4859 4858
4860 // Value must be a smi. 4859 // Value must be a smi.
4861 __ JumpIfNotSmi(value, value_not_smi); 4860 __ JumpIfNotSmi(value, value_not_smi);
4862 __ SmiToInteger32(untagged_value, value); 4861 __ SmiToInteger32(untagged_value, value);
4863 4862
4864 { // Clamp the value to [0..255]. 4863 { // Clamp the value to [0..255].
4865 NearLabel done; 4864 NearLabel done;
4866 __ testl(untagged_value, Immediate(0xFFFFFF00)); 4865 __ testl(untagged_value, Immediate(0xFFFFFF00));
4867 __ j(zero, &done); 4866 __ j(zero, &done);
4868 __ setcc(negative, untagged_value); // 1 if negative, 0 if positive. 4867 __ setcc(negative, untagged_value); // 1 if negative, 0 if positive.
4869 __ decb(untagged_value); // 0 if negative, 255 if positive. 4868 __ decb(untagged_value); // 0 if negative, 255 if positive.
4870 __ bind(&done); 4869 __ bind(&done);
4871 } 4870 }
4872 4871
4873 __ movq(external_pointer, 4872 __ movq(external_pointer,
4874 FieldOperand(elements, PixelArray::kExternalPointerOffset)); 4873 FieldOperand(elements, PixelArray::kExternalPointerOffset));
4875 __ movb(Operand(external_pointer, untagged_key, times_1, 0), untagged_value); 4874 __ movb(Operand(external_pointer, untagged_key, times_1, 0), untagged_value);
4876 __ ret(0); // Return value in eax. 4875 __ ret(0); // Return value in eax.
4877 } 4876 }
4878 4877
4879 #undef __ 4878 #undef __
4880 4879
4881 } } // namespace v8::internal 4880 } } // namespace v8::internal
4882 4881
4883 #endif // V8_TARGET_ARCH_X64 4882 #endif // V8_TARGET_ARCH_X64
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