Chromium Code Reviews| Index: runtime/vm/stub_code_x64.cc |
| =================================================================== |
| --- runtime/vm/stub_code_x64.cc (revision 8832) |
| +++ runtime/vm/stub_code_x64.cc (working copy) |
| @@ -1565,7 +1565,7 @@ |
| __ movq(RAX, FieldAddress(R10, Array::data_offset())); |
| __ movq(RAX, Address(RSP, RAX, TIMES_4, 0)); // RAX (argument count) is Smi. |
| - Label get_class, ic_miss; |
| + Label get_class_id, ic_miss; |
| // RBX: IC data array. |
| #if defined(DEBUG) |
| @@ -1590,10 +1590,10 @@ |
| Immediate(reinterpret_cast<intptr_t>(Object::null())); |
| Label loop, found; |
| if (num_args == 1) { |
| - __ call(&get_class); |
| - // RAX: receiver's class. |
| + __ call(&get_class_id); |
| + // RAX: receiver's class id as Smi. |
| __ Bind(&loop); |
| - __ movq(R13, Address(R12, 0)); // Get class to check. |
| + __ movq(R13, Address(R12, 0)); // Get class if (Smi) to check. |
| __ cmpq(RAX, R13); // Match? |
| __ j(EQUAL, &found, Assembler::kNearJump); |
| __ addq(R12, Immediate(kWordSize * 2)); // Next element (class + target). |
| @@ -1605,18 +1605,17 @@ |
| // Get receiver. |
| __ movq(RAX, FieldAddress(R10, Array::data_offset())); |
| __ movq(RAX, Address(RSP, RAX, TIMES_4, 0)); // RAX is Smi. |
| - __ call(&get_class); |
| - // TODO(vegorov): switch IC data to store class index instead of class. |
| - __ movq(R13, Address(R12, 0)); // Get class from IC data to check. |
| - __ cmpq(RAX, R13); // Match? |
| + __ call(&get_class_id); |
| + __ movq(R13, Address(R12, 0)); // Get class id from IC data to check. |
| + __ cmpq(RAX, R13); // = Class id match? |
|
Vyacheslav Egorov (Google)
2012/06/19 12:01:06
remove =
srdjan
2012/06/19 15:19:16
Done.
|
| __ j(NOT_EQUAL, &no_match, Assembler::kNearJump); |
| // Check second. |
| // Get next argument. |
| __ movq(RAX, FieldAddress(R10, Array::data_offset())); |
| __ movq(RAX, Address(RSP, RAX, TIMES_4, -kWordSize)); // RAX is Smi. |
| - __ call(&get_class); |
| - __ movq(R13, Address(R12, kWordSize)); // Get class from IC data to check. |
| - __ cmpq(RAX, R13); // Match? |
| + __ call(&get_class_id); |
| + __ movq(R13, Address(R12, kWordSize)); // Get class id from IC data. |
| + __ cmpq(RAX, R13); // Class id match? |
| __ j(EQUAL, &found); |
| __ Bind(&no_match); |
| __ addq(R12, Immediate(kWordSize * (1 + num_args))); // Next element. |
| @@ -1670,18 +1669,17 @@ |
| __ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); |
| __ jmp(RAX); |
| - __ Bind(&get_class); |
| + __ Bind(&get_class_id); |
|
Vyacheslav Egorov (Google)
2012/06/19 12:01:06
get_class_id_as_smi
srdjan
2012/06/19 15:19:16
Done.
|
| Label not_smi; |
| // Test if Smi -> load Smi class for comparison. |
| __ testq(RAX, Immediate(kSmiTagMask)); |
| __ j(NOT_ZERO, ¬_smi, Assembler::kNearJump); |
| - const Class& smi_class = |
| - Class::ZoneHandle(Isolate::Current()->object_store()->smi_class()); |
| - __ LoadObject(RAX, smi_class); |
| + __ movq(RAX, Immediate(Smi::RawValue(kSmi))); |
| __ ret(); |
| __ Bind(¬_smi); |
| - __ LoadClass(RAX, RAX); |
| + __ LoadClassId(RAX, RAX); |
| + __ SmiTag(RAX); |
| __ ret(); |
| } |