• Home
  • Raw
  • Download

Lines Matching refs:__

43 #define __ ACCESS_MASM(masm)  macro
48 __ JumpIfNotSmi(eax, &check_heap_number, Label::kNear); in Generate()
49 __ ret(0); in Generate()
51 __ bind(&check_heap_number); in Generate()
52 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); in Generate()
54 __ cmp(ebx, Immediate(factory->heap_number_map())); in Generate()
55 __ j(not_equal, &call_builtin, Label::kNear); in Generate()
56 __ ret(0); in Generate()
58 __ bind(&call_builtin); in Generate()
59 __ pop(ecx); // Pop return address. in Generate()
60 __ push(eax); in Generate()
61 __ push(ecx); // Push return address. in Generate()
62 __ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION); in Generate()
70 __ AllocateInNewSpace(JSFunction::kSize, eax, ebx, ecx, &gc, TAG_OBJECT); in Generate()
73 __ mov(edx, Operand(esp, 1 * kPointerSize)); in Generate()
81 __ mov(ecx, Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX))); in Generate()
82 __ mov(ecx, FieldOperand(ecx, GlobalObject::kGlobalContextOffset)); in Generate()
83 __ mov(ecx, Operand(ecx, Context::SlotOffset(map_index))); in Generate()
84 __ mov(FieldOperand(eax, JSObject::kMapOffset), ecx); in Generate()
89 __ mov(ebx, Immediate(factory->empty_fixed_array())); in Generate()
90 __ mov(FieldOperand(eax, JSObject::kPropertiesOffset), ebx); in Generate()
91 __ mov(FieldOperand(eax, JSObject::kElementsOffset), ebx); in Generate()
92 __ mov(FieldOperand(eax, JSFunction::kPrototypeOrInitialMapOffset), in Generate()
94 __ mov(FieldOperand(eax, JSFunction::kSharedFunctionInfoOffset), edx); in Generate()
95 __ mov(FieldOperand(eax, JSFunction::kContextOffset), esi); in Generate()
96 __ mov(FieldOperand(eax, JSFunction::kLiteralsOffset), ebx); in Generate()
97 __ mov(FieldOperand(eax, JSFunction::kNextFunctionLinkOffset), in Generate()
102 __ mov(edx, FieldOperand(edx, SharedFunctionInfo::kCodeOffset)); in Generate()
103 __ lea(edx, FieldOperand(edx, Code::kHeaderSize)); in Generate()
104 __ mov(FieldOperand(eax, JSFunction::kCodeEntryOffset), edx); in Generate()
107 __ ret(1 * kPointerSize); in Generate()
110 __ bind(&gc); in Generate()
111 __ pop(ecx); // Temporarily remove return address. in Generate()
112 __ pop(edx); in Generate()
113 __ push(esi); in Generate()
114 __ push(edx); in Generate()
115 __ push(Immediate(factory->false_value())); in Generate()
116 __ push(ecx); // Restore return address. in Generate()
117 __ TailCallRuntime(Runtime::kNewClosure, 3, 1); in Generate()
125 __ AllocateInNewSpace((length * kPointerSize) + FixedArray::kHeaderSize, in Generate()
129 __ mov(ecx, Operand(esp, 1 * kPointerSize)); in Generate()
133 __ mov(FieldOperand(eax, HeapObject::kMapOffset), in Generate()
135 __ mov(FieldOperand(eax, Context::kLengthOffset), in Generate()
139 __ Set(ebx, Immediate(0)); // Set to NULL. in Generate()
140 __ mov(Operand(eax, Context::SlotOffset(Context::CLOSURE_INDEX)), ecx); in Generate()
141 __ mov(Operand(eax, Context::SlotOffset(Context::PREVIOUS_INDEX)), esi); in Generate()
142 __ mov(Operand(eax, Context::SlotOffset(Context::EXTENSION_INDEX)), ebx); in Generate()
145 __ mov(ebx, Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX))); in Generate()
146 __ mov(Operand(eax, Context::SlotOffset(Context::GLOBAL_INDEX)), ebx); in Generate()
149 __ mov(ebx, factory->undefined_value()); in Generate()
151 __ mov(Operand(eax, Context::SlotOffset(i)), ebx); in Generate()
155 __ mov(esi, eax); in Generate()
156 __ ret(1 * kPointerSize); in Generate()
159 __ bind(&gc); in Generate()
160 __ TailCallRuntime(Runtime::kNewFunctionContext, 1, 1); in Generate()
173 __ AllocateInNewSpace(FixedArray::SizeFor(length), in Generate()
177 __ mov(ecx, Operand(esp, 1 * kPointerSize)); in Generate()
180 __ mov(ebx, Operand(esp, 2 * kPointerSize)); in Generate()
184 __ mov(FieldOperand(eax, HeapObject::kMapOffset), in Generate()
186 __ mov(FieldOperand(eax, Context::kLengthOffset), in Generate()
194 __ JumpIfNotSmi(ecx, &after_sentinel, Label::kNear); in Generate()
197 __ cmp(ecx, 0); in Generate()
198 __ Assert(equal, message); in Generate()
200 __ mov(ecx, GlobalObjectOperand()); in Generate()
201 __ mov(ecx, FieldOperand(ecx, GlobalObject::kGlobalContextOffset)); in Generate()
202 __ mov(ecx, ContextOperand(ecx, Context::CLOSURE_INDEX)); in Generate()
203 __ bind(&after_sentinel); in Generate()
206 __ mov(ContextOperand(eax, Context::CLOSURE_INDEX), ecx); in Generate()
207 __ mov(ContextOperand(eax, Context::PREVIOUS_INDEX), esi); in Generate()
208 __ mov(ContextOperand(eax, Context::EXTENSION_INDEX), ebx); in Generate()
211 __ mov(ebx, ContextOperand(esi, Context::GLOBAL_INDEX)); in Generate()
212 __ mov(ContextOperand(eax, Context::GLOBAL_INDEX), ebx); in Generate()
216 __ mov(ContextOperand(eax, Context::MIN_CONTEXT_SLOTS), in Generate()
219 __ mov(ebx, factory->the_hole_value()); in Generate()
221 __ mov(ContextOperand(eax, i + Context::MIN_CONTEXT_SLOTS), ebx); in Generate()
226 __ mov(esi, eax); in Generate()
227 __ ret(2 * kPointerSize); in Generate()
230 __ bind(&gc); in Generate()
231 __ TailCallRuntime(Runtime::kPushBlockContext, 2, 1); in Generate()
256 __ AllocateInNewSpace(size, eax, ebx, edx, fail, TAG_OBJECT); in GenerateFastCloneShallowArrayCommon()
261 __ mov(ebx, FieldOperand(ecx, i)); in GenerateFastCloneShallowArrayCommon()
262 __ mov(FieldOperand(eax, i), ebx); in GenerateFastCloneShallowArrayCommon()
269 __ mov(ecx, FieldOperand(ecx, JSArray::kElementsOffset)); in GenerateFastCloneShallowArrayCommon()
270 __ lea(edx, Operand(eax, JSArray::kSize)); in GenerateFastCloneShallowArrayCommon()
271 __ mov(FieldOperand(eax, JSArray::kElementsOffset), edx); in GenerateFastCloneShallowArrayCommon()
276 __ mov(ebx, FieldOperand(ecx, i)); in GenerateFastCloneShallowArrayCommon()
277 __ mov(FieldOperand(edx, i), ebx); in GenerateFastCloneShallowArrayCommon()
283 __ mov(ebx, FieldOperand(ecx, i)); in GenerateFastCloneShallowArrayCommon()
284 __ mov(FieldOperand(edx, i), ebx); in GenerateFastCloneShallowArrayCommon()
287 __ fld_d(FieldOperand(ecx, i)); in GenerateFastCloneShallowArrayCommon()
288 __ fstp_d(FieldOperand(edx, i)); in GenerateFastCloneShallowArrayCommon()
306 __ mov(ecx, Operand(esp, 3 * kPointerSize)); in Generate()
307 __ mov(eax, Operand(esp, 2 * kPointerSize)); in Generate()
311 __ mov(ecx, FieldOperand(ecx, eax, times_half_pointer_size, in Generate()
314 __ cmp(ecx, factory->undefined_value()); in Generate()
316 __ j(equal, &slow_case); in Generate()
322 __ mov(ebx, FieldOperand(ecx, JSArray::kElementsOffset)); in Generate()
323 __ CheckMap(ebx, factory->fixed_cow_array_map(), in Generate()
327 __ ret(3 * kPointerSize); in Generate()
329 __ bind(&check_fast_elements); in Generate()
330 __ CheckMap(ebx, factory->fixed_array_map(), in Generate()
334 __ ret(3 * kPointerSize); in Generate()
336 __ bind(&double_elements); in Generate()
355 __ push(ecx); in Generate()
356 __ mov(ecx, FieldOperand(ecx, JSArray::kElementsOffset)); in Generate()
357 __ cmp(FieldOperand(ecx, HeapObject::kMapOffset), expected_map); in Generate()
358 __ Assert(equal, message); in Generate()
359 __ pop(ecx); in Generate()
364 __ ret(3 * kPointerSize); in Generate()
366 __ bind(&slow_case); in Generate()
367 __ TailCallRuntime(Runtime::kCreateArrayLiteralShallow, 3, 1); in Generate()
382 __ mov(ecx, Operand(esp, 4 * kPointerSize)); in Generate()
383 __ mov(eax, Operand(esp, 3 * kPointerSize)); in Generate()
387 __ mov(ecx, FieldOperand(ecx, eax, times_half_pointer_size, in Generate()
390 __ cmp(ecx, factory->undefined_value()); in Generate()
391 __ j(equal, &slow_case); in Generate()
396 __ mov(eax, FieldOperand(ecx, HeapObject::kMapOffset)); in Generate()
397 __ movzx_b(eax, FieldOperand(eax, Map::kInstanceSizeOffset)); in Generate()
398 __ cmp(eax, Immediate(size >> kPointerSizeLog2)); in Generate()
399 __ j(not_equal, &slow_case); in Generate()
403 __ AllocateInNewSpace(size, eax, ebx, edx, &slow_case, TAG_OBJECT); in Generate()
405 __ mov(ebx, FieldOperand(ecx, i)); in Generate()
406 __ mov(FieldOperand(eax, i), ebx); in Generate()
410 __ ret(4 * kPointerSize); in Generate()
412 __ bind(&slow_case); in Generate()
413 __ TailCallRuntime(Runtime::kCreateObjectLiteralShallow, 4, 1); in Generate()
428 __ mov(argument, Operand(esp, 1 * kPointerSize)); in Generate()
444 __ JumpIfNotSmi(argument, &not_smi, Label::kNear); in Generate()
447 __ mov(tos_, argument); in Generate()
449 __ ret(1 * kPointerSize); in Generate()
450 __ bind(&not_smi); in Generate()
453 __ JumpIfSmi(argument, &patch, Label::kNear); in Generate()
457 __ mov(map, FieldOperand(argument, HeapObject::kMapOffset)); in Generate()
460 __ test_b(FieldOperand(map, Map::kBitFieldOffset), in Generate()
464 __ j(zero, &not_undetectable, Label::kNear); in Generate()
465 __ Set(tos_, Immediate(0)); in Generate()
466 __ ret(1 * kPointerSize); in Generate()
467 __ bind(&not_undetectable); in Generate()
474 __ CmpInstanceType(map, FIRST_SPEC_OBJECT_TYPE); in Generate()
475 __ j(below, &not_js_object, Label::kNear); in Generate()
478 __ Set(tos_, Immediate(1)); in Generate()
480 __ ret(1 * kPointerSize); in Generate()
481 __ bind(&not_js_object); in Generate()
487 __ CmpInstanceType(map, FIRST_NONSTRING_TYPE); in Generate()
488 __ j(above_equal, &not_string, Label::kNear); in Generate()
489 __ mov(tos_, FieldOperand(argument, String::kLengthOffset)); in Generate()
490 __ ret(1 * kPointerSize); // the string length is OK as the return value in Generate()
491 __ bind(&not_string); in Generate()
497 __ cmp(map, factory->heap_number_map()); in Generate()
498 __ j(not_equal, &not_heap_number, Label::kNear); in Generate()
499 __ fldz(); in Generate()
500 __ fld_d(FieldOperand(argument, HeapNumber::kValueOffset)); in Generate()
501 __ FCmp(); in Generate()
502 __ j(zero, &false_result, Label::kNear); in Generate()
505 __ Set(tos_, Immediate(1)); in Generate()
507 __ ret(1 * kPointerSize); in Generate()
508 __ bind(&false_result); in Generate()
509 __ Set(tos_, Immediate(0)); in Generate()
510 __ ret(1 * kPointerSize); in Generate()
511 __ bind(&not_heap_number); in Generate()
514 __ bind(&patch); in Generate()
523 __ pushad(); in Generate()
526 __ sub(esp, Immediate(kDoubleSize * XMMRegister::kNumRegisters)); in Generate()
529 __ movdbl(Operand(esp, i * kDoubleSize), reg); in Generate()
535 __ PrepareCallCFunction(argument_count, ecx); in Generate()
536 __ mov(Operand(esp, 0 * kPointerSize), in Generate()
538 __ CallCFunction( in Generate()
545 __ movdbl(reg, Operand(esp, i * kDoubleSize)); in Generate()
547 __ add(esp, Immediate(kDoubleSize * XMMRegister::kNumRegisters)); in Generate()
549 __ popad(); in Generate()
550 __ ret(0); in Generate()
562 __ CompareRoot(argument, value); in CheckOddball()
563 __ j(not_equal, &different_value, Label::kNear); in CheckOddball()
566 __ Set(tos_, Immediate(0)); in CheckOddball()
570 __ Set(tos_, Immediate(1)); in CheckOddball()
572 __ ret(1 * kPointerSize); in CheckOddball()
573 __ bind(&different_value); in CheckOddball()
579 __ pop(ecx); // Get return address, operand is now on top of stack. in GenerateTypeTransition()
580 __ push(Immediate(Smi::FromInt(tos_.code()))); in GenerateTypeTransition()
581 __ push(Immediate(Smi::FromInt(types_.ToByte()))); in GenerateTypeTransition()
582 __ push(ecx); // Push return address. in GenerateTypeTransition()
585 __ TailCallExternalReference( in GenerateTypeTransition()
679 __ mov(scratch, FieldOperand(source, HeapNumber::kExponentOffset)); in IntegerConvert()
681 __ mov(scratch2, scratch); in IntegerConvert()
682 __ and_(scratch2, HeapNumber::kExponentMask); in IntegerConvert()
688 __ cmp(scratch2, Immediate(kTooBigExponent)); in IntegerConvert()
689 __ j(greater_equal, conversion_failure); in IntegerConvert()
691 __ fld_d(FieldOperand(source, HeapNumber::kValueOffset)); in IntegerConvert()
693 __ sub(esp, Immediate(sizeof(uint64_t))); // Nolint. in IntegerConvert()
695 __ fisttp_d(Operand(esp, 0)); in IntegerConvert()
696 __ mov(ecx, Operand(esp, 0)); // Load low word of answer into ecx. in IntegerConvert()
697 __ add(esp, Immediate(sizeof(uint64_t))); // Nolint. in IntegerConvert()
701 __ xor_(ecx, ecx); in IntegerConvert()
708 __ cmp(scratch2, Immediate(non_smi_exponent)); in IntegerConvert()
711 __ j(equal, &right_exponent, Label::kNear); in IntegerConvert()
714 __ j(less, &normal_exponent, Label::kNear); in IntegerConvert()
721 __ cmp(scratch2, Immediate(big_non_smi_exponent)); in IntegerConvert()
722 __ j(not_equal, conversion_failure); in IntegerConvert()
725 __ mov(scratch2, scratch); in IntegerConvert()
726 __ and_(scratch2, HeapNumber::kMantissaMask); in IntegerConvert()
728 __ or_(scratch2, 1 << HeapNumber::kExponentShift); in IntegerConvert()
734 __ shl(scratch2, big_shift_distance); in IntegerConvert()
736 __ mov(ecx, FieldOperand(source, HeapNumber::kMantissaOffset)); in IntegerConvert()
739 __ shr(ecx, 32 - big_shift_distance); in IntegerConvert()
740 __ or_(ecx, scratch2); in IntegerConvert()
742 __ test(scratch, scratch); in IntegerConvert()
743 __ j(positive, &done, Label::kNear); in IntegerConvert()
744 __ neg(ecx); in IntegerConvert()
745 __ jmp(&done, Label::kNear); in IntegerConvert()
748 __ bind(&normal_exponent); in IntegerConvert()
756 __ sub(scratch2, Immediate(zero_exponent)); in IntegerConvert()
758 __ j(less, &done, Label::kNear); in IntegerConvert()
761 __ shr(scratch2, HeapNumber::kExponentShift); in IntegerConvert()
762 __ mov(ecx, Immediate(30)); in IntegerConvert()
763 __ sub(ecx, scratch2); in IntegerConvert()
765 __ bind(&right_exponent); in IntegerConvert()
768 __ and_(scratch, HeapNumber::kMantissaMask); in IntegerConvert()
770 __ or_(scratch, 1 << HeapNumber::kExponentShift); in IntegerConvert()
775 __ shl(scratch, shift_distance); in IntegerConvert()
779 __ mov(scratch2, FieldOperand(source, HeapNumber::kMantissaOffset)); in IntegerConvert()
782 __ shr(scratch2, 32 - shift_distance); in IntegerConvert()
783 __ or_(scratch2, scratch); in IntegerConvert()
785 __ shr_cl(scratch2); in IntegerConvert()
789 __ xor_(ecx, ecx); in IntegerConvert()
790 __ cmp(ecx, FieldOperand(source, HeapNumber::kExponentOffset)); in IntegerConvert()
791 __ j(greater, &negative, Label::kNear); in IntegerConvert()
792 __ mov(ecx, scratch2); in IntegerConvert()
793 __ jmp(&done, Label::kNear); in IntegerConvert()
794 __ bind(&negative); in IntegerConvert()
795 __ sub(ecx, scratch2); in IntegerConvert()
796 __ bind(&done); in IntegerConvert()
835 __ pop(ecx); // Save return address. in GenerateTypeTransition()
837 __ push(eax); // the operand in GenerateTypeTransition()
838 __ push(Immediate(Smi::FromInt(op_))); in GenerateTypeTransition()
839 __ push(Immediate(Smi::FromInt(mode_))); in GenerateTypeTransition()
840 __ push(Immediate(Smi::FromInt(operand_type_))); in GenerateTypeTransition()
842 __ push(ecx); // Push return address. in GenerateTypeTransition()
846 __ TailCallExternalReference( in GenerateTypeTransition()
870 __ bind(&undo); in GenerateSmiStubSub()
872 __ bind(&non_smi); in GenerateSmiStubSub()
873 __ bind(&slow); in GenerateSmiStubSub()
881 __ bind(&non_smi); in GenerateSmiStubBitNot()
894 __ JumpIfNotSmi(eax, non_smi, non_smi_near); in GenerateSmiCodeSub()
897 __ test(eax, eax); in GenerateSmiCodeSub()
898 __ j(zero, slow, slow_near); in GenerateSmiCodeSub()
901 __ mov(edx, eax); in GenerateSmiCodeSub()
902 __ Set(eax, Immediate(0)); in GenerateSmiCodeSub()
903 __ sub(eax, edx); in GenerateSmiCodeSub()
904 __ j(overflow, undo, undo_near); in GenerateSmiCodeSub()
905 __ ret(0); in GenerateSmiCodeSub()
914 __ JumpIfNotSmi(eax, non_smi, non_smi_near); in GenerateSmiCodeBitNot()
917 __ not_(eax); in GenerateSmiCodeBitNot()
918 __ and_(eax, ~kSmiTagMask); in GenerateSmiCodeBitNot()
919 __ ret(0); in GenerateSmiCodeBitNot()
924 __ mov(eax, edx); in GenerateSmiCodeUndo()
946 __ bind(&non_smi); in GenerateHeapNumberStubSub()
948 __ bind(&undo); in GenerateHeapNumberStubSub()
950 __ bind(&slow); in GenerateHeapNumberStubSub()
952 __ bind(&call_builtin); in GenerateHeapNumberStubSub()
961 __ bind(&non_smi); in GenerateHeapNumberStubBitNot()
963 __ bind(&slow); in GenerateHeapNumberStubBitNot()
970 __ mov(edx, FieldOperand(eax, HeapObject::kMapOffset)); in GenerateHeapNumberCodeSub()
971 __ cmp(edx, masm->isolate()->factory()->heap_number_map()); in GenerateHeapNumberCodeSub()
972 __ j(not_equal, slow); in GenerateHeapNumberCodeSub()
975 __ xor_(FieldOperand(eax, HeapNumber::kExponentOffset), in GenerateHeapNumberCodeSub()
978 __ mov(edx, eax); in GenerateHeapNumberCodeSub()
982 __ AllocateHeapNumber(eax, ebx, ecx, &slow_allocate_heapnumber); in GenerateHeapNumberCodeSub()
983 __ jmp(&heapnumber_allocated, Label::kNear); in GenerateHeapNumberCodeSub()
985 __ bind(&slow_allocate_heapnumber); in GenerateHeapNumberCodeSub()
988 __ push(edx); in GenerateHeapNumberCodeSub()
989 __ CallRuntime(Runtime::kNumberAlloc, 0); in GenerateHeapNumberCodeSub()
990 __ pop(edx); in GenerateHeapNumberCodeSub()
993 __ bind(&heapnumber_allocated); in GenerateHeapNumberCodeSub()
995 __ mov(ecx, FieldOperand(edx, HeapNumber::kExponentOffset)); in GenerateHeapNumberCodeSub()
996 __ xor_(ecx, HeapNumber::kSignMask); // Flip sign. in GenerateHeapNumberCodeSub()
997 __ mov(FieldOperand(eax, HeapNumber::kExponentOffset), ecx); in GenerateHeapNumberCodeSub()
998 __ mov(ecx, FieldOperand(edx, HeapNumber::kMantissaOffset)); in GenerateHeapNumberCodeSub()
999 __ mov(FieldOperand(eax, HeapNumber::kMantissaOffset), ecx); in GenerateHeapNumberCodeSub()
1001 __ ret(0); in GenerateHeapNumberCodeSub()
1007 __ mov(edx, FieldOperand(eax, HeapObject::kMapOffset)); in GenerateHeapNumberCodeBitNot()
1008 __ cmp(edx, masm->isolate()->factory()->heap_number_map()); in GenerateHeapNumberCodeBitNot()
1009 __ j(not_equal, slow); in GenerateHeapNumberCodeBitNot()
1016 __ not_(ecx); in GenerateHeapNumberCodeBitNot()
1017 __ cmp(ecx, 0xc0000000); in GenerateHeapNumberCodeBitNot()
1018 __ j(sign, &try_float, Label::kNear); in GenerateHeapNumberCodeBitNot()
1022 __ lea(eax, Operand(ecx, times_2, kSmiTag)); in GenerateHeapNumberCodeBitNot()
1023 __ ret(0); in GenerateHeapNumberCodeBitNot()
1026 __ bind(&try_float); in GenerateHeapNumberCodeBitNot()
1029 __ mov(ebx, eax); in GenerateHeapNumberCodeBitNot()
1030 __ AllocateHeapNumber(eax, edx, edi, &slow_allocate_heapnumber); in GenerateHeapNumberCodeBitNot()
1031 __ jmp(&heapnumber_allocated); in GenerateHeapNumberCodeBitNot()
1033 __ bind(&slow_allocate_heapnumber); in GenerateHeapNumberCodeBitNot()
1039 __ push(ebx); in GenerateHeapNumberCodeBitNot()
1040 __ CallRuntime(Runtime::kNumberAlloc, 0); in GenerateHeapNumberCodeBitNot()
1042 __ pop(edx); in GenerateHeapNumberCodeBitNot()
1047 __ not_(ecx); in GenerateHeapNumberCodeBitNot()
1049 __ bind(&heapnumber_allocated); in GenerateHeapNumberCodeBitNot()
1053 __ cvtsi2sd(xmm0, ecx); in GenerateHeapNumberCodeBitNot()
1054 __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm0); in GenerateHeapNumberCodeBitNot()
1056 __ push(ecx); in GenerateHeapNumberCodeBitNot()
1057 __ fild_s(Operand(esp, 0)); in GenerateHeapNumberCodeBitNot()
1058 __ pop(ecx); in GenerateHeapNumberCodeBitNot()
1059 __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset)); in GenerateHeapNumberCodeBitNot()
1061 __ ret(0); in GenerateHeapNumberCodeBitNot()
1083 __ bind(&non_smi); in GenerateGenericStubSub()
1085 __ bind(&undo); in GenerateGenericStubSub()
1087 __ bind(&slow); in GenerateGenericStubSub()
1095 __ bind(&non_smi); in GenerateGenericStubBitNot()
1097 __ bind(&slow); in GenerateGenericStubBitNot()
1104 __ pop(ecx); // pop return address. in GenerateGenericCodeFallback()
1105 __ push(eax); in GenerateGenericCodeFallback()
1106 __ push(ecx); // push return address in GenerateGenericCodeFallback()
1109 __ InvokeBuiltin(Builtins::UNARY_MINUS, JUMP_FUNCTION); in GenerateGenericCodeFallback()
1112 __ InvokeBuiltin(Builtins::BIT_NOT, JUMP_FUNCTION); in GenerateGenericCodeFallback()
1121 __ pop(ecx); // Save return address. in GenerateTypeTransition()
1122 __ push(edx); in GenerateTypeTransition()
1123 __ push(eax); in GenerateTypeTransition()
1127 __ push(Immediate(Smi::FromInt(MinorKey()))); in GenerateTypeTransition()
1128 __ push(Immediate(Smi::FromInt(op_))); in GenerateTypeTransition()
1129 __ push(Immediate(Smi::FromInt(operands_type_))); in GenerateTypeTransition()
1131 __ push(ecx); // Push return address. in GenerateTypeTransition()
1135 __ TailCallExternalReference( in GenerateTypeTransition()
1146 __ pop(ecx); // Save return address. in GenerateTypeTransitionWithSavedArgs()
1150 __ push(Immediate(Smi::FromInt(MinorKey()))); in GenerateTypeTransitionWithSavedArgs()
1151 __ push(Immediate(Smi::FromInt(op_))); in GenerateTypeTransitionWithSavedArgs()
1152 __ push(Immediate(Smi::FromInt(operands_type_))); in GenerateTypeTransitionWithSavedArgs()
1154 __ push(ecx); // Push return address. in GenerateTypeTransitionWithSavedArgs()
1158 __ TailCallExternalReference( in GenerateTypeTransitionWithSavedArgs()
1230 __ mov(ebx, eax); in GenerateSmiCode()
1231 __ mov(eax, edx); in GenerateSmiCode()
1245 __ mov(ecx, right); in GenerateSmiCode()
1246 __ or_(right, left); // Bitwise or is commutative. in GenerateSmiCode()
1257 __ mov(combined, right); in GenerateSmiCode()
1258 __ or_(combined, left); in GenerateSmiCode()
1267 __ mov(ecx, right); in GenerateSmiCode()
1268 __ or_(right, left); in GenerateSmiCode()
1278 __ JumpIfNotSmi(combined, &not_smis); in GenerateSmiCode()
1291 __ xor_(right, left); // Bitwise xor is commutative. in GenerateSmiCode()
1296 __ and_(right, left); // Bitwise and is commutative. in GenerateSmiCode()
1301 __ SmiUntag(left); in GenerateSmiCode()
1302 __ SmiUntag(ecx); in GenerateSmiCode()
1304 __ shl_cl(left); in GenerateSmiCode()
1306 __ cmp(left, 0xc0000000); in GenerateSmiCode()
1307 __ j(sign, &use_fp_on_smis); in GenerateSmiCode()
1309 __ SmiTag(left); in GenerateSmiCode()
1310 __ mov(eax, left); in GenerateSmiCode()
1315 __ SmiUntag(left); in GenerateSmiCode()
1316 __ SmiUntag(ecx); in GenerateSmiCode()
1318 __ sar_cl(left); in GenerateSmiCode()
1320 __ SmiTag(left); in GenerateSmiCode()
1321 __ mov(eax, left); in GenerateSmiCode()
1326 __ SmiUntag(left); in GenerateSmiCode()
1327 __ SmiUntag(ecx); in GenerateSmiCode()
1329 __ shr_cl(left); in GenerateSmiCode()
1336 __ test(left, Immediate(0xc0000000)); in GenerateSmiCode()
1337 __ j(not_zero, &use_fp_on_smis); in GenerateSmiCode()
1339 __ SmiTag(left); in GenerateSmiCode()
1340 __ mov(eax, left); in GenerateSmiCode()
1345 __ add(right, left); // Addition is commutative. in GenerateSmiCode()
1346 __ j(overflow, &use_fp_on_smis); in GenerateSmiCode()
1350 __ sub(left, right); in GenerateSmiCode()
1351 __ j(overflow, &use_fp_on_smis); in GenerateSmiCode()
1352 __ mov(eax, left); in GenerateSmiCode()
1360 __ mov(ebx, right); in GenerateSmiCode()
1362 __ SmiUntag(right); in GenerateSmiCode()
1364 __ imul(right, left); // Multiplication is commutative. in GenerateSmiCode()
1365 __ j(overflow, &use_fp_on_smis); in GenerateSmiCode()
1367 __ NegativeZeroTest(right, combined, &use_fp_on_smis); in GenerateSmiCode()
1373 __ mov(edi, left); in GenerateSmiCode()
1375 __ test(right, right); in GenerateSmiCode()
1376 __ j(zero, &use_fp_on_smis); in GenerateSmiCode()
1379 __ cdq(); in GenerateSmiCode()
1381 __ idiv(right); in GenerateSmiCode()
1386 __ cmp(eax, 0x40000000); in GenerateSmiCode()
1387 __ j(equal, &use_fp_on_smis); in GenerateSmiCode()
1389 __ NegativeZeroTest(eax, combined, &use_fp_on_smis); in GenerateSmiCode()
1391 __ test(edx, edx); in GenerateSmiCode()
1392 __ j(not_zero, &use_fp_on_smis); in GenerateSmiCode()
1394 __ SmiTag(eax); in GenerateSmiCode()
1399 __ test(right, right); in GenerateSmiCode()
1400 __ j(zero, &not_smis); in GenerateSmiCode()
1404 __ cdq(); in GenerateSmiCode()
1406 __ idiv(right); in GenerateSmiCode()
1408 __ NegativeZeroTest(edx, combined, slow); in GenerateSmiCode()
1410 __ mov(eax, edx); in GenerateSmiCode()
1423 __ ret(0); in GenerateSmiCode()
1432 __ ret(2 * kPointerSize); in GenerateSmiCode()
1442 __ bind(&use_fp_on_smis); in GenerateSmiCode()
1450 __ sub(right, left); in GenerateSmiCode()
1454 __ add(left, right); in GenerateSmiCode()
1458 __ mov(right, ebx); in GenerateSmiCode()
1463 __ mov(eax, edi); in GenerateSmiCode()
1469 __ jmp(&not_smis); in GenerateSmiCode()
1476 __ bind(&use_fp_on_smis); in GenerateSmiCode()
1479 __ AllocateHeapNumber(eax, ecx, ebx, slow); in GenerateSmiCode()
1484 __ mov(Operand(esp, 1 * kPointerSize), left); in GenerateSmiCode()
1485 __ mov(Operand(esp, 2 * kPointerSize), Immediate(0)); in GenerateSmiCode()
1486 __ fild_d(Operand(esp, 1 * kPointerSize)); in GenerateSmiCode()
1487 __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset)); in GenerateSmiCode()
1492 __ cvtsi2sd(xmm0, left); in GenerateSmiCode()
1493 __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm0); in GenerateSmiCode()
1495 __ mov(Operand(esp, 1 * kPointerSize), left); in GenerateSmiCode()
1496 __ fild_s(Operand(esp, 1 * kPointerSize)); in GenerateSmiCode()
1497 __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset)); in GenerateSmiCode()
1500 __ ret(2 * kPointerSize); in GenerateSmiCode()
1509 __ bind(&use_fp_on_smis); in GenerateSmiCode()
1514 __ sub(right, left); in GenerateSmiCode()
1518 __ add(left, right); in GenerateSmiCode()
1522 __ mov(right, ebx); in GenerateSmiCode()
1527 __ mov(edx, edi); in GenerateSmiCode()
1528 __ mov(eax, right); in GenerateSmiCode()
1533 __ AllocateHeapNumber(ecx, ebx, no_reg, slow); in GenerateSmiCode()
1538 case Token::ADD: __ addsd(xmm0, xmm1); break; in GenerateSmiCode()
1539 case Token::SUB: __ subsd(xmm0, xmm1); break; in GenerateSmiCode()
1540 case Token::MUL: __ mulsd(xmm0, xmm1); break; in GenerateSmiCode()
1541 case Token::DIV: __ divsd(xmm0, xmm1); break; in GenerateSmiCode()
1544 __ movdbl(FieldOperand(ecx, HeapNumber::kValueOffset), xmm0); in GenerateSmiCode()
1548 case Token::ADD: __ faddp(1); break; in GenerateSmiCode()
1549 case Token::SUB: __ fsubp(1); break; in GenerateSmiCode()
1550 case Token::MUL: __ fmulp(1); break; in GenerateSmiCode()
1551 case Token::DIV: __ fdivp(1); break; in GenerateSmiCode()
1554 __ fstp_d(FieldOperand(ecx, HeapNumber::kValueOffset)); in GenerateSmiCode()
1556 __ mov(eax, ecx); in GenerateSmiCode()
1557 __ ret(0); in GenerateSmiCode()
1569 __ bind(&not_smis); in GenerateSmiCode()
1577 __ mov(eax, ecx); in GenerateSmiCode()
1583 __ mov(edx, eax); in GenerateSmiCode()
1584 __ mov(eax, ebx); in GenerateSmiCode()
1621 __ bind(&call_runtime); in GenerateSmiStub()
1666 __ JumpIfSmi(left, &call_runtime, Label::kNear); in GenerateBothStringStub()
1667 __ CmpObjectType(left, FIRST_NONSTRING_TYPE, ecx); in GenerateBothStringStub()
1668 __ j(above_equal, &call_runtime, Label::kNear); in GenerateBothStringStub()
1671 __ JumpIfSmi(right, &call_runtime, Label::kNear); in GenerateBothStringStub()
1672 __ CmpObjectType(right, FIRST_NONSTRING_TYPE, ecx); in GenerateBothStringStub()
1673 __ j(above_equal, &call_runtime, Label::kNear); in GenerateBothStringStub()
1677 __ TailCallStub(&string_add_stub); in GenerateBothStringStub()
1679 __ bind(&call_runtime); in GenerateBothStringStub()
1701 case Token::ADD: __ addsd(xmm0, xmm1); break; in GenerateInt32Stub()
1702 case Token::SUB: __ subsd(xmm0, xmm1); break; in GenerateInt32Stub()
1703 case Token::MUL: __ mulsd(xmm0, xmm1); break; in GenerateInt32Stub()
1704 case Token::DIV: __ divsd(xmm0, xmm1); break; in GenerateInt32Stub()
1709 __ cvttsd2si(ecx, Operand(xmm0)); in GenerateInt32Stub()
1710 __ cvtsi2sd(xmm2, ecx); in GenerateInt32Stub()
1711 __ ucomisd(xmm0, xmm2); in GenerateInt32Stub()
1712 __ j(not_zero, &not_int32); in GenerateInt32Stub()
1713 __ j(carry, &not_int32); in GenerateInt32Stub()
1716 __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm0); in GenerateInt32Stub()
1717 __ ret(0); in GenerateInt32Stub()
1726 case Token::ADD: __ faddp(1); break; in GenerateInt32Stub()
1727 case Token::SUB: __ fsubp(1); break; in GenerateInt32Stub()
1728 case Token::MUL: __ fmulp(1); break; in GenerateInt32Stub()
1729 case Token::DIV: __ fdivp(1); break; in GenerateInt32Stub()
1734 __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset)); in GenerateInt32Stub()
1735 __ ret(0); in GenerateInt32Stub()
1736 __ bind(&after_alloc_failure); in GenerateInt32Stub()
1737 __ ffree(); in GenerateInt32Stub()
1738 __ jmp(&call_runtime); in GenerateInt32Stub()
1741 __ bind(&not_floats); in GenerateInt32Stub()
1742 __ bind(&not_int32); in GenerateInt32Stub()
1772 case Token::BIT_OR: __ or_(eax, ecx); break; in GenerateInt32Stub()
1773 case Token::BIT_AND: __ and_(eax, ecx); break; in GenerateInt32Stub()
1774 case Token::BIT_XOR: __ xor_(eax, ecx); break; in GenerateInt32Stub()
1775 case Token::SAR: __ sar_cl(eax); break; in GenerateInt32Stub()
1776 case Token::SHL: __ shl_cl(eax); break; in GenerateInt32Stub()
1777 case Token::SHR: __ shr_cl(eax); break; in GenerateInt32Stub()
1782 __ test(eax, Immediate(0xc0000000)); in GenerateInt32Stub()
1783 __ j(not_zero, &call_runtime); in GenerateInt32Stub()
1786 __ cmp(eax, 0xc0000000); in GenerateInt32Stub()
1787 __ j(negative, &non_smi_result, Label::kNear); in GenerateInt32Stub()
1790 __ SmiTag(eax); in GenerateInt32Stub()
1791 __ ret(2 * kPointerSize); // Drop two pushed arguments from the stack. in GenerateInt32Stub()
1796 __ bind(&non_smi_result); in GenerateInt32Stub()
1798 __ mov(ebx, eax); // ebx: result in GenerateInt32Stub()
1805 __ mov(eax, Operand(esp, mode_ == OVERWRITE_RIGHT ? in GenerateInt32Stub()
1807 __ JumpIfNotSmi(eax, &skip_allocation, Label::kNear); in GenerateInt32Stub()
1810 __ AllocateHeapNumber(eax, ecx, edx, &call_runtime); in GenerateInt32Stub()
1811 __ bind(&skip_allocation); in GenerateInt32Stub()
1818 __ cvtsi2sd(xmm0, ebx); in GenerateInt32Stub()
1819 __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm0); in GenerateInt32Stub()
1821 __ mov(Operand(esp, 1 * kPointerSize), ebx); in GenerateInt32Stub()
1822 __ fild_s(Operand(esp, 1 * kPointerSize)); in GenerateInt32Stub()
1823 __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset)); in GenerateInt32Stub()
1825 __ ret(2 * kPointerSize); // Drop two pushed arguments from the stack. in GenerateInt32Stub()
1828 __ bind(&not_floats); in GenerateInt32Stub()
1829 __ bind(&not_int32); in GenerateInt32Stub()
1838 __ bind(&call_runtime); in GenerateInt32Stub()
1843 __ InvokeBuiltin(Builtins::ADD, JUMP_FUNCTION); in GenerateInt32Stub()
1847 __ InvokeBuiltin(Builtins::SUB, JUMP_FUNCTION); in GenerateInt32Stub()
1851 __ InvokeBuiltin(Builtins::MUL, JUMP_FUNCTION); in GenerateInt32Stub()
1855 __ InvokeBuiltin(Builtins::DIV, JUMP_FUNCTION); in GenerateInt32Stub()
1859 __ InvokeBuiltin(Builtins::MOD, JUMP_FUNCTION); in GenerateInt32Stub()
1862 __ InvokeBuiltin(Builtins::BIT_OR, JUMP_FUNCTION); in GenerateInt32Stub()
1865 __ InvokeBuiltin(Builtins::BIT_AND, JUMP_FUNCTION); in GenerateInt32Stub()
1868 __ InvokeBuiltin(Builtins::BIT_XOR, JUMP_FUNCTION); in GenerateInt32Stub()
1871 __ InvokeBuiltin(Builtins::SAR, JUMP_FUNCTION); in GenerateInt32Stub()
1874 __ InvokeBuiltin(Builtins::SHL, JUMP_FUNCTION); in GenerateInt32Stub()
1877 __ InvokeBuiltin(Builtins::SHR, JUMP_FUNCTION); in GenerateInt32Stub()
1896 __ cmp(edx, factory->undefined_value()); in GenerateOddballStub()
1897 __ j(not_equal, &check, Label::kNear); in GenerateOddballStub()
1899 __ xor_(edx, edx); in GenerateOddballStub()
1901 __ mov(edx, Immediate(factory->nan_value())); in GenerateOddballStub()
1903 __ jmp(&done, Label::kNear); in GenerateOddballStub()
1904 __ bind(&check); in GenerateOddballStub()
1905 __ cmp(eax, factory->undefined_value()); in GenerateOddballStub()
1906 __ j(not_equal, &done, Label::kNear); in GenerateOddballStub()
1908 __ xor_(eax, eax); in GenerateOddballStub()
1910 __ mov(eax, Immediate(factory->nan_value())); in GenerateOddballStub()
1912 __ bind(&done); in GenerateOddballStub()
1933 case Token::ADD: __ addsd(xmm0, xmm1); break; in GenerateHeapNumberStub()
1934 case Token::SUB: __ subsd(xmm0, xmm1); break; in GenerateHeapNumberStub()
1935 case Token::MUL: __ mulsd(xmm0, xmm1); break; in GenerateHeapNumberStub()
1936 case Token::DIV: __ divsd(xmm0, xmm1); break; in GenerateHeapNumberStub()
1940 __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm0); in GenerateHeapNumberStub()
1941 __ ret(0); in GenerateHeapNumberStub()
1949 case Token::ADD: __ faddp(1); break; in GenerateHeapNumberStub()
1950 case Token::SUB: __ fsubp(1); break; in GenerateHeapNumberStub()
1951 case Token::MUL: __ fmulp(1); break; in GenerateHeapNumberStub()
1952 case Token::DIV: __ fdivp(1); break; in GenerateHeapNumberStub()
1957 __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset)); in GenerateHeapNumberStub()
1958 __ ret(0); in GenerateHeapNumberStub()
1959 __ bind(&after_alloc_failure); in GenerateHeapNumberStub()
1960 __ ffree(); in GenerateHeapNumberStub()
1961 __ jmp(&call_runtime); in GenerateHeapNumberStub()
1964 __ bind(&not_floats); in GenerateHeapNumberStub()
1986 case Token::BIT_OR: __ or_(eax, ecx); break; in GenerateHeapNumberStub()
1987 case Token::BIT_AND: __ and_(eax, ecx); break; in GenerateHeapNumberStub()
1988 case Token::BIT_XOR: __ xor_(eax, ecx); break; in GenerateHeapNumberStub()
1989 case Token::SAR: __ sar_cl(eax); break; in GenerateHeapNumberStub()
1990 case Token::SHL: __ shl_cl(eax); break; in GenerateHeapNumberStub()
1991 case Token::SHR: __ shr_cl(eax); break; in GenerateHeapNumberStub()
1996 __ test(eax, Immediate(0xc0000000)); in GenerateHeapNumberStub()
1997 __ j(not_zero, &call_runtime); in GenerateHeapNumberStub()
2000 __ cmp(eax, 0xc0000000); in GenerateHeapNumberStub()
2001 __ j(negative, &non_smi_result, Label::kNear); in GenerateHeapNumberStub()
2004 __ SmiTag(eax); in GenerateHeapNumberStub()
2005 __ ret(2 * kPointerSize); // Drop two pushed arguments from the stack. in GenerateHeapNumberStub()
2010 __ bind(&non_smi_result); in GenerateHeapNumberStub()
2012 __ mov(ebx, eax); // ebx: result in GenerateHeapNumberStub()
2019 __ mov(eax, Operand(esp, mode_ == OVERWRITE_RIGHT ? in GenerateHeapNumberStub()
2021 __ JumpIfNotSmi(eax, &skip_allocation, Label::kNear); in GenerateHeapNumberStub()
2024 __ AllocateHeapNumber(eax, ecx, edx, &call_runtime); in GenerateHeapNumberStub()
2025 __ bind(&skip_allocation); in GenerateHeapNumberStub()
2032 __ cvtsi2sd(xmm0, ebx); in GenerateHeapNumberStub()
2033 __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm0); in GenerateHeapNumberStub()
2035 __ mov(Operand(esp, 1 * kPointerSize), ebx); in GenerateHeapNumberStub()
2036 __ fild_s(Operand(esp, 1 * kPointerSize)); in GenerateHeapNumberStub()
2037 __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset)); in GenerateHeapNumberStub()
2039 __ ret(2 * kPointerSize); // Drop two pushed arguments from the stack. in GenerateHeapNumberStub()
2042 __ bind(&not_floats); in GenerateHeapNumberStub()
2051 __ bind(&call_runtime); in GenerateHeapNumberStub()
2056 __ InvokeBuiltin(Builtins::ADD, JUMP_FUNCTION); in GenerateHeapNumberStub()
2060 __ InvokeBuiltin(Builtins::SUB, JUMP_FUNCTION); in GenerateHeapNumberStub()
2064 __ InvokeBuiltin(Builtins::MUL, JUMP_FUNCTION); in GenerateHeapNumberStub()
2068 __ InvokeBuiltin(Builtins::DIV, JUMP_FUNCTION); in GenerateHeapNumberStub()
2072 __ InvokeBuiltin(Builtins::MOD, JUMP_FUNCTION); in GenerateHeapNumberStub()
2075 __ InvokeBuiltin(Builtins::BIT_OR, JUMP_FUNCTION); in GenerateHeapNumberStub()
2078 __ InvokeBuiltin(Builtins::BIT_AND, JUMP_FUNCTION); in GenerateHeapNumberStub()
2081 __ InvokeBuiltin(Builtins::BIT_XOR, JUMP_FUNCTION); in GenerateHeapNumberStub()
2084 __ InvokeBuiltin(Builtins::SAR, JUMP_FUNCTION); in GenerateHeapNumberStub()
2087 __ InvokeBuiltin(Builtins::SHL, JUMP_FUNCTION); in GenerateHeapNumberStub()
2090 __ InvokeBuiltin(Builtins::SHR, JUMP_FUNCTION); in GenerateHeapNumberStub()
2102 __ IncrementCounter(counters->generic_binary_stub_calls(), 1); in GenerateGeneric()
2137 case Token::ADD: __ addsd(xmm0, xmm1); break; in GenerateGeneric()
2138 case Token::SUB: __ subsd(xmm0, xmm1); break; in GenerateGeneric()
2139 case Token::MUL: __ mulsd(xmm0, xmm1); break; in GenerateGeneric()
2140 case Token::DIV: __ divsd(xmm0, xmm1); break; in GenerateGeneric()
2144 __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm0); in GenerateGeneric()
2145 __ ret(0); in GenerateGeneric()
2153 case Token::ADD: __ faddp(1); break; in GenerateGeneric()
2154 case Token::SUB: __ fsubp(1); break; in GenerateGeneric()
2155 case Token::MUL: __ fmulp(1); break; in GenerateGeneric()
2156 case Token::DIV: __ fdivp(1); break; in GenerateGeneric()
2161 __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset)); in GenerateGeneric()
2162 __ ret(0); in GenerateGeneric()
2163 __ bind(&after_alloc_failure); in GenerateGeneric()
2164 __ ffree(); in GenerateGeneric()
2165 __ jmp(&call_runtime); in GenerateGeneric()
2167 __ bind(&not_floats); in GenerateGeneric()
2185 case Token::BIT_OR: __ or_(eax, ecx); break; in GenerateGeneric()
2186 case Token::BIT_AND: __ and_(eax, ecx); break; in GenerateGeneric()
2187 case Token::BIT_XOR: __ xor_(eax, ecx); break; in GenerateGeneric()
2188 case Token::SAR: __ sar_cl(eax); break; in GenerateGeneric()
2189 case Token::SHL: __ shl_cl(eax); break; in GenerateGeneric()
2190 case Token::SHR: __ shr_cl(eax); break; in GenerateGeneric()
2195 __ test(eax, Immediate(0xc0000000)); in GenerateGeneric()
2196 __ j(not_zero, &call_runtime); in GenerateGeneric()
2199 __ cmp(eax, 0xc0000000); in GenerateGeneric()
2200 __ j(negative, &non_smi_result, Label::kNear); in GenerateGeneric()
2203 __ SmiTag(eax); in GenerateGeneric()
2204 __ ret(2 * kPointerSize); // Drop the arguments from the stack. in GenerateGeneric()
2209 __ bind(&non_smi_result); in GenerateGeneric()
2211 __ mov(ebx, eax); // ebx: result in GenerateGeneric()
2218 __ mov(eax, Operand(esp, mode_ == OVERWRITE_RIGHT ? in GenerateGeneric()
2220 __ JumpIfNotSmi(eax, &skip_allocation, Label::kNear); in GenerateGeneric()
2223 __ AllocateHeapNumber(eax, ecx, edx, &call_runtime); in GenerateGeneric()
2224 __ bind(&skip_allocation); in GenerateGeneric()
2231 __ cvtsi2sd(xmm0, ebx); in GenerateGeneric()
2232 __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm0); in GenerateGeneric()
2234 __ mov(Operand(esp, 1 * kPointerSize), ebx); in GenerateGeneric()
2235 __ fild_s(Operand(esp, 1 * kPointerSize)); in GenerateGeneric()
2236 __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset)); in GenerateGeneric()
2238 __ ret(2 * kPointerSize); in GenerateGeneric()
2247 __ bind(&call_runtime); in GenerateGeneric()
2252 __ InvokeBuiltin(Builtins::ADD, JUMP_FUNCTION); in GenerateGeneric()
2257 __ InvokeBuiltin(Builtins::SUB, JUMP_FUNCTION); in GenerateGeneric()
2261 __ InvokeBuiltin(Builtins::MUL, JUMP_FUNCTION); in GenerateGeneric()
2265 __ InvokeBuiltin(Builtins::DIV, JUMP_FUNCTION); in GenerateGeneric()
2268 __ InvokeBuiltin(Builtins::MOD, JUMP_FUNCTION); in GenerateGeneric()
2271 __ InvokeBuiltin(Builtins::BIT_OR, JUMP_FUNCTION); in GenerateGeneric()
2274 __ InvokeBuiltin(Builtins::BIT_AND, JUMP_FUNCTION); in GenerateGeneric()
2277 __ InvokeBuiltin(Builtins::BIT_XOR, JUMP_FUNCTION); in GenerateGeneric()
2280 __ InvokeBuiltin(Builtins::SAR, JUMP_FUNCTION); in GenerateGeneric()
2283 __ InvokeBuiltin(Builtins::SHL, JUMP_FUNCTION); in GenerateGeneric()
2286 __ InvokeBuiltin(Builtins::SHR, JUMP_FUNCTION); in GenerateGeneric()
2303 __ JumpIfSmi(left, &left_not_string, Label::kNear); in GenerateAddStrings()
2304 __ CmpObjectType(left, FIRST_NONSTRING_TYPE, ecx); in GenerateAddStrings()
2305 __ j(above_equal, &left_not_string, Label::kNear); in GenerateAddStrings()
2309 __ TailCallStub(&string_add_left_stub); in GenerateAddStrings()
2312 __ bind(&left_not_string); in GenerateAddStrings()
2313 __ JumpIfSmi(right, &call_runtime, Label::kNear); in GenerateAddStrings()
2314 __ CmpObjectType(right, FIRST_NONSTRING_TYPE, ecx); in GenerateAddStrings()
2315 __ j(above_equal, &call_runtime, Label::kNear); in GenerateAddStrings()
2319 __ TailCallStub(&string_add_right_stub); in GenerateAddStrings()
2322 __ bind(&call_runtime); in GenerateAddStrings()
2335 __ JumpIfNotSmi(edx, &skip_allocation, Label::kNear); in GenerateHeapResultAllocation()
2338 __ AllocateHeapNumber(ebx, ecx, no_reg, alloc_failure); in GenerateHeapResultAllocation()
2341 __ mov(edx, ebx); in GenerateHeapResultAllocation()
2342 __ bind(&skip_allocation); in GenerateHeapResultAllocation()
2344 __ mov(eax, edx); in GenerateHeapResultAllocation()
2350 __ JumpIfNotSmi(eax, &skip_allocation, Label::kNear); in GenerateHeapResultAllocation()
2355 __ AllocateHeapNumber(ebx, ecx, no_reg, alloc_failure); in GenerateHeapResultAllocation()
2358 __ mov(eax, ebx); in GenerateHeapResultAllocation()
2359 __ bind(&skip_allocation); in GenerateHeapResultAllocation()
2367 __ pop(ecx); in GenerateRegisterArgsPush()
2368 __ push(edx); in GenerateRegisterArgsPush()
2369 __ push(eax); in GenerateRegisterArgsPush()
2370 __ push(ecx); in GenerateRegisterArgsPush()
2396 __ mov(eax, Operand(esp, kPointerSize)); in Generate()
2397 __ JumpIfNotSmi(eax, &input_not_smi, Label::kNear); in Generate()
2401 __ sar(eax, 1); in Generate()
2402 __ sub(esp, Immediate(2 * kPointerSize)); in Generate()
2403 __ mov(Operand(esp, 0), eax); in Generate()
2404 __ fild_s(Operand(esp, 0)); in Generate()
2405 __ fst_d(Operand(esp, 0)); in Generate()
2406 __ pop(edx); in Generate()
2407 __ pop(ebx); in Generate()
2408 __ jmp(&loaded, Label::kNear); in Generate()
2409 __ bind(&input_not_smi); in Generate()
2411 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); in Generate()
2413 __ cmp(ebx, Immediate(factory->heap_number_map())); in Generate()
2414 __ j(not_equal, &runtime_call); in Generate()
2417 __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset)); in Generate()
2418 __ mov(edx, FieldOperand(eax, HeapNumber::kExponentOffset)); in Generate()
2419 __ mov(ebx, FieldOperand(eax, HeapNumber::kMantissaOffset)); in Generate()
2421 __ bind(&loaded); in Generate()
2425 __ pextrd(edx, xmm1, 0x1); // copy xmm1[63..32] to edx. in Generate()
2427 __ pshufd(xmm0, xmm1, 0x1); in Generate()
2428 __ movd(edx, xmm0); in Generate()
2430 __ movd(ebx, xmm1); in Generate()
2438 __ mov(ecx, ebx); in Generate()
2439 __ xor_(ecx, edx); in Generate()
2440 __ mov(eax, ecx); in Generate()
2441 __ sar(eax, 16); in Generate()
2442 __ xor_(ecx, eax); in Generate()
2443 __ mov(eax, ecx); in Generate()
2444 __ sar(eax, 8); in Generate()
2445 __ xor_(ecx, eax); in Generate()
2447 __ and_(ecx, in Generate()
2456 __ mov(eax, Immediate(cache_array)); in Generate()
2459 __ mov(eax, Operand(eax, cache_array_index)); in Generate()
2462 __ test(eax, eax); in Generate()
2463 __ j(zero, &runtime_call_clear_stack); in Generate()
2479 __ lea(ecx, Operand(ecx, ecx, times_2, 0)); in Generate()
2480 __ lea(ecx, Operand(eax, ecx, times_4, 0)); in Generate()
2483 __ cmp(ebx, Operand(ecx, 0)); in Generate()
2484 __ j(not_equal, &cache_miss, Label::kNear); in Generate()
2485 __ cmp(edx, Operand(ecx, kIntSize)); in Generate()
2486 __ j(not_equal, &cache_miss, Label::kNear); in Generate()
2489 __ IncrementCounter(counters->transcendental_cache_hit(), 1); in Generate()
2490 __ mov(eax, Operand(ecx, 2 * kIntSize)); in Generate()
2492 __ fstp(0); in Generate()
2493 __ ret(kPointerSize); in Generate()
2495 __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset)); in Generate()
2496 __ Ret(); in Generate()
2499 __ bind(&cache_miss); in Generate()
2500 __ IncrementCounter(counters->transcendental_cache_miss(), 1); in Generate()
2505 __ AllocateHeapNumber(eax, edi, no_reg, &runtime_call_clear_stack); in Generate()
2507 __ AllocateHeapNumber(eax, edi, no_reg, &skip_cache); in Generate()
2508 __ sub(esp, Immediate(kDoubleSize)); in Generate()
2509 __ movdbl(Operand(esp, 0), xmm1); in Generate()
2510 __ fld_d(Operand(esp, 0)); in Generate()
2511 __ add(esp, Immediate(kDoubleSize)); in Generate()
2514 __ mov(Operand(ecx, 0), ebx); in Generate()
2515 __ mov(Operand(ecx, kIntSize), edx); in Generate()
2516 __ mov(Operand(ecx, 2 * kIntSize), eax); in Generate()
2517 __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset)); in Generate()
2519 __ ret(kPointerSize); in Generate()
2521 __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset)); in Generate()
2522 __ Ret(); in Generate()
2525 __ bind(&skip_cache); in Generate()
2526 __ sub(esp, Immediate(kDoubleSize)); in Generate()
2527 __ movdbl(Operand(esp, 0), xmm1); in Generate()
2528 __ fld_d(Operand(esp, 0)); in Generate()
2530 __ fstp_d(Operand(esp, 0)); in Generate()
2531 __ movdbl(xmm1, Operand(esp, 0)); in Generate()
2532 __ add(esp, Immediate(kDoubleSize)); in Generate()
2538 __ push(Immediate(Smi::FromInt(2 * kDoubleSize))); in Generate()
2539 __ CallRuntimeSaveDoubles(Runtime::kAllocateInNewSpace); in Generate()
2541 __ Ret(); in Generate()
2546 __ bind(&runtime_call_clear_stack); in Generate()
2547 __ fstp(0); in Generate()
2548 __ bind(&runtime_call); in Generate()
2551 __ TailCallExternalReference(runtime, 1, 1); in Generate()
2553 __ bind(&runtime_call_clear_stack); in Generate()
2554 __ bind(&runtime_call); in Generate()
2555 __ AllocateHeapNumber(eax, edi, no_reg, &skip_cache); in Generate()
2556 __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm1); in Generate()
2559 __ push(eax); in Generate()
2560 __ CallRuntime(RuntimeFunction(), 1); in Generate()
2562 __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset)); in Generate()
2563 __ Ret(); in Generate()
2596 __ mov(edi, edx); in GenerateOperation()
2597 __ and_(edi, Immediate(0x7ff00000)); // Exponent only. in GenerateOperation()
2600 __ cmp(edi, Immediate(supported_exponent_limit)); in GenerateOperation()
2601 __ j(below, &in_range, Label::kNear); in GenerateOperation()
2603 __ cmp(edi, Immediate(0x7ff00000)); in GenerateOperation()
2605 __ j(not_equal, &non_nan_result, Label::kNear); in GenerateOperation()
2607 __ fstp(0); in GenerateOperation()
2609 __ push(Immediate(0x7ff80000)); in GenerateOperation()
2610 __ push(Immediate(0)); in GenerateOperation()
2611 __ fld_d(Operand(esp, 0)); in GenerateOperation()
2612 __ add(esp, Immediate(2 * kPointerSize)); in GenerateOperation()
2613 __ jmp(&done, Label::kNear); in GenerateOperation()
2615 __ bind(&non_nan_result); in GenerateOperation()
2618 __ mov(edi, eax); // Save eax before using fnstsw_ax. in GenerateOperation()
2619 __ fldpi(); in GenerateOperation()
2620 __ fadd(0); in GenerateOperation()
2621 __ fld(1); in GenerateOperation()
2625 __ fwait(); in GenerateOperation()
2626 __ fnstsw_ax(); in GenerateOperation()
2628 __ test(eax, Immediate(5)); in GenerateOperation()
2629 __ j(zero, &no_exceptions, Label::kNear); in GenerateOperation()
2630 __ fnclex(); in GenerateOperation()
2631 __ bind(&no_exceptions); in GenerateOperation()
2637 __ bind(&partial_remainder_loop); in GenerateOperation()
2638 __ fprem1(); in GenerateOperation()
2639 __ fwait(); in GenerateOperation()
2640 __ fnstsw_ax(); in GenerateOperation()
2641 __ test(eax, Immediate(0x400 /* C2 */)); in GenerateOperation()
2644 __ j(not_zero, &partial_remainder_loop); in GenerateOperation()
2647 __ fstp(2); in GenerateOperation()
2648 __ fstp(0); in GenerateOperation()
2649 __ mov(eax, edi); // Restore eax (allocated HeapNumber pointer). in GenerateOperation()
2652 __ bind(&in_range); in GenerateOperation()
2655 __ fsin(); in GenerateOperation()
2658 __ fcos(); in GenerateOperation()
2663 __ fptan(); in GenerateOperation()
2664 __ fstp(0); // Pop FP register stack. in GenerateOperation()
2669 __ bind(&done); in GenerateOperation()
2672 __ fldln2(); in GenerateOperation()
2673 __ fxch(); in GenerateOperation()
2674 __ fyl2x(); in GenerateOperation()
2690 __ JumpIfNotSmi(edx, &arg1_is_object, Label::kNear); in LoadUnknownsAsIntegers()
2692 __ SmiUntag(edx); in LoadUnknownsAsIntegers()
2693 __ jmp(&load_arg2); in LoadUnknownsAsIntegers()
2696 __ bind(&check_undefined_arg1); in LoadUnknownsAsIntegers()
2698 __ cmp(edx, factory->undefined_value()); in LoadUnknownsAsIntegers()
2699 __ j(not_equal, conversion_failure); in LoadUnknownsAsIntegers()
2700 __ mov(edx, Immediate(0)); in LoadUnknownsAsIntegers()
2701 __ jmp(&load_arg2); in LoadUnknownsAsIntegers()
2703 __ bind(&arg1_is_object); in LoadUnknownsAsIntegers()
2704 __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset)); in LoadUnknownsAsIntegers()
2705 __ cmp(ebx, factory->heap_number_map()); in LoadUnknownsAsIntegers()
2706 __ j(not_equal, &check_undefined_arg1); in LoadUnknownsAsIntegers()
2710 __ mov(edx, ecx); in LoadUnknownsAsIntegers()
2713 __ bind(&load_arg2); in LoadUnknownsAsIntegers()
2716 __ JumpIfNotSmi(eax, &arg2_is_object, Label::kNear); in LoadUnknownsAsIntegers()
2718 __ SmiUntag(eax); in LoadUnknownsAsIntegers()
2719 __ mov(ecx, eax); in LoadUnknownsAsIntegers()
2720 __ jmp(&done); in LoadUnknownsAsIntegers()
2723 __ bind(&check_undefined_arg2); in LoadUnknownsAsIntegers()
2724 __ cmp(eax, factory->undefined_value()); in LoadUnknownsAsIntegers()
2725 __ j(not_equal, conversion_failure); in LoadUnknownsAsIntegers()
2726 __ mov(ecx, Immediate(0)); in LoadUnknownsAsIntegers()
2727 __ jmp(&done); in LoadUnknownsAsIntegers()
2729 __ bind(&arg2_is_object); in LoadUnknownsAsIntegers()
2730 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); in LoadUnknownsAsIntegers()
2731 __ cmp(ebx, factory->heap_number_map()); in LoadUnknownsAsIntegers()
2732 __ j(not_equal, &check_undefined_arg2); in LoadUnknownsAsIntegers()
2736 __ bind(&done); in LoadUnknownsAsIntegers()
2737 __ mov(eax, edx); in LoadUnknownsAsIntegers()
2752 __ JumpIfSmi(number, &load_smi, Label::kNear); in LoadFloatOperand()
2753 __ fld_d(FieldOperand(number, HeapNumber::kValueOffset)); in LoadFloatOperand()
2754 __ jmp(&done, Label::kNear); in LoadFloatOperand()
2756 __ bind(&load_smi); in LoadFloatOperand()
2757 __ SmiUntag(number); in LoadFloatOperand()
2758 __ push(number); in LoadFloatOperand()
2759 __ fild_s(Operand(esp, 0)); in LoadFloatOperand()
2760 __ pop(number); in LoadFloatOperand()
2762 __ bind(&done); in LoadFloatOperand()
2769 __ JumpIfSmi(edx, &load_smi_edx, Label::kNear); in LoadSSE2Operands()
2770 __ movdbl(xmm0, FieldOperand(edx, HeapNumber::kValueOffset)); in LoadSSE2Operands()
2772 __ bind(&load_eax); in LoadSSE2Operands()
2774 __ JumpIfSmi(eax, &load_smi_eax, Label::kNear); in LoadSSE2Operands()
2775 __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset)); in LoadSSE2Operands()
2776 __ jmp(&done, Label::kNear); in LoadSSE2Operands()
2778 __ bind(&load_smi_edx); in LoadSSE2Operands()
2779 __ SmiUntag(edx); // Untag smi before converting to float. in LoadSSE2Operands()
2780 __ cvtsi2sd(xmm0, edx); in LoadSSE2Operands()
2781 __ SmiTag(edx); // Retag smi for heap number overwriting test. in LoadSSE2Operands()
2782 __ jmp(&load_eax); in LoadSSE2Operands()
2784 __ bind(&load_smi_eax); in LoadSSE2Operands()
2785 __ SmiUntag(eax); // Untag smi before converting to float. in LoadSSE2Operands()
2786 __ cvtsi2sd(xmm1, eax); in LoadSSE2Operands()
2787 __ SmiTag(eax); // Retag smi for heap number overwriting test. in LoadSSE2Operands()
2789 __ bind(&done); in LoadSSE2Operands()
2797 __ JumpIfSmi(edx, &load_smi_edx, Label::kNear); in LoadSSE2Operands()
2799 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), factory->heap_number_map()); in LoadSSE2Operands()
2800 __ j(not_equal, not_numbers); // Argument in edx is not a number. in LoadSSE2Operands()
2801 __ movdbl(xmm0, FieldOperand(edx, HeapNumber::kValueOffset)); in LoadSSE2Operands()
2802 __ bind(&load_eax); in LoadSSE2Operands()
2804 __ JumpIfSmi(eax, &load_smi_eax, Label::kNear); in LoadSSE2Operands()
2805 __ cmp(FieldOperand(eax, HeapObject::kMapOffset), factory->heap_number_map()); in LoadSSE2Operands()
2806 __ j(equal, &load_float_eax, Label::kNear); in LoadSSE2Operands()
2807 __ jmp(not_numbers); // Argument in eax is not a number. in LoadSSE2Operands()
2808 __ bind(&load_smi_edx); in LoadSSE2Operands()
2809 __ SmiUntag(edx); // Untag smi before converting to float. in LoadSSE2Operands()
2810 __ cvtsi2sd(xmm0, edx); in LoadSSE2Operands()
2811 __ SmiTag(edx); // Retag smi for heap number overwriting test. in LoadSSE2Operands()
2812 __ jmp(&load_eax); in LoadSSE2Operands()
2813 __ bind(&load_smi_eax); in LoadSSE2Operands()
2814 __ SmiUntag(eax); // Untag smi before converting to float. in LoadSSE2Operands()
2815 __ cvtsi2sd(xmm1, eax); in LoadSSE2Operands()
2816 __ SmiTag(eax); // Retag smi for heap number overwriting test. in LoadSSE2Operands()
2817 __ jmp(&done, Label::kNear); in LoadSSE2Operands()
2818 __ bind(&load_float_eax); in LoadSSE2Operands()
2819 __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset)); in LoadSSE2Operands()
2820 __ bind(&done); in LoadSSE2Operands()
2828 __ mov(scratch, left); in LoadSSE2Smis()
2830 __ SmiUntag(scratch); in LoadSSE2Smis()
2831 __ cvtsi2sd(xmm0, scratch); in LoadSSE2Smis()
2833 __ mov(scratch, right); in LoadSSE2Smis()
2834 __ SmiUntag(scratch); in LoadSSE2Smis()
2835 __ cvtsi2sd(xmm1, scratch); in LoadSSE2Smis()
2842 __ cvttsd2si(scratch, Operand(xmm0)); in CheckSSE2OperandsAreInt32()
2843 __ cvtsi2sd(xmm2, scratch); in CheckSSE2OperandsAreInt32()
2844 __ ucomisd(xmm0, xmm2); in CheckSSE2OperandsAreInt32()
2845 __ j(not_zero, non_int32); in CheckSSE2OperandsAreInt32()
2846 __ j(carry, non_int32); in CheckSSE2OperandsAreInt32()
2847 __ cvttsd2si(scratch, Operand(xmm1)); in CheckSSE2OperandsAreInt32()
2848 __ cvtsi2sd(xmm2, scratch); in CheckSSE2OperandsAreInt32()
2849 __ ucomisd(xmm1, xmm2); in CheckSSE2OperandsAreInt32()
2850 __ j(not_zero, non_int32); in CheckSSE2OperandsAreInt32()
2851 __ j(carry, non_int32); in CheckSSE2OperandsAreInt32()
2860 __ mov(scratch, edx); in LoadFloatOperands()
2862 __ mov(scratch, Operand(esp, 2 * kPointerSize)); in LoadFloatOperands()
2864 __ JumpIfSmi(scratch, &load_smi_1, Label::kNear); in LoadFloatOperands()
2865 __ fld_d(FieldOperand(scratch, HeapNumber::kValueOffset)); in LoadFloatOperands()
2866 __ bind(&done_load_1); in LoadFloatOperands()
2869 __ mov(scratch, eax); in LoadFloatOperands()
2871 __ mov(scratch, Operand(esp, 1 * kPointerSize)); in LoadFloatOperands()
2873 __ JumpIfSmi(scratch, &load_smi_2, Label::kNear); in LoadFloatOperands()
2874 __ fld_d(FieldOperand(scratch, HeapNumber::kValueOffset)); in LoadFloatOperands()
2875 __ jmp(&done, Label::kNear); in LoadFloatOperands()
2877 __ bind(&load_smi_1); in LoadFloatOperands()
2878 __ SmiUntag(scratch); in LoadFloatOperands()
2879 __ push(scratch); in LoadFloatOperands()
2880 __ fild_s(Operand(esp, 0)); in LoadFloatOperands()
2881 __ pop(scratch); in LoadFloatOperands()
2882 __ jmp(&done_load_1); in LoadFloatOperands()
2884 __ bind(&load_smi_2); in LoadFloatOperands()
2885 __ SmiUntag(scratch); in LoadFloatOperands()
2886 __ push(scratch); in LoadFloatOperands()
2887 __ fild_s(Operand(esp, 0)); in LoadFloatOperands()
2888 __ pop(scratch); in LoadFloatOperands()
2890 __ bind(&done); in LoadFloatOperands()
2898 __ mov(scratch, left); in LoadFloatSmis()
2900 __ SmiUntag(scratch); in LoadFloatSmis()
2901 __ push(scratch); in LoadFloatSmis()
2902 __ fild_s(Operand(esp, 0)); in LoadFloatSmis()
2904 __ mov(scratch, right); in LoadFloatSmis()
2905 __ SmiUntag(scratch); in LoadFloatSmis()
2906 __ mov(Operand(esp, 0), scratch); in LoadFloatSmis()
2907 __ fild_s(Operand(esp, 0)); in LoadFloatSmis()
2908 __ pop(scratch); in LoadFloatSmis()
2918 __ JumpIfSmi(edx, &test_other, Label::kNear); in CheckFloatOperands()
2919 __ mov(scratch, FieldOperand(edx, HeapObject::kMapOffset)); in CheckFloatOperands()
2921 __ cmp(scratch, factory->heap_number_map()); in CheckFloatOperands()
2922 __ j(not_equal, non_float); // argument in edx is not a number -> NaN in CheckFloatOperands()
2924 __ bind(&test_other); in CheckFloatOperands()
2925 __ JumpIfSmi(eax, &done, Label::kNear); in CheckFloatOperands()
2926 __ mov(scratch, FieldOperand(eax, HeapObject::kMapOffset)); in CheckFloatOperands()
2927 __ cmp(scratch, factory->heap_number_map()); in CheckFloatOperands()
2928 __ j(not_equal, non_float); // argument in eax is not a number -> NaN in CheckFloatOperands()
2931 __ bind(&done); in CheckFloatOperands()
2955 __ mov(scratch, Immediate(1)); in Generate()
2956 __ cvtsi2sd(double_result, scratch); in Generate()
2963 __ mov(base, Operand(esp, 2 * kPointerSize)); in Generate()
2964 __ mov(exponent, Operand(esp, 1 * kPointerSize)); in Generate()
2966 __ JumpIfSmi(base, &base_is_smi, Label::kNear); in Generate()
2967 __ cmp(FieldOperand(base, HeapObject::kMapOffset), in Generate()
2969 __ j(not_equal, &call_runtime); in Generate()
2971 __ movdbl(double_base, FieldOperand(base, HeapNumber::kValueOffset)); in Generate()
2972 __ jmp(&unpack_exponent, Label::kNear); in Generate()
2974 __ bind(&base_is_smi); in Generate()
2975 __ SmiUntag(base); in Generate()
2976 __ cvtsi2sd(double_base, base); in Generate()
2978 __ bind(&unpack_exponent); in Generate()
2979 __ JumpIfNotSmi(exponent, &exponent_not_smi, Label::kNear); in Generate()
2980 __ SmiUntag(exponent); in Generate()
2981 __ jmp(&int_exponent); in Generate()
2983 __ bind(&exponent_not_smi); in Generate()
2984 __ cmp(FieldOperand(exponent, HeapObject::kMapOffset), in Generate()
2986 __ j(not_equal, &call_runtime); in Generate()
2987 __ movdbl(double_exponent, in Generate()
2990 __ JumpIfNotSmi(exponent, &exponent_not_smi, Label::kNear); in Generate()
2991 __ SmiUntag(exponent); in Generate()
2992 __ jmp(&int_exponent); in Generate()
2994 __ bind(&exponent_not_smi); in Generate()
2995 __ movdbl(double_exponent, in Generate()
3002 __ cvttsd2si(exponent, Operand(double_exponent)); in Generate()
3004 __ cmp(exponent, Immediate(0x80000000u)); in Generate()
3005 __ j(equal, &call_runtime); in Generate()
3006 __ cvtsi2sd(double_scratch, exponent); in Generate()
3008 __ ucomisd(double_exponent, double_scratch); in Generate()
3009 __ j(equal, &int_exponent); in Generate()
3018 __ mov(scratch, Immediate(0x3F000000u)); in Generate()
3019 __ movd(double_scratch, scratch); in Generate()
3020 __ cvtss2sd(double_scratch, double_scratch); in Generate()
3022 __ ucomisd(double_scratch, double_exponent); in Generate()
3023 __ j(not_equal, &not_plus_half, Label::kNear); in Generate()
3029 __ mov(scratch, 0xFF800000u); in Generate()
3030 __ movd(double_scratch, scratch); in Generate()
3031 __ cvtss2sd(double_scratch, double_scratch); in Generate()
3032 __ ucomisd(double_base, double_scratch); in Generate()
3035 __ j(not_equal, &continue_sqrt, Label::kNear); in Generate()
3036 __ j(carry, &continue_sqrt, Label::kNear); in Generate()
3039 __ xorps(double_result, double_result); in Generate()
3040 __ subsd(double_result, double_scratch); in Generate()
3041 __ jmp(&done); in Generate()
3043 __ bind(&continue_sqrt); in Generate()
3045 __ xorps(double_scratch, double_scratch); in Generate()
3046 __ addsd(double_scratch, double_base); // Convert -0 to +0. in Generate()
3047 __ sqrtsd(double_result, double_scratch); in Generate()
3048 __ jmp(&done); in Generate()
3051 __ bind(&not_plus_half); in Generate()
3053 __ subsd(double_scratch, double_result); in Generate()
3055 __ ucomisd(double_scratch, double_exponent); in Generate()
3056 __ j(not_equal, &fast_power, Label::kNear); in Generate()
3062 __ mov(scratch, 0xFF800000u); in Generate()
3063 __ movd(double_scratch, scratch); in Generate()
3064 __ cvtss2sd(double_scratch, double_scratch); in Generate()
3065 __ ucomisd(double_base, double_scratch); in Generate()
3068 __ j(not_equal, &continue_rsqrt, Label::kNear); in Generate()
3069 __ j(carry, &continue_rsqrt, Label::kNear); in Generate()
3072 __ xorps(double_result, double_result); in Generate()
3073 __ jmp(&done); in Generate()
3075 __ bind(&continue_rsqrt); in Generate()
3077 __ xorps(double_exponent, double_exponent); in Generate()
3078 __ addsd(double_exponent, double_base); // Convert -0 to +0. in Generate()
3079 __ sqrtsd(double_exponent, double_exponent); in Generate()
3080 __ divsd(double_result, double_exponent); in Generate()
3081 __ jmp(&done); in Generate()
3086 __ bind(&fast_power); in Generate()
3087 __ fnclex(); // Clear flags to catch exceptions later. in Generate()
3089 __ sub(esp, Immediate(kDoubleSize)); in Generate()
3090 __ movdbl(Operand(esp, 0), double_exponent); in Generate()
3091 __ fld_d(Operand(esp, 0)); // E in Generate()
3092 __ movdbl(Operand(esp, 0), double_base); in Generate()
3093 __ fld_d(Operand(esp, 0)); // B, E in Generate()
3098 __ fyl2x(); // X in Generate()
3099 __ fld(0); // X, X in Generate()
3100 __ frndint(); // rnd(X), X in Generate()
3101 __ fsub(1); // rnd(X), X-rnd(X) in Generate()
3102 __ fxch(1); // X - rnd(X), rnd(X) in Generate()
3104 __ f2xm1(); // 2^(X-rnd(X)) - 1, rnd(X) in Generate()
3105 __ fld1(); // 1, 2^(X-rnd(X)) - 1, rnd(X) in Generate()
3106 __ faddp(1); // 1, 2^(X-rnd(X)), rnd(X) in Generate()
3108 __ fscale(); // 2^X, rnd(X) in Generate()
3109 __ fstp(1); in Generate()
3111 __ fnstsw_ax(); in Generate()
3112 __ test_b(eax, 0x5F); // We check for all but precision exception. in Generate()
3113 __ j(not_zero, &fast_power_failed, Label::kNear); in Generate()
3114 __ fstp_d(Operand(esp, 0)); in Generate()
3115 __ movdbl(double_result, Operand(esp, 0)); in Generate()
3116 __ add(esp, Immediate(kDoubleSize)); in Generate()
3117 __ jmp(&done); in Generate()
3119 __ bind(&fast_power_failed); in Generate()
3120 __ fninit(); in Generate()
3121 __ add(esp, Immediate(kDoubleSize)); in Generate()
3122 __ jmp(&call_runtime); in Generate()
3126 __ bind(&int_exponent); in Generate()
3128 __ mov(scratch, exponent); // Back up exponent. in Generate()
3129 __ movsd(double_scratch, double_base); // Back up base. in Generate()
3130 __ movsd(double_scratch2, double_result); // Load double_exponent with 1. in Generate()
3134 __ test(scratch, scratch); in Generate()
3135 __ j(positive, &no_neg, Label::kNear); in Generate()
3136 __ neg(scratch); in Generate()
3137 __ bind(&no_neg); in Generate()
3139 __ bind(&while_true); in Generate()
3140 __ shr(scratch, 1); in Generate()
3141 __ j(not_carry, &no_multiply, Label::kNear); in Generate()
3142 __ mulsd(double_result, double_scratch); in Generate()
3143 __ bind(&no_multiply); in Generate()
3145 __ mulsd(double_scratch, double_scratch); in Generate()
3146 __ j(not_zero, &while_true); in Generate()
3150 __ test(exponent, exponent); in Generate()
3151 __ j(positive, &done); in Generate()
3152 __ divsd(double_scratch2, double_result); in Generate()
3153 __ movsd(double_result, double_scratch2); in Generate()
3156 __ xorps(double_scratch2, double_scratch2); in Generate()
3157 __ ucomisd(double_scratch2, double_result); // Result cannot be NaN. in Generate()
3161 __ j(not_equal, &done); in Generate()
3162 __ cvtsi2sd(double_exponent, exponent); in Generate()
3168 __ bind(&call_runtime); in Generate()
3169 __ TailCallRuntime(Runtime::kMath_pow_cfunction, 2, 1); in Generate()
3173 __ bind(&done); in Generate()
3174 __ AllocateHeapNumber(eax, scratch, base, &call_runtime); in Generate()
3175 __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), double_result); in Generate()
3176 __ IncrementCounter(counters->math_pow(), 1); in Generate()
3177 __ ret(2 * kPointerSize); in Generate()
3179 __ bind(&call_runtime); in Generate()
3182 __ PrepareCallCFunction(4, scratch); in Generate()
3183 __ movdbl(Operand(esp, 0 * kDoubleSize), double_base); in Generate()
3184 __ movdbl(Operand(esp, 1 * kDoubleSize), double_exponent); in Generate()
3185 __ CallCFunction( in Generate()
3190 __ sub(esp, Immediate(kDoubleSize)); in Generate()
3191 __ fstp_d(Operand(esp, 0)); in Generate()
3192 __ movdbl(double_result, Operand(esp, 0)); in Generate()
3193 __ add(esp, Immediate(kDoubleSize)); in Generate()
3195 __ bind(&done); in Generate()
3196 __ IncrementCounter(counters->math_pow(), 1); in Generate()
3197 __ ret(0); in Generate()
3212 __ JumpIfNotSmi(edx, &slow, Label::kNear); in GenerateReadElement()
3216 __ mov(ebx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); in GenerateReadElement()
3217 __ mov(ecx, Operand(ebx, StandardFrameConstants::kContextOffset)); in GenerateReadElement()
3218 __ cmp(ecx, Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); in GenerateReadElement()
3219 __ j(equal, &adaptor, Label::kNear); in GenerateReadElement()
3224 __ cmp(edx, eax); in GenerateReadElement()
3225 __ j(above_equal, &slow, Label::kNear); in GenerateReadElement()
3230 __ lea(ebx, Operand(ebp, eax, times_2, 0)); in GenerateReadElement()
3231 __ neg(edx); in GenerateReadElement()
3232 __ mov(eax, Operand(ebx, edx, times_2, kDisplacement)); in GenerateReadElement()
3233 __ ret(0); in GenerateReadElement()
3238 __ bind(&adaptor); in GenerateReadElement()
3239 __ mov(ecx, Operand(ebx, ArgumentsAdaptorFrameConstants::kLengthOffset)); in GenerateReadElement()
3240 __ cmp(edx, ecx); in GenerateReadElement()
3241 __ j(above_equal, &slow, Label::kNear); in GenerateReadElement()
3246 __ lea(ebx, Operand(ebx, ecx, times_2, 0)); in GenerateReadElement()
3247 __ neg(edx); in GenerateReadElement()
3248 __ mov(eax, Operand(ebx, edx, times_2, kDisplacement)); in GenerateReadElement()
3249 __ ret(0); in GenerateReadElement()
3253 __ bind(&slow); in GenerateReadElement()
3254 __ pop(ebx); // Return address. in GenerateReadElement()
3255 __ push(edx); in GenerateReadElement()
3256 __ push(ebx); in GenerateReadElement()
3257 __ TailCallRuntime(Runtime::kGetArgumentsProperty, 1, 1); in GenerateReadElement()
3269 __ mov(edx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); in GenerateNewNonStrictSlow()
3270 __ mov(ecx, Operand(edx, StandardFrameConstants::kContextOffset)); in GenerateNewNonStrictSlow()
3271 __ cmp(ecx, Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); in GenerateNewNonStrictSlow()
3272 __ j(not_equal, &runtime, Label::kNear); in GenerateNewNonStrictSlow()
3275 __ mov(ecx, Operand(edx, ArgumentsAdaptorFrameConstants::kLengthOffset)); in GenerateNewNonStrictSlow()
3276 __ mov(Operand(esp, 1 * kPointerSize), ecx); in GenerateNewNonStrictSlow()
3277 __ lea(edx, Operand(edx, ecx, times_2, in GenerateNewNonStrictSlow()
3279 __ mov(Operand(esp, 2 * kPointerSize), edx); in GenerateNewNonStrictSlow()
3281 __ bind(&runtime); in GenerateNewNonStrictSlow()
3282 __ TailCallRuntime(Runtime::kNewArgumentsFast, 3, 1); in GenerateNewNonStrictSlow()
3293 __ mov(ebx, Operand(esp, 1 * kPointerSize)); in GenerateNewNonStrictFast()
3300 __ mov(edx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); in GenerateNewNonStrictFast()
3301 __ mov(ecx, Operand(edx, StandardFrameConstants::kContextOffset)); in GenerateNewNonStrictFast()
3302 __ cmp(ecx, Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); in GenerateNewNonStrictFast()
3303 __ j(equal, &adaptor_frame, Label::kNear); in GenerateNewNonStrictFast()
3306 __ mov(ecx, ebx); in GenerateNewNonStrictFast()
3307 __ jmp(&try_allocate, Label::kNear); in GenerateNewNonStrictFast()
3310 __ bind(&adaptor_frame); in GenerateNewNonStrictFast()
3311 __ mov(ecx, Operand(edx, ArgumentsAdaptorFrameConstants::kLengthOffset)); in GenerateNewNonStrictFast()
3312 __ lea(edx, Operand(edx, ecx, times_2, in GenerateNewNonStrictFast()
3314 __ mov(Operand(esp, 2 * kPointerSize), edx); in GenerateNewNonStrictFast()
3321 __ cmp(ebx, ecx); in GenerateNewNonStrictFast()
3322 __ j(less_equal, &try_allocate, Label::kNear); in GenerateNewNonStrictFast()
3323 __ mov(ebx, ecx); in GenerateNewNonStrictFast()
3325 __ bind(&try_allocate); in GenerateNewNonStrictFast()
3328 __ push(ebx); in GenerateNewNonStrictFast()
3335 __ test(ebx, ebx); in GenerateNewNonStrictFast()
3336 __ j(zero, &no_parameter_map, Label::kNear); in GenerateNewNonStrictFast()
3337 __ lea(ebx, Operand(ebx, times_2, kParameterMapHeaderSize)); in GenerateNewNonStrictFast()
3338 __ bind(&no_parameter_map); in GenerateNewNonStrictFast()
3341 __ lea(ebx, Operand(ebx, ecx, times_2, FixedArray::kHeaderSize)); in GenerateNewNonStrictFast()
3344 __ add(ebx, Immediate(Heap::kArgumentsObjectSize)); in GenerateNewNonStrictFast()
3347 __ AllocateInNewSpace(ebx, eax, edx, edi, &runtime, TAG_OBJECT); in GenerateNewNonStrictFast()
3356 __ mov(edi, Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX))); in GenerateNewNonStrictFast()
3357 __ mov(edi, FieldOperand(edi, GlobalObject::kGlobalContextOffset)); in GenerateNewNonStrictFast()
3358 __ mov(ebx, Operand(esp, 0 * kPointerSize)); in GenerateNewNonStrictFast()
3359 __ test(ebx, ebx); in GenerateNewNonStrictFast()
3360 __ j(not_zero, &has_mapped_parameters, Label::kNear); in GenerateNewNonStrictFast()
3361 __ mov(edi, Operand(edi, in GenerateNewNonStrictFast()
3363 __ jmp(&copy, Label::kNear); in GenerateNewNonStrictFast()
3365 __ bind(&has_mapped_parameters); in GenerateNewNonStrictFast()
3366 __ mov(edi, Operand(edi, in GenerateNewNonStrictFast()
3368 __ bind(&copy); in GenerateNewNonStrictFast()
3379 __ mov(edx, FieldOperand(edi, i)); in GenerateNewNonStrictFast()
3380 __ mov(FieldOperand(eax, i), edx); in GenerateNewNonStrictFast()
3385 __ mov(edx, Operand(esp, 4 * kPointerSize)); in GenerateNewNonStrictFast()
3386 __ mov(FieldOperand(eax, JSObject::kHeaderSize + in GenerateNewNonStrictFast()
3392 __ mov(FieldOperand(eax, JSObject::kHeaderSize + in GenerateNewNonStrictFast()
3399 __ lea(edi, Operand(eax, Heap::kArgumentsObjectSize)); in GenerateNewNonStrictFast()
3400 __ mov(FieldOperand(eax, JSObject::kElementsOffset), edi); in GenerateNewNonStrictFast()
3410 __ push(eax); in GenerateNewNonStrictFast()
3414 __ test(ebx, ebx); in GenerateNewNonStrictFast()
3415 __ j(zero, &skip_parameter_map); in GenerateNewNonStrictFast()
3417 __ mov(FieldOperand(edi, FixedArray::kMapOffset), in GenerateNewNonStrictFast()
3419 __ lea(eax, Operand(ebx, reinterpret_cast<intptr_t>(Smi::FromInt(2)))); in GenerateNewNonStrictFast()
3420 __ mov(FieldOperand(edi, FixedArray::kLengthOffset), eax); in GenerateNewNonStrictFast()
3421 __ mov(FieldOperand(edi, FixedArray::kHeaderSize + 0 * kPointerSize), esi); in GenerateNewNonStrictFast()
3422 __ lea(eax, Operand(edi, ebx, times_2, kParameterMapHeaderSize)); in GenerateNewNonStrictFast()
3423 __ mov(FieldOperand(edi, FixedArray::kHeaderSize + 1 * kPointerSize), eax); in GenerateNewNonStrictFast()
3434 __ push(ecx); in GenerateNewNonStrictFast()
3435 __ mov(eax, Operand(esp, 2 * kPointerSize)); in GenerateNewNonStrictFast()
3436 __ mov(ebx, Immediate(Smi::FromInt(Context::MIN_CONTEXT_SLOTS))); in GenerateNewNonStrictFast()
3437 __ add(ebx, Operand(esp, 4 * kPointerSize)); in GenerateNewNonStrictFast()
3438 __ sub(ebx, eax); in GenerateNewNonStrictFast()
3439 __ mov(ecx, FACTORY->the_hole_value()); in GenerateNewNonStrictFast()
3440 __ mov(edx, edi); in GenerateNewNonStrictFast()
3441 __ lea(edi, Operand(edi, eax, times_2, kParameterMapHeaderSize)); in GenerateNewNonStrictFast()
3452 __ jmp(&parameters_test, Label::kNear); in GenerateNewNonStrictFast()
3454 __ bind(&parameters_loop); in GenerateNewNonStrictFast()
3455 __ sub(eax, Immediate(Smi::FromInt(1))); in GenerateNewNonStrictFast()
3456 __ mov(FieldOperand(edx, eax, times_2, kParameterMapHeaderSize), ebx); in GenerateNewNonStrictFast()
3457 __ mov(FieldOperand(edi, eax, times_2, FixedArray::kHeaderSize), ecx); in GenerateNewNonStrictFast()
3458 __ add(ebx, Immediate(Smi::FromInt(1))); in GenerateNewNonStrictFast()
3459 __ bind(&parameters_test); in GenerateNewNonStrictFast()
3460 __ test(eax, eax); in GenerateNewNonStrictFast()
3461 __ j(not_zero, &parameters_loop, Label::kNear); in GenerateNewNonStrictFast()
3462 __ pop(ecx); in GenerateNewNonStrictFast()
3464 __ bind(&skip_parameter_map); in GenerateNewNonStrictFast()
3473 __ mov(FieldOperand(edi, FixedArray::kMapOffset), in GenerateNewNonStrictFast()
3475 __ mov(FieldOperand(edi, FixedArray::kLengthOffset), ecx); in GenerateNewNonStrictFast()
3478 __ mov(ebx, Operand(esp, 1 * kPointerSize)); in GenerateNewNonStrictFast()
3479 __ mov(edx, Operand(esp, 4 * kPointerSize)); in GenerateNewNonStrictFast()
3480 __ sub(edx, ebx); // Is there a smarter way to do negative scaling? in GenerateNewNonStrictFast()
3481 __ sub(edx, ebx); in GenerateNewNonStrictFast()
3482 __ jmp(&arguments_test, Label::kNear); in GenerateNewNonStrictFast()
3484 __ bind(&arguments_loop); in GenerateNewNonStrictFast()
3485 __ sub(edx, Immediate(kPointerSize)); in GenerateNewNonStrictFast()
3486 __ mov(eax, Operand(edx, 0)); in GenerateNewNonStrictFast()
3487 __ mov(FieldOperand(edi, ebx, times_2, FixedArray::kHeaderSize), eax); in GenerateNewNonStrictFast()
3488 __ add(ebx, Immediate(Smi::FromInt(1))); in GenerateNewNonStrictFast()
3490 __ bind(&arguments_test); in GenerateNewNonStrictFast()
3491 __ cmp(ebx, ecx); in GenerateNewNonStrictFast()
3492 __ j(less, &arguments_loop, Label::kNear); in GenerateNewNonStrictFast()
3495 __ pop(eax); // Address of arguments object. in GenerateNewNonStrictFast()
3496 __ pop(ebx); // Parameter count. in GenerateNewNonStrictFast()
3499 __ ret(3 * kPointerSize); in GenerateNewNonStrictFast()
3502 __ bind(&runtime); in GenerateNewNonStrictFast()
3503 __ pop(eax); // Remove saved parameter count. in GenerateNewNonStrictFast()
3504 __ mov(Operand(esp, 1 * kPointerSize), ecx); // Patch argument count. in GenerateNewNonStrictFast()
3505 __ TailCallRuntime(Runtime::kNewStrictArgumentsFast, 3, 1); in GenerateNewNonStrictFast()
3517 __ mov(edx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); in GenerateNewStrict()
3518 __ mov(ecx, Operand(edx, StandardFrameConstants::kContextOffset)); in GenerateNewStrict()
3519 __ cmp(ecx, Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); in GenerateNewStrict()
3520 __ j(equal, &adaptor_frame, Label::kNear); in GenerateNewStrict()
3523 __ mov(ecx, Operand(esp, 1 * kPointerSize)); in GenerateNewStrict()
3524 __ jmp(&try_allocate, Label::kNear); in GenerateNewStrict()
3527 __ bind(&adaptor_frame); in GenerateNewStrict()
3528 __ mov(ecx, Operand(edx, ArgumentsAdaptorFrameConstants::kLengthOffset)); in GenerateNewStrict()
3529 __ mov(Operand(esp, 1 * kPointerSize), ecx); in GenerateNewStrict()
3530 __ lea(edx, Operand(edx, ecx, times_2, in GenerateNewStrict()
3532 __ mov(Operand(esp, 2 * kPointerSize), edx); in GenerateNewStrict()
3537 __ bind(&try_allocate); in GenerateNewStrict()
3538 __ test(ecx, ecx); in GenerateNewStrict()
3539 __ j(zero, &add_arguments_object, Label::kNear); in GenerateNewStrict()
3540 __ lea(ecx, Operand(ecx, times_2, FixedArray::kHeaderSize)); in GenerateNewStrict()
3541 __ bind(&add_arguments_object); in GenerateNewStrict()
3542 __ add(ecx, Immediate(Heap::kArgumentsObjectSizeStrict)); in GenerateNewStrict()
3545 __ AllocateInNewSpace(ecx, eax, edx, ebx, &runtime, TAG_OBJECT); in GenerateNewStrict()
3548 __ mov(edi, Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX))); in GenerateNewStrict()
3549 __ mov(edi, FieldOperand(edi, GlobalObject::kGlobalContextOffset)); in GenerateNewStrict()
3552 __ mov(edi, Operand(edi, offset)); in GenerateNewStrict()
3556 __ mov(ebx, FieldOperand(edi, i)); in GenerateNewStrict()
3557 __ mov(FieldOperand(eax, i), ebx); in GenerateNewStrict()
3562 __ mov(ecx, Operand(esp, 1 * kPointerSize)); in GenerateNewStrict()
3563 __ mov(FieldOperand(eax, JSObject::kHeaderSize + in GenerateNewStrict()
3569 __ test(ecx, ecx); in GenerateNewStrict()
3570 __ j(zero, &done, Label::kNear); in GenerateNewStrict()
3573 __ mov(edx, Operand(esp, 2 * kPointerSize)); in GenerateNewStrict()
3577 __ lea(edi, Operand(eax, Heap::kArgumentsObjectSizeStrict)); in GenerateNewStrict()
3578 __ mov(FieldOperand(eax, JSObject::kElementsOffset), edi); in GenerateNewStrict()
3579 __ mov(FieldOperand(edi, FixedArray::kMapOffset), in GenerateNewStrict()
3582 __ mov(FieldOperand(edi, FixedArray::kLengthOffset), ecx); in GenerateNewStrict()
3584 __ SmiUntag(ecx); in GenerateNewStrict()
3588 __ bind(&loop); in GenerateNewStrict()
3589 __ mov(ebx, Operand(edx, -1 * kPointerSize)); // Skip receiver. in GenerateNewStrict()
3590 __ mov(FieldOperand(edi, FixedArray::kHeaderSize), ebx); in GenerateNewStrict()
3591 __ add(edi, Immediate(kPointerSize)); in GenerateNewStrict()
3592 __ sub(edx, Immediate(kPointerSize)); in GenerateNewStrict()
3593 __ dec(ecx); in GenerateNewStrict()
3594 __ j(not_zero, &loop); in GenerateNewStrict()
3597 __ bind(&done); in GenerateNewStrict()
3598 __ ret(3 * kPointerSize); in GenerateNewStrict()
3601 __ bind(&runtime); in GenerateNewStrict()
3602 __ TailCallRuntime(Runtime::kNewStrictArgumentsFast, 3, 1); in GenerateNewStrict()
3611 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); in Generate()
3634 __ mov(ebx, Operand::StaticVariable(address_of_regexp_stack_memory_size)); in Generate()
3635 __ test(ebx, ebx); in Generate()
3636 __ j(zero, &runtime); in Generate()
3639 __ mov(eax, Operand(esp, kJSRegExpOffset)); in Generate()
3641 __ JumpIfSmi(eax, &runtime); in Generate()
3642 __ CmpObjectType(eax, JS_REGEXP_TYPE, ecx); in Generate()
3643 __ j(not_equal, &runtime); in Generate()
3645 __ mov(ecx, FieldOperand(eax, JSRegExp::kDataOffset)); in Generate()
3647 __ test(ecx, Immediate(kSmiTagMask)); in Generate()
3648 __ Check(not_zero, "Unexpected type for RegExp data, FixedArray expected"); in Generate()
3649 __ CmpObjectType(ecx, FIXED_ARRAY_TYPE, ebx); in Generate()
3650 __ Check(equal, "Unexpected type for RegExp data, FixedArray expected"); in Generate()
3655 __ mov(ebx, FieldOperand(ecx, JSRegExp::kDataTagOffset)); in Generate()
3656 __ cmp(ebx, Immediate(Smi::FromInt(JSRegExp::IRREGEXP))); in Generate()
3657 __ j(not_equal, &runtime); in Generate()
3661 __ mov(edx, FieldOperand(ecx, JSRegExp::kIrregexpCaptureCountOffset)); in Generate()
3666 __ add(edx, Immediate(2)); // edx was a smi. in Generate()
3668 __ cmp(edx, OffsetsVector::kStaticOffsetsVectorSize); in Generate()
3669 __ j(above, &runtime); in Generate()
3674 __ mov(eax, Operand(esp, kSubjectOffset)); in Generate()
3675 __ JumpIfSmi(eax, &runtime); in Generate()
3677 __ j(NegateCondition(is_string), &runtime); in Generate()
3679 __ mov(ebx, FieldOperand(eax, String::kLengthOffset)); in Generate()
3686 __ mov(eax, Operand(esp, kPreviousIndexOffset)); in Generate()
3687 __ JumpIfNotSmi(eax, &runtime); in Generate()
3688 __ cmp(eax, ebx); in Generate()
3689 __ j(above_equal, &runtime); in Generate()
3694 __ mov(eax, Operand(esp, kLastMatchInfoOffset)); in Generate()
3695 __ JumpIfSmi(eax, &runtime); in Generate()
3696 __ CmpObjectType(eax, JS_ARRAY_TYPE, ebx); in Generate()
3697 __ j(not_equal, &runtime); in Generate()
3699 __ mov(ebx, FieldOperand(eax, JSArray::kElementsOffset)); in Generate()
3700 __ mov(eax, FieldOperand(ebx, HeapObject::kMapOffset)); in Generate()
3702 __ cmp(eax, factory->fixed_array_map()); in Generate()
3703 __ j(not_equal, &runtime); in Generate()
3706 __ mov(eax, FieldOperand(ebx, FixedArray::kLengthOffset)); in Generate()
3707 __ SmiUntag(eax); in Generate()
3708 __ add(edx, Immediate(RegExpImpl::kLastMatchOverhead)); in Generate()
3709 __ cmp(edx, eax); in Generate()
3710 __ j(greater, &runtime); in Generate()
3713 __ Set(edi, Immediate(0)); in Generate()
3717 __ mov(eax, Operand(esp, kSubjectOffset)); in Generate()
3718 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); in Generate()
3719 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); in Generate()
3721 __ and_(ebx, kIsNotStringMask | in Generate()
3726 __ j(zero, &seq_two_byte_string, Label::kNear); in Generate()
3730 __ and_(ebx, Immediate(kIsNotStringMask | in Generate()
3733 __ j(zero, &seq_ascii_string, Label::kNear); in Generate()
3747 __ cmp(ebx, Immediate(kExternalStringTag)); in Generate()
3748 __ j(less, &cons_string); in Generate()
3749 __ j(equal, &external_string); in Generate()
3753 __ test(ebx, Immediate(kIsNotStringMask | kShortExternalStringTag)); in Generate()
3754 __ j(not_zero, &runtime); in Generate()
3757 __ mov(edi, FieldOperand(eax, SlicedString::kOffsetOffset)); in Generate()
3758 __ mov(eax, FieldOperand(eax, SlicedString::kParentOffset)); in Generate()
3761 __ jmp(&check_encoding, Label::kNear); in Generate()
3763 __ bind(&cons_string); in Generate()
3764 __ cmp(FieldOperand(eax, ConsString::kSecondOffset), factory->empty_string()); in Generate()
3765 __ j(not_equal, &runtime); in Generate()
3766 __ mov(eax, FieldOperand(eax, ConsString::kFirstOffset)); in Generate()
3767 __ bind(&check_encoding); in Generate()
3768 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); in Generate()
3772 __ test_b(FieldOperand(ebx, Map::kInstanceTypeOffset), in Generate()
3775 __ j(zero, &seq_two_byte_string, Label::kNear); in Generate()
3777 __ test_b(FieldOperand(ebx, Map::kInstanceTypeOffset), in Generate()
3779 __ j(not_zero, &external_string); in Generate()
3781 __ bind(&seq_ascii_string); in Generate()
3784 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataAsciiCodeOffset)); in Generate()
3785 __ Set(ecx, Immediate(1)); // Type is ASCII. in Generate()
3786 __ jmp(&check_code, Label::kNear); in Generate()
3788 __ bind(&seq_two_byte_string); in Generate()
3791 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataUC16CodeOffset)); in Generate()
3792 __ Set(ecx, Immediate(0)); // Type is two byte. in Generate()
3794 __ bind(&check_code); in Generate()
3798 __ JumpIfSmi(edx, &runtime); in Generate()
3805 __ mov(ebx, Operand(esp, kPreviousIndexOffset)); in Generate()
3806 __ SmiUntag(ebx); // Previous index from smi. in Generate()
3814 __ IncrementCounter(counters->regexp_entry_native(), 1); in Generate()
3818 __ EnterApiExitFrame(kRegExpExecuteArguments); in Generate()
3821 __ mov(Operand(esp, 7 * kPointerSize), in Generate()
3825 __ mov(Operand(esp, 6 * kPointerSize), Immediate(1)); in Generate()
3828 __ mov(esi, Operand::StaticVariable(address_of_regexp_stack_memory_address)); in Generate()
3829 __ add(esi, Operand::StaticVariable(address_of_regexp_stack_memory_size)); in Generate()
3830 __ mov(Operand(esp, 5 * kPointerSize), esi); in Generate()
3833 __ mov(Operand(esp, 4 * kPointerSize), in Generate()
3838 __ mov(Operand(esp, 1 * kPointerSize), ebx); in Generate()
3845 __ mov(esi, Operand(ebp, kSubjectOffset + kPointerSize)); in Generate()
3846 __ mov(Operand(esp, 0 * kPointerSize), esi); in Generate()
3857 __ mov(esi, FieldOperand(esi, String::kLengthOffset)); in Generate()
3858 __ add(esi, edi); // Calculate input end wrt offset. in Generate()
3859 __ SmiUntag(edi); in Generate()
3860 __ add(ebx, edi); // Calculate input start wrt offset. in Generate()
3865 __ test(ecx, ecx); in Generate()
3866 __ j(zero, &setup_two_byte, Label::kNear); in Generate()
3867 __ SmiUntag(esi); in Generate()
3868 __ lea(ecx, FieldOperand(eax, esi, times_1, SeqAsciiString::kHeaderSize)); in Generate()
3869 __ mov(Operand(esp, 3 * kPointerSize), ecx); // Argument 4. in Generate()
3870 __ lea(ecx, FieldOperand(eax, ebx, times_1, SeqAsciiString::kHeaderSize)); in Generate()
3871 __ mov(Operand(esp, 2 * kPointerSize), ecx); // Argument 3. in Generate()
3872 __ jmp(&setup_rest, Label::kNear); in Generate()
3874 __ bind(&setup_two_byte); in Generate()
3877 __ lea(ecx, FieldOperand(eax, esi, times_1, SeqTwoByteString::kHeaderSize)); in Generate()
3878 __ mov(Operand(esp, 3 * kPointerSize), ecx); // Argument 4. in Generate()
3879 __ lea(ecx, FieldOperand(eax, ebx, times_2, SeqTwoByteString::kHeaderSize)); in Generate()
3880 __ mov(Operand(esp, 2 * kPointerSize), ecx); // Argument 3. in Generate()
3882 __ bind(&setup_rest); in Generate()
3885 __ add(edx, Immediate(Code::kHeaderSize - kHeapObjectTag)); in Generate()
3886 __ call(edx); in Generate()
3889 __ LeaveApiExitFrame(); in Generate()
3893 __ cmp(eax, NativeRegExpMacroAssembler::SUCCESS); in Generate()
3894 __ j(equal, &success); in Generate()
3896 __ cmp(eax, NativeRegExpMacroAssembler::FAILURE); in Generate()
3897 __ j(equal, &failure); in Generate()
3898 __ cmp(eax, NativeRegExpMacroAssembler::EXCEPTION); in Generate()
3900 __ j(not_equal, &runtime); in Generate()
3907 __ mov(edx, Immediate(masm->isolate()->factory()->the_hole_value())); in Generate()
3908 __ mov(eax, Operand::StaticVariable(pending_exception)); in Generate()
3909 __ cmp(edx, eax); in Generate()
3910 __ j(equal, &runtime); in Generate()
3914 __ mov(Operand::StaticVariable(pending_exception), edx); in Generate()
3918 __ cmp(eax, factory->termination_exception()); in Generate()
3920 __ j(equal, &throw_termination_exception, Label::kNear); in Generate()
3923 __ Throw(eax); in Generate()
3925 __ bind(&throw_termination_exception); in Generate()
3926 __ ThrowUncatchable(eax); in Generate()
3928 __ bind(&failure); in Generate()
3930 __ mov(eax, factory->null_value()); in Generate()
3931 __ ret(4 * kPointerSize); in Generate()
3934 __ bind(&success); in Generate()
3935 __ mov(eax, Operand(esp, kJSRegExpOffset)); in Generate()
3936 __ mov(ecx, FieldOperand(eax, JSRegExp::kDataOffset)); in Generate()
3937 __ mov(edx, FieldOperand(ecx, JSRegExp::kIrregexpCaptureCountOffset)); in Generate()
3941 __ add(edx, Immediate(2)); // edx was a smi. in Generate()
3945 __ mov(eax, Operand(esp, kLastMatchInfoOffset)); in Generate()
3946 __ mov(ebx, FieldOperand(eax, JSArray::kElementsOffset)); in Generate()
3951 __ SmiTag(edx); // Number of capture registers to smi. in Generate()
3952 __ mov(FieldOperand(ebx, RegExpImpl::kLastCaptureCountOffset), edx); in Generate()
3953 __ SmiUntag(edx); // Number of capture registers back from smi. in Generate()
3955 __ mov(eax, Operand(esp, kSubjectOffset)); in Generate()
3956 __ mov(FieldOperand(ebx, RegExpImpl::kLastSubjectOffset), eax); in Generate()
3957 __ RecordWriteField(ebx, in Generate()
3962 __ mov(eax, Operand(esp, kSubjectOffset)); in Generate()
3963 __ mov(FieldOperand(ebx, RegExpImpl::kLastInputOffset), eax); in Generate()
3964 __ RecordWriteField(ebx, in Generate()
3973 __ mov(ecx, Immediate(address_of_static_offsets_vector)); in Generate()
3981 __ bind(&next_capture); in Generate()
3982 __ sub(edx, Immediate(1)); in Generate()
3983 __ j(negative, &done, Label::kNear); in Generate()
3985 __ mov(edi, Operand(ecx, edx, times_int_size, 0)); in Generate()
3986 __ SmiTag(edi); in Generate()
3988 __ mov(FieldOperand(ebx, in Generate()
3993 __ jmp(&next_capture); in Generate()
3994 __ bind(&done); in Generate()
3997 __ mov(eax, Operand(esp, kLastMatchInfoOffset)); in Generate()
3998 __ ret(4 * kPointerSize); in Generate()
4003 __ bind(&external_string); in Generate()
4004 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); in Generate()
4005 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); in Generate()
4009 __ test_b(ebx, kIsIndirectStringMask); in Generate()
4010 __ Assert(zero, "external string expected, but not found"); in Generate()
4012 __ mov(eax, FieldOperand(eax, ExternalString::kResourceDataOffset)); in Generate()
4015 __ sub(eax, Immediate(SeqTwoByteString::kHeaderSize - kHeapObjectTag)); in Generate()
4017 __ test_b(ebx, kStringEncodingMask); in Generate()
4018 __ j(not_zero, &seq_ascii_string); in Generate()
4019 __ jmp(&seq_two_byte_string); in Generate()
4022 __ bind(&runtime); in Generate()
4023 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); in Generate()
4032 __ mov(ebx, Operand(esp, kPointerSize * 3)); in Generate()
4033 __ JumpIfNotSmi(ebx, &slowcase); in Generate()
4034 __ cmp(ebx, Immediate(Smi::FromInt(kMaxInlineLength))); in Generate()
4035 __ j(above, &slowcase); in Generate()
4042 __ AllocateInNewSpace(JSRegExpResult::kSize + FixedArray::kHeaderSize, in Generate()
4056 __ mov(edx, ContextOperand(esi, Context::GLOBAL_INDEX)); in Generate()
4058 __ mov(ecx, Immediate(factory->empty_fixed_array())); in Generate()
4059 __ lea(ebx, Operand(eax, JSRegExpResult::kSize)); in Generate()
4060 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalContextOffset)); in Generate()
4061 __ mov(FieldOperand(eax, JSObject::kElementsOffset), ebx); in Generate()
4062 __ mov(FieldOperand(eax, JSObject::kPropertiesOffset), ecx); in Generate()
4063 __ mov(edx, ContextOperand(edx, Context::REGEXP_RESULT_MAP_INDEX)); in Generate()
4064 __ mov(FieldOperand(eax, HeapObject::kMapOffset), edx); in Generate()
4067 __ mov(ecx, Operand(esp, kPointerSize * 1)); in Generate()
4068 __ mov(FieldOperand(eax, JSRegExpResult::kInputOffset), ecx); in Generate()
4069 __ mov(ecx, Operand(esp, kPointerSize * 2)); in Generate()
4070 __ mov(FieldOperand(eax, JSRegExpResult::kIndexOffset), ecx); in Generate()
4071 __ mov(ecx, Operand(esp, kPointerSize * 3)); in Generate()
4072 __ mov(FieldOperand(eax, JSArray::kLengthOffset), ecx); in Generate()
4080 __ mov(FieldOperand(ebx, HeapObject::kMapOffset), in Generate()
4083 __ mov(FieldOperand(ebx, FixedArray::kLengthOffset), ecx); in Generate()
4085 __ SmiUntag(ecx); in Generate()
4086 __ mov(edx, Immediate(factory->the_hole_value())); in Generate()
4087 __ lea(ebx, FieldOperand(ebx, FixedArray::kHeaderSize)); in Generate()
4094 __ test(ecx, ecx); in Generate()
4095 __ bind(&loop); in Generate()
4096 __ j(less_equal, &done, Label::kNear); // Jump if ecx is negative or zero. in Generate()
4097 __ sub(ecx, Immediate(1)); in Generate()
4098 __ mov(Operand(ebx, ecx, times_pointer_size, 0), edx); in Generate()
4099 __ jmp(&loop); in Generate()
4101 __ bind(&done); in Generate()
4102 __ ret(3 * kPointerSize); in Generate()
4104 __ bind(&slowcase); in Generate()
4105 __ TailCallRuntime(Runtime::kRegExpConstructResult, 3, 1); in Generate()
4124 __ mov(scratch, Immediate(Heap::kNumberStringCacheRootIndex)); in GenerateLookupNumberStringCache()
4125 __ mov(number_string_cache, in GenerateLookupNumberStringCache()
4129 __ mov(mask, FieldOperand(number_string_cache, FixedArray::kLengthOffset)); in GenerateLookupNumberStringCache()
4130 __ shr(mask, kSmiTagSize + 1); // Untag length and divide it by two. in GenerateLookupNumberStringCache()
4131 __ sub(mask, Immediate(1)); // Make mask. in GenerateLookupNumberStringCache()
4140 __ mov(scratch, object); in GenerateLookupNumberStringCache()
4141 __ SmiUntag(scratch); in GenerateLookupNumberStringCache()
4145 __ JumpIfNotSmi(object, &not_smi, Label::kNear); in GenerateLookupNumberStringCache()
4146 __ mov(scratch, object); in GenerateLookupNumberStringCache()
4147 __ SmiUntag(scratch); in GenerateLookupNumberStringCache()
4148 __ jmp(&smi_hash_calculated, Label::kNear); in GenerateLookupNumberStringCache()
4149 __ bind(&not_smi); in GenerateLookupNumberStringCache()
4150 __ cmp(FieldOperand(object, HeapObject::kMapOffset), in GenerateLookupNumberStringCache()
4152 __ j(not_equal, not_found); in GenerateLookupNumberStringCache()
4154 __ mov(scratch, FieldOperand(object, HeapNumber::kValueOffset)); in GenerateLookupNumberStringCache()
4155 __ xor_(scratch, FieldOperand(object, HeapNumber::kValueOffset + 4)); in GenerateLookupNumberStringCache()
4157 __ and_(scratch, mask); in GenerateLookupNumberStringCache()
4160 __ mov(probe, in GenerateLookupNumberStringCache()
4165 __ JumpIfSmi(probe, not_found); in GenerateLookupNumberStringCache()
4168 __ movdbl(xmm0, FieldOperand(object, HeapNumber::kValueOffset)); in GenerateLookupNumberStringCache()
4169 __ movdbl(xmm1, FieldOperand(probe, HeapNumber::kValueOffset)); in GenerateLookupNumberStringCache()
4170 __ ucomisd(xmm0, xmm1); in GenerateLookupNumberStringCache()
4172 __ fld_d(FieldOperand(object, HeapNumber::kValueOffset)); in GenerateLookupNumberStringCache()
4173 __ fld_d(FieldOperand(probe, HeapNumber::kValueOffset)); in GenerateLookupNumberStringCache()
4174 __ FCmp(); in GenerateLookupNumberStringCache()
4176 __ j(parity_even, not_found); // Bail out if NaN is involved. in GenerateLookupNumberStringCache()
4177 __ j(not_equal, not_found); // The cache did not contain this value. in GenerateLookupNumberStringCache()
4178 __ jmp(&load_result_from_cache, Label::kNear); in GenerateLookupNumberStringCache()
4181 __ bind(&smi_hash_calculated); in GenerateLookupNumberStringCache()
4183 __ and_(scratch, mask); in GenerateLookupNumberStringCache()
4186 __ cmp(object, in GenerateLookupNumberStringCache()
4191 __ j(not_equal, not_found); in GenerateLookupNumberStringCache()
4194 __ bind(&load_result_from_cache); in GenerateLookupNumberStringCache()
4195 __ mov(result, in GenerateLookupNumberStringCache()
4201 __ IncrementCounter(counters->number_to_string_native(), 1); in GenerateLookupNumberStringCache()
4208 __ mov(ebx, Operand(esp, kPointerSize)); in Generate()
4212 __ ret(1 * kPointerSize); in Generate()
4214 __ bind(&runtime); in Generate()
4216 __ TailCallRuntime(Runtime::kNumberToStringSkipCache, 1, 1); in Generate()
4235 __ mov(ecx, edx); in Generate()
4236 __ or_(ecx, eax); in Generate()
4237 __ JumpIfNotSmi(ecx, &non_smi, Label::kNear); in Generate()
4238 __ sub(edx, eax); // Return on the result of the subtraction. in Generate()
4239 __ j(no_overflow, &smi_done, Label::kNear); in Generate()
4240 __ not_(edx); // Correct sign in case of overflow. edx is never 0 here. in Generate()
4241 __ bind(&smi_done); in Generate()
4242 __ mov(eax, edx); in Generate()
4243 __ ret(0); in Generate()
4244 __ bind(&non_smi); in Generate()
4246 __ mov(ecx, edx); in Generate()
4247 __ or_(ecx, eax); in Generate()
4248 __ test(ecx, Immediate(kSmiTagMask)); in Generate()
4249 __ Assert(not_zero, "Unexpected smi operands."); in Generate()
4259 __ cmp(eax, edx); in Generate()
4260 __ j(not_equal, &not_identical); in Generate()
4266 __ cmp(edx, masm->isolate()->factory()->undefined_value()); in Generate()
4267 __ j(not_equal, &check_for_nan, Label::kNear); in Generate()
4268 __ Set(eax, Immediate(Smi::FromInt(NegativeComparisonResult(cc_)))); in Generate()
4269 __ ret(0); in Generate()
4270 __ bind(&check_for_nan); in Generate()
4277 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); in Generate()
4278 __ ret(0); in Generate()
4281 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), in Generate()
4283 __ j(equal, &heap_number, Label::kNear); in Generate()
4286 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx); in Generate()
4287 __ j(above_equal, &not_identical); in Generate()
4289 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); in Generate()
4290 __ ret(0); in Generate()
4292 __ bind(&heap_number); in Generate()
4304 __ mov(edx, FieldOperand(edx, HeapNumber::kExponentOffset)); in Generate()
4305 __ Set(eax, Immediate(0)); in Generate()
4308 __ add(edx, edx); in Generate()
4309 __ cmp(edx, kQuietNaNHighBitsMask << 1); in Generate()
4312 __ setcc(above_equal, eax); in Generate()
4313 __ ret(0); in Generate()
4316 __ j(above_equal, &nan, Label::kNear); in Generate()
4317 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); in Generate()
4318 __ ret(0); in Generate()
4319 __ bind(&nan); in Generate()
4320 __ Set(eax, Immediate(Smi::FromInt(NegativeComparisonResult(cc_)))); in Generate()
4321 __ ret(0); in Generate()
4325 __ bind(&not_identical); in Generate()
4341 __ mov(ecx, Immediate(kSmiTagMask)); in Generate()
4342 __ and_(ecx, eax); in Generate()
4343 __ test(ecx, edx); in Generate()
4344 __ j(not_zero, &not_smis, Label::kNear); in Generate()
4350 __ sub(ecx, Immediate(0x01)); in Generate()
4351 __ mov(ebx, edx); in Generate()
4352 __ xor_(ebx, eax); in Generate()
4353 __ and_(ebx, ecx); // ebx holds either 0 or eax ^ edx. in Generate()
4354 __ xor_(ebx, eax); in Generate()
4358 __ cmp(FieldOperand(ebx, HeapObject::kMapOffset), in Generate()
4361 __ j(equal, &slow, Label::kNear); in Generate()
4363 __ mov(eax, ebx); in Generate()
4364 __ ret(0); in Generate()
4366 __ bind(&not_smis); in Generate()
4375 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx); in Generate()
4376 __ j(below, &first_non_object, Label::kNear); in Generate()
4381 __ bind(&return_not_equal); in Generate()
4382 __ ret(0); in Generate()
4384 __ bind(&first_non_object); in Generate()
4386 __ CmpInstanceType(ecx, ODDBALL_TYPE); in Generate()
4387 __ j(equal, &return_not_equal); in Generate()
4389 __ CmpObjectType(edx, FIRST_SPEC_OBJECT_TYPE, ecx); in Generate()
4390 __ j(above_equal, &return_not_equal); in Generate()
4393 __ CmpInstanceType(ecx, ODDBALL_TYPE); in Generate()
4394 __ j(equal, &return_not_equal); in Generate()
4397 __ bind(&slow); in Generate()
4409 __ ucomisd(xmm0, xmm1); in Generate()
4412 __ j(parity_even, &unordered, Label::kNear); in Generate()
4414 __ mov(eax, 0); // equal in Generate()
4415 __ mov(ecx, Immediate(Smi::FromInt(1))); in Generate()
4416 __ cmov(above, eax, ecx); in Generate()
4417 __ mov(ecx, Immediate(Smi::FromInt(-1))); in Generate()
4418 __ cmov(below, eax, ecx); in Generate()
4419 __ ret(0); in Generate()
4425 __ FCmp(); in Generate()
4428 __ j(parity_even, &unordered, Label::kNear); in Generate()
4432 __ j(below, &below_label, Label::kNear); in Generate()
4433 __ j(above, &above_label, Label::kNear); in Generate()
4435 __ Set(eax, Immediate(0)); in Generate()
4436 __ ret(0); in Generate()
4438 __ bind(&below_label); in Generate()
4439 __ mov(eax, Immediate(Smi::FromInt(-1))); in Generate()
4440 __ ret(0); in Generate()
4442 __ bind(&above_label); in Generate()
4443 __ mov(eax, Immediate(Smi::FromInt(1))); in Generate()
4444 __ ret(0); in Generate()
4449 __ bind(&unordered); in Generate()
4452 __ mov(eax, Immediate(Smi::FromInt(1))); in Generate()
4454 __ mov(eax, Immediate(Smi::FromInt(-1))); in Generate()
4456 __ ret(0); in Generate()
4459 __ bind(&non_number_comparison); in Generate()
4471 __ ret(0); in Generate()
4474 __ bind(&check_for_strings); in Generate()
4476 __ JumpIfNotBothSequentialAsciiStrings(edx, eax, ecx, ebx, in Generate()
4495 __ Abort("Unexpected fall-through from string comparison"); in Generate()
4498 __ bind(&check_unequal_objects); in Generate()
4510 __ lea(ecx, Operand(eax, edx, times_1, 0)); in Generate()
4511 __ test(ecx, Immediate(kSmiTagMask)); in Generate()
4512 __ j(not_zero, &not_both_objects, Label::kNear); in Generate()
4513 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx); in Generate()
4514 __ j(below, &not_both_objects, Label::kNear); in Generate()
4515 __ CmpObjectType(edx, FIRST_SPEC_OBJECT_TYPE, ebx); in Generate()
4516 __ j(below, &not_both_objects, Label::kNear); in Generate()
4520 __ test_b(FieldOperand(ecx, Map::kBitFieldOffset), in Generate()
4522 __ j(zero, &return_unequal, Label::kNear); in Generate()
4523 __ test_b(FieldOperand(ebx, Map::kBitFieldOffset), in Generate()
4525 __ j(zero, &return_unequal, Label::kNear); in Generate()
4528 __ Set(eax, Immediate(EQUAL)); in Generate()
4529 __ bind(&return_unequal); in Generate()
4532 __ ret(0); // rax, rdx were pushed in Generate()
4533 __ bind(&not_both_objects); in Generate()
4537 __ pop(ecx); in Generate()
4538 __ push(edx); in Generate()
4539 __ push(eax); in Generate()
4547 __ push(Immediate(Smi::FromInt(NegativeComparisonResult(cc_)))); in Generate()
4551 __ push(ecx); in Generate()
4555 __ InvokeBuiltin(builtin, JUMP_FUNCTION); in Generate()
4563 __ JumpIfSmi(object, label); in BranchIfNonSymbol()
4564 __ mov(scratch, FieldOperand(object, HeapObject::kMapOffset)); in BranchIfNonSymbol()
4565 __ movzx_b(scratch, FieldOperand(scratch, Map::kInstanceTypeOffset)); in BranchIfNonSymbol()
4566 __ and_(scratch, kIsSymbolMask | kIsNotStringMask); in BranchIfNonSymbol()
4567 __ cmp(scratch, kSymbolTag | kStringTag); in BranchIfNonSymbol()
4568 __ j(not_equal, label); in BranchIfNonSymbol()
4573 __ TailCallRuntime(Runtime::kStackGuard, 0, 1); in Generate()
4578 __ TailCallRuntime(Runtime::kInterrupt, 0, 1); in Generate()
4592 __ mov(ecx, FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset)); in GenerateRecordCallTarget()
4596 __ cmp(ecx, edi); in GenerateRecordCallTarget()
4597 __ j(equal, &done, Label::kNear); in GenerateRecordCallTarget()
4598 __ cmp(ecx, Immediate(TypeFeedbackCells::MegamorphicSentinel(isolate))); in GenerateRecordCallTarget()
4599 __ j(equal, &done, Label::kNear); in GenerateRecordCallTarget()
4603 __ cmp(ecx, Immediate(TypeFeedbackCells::UninitializedSentinel(isolate))); in GenerateRecordCallTarget()
4604 __ j(equal, &initialize, Label::kNear); in GenerateRecordCallTarget()
4607 __ mov(FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset), in GenerateRecordCallTarget()
4609 __ jmp(&done, Label::kNear); in GenerateRecordCallTarget()
4612 __ bind(&initialize); in GenerateRecordCallTarget()
4613 __ mov(FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset), edi); in GenerateRecordCallTarget()
4616 __ bind(&done); in GenerateRecordCallTarget()
4633 __ mov(eax, Operand(esp, (argc_ + 1) * kPointerSize)); in Generate()
4635 __ cmp(eax, isolate->factory()->the_hole_value()); in Generate()
4636 __ j(not_equal, &receiver_ok, Label::kNear); in Generate()
4638 __ mov(ecx, GlobalObjectOperand()); in Generate()
4639 __ mov(ecx, FieldOperand(ecx, GlobalObject::kGlobalReceiverOffset)); in Generate()
4640 __ mov(Operand(esp, (argc_ + 1) * kPointerSize), ecx); in Generate()
4641 __ bind(&receiver_ok); in Generate()
4645 __ JumpIfSmi(edi, &non_function); in Generate()
4647 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); in Generate()
4648 __ j(not_equal, &slow); in Generate()
4659 __ cmp(eax, isolate->factory()->the_hole_value()); in Generate()
4660 __ j(equal, &call_as_function); in Generate()
4661 __ InvokeFunction(edi, in Generate()
4666 __ bind(&call_as_function); in Generate()
4668 __ InvokeFunction(edi, in Generate()
4675 __ bind(&slow); in Generate()
4680 __ mov(FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset), in Generate()
4684 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); in Generate()
4685 __ j(not_equal, &non_function); in Generate()
4686 __ pop(ecx); in Generate()
4687 __ push(edi); // put proxy as additional argument under return address in Generate()
4688 __ push(ecx); in Generate()
4689 __ Set(eax, Immediate(argc_ + 1)); in Generate()
4690 __ Set(ebx, Immediate(0)); in Generate()
4691 __ SetCallKind(ecx, CALL_AS_FUNCTION); in Generate()
4692 __ GetBuiltinEntry(edx, Builtins::CALL_FUNCTION_PROXY); in Generate()
4695 __ jmp(adaptor, RelocInfo::CODE_TARGET); in Generate()
4700 __ bind(&non_function); in Generate()
4701 __ mov(Operand(esp, (argc_ + 1) * kPointerSize), edi); in Generate()
4702 __ Set(eax, Immediate(argc_)); in Generate()
4703 __ Set(ebx, Immediate(0)); in Generate()
4704 __ SetCallKind(ecx, CALL_AS_METHOD); in Generate()
4705 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION); in Generate()
4707 __ jmp(adaptor, RelocInfo::CODE_TARGET); in Generate()
4718 __ JumpIfSmi(edi, &non_function_call); in Generate()
4720 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); in Generate()
4721 __ j(not_equal, &slow); in Generate()
4728 __ mov(ebx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); in Generate()
4729 __ mov(ebx, FieldOperand(ebx, SharedFunctionInfo::kConstructStubOffset)); in Generate()
4730 __ lea(ebx, FieldOperand(ebx, Code::kHeaderSize)); in Generate()
4731 __ jmp(ebx); in Generate()
4737 __ bind(&slow); in Generate()
4738 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); in Generate()
4739 __ j(not_equal, &non_function_call); in Generate()
4740 __ GetBuiltinEntry(edx, Builtins::CALL_FUNCTION_PROXY_AS_CONSTRUCTOR); in Generate()
4741 __ jmp(&do_call); in Generate()
4743 __ bind(&non_function_call); in Generate()
4744 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION_AS_CONSTRUCTOR); in Generate()
4745 __ bind(&do_call); in Generate()
4747 __ Set(ebx, Immediate(0)); in Generate()
4750 __ SetCallKind(ecx, CALL_AS_METHOD); in Generate()
4751 __ jmp(arguments_adaptor, RelocInfo::CODE_TARGET); in Generate()
4806 __ CheckStackAlignment(); in GenerateCore()
4815 __ mov(Operand(esp, 0 * kPointerSize), eax); // Result. in GenerateCore()
4816 __ call(FUNCTION_ADDR(Runtime::PerformGC), RelocInfo::RUNTIME_ENTRY); in GenerateCore()
4822 __ inc(Operand::StaticVariable(scope_depth)); in GenerateCore()
4826 __ mov(Operand(esp, 0 * kPointerSize), edi); // argc. in GenerateCore()
4827 __ mov(Operand(esp, 1 * kPointerSize), esi); // argv. in GenerateCore()
4828 __ mov(Operand(esp, 2 * kPointerSize), in GenerateCore()
4830 __ call(ebx); in GenerateCore()
4834 __ dec(Operand::StaticVariable(scope_depth)); in GenerateCore()
4841 __ cmp(eax, masm->isolate()->factory()->the_hole_value()); in GenerateCore()
4842 __ j(not_equal, &okay, Label::kNear); in GenerateCore()
4843 __ int3(); in GenerateCore()
4844 __ bind(&okay); in GenerateCore()
4850 __ lea(ecx, Operand(eax, 1)); in GenerateCore()
4852 __ test(ecx, Immediate(kFailureTagMask)); in GenerateCore()
4853 __ j(zero, &failure_returned); in GenerateCore()
4861 __ push(edx); in GenerateCore()
4862 __ mov(edx, Immediate(masm->isolate()->factory()->the_hole_value())); in GenerateCore()
4864 __ cmp(edx, Operand::StaticVariable(pending_exception_address)); in GenerateCore()
4866 __ j(equal, &okay, Label::kNear); in GenerateCore()
4867 __ int3(); in GenerateCore()
4868 __ bind(&okay); in GenerateCore()
4869 __ pop(edx); in GenerateCore()
4873 __ LeaveExitFrame(save_doubles_ == kSaveFPRegs); in GenerateCore()
4874 __ ret(0); in GenerateCore()
4877 __ bind(&failure_returned); in GenerateCore()
4882 __ test(eax, Immediate(((1 << kFailureTypeTagSize) - 1) << kFailureTagSize)); in GenerateCore()
4883 __ j(zero, &retry, Label::kNear); in GenerateCore()
4886 __ cmp(eax, reinterpret_cast<int32_t>(Failure::OutOfMemoryException())); in GenerateCore()
4887 __ j(equal, throw_out_of_memory_exception); in GenerateCore()
4890 __ mov(eax, Operand::StaticVariable(pending_exception_address)); in GenerateCore()
4891 __ mov(edx, Immediate(masm->isolate()->factory()->the_hole_value())); in GenerateCore()
4892 __ mov(Operand::StaticVariable(pending_exception_address), edx); in GenerateCore()
4896 __ cmp(eax, masm->isolate()->factory()->termination_exception()); in GenerateCore()
4897 __ j(equal, throw_termination_exception); in GenerateCore()
4900 __ jmp(throw_normal_exception); in GenerateCore()
4903 __ bind(&retry); in GenerateCore()
4920 __ EnterExitFrame(save_doubles_ == kSaveFPRegs); in Generate()
4951 __ mov(eax, Immediate(reinterpret_cast<int32_t>(failure))); in Generate()
4959 __ bind(&throw_out_of_memory_exception); in Generate()
4964 __ mov(Operand::StaticVariable(external_caught), Immediate(false)); in Generate()
4969 __ mov(eax, reinterpret_cast<int32_t>(Failure::OutOfMemoryException())); in Generate()
4970 __ mov(Operand::StaticVariable(pending_exception), eax); in Generate()
4973 __ bind(&throw_termination_exception); in Generate()
4974 __ ThrowUncatchable(eax); in Generate()
4976 __ bind(&throw_normal_exception); in Generate()
4977 __ Throw(eax); in Generate()
4986 __ push(ebp); in GenerateBody()
4987 __ mov(ebp, esp); in GenerateBody()
4991 __ push(Immediate(Smi::FromInt(marker))); // context slot in GenerateBody()
4992 __ push(Immediate(Smi::FromInt(marker))); // function slot in GenerateBody()
4994 __ push(edi); in GenerateBody()
4995 __ push(esi); in GenerateBody()
4996 __ push(ebx); in GenerateBody()
5000 __ push(Operand::StaticVariable(c_entry_fp)); in GenerateBody()
5005 __ cmp(Operand::StaticVariable(js_entry_sp), Immediate(0)); in GenerateBody()
5006 __ j(not_equal, &not_outermost_js, Label::kNear); in GenerateBody()
5007 __ mov(Operand::StaticVariable(js_entry_sp), ebp); in GenerateBody()
5008 __ push(Immediate(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME))); in GenerateBody()
5010 __ jmp(&cont, Label::kNear); in GenerateBody()
5011 __ bind(&not_outermost_js); in GenerateBody()
5012 __ push(Immediate(Smi::FromInt(StackFrame::INNER_JSENTRY_FRAME))); in GenerateBody()
5013 __ bind(&cont); in GenerateBody()
5017 __ jmp(&invoke); in GenerateBody()
5018 __ bind(&handler_entry); in GenerateBody()
5024 __ mov(Operand::StaticVariable(pending_exception), eax); in GenerateBody()
5025 __ mov(eax, reinterpret_cast<int32_t>(Failure::Exception())); in GenerateBody()
5026 __ jmp(&exit); in GenerateBody()
5030 __ bind(&invoke); in GenerateBody()
5031 __ PushTryHandler(StackHandler::JS_ENTRY, 0); in GenerateBody()
5034 __ mov(edx, Immediate(masm->isolate()->factory()->the_hole_value())); in GenerateBody()
5035 __ mov(Operand::StaticVariable(pending_exception), edx); in GenerateBody()
5038 __ push(Immediate(0)); // receiver in GenerateBody()
5047 __ mov(edx, Immediate(construct_entry)); in GenerateBody()
5051 __ mov(edx, Immediate(entry)); in GenerateBody()
5053 __ mov(edx, Operand(edx, 0)); // deref address in GenerateBody()
5054 __ lea(edx, FieldOperand(edx, Code::kHeaderSize)); in GenerateBody()
5055 __ call(edx); in GenerateBody()
5058 __ PopTryHandler(); in GenerateBody()
5060 __ bind(&exit); in GenerateBody()
5062 __ pop(ebx); in GenerateBody()
5063 __ cmp(ebx, Immediate(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME))); in GenerateBody()
5064 __ j(not_equal, &not_outermost_js_2); in GenerateBody()
5065 __ mov(Operand::StaticVariable(js_entry_sp), Immediate(0)); in GenerateBody()
5066 __ bind(&not_outermost_js_2); in GenerateBody()
5069 __ pop(Operand::StaticVariable(ExternalReference( in GenerateBody()
5074 __ pop(ebx); in GenerateBody()
5075 __ pop(esi); in GenerateBody()
5076 __ pop(edi); in GenerateBody()
5077 __ add(esp, Immediate(2 * kPointerSize)); // remove markers in GenerateBody()
5080 __ pop(ebp); in GenerateBody()
5081 __ ret(0); in GenerateBody()
5129 __ mov(object, Operand(esp, 2 * kPointerSize)); in Generate()
5130 __ mov(function, Operand(esp, 1 * kPointerSize)); in Generate()
5134 __ JumpIfSmi(object, &not_js_object); in Generate()
5135 __ IsObjectJSObjectType(object, map, scratch, &not_js_object); in Generate()
5142 __ mov(scratch, Immediate(Heap::kInstanceofCacheFunctionRootIndex)); in Generate()
5143 __ cmp(function, Operand::StaticArray(scratch, in Generate()
5146 __ j(not_equal, &miss, Label::kNear); in Generate()
5147 __ mov(scratch, Immediate(Heap::kInstanceofCacheMapRootIndex)); in Generate()
5148 __ cmp(map, Operand::StaticArray( in Generate()
5150 __ j(not_equal, &miss, Label::kNear); in Generate()
5151 __ mov(scratch, Immediate(Heap::kInstanceofCacheAnswerRootIndex)); in Generate()
5152 __ mov(eax, Operand::StaticArray( in Generate()
5154 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); in Generate()
5155 __ bind(&miss); in Generate()
5159 __ TryGetFunctionPrototype(function, prototype, scratch, &slow, true); in Generate()
5162 __ JumpIfSmi(prototype, &slow); in Generate()
5163 __ IsObjectJSObjectType(prototype, scratch, scratch, &slow); in Generate()
5168 __ mov(scratch, Immediate(Heap::kInstanceofCacheMapRootIndex)); in Generate()
5169 __ mov(Operand::StaticArray(scratch, times_pointer_size, roots_array_start), in Generate()
5171 __ mov(scratch, Immediate(Heap::kInstanceofCacheFunctionRootIndex)); in Generate()
5172 __ mov(Operand::StaticArray(scratch, times_pointer_size, roots_array_start), in Generate()
5179 __ mov(scratch, Operand(esp, 0 * kPointerSize)); in Generate()
5180 __ sub(scratch, Operand(esp, 1 * kPointerSize)); in Generate()
5182 __ cmpb(Operand(scratch, 0), kCmpEdiOperandByte1); in Generate()
5183 __ Assert(equal, "InstanceofStub unexpected call site cache (cmp 1)"); in Generate()
5184 __ cmpb(Operand(scratch, 1), kCmpEdiOperandByte2); in Generate()
5185 __ Assert(equal, "InstanceofStub unexpected call site cache (cmp 2)"); in Generate()
5187 __ mov(scratch, Operand(scratch, kDeltaToCmpImmediate)); in Generate()
5188 __ mov(Operand(scratch, 0), map); in Generate()
5193 __ mov(scratch, FieldOperand(map, Map::kPrototypeOffset)); in Generate()
5195 __ bind(&loop); in Generate()
5196 __ cmp(scratch, prototype); in Generate()
5197 __ j(equal, &is_instance, Label::kNear); in Generate()
5199 __ cmp(scratch, Immediate(factory->null_value())); in Generate()
5200 __ j(equal, &is_not_instance, Label::kNear); in Generate()
5201 __ mov(scratch, FieldOperand(scratch, HeapObject::kMapOffset)); in Generate()
5202 __ mov(scratch, FieldOperand(scratch, Map::kPrototypeOffset)); in Generate()
5203 __ jmp(&loop); in Generate()
5205 __ bind(&is_instance); in Generate()
5207 __ Set(eax, Immediate(0)); in Generate()
5208 __ mov(scratch, Immediate(Heap::kInstanceofCacheAnswerRootIndex)); in Generate()
5209 __ mov(Operand::StaticArray(scratch, in Generate()
5213 __ mov(eax, factory->true_value()); in Generate()
5214 __ mov(scratch, Operand(esp, 0 * kPointerSize)); in Generate()
5215 __ sub(scratch, Operand(esp, 1 * kPointerSize)); in Generate()
5217 __ cmpb(Operand(scratch, kDeltaToMov), kMovEaxImmediateByte); in Generate()
5218 __ Assert(equal, "InstanceofStub unexpected call site cache (mov)"); in Generate()
5220 __ mov(Operand(scratch, kDeltaToMovImmediate), eax); in Generate()
5222 __ Set(eax, Immediate(0)); in Generate()
5225 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); in Generate()
5227 __ bind(&is_not_instance); in Generate()
5229 __ Set(eax, Immediate(Smi::FromInt(1))); in Generate()
5230 __ mov(scratch, Immediate(Heap::kInstanceofCacheAnswerRootIndex)); in Generate()
5231 __ mov(Operand::StaticArray( in Generate()
5235 __ mov(eax, factory->false_value()); in Generate()
5236 __ mov(scratch, Operand(esp, 0 * kPointerSize)); in Generate()
5237 __ sub(scratch, Operand(esp, 1 * kPointerSize)); in Generate()
5239 __ cmpb(Operand(scratch, kDeltaToMov), kMovEaxImmediateByte); in Generate()
5240 __ Assert(equal, "InstanceofStub unexpected call site cache (mov)"); in Generate()
5242 __ mov(Operand(scratch, kDeltaToMovImmediate), eax); in Generate()
5244 __ Set(eax, Immediate(Smi::FromInt(1))); in Generate()
5247 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); in Generate()
5250 __ bind(&not_js_object); in Generate()
5253 __ JumpIfSmi(function, &slow, Label::kNear); in Generate()
5254 __ CmpObjectType(function, JS_FUNCTION_TYPE, scratch); in Generate()
5255 __ j(not_equal, &slow, Label::kNear); in Generate()
5258 __ cmp(object, factory->null_value()); in Generate()
5259 __ j(not_equal, &object_not_null, Label::kNear); in Generate()
5260 __ Set(eax, Immediate(Smi::FromInt(1))); in Generate()
5261 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); in Generate()
5263 __ bind(&object_not_null); in Generate()
5265 __ JumpIfNotSmi(object, &object_not_null_or_smi, Label::kNear); in Generate()
5266 __ Set(eax, Immediate(Smi::FromInt(1))); in Generate()
5267 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); in Generate()
5269 __ bind(&object_not_null_or_smi); in Generate()
5272 __ j(NegateCondition(is_string), &slow, Label::kNear); in Generate()
5273 __ Set(eax, Immediate(Smi::FromInt(1))); in Generate()
5274 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); in Generate()
5277 __ bind(&slow); in Generate()
5282 __ pop(scratch); in Generate()
5283 __ push(object); in Generate()
5284 __ push(function); in Generate()
5285 __ push(scratch); in Generate()
5287 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); in Generate()
5292 __ push(object); in Generate()
5293 __ push(function); in Generate()
5294 __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION); in Generate()
5297 __ test(eax, eax); in Generate()
5298 __ j(zero, &true_value, Label::kNear); in Generate()
5299 __ mov(eax, factory->false_value()); in Generate()
5300 __ jmp(&done, Label::kNear); in Generate()
5301 __ bind(&true_value); in Generate()
5302 __ mov(eax, factory->true_value()); in Generate()
5303 __ bind(&done); in Generate()
5304 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); in Generate()
5359 __ JumpIfSmi(object_, receiver_not_string_); in GenerateFast()
5362 __ mov(result_, FieldOperand(object_, HeapObject::kMapOffset)); in GenerateFast()
5363 __ movzx_b(result_, FieldOperand(result_, Map::kInstanceTypeOffset)); in GenerateFast()
5365 __ test(result_, Immediate(kIsNotStringMask)); in GenerateFast()
5366 __ j(not_zero, receiver_not_string_); in GenerateFast()
5370 __ JumpIfNotSmi(index_, &index_not_smi_); in GenerateFast()
5371 __ bind(&got_smi_index_); in GenerateFast()
5374 __ cmp(index_, FieldOperand(object_, String::kLengthOffset)); in GenerateFast()
5375 __ j(above_equal, index_out_of_range_); in GenerateFast()
5377 __ SmiUntag(index_); in GenerateFast()
5383 __ SmiTag(result_); in GenerateFast()
5384 __ bind(&exit_); in GenerateFast()
5391 __ Abort("Unexpected fallthrough to CharCodeAt slow case"); in GenerateSlow()
5394 __ bind(&index_not_smi_); in GenerateSlow()
5396 __ CheckMap(index_, in GenerateSlow()
5401 __ push(object_); in GenerateSlow()
5402 __ push(index_); // Consumed by runtime conversion function. in GenerateSlow()
5404 __ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1); in GenerateSlow()
5408 __ CallRuntime(Runtime::kNumberToSmi, 1); in GenerateSlow()
5413 __ mov(index_, eax); in GenerateSlow()
5415 __ pop(object_); in GenerateSlow()
5417 __ mov(result_, FieldOperand(object_, HeapObject::kMapOffset)); in GenerateSlow()
5418 __ movzx_b(result_, FieldOperand(result_, Map::kInstanceTypeOffset)); in GenerateSlow()
5422 __ JumpIfNotSmi(index_, index_out_of_range_); in GenerateSlow()
5424 __ jmp(&got_smi_index_); in GenerateSlow()
5429 __ bind(&call_runtime_); in GenerateSlow()
5431 __ push(object_); in GenerateSlow()
5432 __ SmiTag(index_); in GenerateSlow()
5433 __ push(index_); in GenerateSlow()
5434 __ CallRuntime(Runtime::kStringCharCodeAt, 2); in GenerateSlow()
5436 __ mov(result_, eax); in GenerateSlow()
5439 __ jmp(&exit_); in GenerateSlow()
5441 __ Abort("Unexpected fallthrough from CharCodeAt slow case"); in GenerateSlow()
5453 __ test(code_, in GenerateFast()
5456 __ j(not_zero, &slow_case_); in GenerateFast()
5459 __ Set(result_, Immediate(factory->single_character_string_cache())); in GenerateFast()
5464 __ mov(result_, FieldOperand(result_, in GenerateFast()
5467 __ cmp(result_, factory->undefined_value()); in GenerateFast()
5468 __ j(equal, &slow_case_); in GenerateFast()
5469 __ bind(&exit_); in GenerateFast()
5476 __ Abort("Unexpected fallthrough to CharFromCode slow case"); in GenerateSlow()
5478 __ bind(&slow_case_); in GenerateSlow()
5480 __ push(code_); in GenerateSlow()
5481 __ CallRuntime(Runtime::kCharFromCode, 1); in GenerateSlow()
5483 __ mov(result_, eax); in GenerateSlow()
5486 __ jmp(&exit_); in GenerateSlow()
5488 __ Abort("Unexpected fallthrough from CharFromCode slow case"); in GenerateSlow()
5514 __ mov(eax, Operand(esp, 2 * kPointerSize)); // First argument. in Generate()
5515 __ mov(edx, Operand(esp, 1 * kPointerSize)); // Second argument. in Generate()
5519 __ JumpIfSmi(eax, &call_runtime); in Generate()
5520 __ CmpObjectType(eax, FIRST_NONSTRING_TYPE, ebx); in Generate()
5521 __ j(above_equal, &call_runtime); in Generate()
5524 __ JumpIfSmi(edx, &call_runtime); in Generate()
5525 __ CmpObjectType(edx, FIRST_NONSTRING_TYPE, ebx); in Generate()
5526 __ j(above_equal, &call_runtime); in Generate()
5548 __ mov(ecx, FieldOperand(edx, String::kLengthOffset)); in Generate()
5550 __ test(ecx, ecx); in Generate()
5551 __ j(not_zero, &second_not_zero_length, Label::kNear); in Generate()
5554 __ IncrementCounter(counters->string_add_native(), 1); in Generate()
5555 __ ret(2 * kPointerSize); in Generate()
5556 __ bind(&second_not_zero_length); in Generate()
5557 __ mov(ebx, FieldOperand(eax, String::kLengthOffset)); in Generate()
5559 __ test(ebx, ebx); in Generate()
5560 __ j(not_zero, &both_not_zero_length, Label::kNear); in Generate()
5562 __ mov(eax, edx); in Generate()
5563 __ IncrementCounter(counters->string_add_native(), 1); in Generate()
5564 __ ret(2 * kPointerSize); in Generate()
5573 __ bind(&both_not_zero_length); in Generate()
5574 __ add(ebx, ecx); in Generate()
5577 __ j(overflow, &call_runtime); in Generate()
5580 __ cmp(ebx, Immediate(Smi::FromInt(2))); in Generate()
5581 __ j(not_equal, &longer_than_two); in Generate()
5584 __ JumpIfNotBothSequentialAsciiStrings(eax, edx, ebx, ecx, &call_runtime); in Generate()
5587 __ movzx_b(ebx, FieldOperand(eax, SeqAsciiString::kHeaderSize)); in Generate()
5588 __ movzx_b(ecx, FieldOperand(edx, SeqAsciiString::kHeaderSize)); in Generate()
5596 __ IncrementCounter(counters->string_add_native(), 1); in Generate()
5597 __ ret(2 * kPointerSize); in Generate()
5600 __ bind(&make_two_character_string); in Generate()
5602 __ mov(eax, Operand(esp, 2 * kPointerSize)); // First argument. in Generate()
5603 __ mov(edx, Operand(esp, 1 * kPointerSize)); // Second argument. in Generate()
5605 __ movzx_b(ebx, FieldOperand(eax, SeqAsciiString::kHeaderSize)); in Generate()
5606 __ movzx_b(ecx, FieldOperand(edx, SeqAsciiString::kHeaderSize)); in Generate()
5607 __ bind(&make_two_character_string_no_reload); in Generate()
5608 __ IncrementCounter(counters->string_add_make_two_char(), 1); in Generate()
5609 __ AllocateAsciiString(eax, 2, edi, edx, &call_runtime); in Generate()
5611 __ shl(ecx, kBitsPerByte); in Generate()
5612 __ or_(ebx, ecx); in Generate()
5614 __ mov_w(FieldOperand(eax, SeqAsciiString::kHeaderSize), ebx); in Generate()
5615 __ IncrementCounter(counters->string_add_native(), 1); in Generate()
5616 __ ret(2 * kPointerSize); in Generate()
5618 __ bind(&longer_than_two); in Generate()
5620 __ cmp(ebx, Immediate(Smi::FromInt(ConsString::kMinLength))); in Generate()
5621 __ j(below, &string_add_flat_result); in Generate()
5626 __ mov(edi, FieldOperand(eax, HeapObject::kMapOffset)); in Generate()
5627 __ movzx_b(ecx, FieldOperand(edi, Map::kInstanceTypeOffset)); in Generate()
5628 __ mov(edi, FieldOperand(edx, HeapObject::kMapOffset)); in Generate()
5629 __ movzx_b(edi, FieldOperand(edi, Map::kInstanceTypeOffset)); in Generate()
5630 __ and_(ecx, edi); in Generate()
5633 __ test(ecx, Immediate(kStringEncodingMask)); in Generate()
5634 __ j(zero, &non_ascii); in Generate()
5635 __ bind(&ascii_data); in Generate()
5637 __ AllocateAsciiConsString(ecx, edi, no_reg, &call_runtime); in Generate()
5638 __ bind(&allocated); in Generate()
5640 if (FLAG_debug_code) __ AbortIfNotSmi(ebx); in Generate()
5641 __ mov(FieldOperand(ecx, ConsString::kLengthOffset), ebx); in Generate()
5642 __ mov(FieldOperand(ecx, ConsString::kHashFieldOffset), in Generate()
5644 __ mov(FieldOperand(ecx, ConsString::kFirstOffset), eax); in Generate()
5645 __ mov(FieldOperand(ecx, ConsString::kSecondOffset), edx); in Generate()
5646 __ mov(eax, ecx); in Generate()
5647 __ IncrementCounter(counters->string_add_native(), 1); in Generate()
5648 __ ret(2 * kPointerSize); in Generate()
5649 __ bind(&non_ascii); in Generate()
5654 __ test(ecx, Immediate(kAsciiDataHintMask)); in Generate()
5655 __ j(not_zero, &ascii_data); in Generate()
5656 __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset)); in Generate()
5657 __ movzx_b(ecx, FieldOperand(ecx, Map::kInstanceTypeOffset)); in Generate()
5658 __ xor_(edi, ecx); in Generate()
5660 __ and_(edi, kAsciiStringTag | kAsciiDataHintTag); in Generate()
5661 __ cmp(edi, kAsciiStringTag | kAsciiDataHintTag); in Generate()
5662 __ j(equal, &ascii_data); in Generate()
5664 __ AllocateTwoByteConsString(ecx, edi, no_reg, &call_runtime); in Generate()
5665 __ jmp(&allocated); in Generate()
5676 __ bind(&string_add_flat_result); in Generate()
5677 __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset)); in Generate()
5678 __ movzx_b(ecx, FieldOperand(ecx, Map::kInstanceTypeOffset)); in Generate()
5681 __ test_b(ecx, kStringRepresentationMask); in Generate()
5682 __ j(zero, &first_is_sequential, Label::kNear); in Generate()
5685 __ test_b(ecx, kShortExternalStringMask); in Generate()
5686 __ j(not_zero, &call_runtime); in Generate()
5687 __ mov(eax, FieldOperand(eax, ExternalString::kResourceDataOffset)); in Generate()
5689 __ jmp(&first_prepared, Label::kNear); in Generate()
5690 __ bind(&first_is_sequential); in Generate()
5691 __ add(eax, Immediate(SeqAsciiString::kHeaderSize - kHeapObjectTag)); in Generate()
5692 __ bind(&first_prepared); in Generate()
5694 __ mov(edi, FieldOperand(edx, HeapObject::kMapOffset)); in Generate()
5695 __ movzx_b(edi, FieldOperand(edi, Map::kInstanceTypeOffset)); in Generate()
5698 __ xor_(ecx, edi); in Generate()
5699 __ test_b(ecx, kStringEncodingMask); in Generate()
5700 __ j(not_zero, &call_runtime); in Generate()
5702 __ test_b(edi, kStringRepresentationMask); in Generate()
5703 __ j(zero, &second_is_sequential, Label::kNear); in Generate()
5706 __ test_b(edi, kShortExternalStringMask); in Generate()
5707 __ j(not_zero, &call_runtime); in Generate()
5708 __ mov(edx, FieldOperand(edx, ExternalString::kResourceDataOffset)); in Generate()
5710 __ jmp(&second_prepared, Label::kNear); in Generate()
5711 __ bind(&second_is_sequential); in Generate()
5712 __ add(edx, Immediate(SeqAsciiString::kHeaderSize - kHeapObjectTag)); in Generate()
5713 __ bind(&second_prepared); in Generate()
5716 __ push(edx); in Generate()
5717 __ push(eax); in Generate()
5723 __ test_b(edi, kStringEncodingMask); in Generate()
5724 __ j(zero, &non_ascii_string_add_flat_result); in Generate()
5728 __ SmiUntag(ebx); in Generate()
5729 __ AllocateAsciiString(eax, ebx, ecx, edx, edi, &call_runtime_drop_two); in Generate()
5731 __ mov(ecx, eax); in Generate()
5733 __ add(ecx, Immediate(SeqAsciiString::kHeaderSize - kHeapObjectTag)); in Generate()
5736 __ mov(edx, Operand(esp, 4 * kPointerSize)); in Generate()
5737 __ mov(edi, FieldOperand(edx, String::kLengthOffset)); in Generate()
5738 __ SmiUntag(edi); in Generate()
5739 __ pop(edx); in Generate()
5747 __ mov(edx, Operand(esp, 2 * kPointerSize)); in Generate()
5748 __ mov(edi, FieldOperand(edx, String::kLengthOffset)); in Generate()
5749 __ SmiUntag(edi); in Generate()
5750 __ pop(edx); in Generate()
5756 __ IncrementCounter(counters->string_add_native(), 1); in Generate()
5757 __ ret(2 * kPointerSize); in Generate()
5763 __ bind(&non_ascii_string_add_flat_result); in Generate()
5765 __ SmiUntag(ebx); in Generate()
5766 __ AllocateTwoByteString(eax, ebx, ecx, edx, edi, &call_runtime_drop_two); in Generate()
5768 __ mov(ecx, eax); in Generate()
5770 __ add(ecx, Immediate(SeqTwoByteString::kHeaderSize - kHeapObjectTag)); in Generate()
5773 __ mov(edx, Operand(esp, 4 * kPointerSize)); in Generate()
5774 __ mov(edi, FieldOperand(edx, String::kLengthOffset)); in Generate()
5775 __ SmiUntag(edi); in Generate()
5776 __ pop(edx); in Generate()
5784 __ mov(edx, Operand(esp, 2 * kPointerSize)); in Generate()
5785 __ mov(edi, FieldOperand(edx, String::kLengthOffset)); in Generate()
5786 __ SmiUntag(edi); in Generate()
5787 __ pop(edx); in Generate()
5793 __ IncrementCounter(counters->string_add_native(), 1); in Generate()
5794 __ ret(2 * kPointerSize); in Generate()
5797 __ bind(&call_runtime_drop_two); in Generate()
5798 __ Drop(2); in Generate()
5800 __ bind(&call_runtime); in Generate()
5801 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); in Generate()
5804 __ bind(&call_builtin); in Generate()
5805 __ InvokeBuiltin(builtin_id, JUMP_FUNCTION); in Generate()
5819 __ JumpIfSmi(arg, &not_string); in GenerateConvertArgument()
5820 __ CmpObjectType(arg, FIRST_NONSTRING_TYPE, scratch1); in GenerateConvertArgument()
5821 __ j(below, &done); in GenerateConvertArgument()
5825 __ bind(&not_string); in GenerateConvertArgument()
5834 __ mov(arg, scratch1); in GenerateConvertArgument()
5835 __ mov(Operand(esp, stack_offset), arg); in GenerateConvertArgument()
5836 __ jmp(&done); in GenerateConvertArgument()
5839 __ bind(&not_cached); in GenerateConvertArgument()
5840 __ JumpIfSmi(arg, slow); in GenerateConvertArgument()
5841 __ CmpObjectType(arg, JS_VALUE_TYPE, scratch1); // map -> scratch1. in GenerateConvertArgument()
5842 __ j(not_equal, slow); in GenerateConvertArgument()
5843 __ test_b(FieldOperand(scratch1, Map::kBitField2Offset), in GenerateConvertArgument()
5845 __ j(zero, slow); in GenerateConvertArgument()
5846 __ mov(arg, FieldOperand(arg, JSValue::kValueOffset)); in GenerateConvertArgument()
5847 __ mov(Operand(esp, stack_offset), arg); in GenerateConvertArgument()
5849 __ bind(&done); in GenerateConvertArgument()
5860 __ bind(&loop); in GenerateCopyCharacters()
5864 __ mov_b(scratch, Operand(src, 0)); in GenerateCopyCharacters()
5865 __ mov_b(Operand(dest, 0), scratch); in GenerateCopyCharacters()
5866 __ add(src, Immediate(1)); in GenerateCopyCharacters()
5867 __ add(dest, Immediate(1)); in GenerateCopyCharacters()
5869 __ mov_w(scratch, Operand(src, 0)); in GenerateCopyCharacters()
5870 __ mov_w(Operand(dest, 0), scratch); in GenerateCopyCharacters()
5871 __ add(src, Immediate(2)); in GenerateCopyCharacters()
5872 __ add(dest, Immediate(2)); in GenerateCopyCharacters()
5874 __ sub(count, Immediate(1)); in GenerateCopyCharacters()
5875 __ j(not_zero, &loop); in GenerateCopyCharacters()
5897 __ test(count, count); in GenerateCopyCharactersREP()
5898 __ j(zero, &done); in GenerateCopyCharactersREP()
5902 __ shl(count, 1); in GenerateCopyCharactersREP()
5907 __ test(count, Immediate(~3)); in GenerateCopyCharactersREP()
5908 __ j(zero, &last_bytes, Label::kNear); in GenerateCopyCharactersREP()
5911 __ mov(scratch, count); in GenerateCopyCharactersREP()
5912 __ sar(count, 2); // Number of doublewords to copy. in GenerateCopyCharactersREP()
5913 __ cld(); in GenerateCopyCharactersREP()
5914 __ rep_movs(); in GenerateCopyCharactersREP()
5917 __ mov(count, scratch); in GenerateCopyCharactersREP()
5918 __ and_(count, 3); in GenerateCopyCharactersREP()
5921 __ bind(&last_bytes); in GenerateCopyCharactersREP()
5922 __ test(count, count); in GenerateCopyCharactersREP()
5923 __ j(zero, &done); in GenerateCopyCharactersREP()
5927 __ bind(&loop); in GenerateCopyCharactersREP()
5928 __ mov_b(scratch, Operand(src, 0)); in GenerateCopyCharactersREP()
5929 __ mov_b(Operand(dest, 0), scratch); in GenerateCopyCharactersREP()
5930 __ add(src, Immediate(1)); in GenerateCopyCharactersREP()
5931 __ add(dest, Immediate(1)); in GenerateCopyCharactersREP()
5932 __ sub(count, Immediate(1)); in GenerateCopyCharactersREP()
5933 __ j(not_zero, &loop); in GenerateCopyCharactersREP()
5935 __ bind(&done); in GenerateCopyCharactersREP()
5953 __ mov(scratch, c1); in GenerateTwoCharacterSymbolTableProbe()
5954 __ sub(scratch, Immediate(static_cast<int>('0'))); in GenerateTwoCharacterSymbolTableProbe()
5955 __ cmp(scratch, Immediate(static_cast<int>('9' - '0'))); in GenerateTwoCharacterSymbolTableProbe()
5956 __ j(above, &not_array_index, Label::kNear); in GenerateTwoCharacterSymbolTableProbe()
5957 __ mov(scratch, c2); in GenerateTwoCharacterSymbolTableProbe()
5958 __ sub(scratch, Immediate(static_cast<int>('0'))); in GenerateTwoCharacterSymbolTableProbe()
5959 __ cmp(scratch, Immediate(static_cast<int>('9' - '0'))); in GenerateTwoCharacterSymbolTableProbe()
5960 __ j(below_equal, not_probed); in GenerateTwoCharacterSymbolTableProbe()
5962 __ bind(&not_array_index); in GenerateTwoCharacterSymbolTableProbe()
5971 __ shl(c2, kBitsPerByte); in GenerateTwoCharacterSymbolTableProbe()
5972 __ or_(chars, c2); in GenerateTwoCharacterSymbolTableProbe()
5981 __ mov(scratch, Immediate(Heap::kSymbolTableRootIndex)); in GenerateTwoCharacterSymbolTableProbe()
5982 __ mov(symbol_table, in GenerateTwoCharacterSymbolTableProbe()
5987 __ mov(mask, FieldOperand(symbol_table, SymbolTable::kCapacityOffset)); in GenerateTwoCharacterSymbolTableProbe()
5988 __ SmiUntag(mask); in GenerateTwoCharacterSymbolTableProbe()
5989 __ sub(mask, Immediate(1)); in GenerateTwoCharacterSymbolTableProbe()
6005 __ mov(scratch, hash); in GenerateTwoCharacterSymbolTableProbe()
6007 __ add(scratch, Immediate(SymbolTable::GetProbeOffset(i))); in GenerateTwoCharacterSymbolTableProbe()
6009 __ and_(scratch, mask); in GenerateTwoCharacterSymbolTableProbe()
6013 __ mov(candidate, in GenerateTwoCharacterSymbolTableProbe()
6021 __ cmp(candidate, factory->undefined_value()); in GenerateTwoCharacterSymbolTableProbe()
6022 __ j(equal, not_found); in GenerateTwoCharacterSymbolTableProbe()
6023 __ cmp(candidate, factory->the_hole_value()); in GenerateTwoCharacterSymbolTableProbe()
6024 __ j(equal, &next_probe[i]); in GenerateTwoCharacterSymbolTableProbe()
6027 __ cmp(FieldOperand(candidate, String::kLengthOffset), in GenerateTwoCharacterSymbolTableProbe()
6029 __ j(not_equal, &next_probe[i]); in GenerateTwoCharacterSymbolTableProbe()
6033 __ push(mask); in GenerateTwoCharacterSymbolTableProbe()
6037 __ mov(temp, FieldOperand(candidate, HeapObject::kMapOffset)); in GenerateTwoCharacterSymbolTableProbe()
6038 __ movzx_b(temp, FieldOperand(temp, Map::kInstanceTypeOffset)); in GenerateTwoCharacterSymbolTableProbe()
6039 __ JumpIfInstanceTypeIsNotSequentialAscii( in GenerateTwoCharacterSymbolTableProbe()
6043 __ mov(temp, FieldOperand(candidate, SeqAsciiString::kHeaderSize)); in GenerateTwoCharacterSymbolTableProbe()
6044 __ and_(temp, 0x0000ffff); in GenerateTwoCharacterSymbolTableProbe()
6045 __ cmp(chars, temp); in GenerateTwoCharacterSymbolTableProbe()
6046 __ j(equal, &found_in_symbol_table); in GenerateTwoCharacterSymbolTableProbe()
6047 __ bind(&next_probe_pop_mask[i]); in GenerateTwoCharacterSymbolTableProbe()
6048 __ pop(mask); in GenerateTwoCharacterSymbolTableProbe()
6049 __ bind(&next_probe[i]); in GenerateTwoCharacterSymbolTableProbe()
6053 __ jmp(not_found); in GenerateTwoCharacterSymbolTableProbe()
6057 __ bind(&found_in_symbol_table); in GenerateTwoCharacterSymbolTableProbe()
6058 __ pop(mask); // Pop saved mask from the stack. in GenerateTwoCharacterSymbolTableProbe()
6060 __ mov(eax, result); in GenerateTwoCharacterSymbolTableProbe()
6073 __ mov(scratch, Immediate(Heap::kHashSeedRootIndex)); in GenerateHashInit()
6074 __ mov(scratch, Operand::StaticArray(scratch, in GenerateHashInit()
6077 __ SmiUntag(scratch); in GenerateHashInit()
6078 __ add(scratch, character); in GenerateHashInit()
6079 __ mov(hash, scratch); in GenerateHashInit()
6080 __ shl(scratch, 10); in GenerateHashInit()
6081 __ add(hash, scratch); in GenerateHashInit()
6084 __ lea(scratch, Operand(character, seed)); in GenerateHashInit()
6085 __ shl(scratch, 10); in GenerateHashInit()
6086 __ lea(hash, Operand(scratch, character, times_1, seed)); in GenerateHashInit()
6089 __ mov(scratch, hash); in GenerateHashInit()
6090 __ shr(scratch, 6); in GenerateHashInit()
6091 __ xor_(hash, scratch); in GenerateHashInit()
6100 __ add(hash, character); in GenerateHashAddCharacter()
6102 __ mov(scratch, hash); in GenerateHashAddCharacter()
6103 __ shl(scratch, 10); in GenerateHashAddCharacter()
6104 __ add(hash, scratch); in GenerateHashAddCharacter()
6106 __ mov(scratch, hash); in GenerateHashAddCharacter()
6107 __ shr(scratch, 6); in GenerateHashAddCharacter()
6108 __ xor_(hash, scratch); in GenerateHashAddCharacter()
6116 __ mov(scratch, hash); in GenerateHashGetHash()
6117 __ shl(scratch, 3); in GenerateHashGetHash()
6118 __ add(hash, scratch); in GenerateHashGetHash()
6120 __ mov(scratch, hash); in GenerateHashGetHash()
6121 __ shr(scratch, 11); in GenerateHashGetHash()
6122 __ xor_(hash, scratch); in GenerateHashGetHash()
6124 __ mov(scratch, hash); in GenerateHashGetHash()
6125 __ shl(scratch, 15); in GenerateHashGetHash()
6126 __ add(hash, scratch); in GenerateHashGetHash()
6128 __ and_(hash, String::kHashBitMask); in GenerateHashGetHash()
6132 __ j(not_zero, &hash_not_zero, Label::kNear); in GenerateHashGetHash()
6133 __ mov(hash, Immediate(StringHasher::kZeroHash)); in GenerateHashGetHash()
6134 __ bind(&hash_not_zero); in GenerateHashGetHash()
6148 __ mov(eax, Operand(esp, 3 * kPointerSize)); in Generate()
6150 __ JumpIfSmi(eax, &runtime); in Generate()
6152 __ j(NegateCondition(is_string), &runtime); in Generate()
6158 __ mov(ecx, Operand(esp, 1 * kPointerSize)); // To index. in Generate()
6159 __ JumpIfNotSmi(ecx, &runtime); in Generate()
6160 __ mov(edx, Operand(esp, 2 * kPointerSize)); // From index. in Generate()
6161 __ JumpIfNotSmi(edx, &runtime); in Generate()
6162 __ sub(ecx, edx); in Generate()
6163 __ cmp(ecx, FieldOperand(eax, String::kLengthOffset)); in Generate()
6165 __ j(not_equal, &not_original_string, Label::kNear); in Generate()
6167 __ IncrementCounter(counters->sub_string_native(), 1); in Generate()
6168 __ ret(3 * kPointerSize); in Generate()
6169 __ bind(&not_original_string); in Generate()
6181 __ test(ebx, Immediate(kIsIndirectStringMask)); in Generate()
6182 __ j(zero, &seq_or_external_string, Label::kNear); in Generate()
6185 __ test(ebx, Immediate(kSlicedNotConsMask)); in Generate()
6186 __ j(not_zero, &sliced_string, Label::kNear); in Generate()
6189 __ cmp(FieldOperand(eax, ConsString::kSecondOffset), in Generate()
6191 __ j(not_equal, &runtime); in Generate()
6192 __ mov(edi, FieldOperand(eax, ConsString::kFirstOffset)); in Generate()
6194 __ mov(ebx, FieldOperand(edi, HeapObject::kMapOffset)); in Generate()
6195 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); in Generate()
6196 __ jmp(&underlying_unpacked, Label::kNear); in Generate()
6198 __ bind(&sliced_string); in Generate()
6200 __ add(edx, FieldOperand(eax, SlicedString::kOffsetOffset)); in Generate()
6201 __ mov(edi, FieldOperand(eax, SlicedString::kParentOffset)); in Generate()
6203 __ mov(ebx, FieldOperand(edi, HeapObject::kMapOffset)); in Generate()
6204 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); in Generate()
6205 __ jmp(&underlying_unpacked, Label::kNear); in Generate()
6207 __ bind(&seq_or_external_string); in Generate()
6209 __ mov(edi, eax); in Generate()
6211 __ bind(&underlying_unpacked); in Generate()
6219 __ cmp(ecx, Immediate(Smi::FromInt(SlicedString::kMinLength))); in Generate()
6221 __ j(less, &copy_routine); in Generate()
6230 __ test(ebx, Immediate(kStringEncodingMask)); in Generate()
6231 __ j(zero, &two_byte_slice, Label::kNear); in Generate()
6232 __ AllocateAsciiSlicedString(eax, ebx, no_reg, &runtime); in Generate()
6233 __ jmp(&set_slice_header, Label::kNear); in Generate()
6234 __ bind(&two_byte_slice); in Generate()
6235 __ AllocateTwoByteSlicedString(eax, ebx, no_reg, &runtime); in Generate()
6236 __ bind(&set_slice_header); in Generate()
6237 __ mov(FieldOperand(eax, SlicedString::kLengthOffset), ecx); in Generate()
6238 __ mov(FieldOperand(eax, SlicedString::kHashFieldOffset), in Generate()
6240 __ mov(FieldOperand(eax, SlicedString::kParentOffset), edi); in Generate()
6241 __ mov(FieldOperand(eax, SlicedString::kOffsetOffset), edx); in Generate()
6242 __ IncrementCounter(counters->sub_string_native(), 1); in Generate()
6243 __ ret(3 * kPointerSize); in Generate()
6245 __ bind(&copy_routine); in Generate()
6257 __ test_b(ebx, kExternalStringTag); in Generate()
6258 __ j(zero, &sequential_string); in Generate()
6263 __ test_b(ebx, kShortExternalStringMask); in Generate()
6264 __ j(not_zero, &runtime); in Generate()
6265 __ mov(edi, FieldOperand(edi, ExternalString::kResourceDataOffset)); in Generate()
6268 __ sub(edi, Immediate(SeqTwoByteString::kHeaderSize - kHeapObjectTag)); in Generate()
6270 __ bind(&sequential_string); in Generate()
6272 __ push(edx); in Generate()
6273 __ push(edi); in Generate()
6274 __ SmiUntag(ecx); in Generate()
6276 __ test_b(ebx, kStringEncodingMask); in Generate()
6277 __ j(zero, &two_byte_sequential); in Generate()
6280 __ AllocateAsciiString(eax, ecx, ebx, edx, edi, &runtime_drop_two); in Generate()
6284 __ mov(edx, esi); // esi used by following code. in Generate()
6286 __ mov(edi, eax); in Generate()
6287 __ add(edi, Immediate(SeqAsciiString::kHeaderSize - kHeapObjectTag)); in Generate()
6289 __ pop(esi); in Generate()
6290 __ pop(ebx); in Generate()
6291 __ SmiUntag(ebx); in Generate()
6292 __ lea(esi, FieldOperand(esi, ebx, times_1, SeqAsciiString::kHeaderSize)); in Generate()
6300 __ mov(esi, edx); // Restore esi. in Generate()
6301 __ IncrementCounter(counters->sub_string_native(), 1); in Generate()
6302 __ ret(3 * kPointerSize); in Generate()
6304 __ bind(&two_byte_sequential); in Generate()
6306 __ AllocateTwoByteString(eax, ecx, ebx, edx, edi, &runtime_drop_two); in Generate()
6310 __ mov(edx, esi); // esi used by following code. in Generate()
6312 __ mov(edi, eax); in Generate()
6313 __ add(edi, in Generate()
6316 __ pop(esi); in Generate()
6317 __ pop(ebx); in Generate()
6322 __ lea(esi, FieldOperand(esi, ebx, times_1, SeqTwoByteString::kHeaderSize)); in Generate()
6330 __ mov(esi, edx); // Restore esi. in Generate()
6331 __ IncrementCounter(counters->sub_string_native(), 1); in Generate()
6332 __ ret(3 * kPointerSize); in Generate()
6335 __ bind(&runtime_drop_two); in Generate()
6336 __ Drop(2); in Generate()
6339 __ bind(&runtime); in Generate()
6340 __ TailCallRuntime(Runtime::kSubString, 3, 1); in Generate()
6353 __ mov(length, FieldOperand(left, String::kLengthOffset)); in GenerateFlatAsciiStringEquals()
6354 __ cmp(length, FieldOperand(right, String::kLengthOffset)); in GenerateFlatAsciiStringEquals()
6355 __ j(equal, &check_zero_length, Label::kNear); in GenerateFlatAsciiStringEquals()
6356 __ bind(&strings_not_equal); in GenerateFlatAsciiStringEquals()
6357 __ Set(eax, Immediate(Smi::FromInt(NOT_EQUAL))); in GenerateFlatAsciiStringEquals()
6358 __ ret(0); in GenerateFlatAsciiStringEquals()
6362 __ bind(&check_zero_length); in GenerateFlatAsciiStringEquals()
6364 __ test(length, length); in GenerateFlatAsciiStringEquals()
6365 __ j(not_zero, &compare_chars, Label::kNear); in GenerateFlatAsciiStringEquals()
6366 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); in GenerateFlatAsciiStringEquals()
6367 __ ret(0); in GenerateFlatAsciiStringEquals()
6370 __ bind(&compare_chars); in GenerateFlatAsciiStringEquals()
6375 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); in GenerateFlatAsciiStringEquals()
6376 __ ret(0); in GenerateFlatAsciiStringEquals()
6387 __ IncrementCounter(counters->string_compare_native(), 1); in GenerateCompareFlatAsciiStrings()
6391 __ mov(scratch1, FieldOperand(left, String::kLengthOffset)); in GenerateCompareFlatAsciiStrings()
6392 __ mov(scratch3, scratch1); in GenerateCompareFlatAsciiStrings()
6393 __ sub(scratch3, FieldOperand(right, String::kLengthOffset)); in GenerateCompareFlatAsciiStrings()
6397 __ j(less_equal, &left_shorter, Label::kNear); in GenerateCompareFlatAsciiStrings()
6399 __ sub(scratch1, length_delta); in GenerateCompareFlatAsciiStrings()
6400 __ bind(&left_shorter); in GenerateCompareFlatAsciiStrings()
6406 __ test(min_length, min_length); in GenerateCompareFlatAsciiStrings()
6407 __ j(zero, &compare_lengths, Label::kNear); in GenerateCompareFlatAsciiStrings()
6415 __ bind(&compare_lengths); in GenerateCompareFlatAsciiStrings()
6416 __ test(length_delta, length_delta); in GenerateCompareFlatAsciiStrings()
6417 __ j(not_zero, &result_not_equal, Label::kNear); in GenerateCompareFlatAsciiStrings()
6422 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); in GenerateCompareFlatAsciiStrings()
6423 __ ret(0); in GenerateCompareFlatAsciiStrings()
6426 __ bind(&result_not_equal); in GenerateCompareFlatAsciiStrings()
6427 __ j(greater, &result_greater, Label::kNear); in GenerateCompareFlatAsciiStrings()
6430 __ Set(eax, Immediate(Smi::FromInt(LESS))); in GenerateCompareFlatAsciiStrings()
6431 __ ret(0); in GenerateCompareFlatAsciiStrings()
6434 __ bind(&result_greater); in GenerateCompareFlatAsciiStrings()
6435 __ Set(eax, Immediate(Smi::FromInt(GREATER))); in GenerateCompareFlatAsciiStrings()
6436 __ ret(0); in GenerateCompareFlatAsciiStrings()
6451 __ SmiUntag(length); in GenerateAsciiCharsCompareLoop()
6452 __ lea(left, in GenerateAsciiCharsCompareLoop()
6454 __ lea(right, in GenerateAsciiCharsCompareLoop()
6456 __ neg(length); in GenerateAsciiCharsCompareLoop()
6461 __ bind(&loop); in GenerateAsciiCharsCompareLoop()
6462 __ mov_b(scratch, Operand(left, index, times_1, 0)); in GenerateAsciiCharsCompareLoop()
6463 __ cmpb(scratch, Operand(right, index, times_1, 0)); in GenerateAsciiCharsCompareLoop()
6464 __ j(not_equal, chars_not_equal, chars_not_equal_near); in GenerateAsciiCharsCompareLoop()
6465 __ inc(index); in GenerateAsciiCharsCompareLoop()
6466 __ j(not_zero, &loop); in GenerateAsciiCharsCompareLoop()
6478 __ mov(edx, Operand(esp, 2 * kPointerSize)); // left in Generate()
6479 __ mov(eax, Operand(esp, 1 * kPointerSize)); // right in Generate()
6482 __ cmp(edx, eax); in Generate()
6483 __ j(not_equal, &not_same, Label::kNear); in Generate()
6486 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); in Generate()
6487 __ IncrementCounter(masm->isolate()->counters()->string_compare_native(), 1); in Generate()
6488 __ ret(2 * kPointerSize); in Generate()
6490 __ bind(&not_same); in Generate()
6493 __ JumpIfNotBothSequentialAsciiStrings(edx, eax, ecx, ebx, &runtime); in Generate()
6497 __ pop(ecx); in Generate()
6498 __ add(esp, Immediate(2 * kPointerSize)); in Generate()
6499 __ push(ecx); in Generate()
6504 __ bind(&runtime); in Generate()
6505 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); in Generate()
6512 __ mov(ecx, edx); in GenerateSmis()
6513 __ or_(ecx, eax); in GenerateSmis()
6514 __ JumpIfNotSmi(ecx, &miss, Label::kNear); in GenerateSmis()
6518 __ sub(eax, edx); in GenerateSmis()
6521 __ sub(edx, eax); in GenerateSmis()
6522 __ j(no_overflow, &done, Label::kNear); in GenerateSmis()
6524 __ not_(edx); in GenerateSmis()
6525 __ bind(&done); in GenerateSmis()
6526 __ mov(eax, edx); in GenerateSmis()
6528 __ ret(0); in GenerateSmis()
6530 __ bind(&miss); in GenerateSmis()
6541 __ mov(ecx, edx); in GenerateHeapNumbers()
6542 __ and_(ecx, eax); in GenerateHeapNumbers()
6543 __ JumpIfSmi(ecx, &generic_stub, Label::kNear); in GenerateHeapNumbers()
6545 __ CmpObjectType(eax, HEAP_NUMBER_TYPE, ecx); in GenerateHeapNumbers()
6546 __ j(not_equal, &maybe_undefined1, Label::kNear); in GenerateHeapNumbers()
6547 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ecx); in GenerateHeapNumbers()
6548 __ j(not_equal, &maybe_undefined2, Label::kNear); in GenerateHeapNumbers()
6557 __ movdbl(xmm0, FieldOperand(edx, HeapNumber::kValueOffset)); in GenerateHeapNumbers()
6558 __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset)); in GenerateHeapNumbers()
6561 __ ucomisd(xmm0, xmm1); in GenerateHeapNumbers()
6564 __ j(parity_even, &unordered, Label::kNear); in GenerateHeapNumbers()
6568 __ mov(eax, 0); // equal in GenerateHeapNumbers()
6569 __ mov(ecx, Immediate(Smi::FromInt(1))); in GenerateHeapNumbers()
6570 __ cmov(above, eax, ecx); in GenerateHeapNumbers()
6571 __ mov(ecx, Immediate(Smi::FromInt(-1))); in GenerateHeapNumbers()
6572 __ cmov(below, eax, ecx); in GenerateHeapNumbers()
6573 __ ret(0); in GenerateHeapNumbers()
6576 __ bind(&unordered); in GenerateHeapNumbers()
6578 __ bind(&generic_stub); in GenerateHeapNumbers()
6579 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); in GenerateHeapNumbers()
6581 __ bind(&maybe_undefined1); in GenerateHeapNumbers()
6583 __ cmp(eax, Immediate(masm->isolate()->factory()->undefined_value())); in GenerateHeapNumbers()
6584 __ j(not_equal, &miss); in GenerateHeapNumbers()
6585 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ecx); in GenerateHeapNumbers()
6586 __ j(not_equal, &maybe_undefined2, Label::kNear); in GenerateHeapNumbers()
6587 __ jmp(&unordered); in GenerateHeapNumbers()
6590 __ bind(&maybe_undefined2); in GenerateHeapNumbers()
6592 __ cmp(edx, Immediate(masm->isolate()->factory()->undefined_value())); in GenerateHeapNumbers()
6593 __ j(equal, &unordered); in GenerateHeapNumbers()
6596 __ bind(&miss); in GenerateHeapNumbers()
6613 __ mov(tmp1, left); in GenerateSymbols()
6615 __ and_(tmp1, right); in GenerateSymbols()
6616 __ JumpIfSmi(tmp1, &miss, Label::kNear); in GenerateSymbols()
6619 __ mov(tmp1, FieldOperand(left, HeapObject::kMapOffset)); in GenerateSymbols()
6620 __ mov(tmp2, FieldOperand(right, HeapObject::kMapOffset)); in GenerateSymbols()
6621 __ movzx_b(tmp1, FieldOperand(tmp1, Map::kInstanceTypeOffset)); in GenerateSymbols()
6622 __ movzx_b(tmp2, FieldOperand(tmp2, Map::kInstanceTypeOffset)); in GenerateSymbols()
6624 __ and_(tmp1, tmp2); in GenerateSymbols()
6625 __ test(tmp1, Immediate(kIsSymbolMask)); in GenerateSymbols()
6626 __ j(zero, &miss, Label::kNear); in GenerateSymbols()
6630 __ cmp(left, right); in GenerateSymbols()
6634 __ j(not_equal, &done, Label::kNear); in GenerateSymbols()
6637 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); in GenerateSymbols()
6638 __ bind(&done); in GenerateSymbols()
6639 __ ret(0); in GenerateSymbols()
6641 __ bind(&miss); in GenerateSymbols()
6660 __ mov(tmp1, left); in GenerateStrings()
6662 __ and_(tmp1, right); in GenerateStrings()
6663 __ JumpIfSmi(tmp1, &miss); in GenerateStrings()
6667 __ mov(tmp1, FieldOperand(left, HeapObject::kMapOffset)); in GenerateStrings()
6668 __ mov(tmp2, FieldOperand(right, HeapObject::kMapOffset)); in GenerateStrings()
6669 __ movzx_b(tmp1, FieldOperand(tmp1, Map::kInstanceTypeOffset)); in GenerateStrings()
6670 __ movzx_b(tmp2, FieldOperand(tmp2, Map::kInstanceTypeOffset)); in GenerateStrings()
6671 __ mov(tmp3, tmp1); in GenerateStrings()
6673 __ or_(tmp3, tmp2); in GenerateStrings()
6674 __ test(tmp3, Immediate(kIsNotStringMask)); in GenerateStrings()
6675 __ j(not_zero, &miss); in GenerateStrings()
6679 __ cmp(left, right); in GenerateStrings()
6680 __ j(not_equal, &not_same, Label::kNear); in GenerateStrings()
6683 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); in GenerateStrings()
6684 __ ret(0); in GenerateStrings()
6687 __ bind(&not_same); in GenerateStrings()
6695 __ and_(tmp1, tmp2); in GenerateStrings()
6696 __ test(tmp1, Immediate(kIsSymbolMask)); in GenerateStrings()
6697 __ j(zero, &do_compare, Label::kNear); in GenerateStrings()
6701 __ ret(0); in GenerateStrings()
6702 __ bind(&do_compare); in GenerateStrings()
6707 __ JumpIfNotBothSequentialAsciiStrings(left, right, tmp1, tmp2, &runtime); in GenerateStrings()
6719 __ bind(&runtime); in GenerateStrings()
6720 __ pop(tmp1); // Return address. in GenerateStrings()
6721 __ push(left); in GenerateStrings()
6722 __ push(right); in GenerateStrings()
6723 __ push(tmp1); in GenerateStrings()
6725 __ TailCallRuntime(Runtime::kStringEquals, 2, 1); in GenerateStrings()
6727 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); in GenerateStrings()
6730 __ bind(&miss); in GenerateStrings()
6738 __ mov(ecx, edx); in GenerateObjects()
6739 __ and_(ecx, eax); in GenerateObjects()
6740 __ JumpIfSmi(ecx, &miss, Label::kNear); in GenerateObjects()
6742 __ CmpObjectType(eax, JS_OBJECT_TYPE, ecx); in GenerateObjects()
6743 __ j(not_equal, &miss, Label::kNear); in GenerateObjects()
6744 __ CmpObjectType(edx, JS_OBJECT_TYPE, ecx); in GenerateObjects()
6745 __ j(not_equal, &miss, Label::kNear); in GenerateObjects()
6748 __ sub(eax, edx); in GenerateObjects()
6749 __ ret(0); in GenerateObjects()
6751 __ bind(&miss); in GenerateObjects()
6758 __ mov(ecx, edx); in GenerateKnownObjects()
6759 __ and_(ecx, eax); in GenerateKnownObjects()
6760 __ JumpIfSmi(ecx, &miss, Label::kNear); in GenerateKnownObjects()
6762 __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset)); in GenerateKnownObjects()
6763 __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset)); in GenerateKnownObjects()
6764 __ cmp(ecx, known_map_); in GenerateKnownObjects()
6765 __ j(not_equal, &miss, Label::kNear); in GenerateKnownObjects()
6766 __ cmp(ebx, known_map_); in GenerateKnownObjects()
6767 __ j(not_equal, &miss, Label::kNear); in GenerateKnownObjects()
6769 __ sub(eax, edx); in GenerateKnownObjects()
6770 __ ret(0); in GenerateKnownObjects()
6772 __ bind(&miss); in GenerateKnownObjects()
6783 __ push(edx); // Preserve edx and eax. in GenerateMiss()
6784 __ push(eax); in GenerateMiss()
6785 __ push(edx); // And also use them as the arguments. in GenerateMiss()
6786 __ push(eax); in GenerateMiss()
6787 __ push(Immediate(Smi::FromInt(op_))); in GenerateMiss()
6788 __ CallExternalReference(miss, 3); in GenerateMiss()
6790 __ lea(edi, FieldOperand(eax, Code::kHeaderSize)); in GenerateMiss()
6791 __ pop(eax); in GenerateMiss()
6792 __ pop(edx); in GenerateMiss()
6796 __ jmp(edi); in GenerateMiss()
6822 __ mov(index, FieldOperand(properties, kCapacityOffset)); in GenerateNegativeLookup()
6823 __ dec(index); in GenerateNegativeLookup()
6824 __ and_(index, in GenerateNegativeLookup()
6830 __ lea(index, Operand(index, index, times_2, 0)); // index *= 3. in GenerateNegativeLookup()
6834 __ mov(entity_name, Operand(properties, index, times_half_pointer_size, in GenerateNegativeLookup()
6836 __ cmp(entity_name, masm->isolate()->factory()->undefined_value()); in GenerateNegativeLookup()
6837 __ j(equal, done); in GenerateNegativeLookup()
6840 __ cmp(entity_name, Handle<String>(name)); in GenerateNegativeLookup()
6841 __ j(equal, miss); in GenerateNegativeLookup()
6845 __ cmp(entity_name, masm->isolate()->factory()->the_hole_value()); in GenerateNegativeLookup()
6846 __ j(equal, &the_hole, Label::kNear); in GenerateNegativeLookup()
6849 __ mov(entity_name, FieldOperand(entity_name, HeapObject::kMapOffset)); in GenerateNegativeLookup()
6850 __ test_b(FieldOperand(entity_name, Map::kInstanceTypeOffset), in GenerateNegativeLookup()
6852 __ j(zero, miss); in GenerateNegativeLookup()
6853 __ bind(&the_hole); in GenerateNegativeLookup()
6860 __ push(Immediate(Handle<Object>(name))); in GenerateNegativeLookup()
6861 __ push(Immediate(name->Hash())); in GenerateNegativeLookup()
6862 __ CallStub(&stub); in GenerateNegativeLookup()
6863 __ test(r0, r0); in GenerateNegativeLookup()
6864 __ j(not_zero, miss); in GenerateNegativeLookup()
6865 __ jmp(done); in GenerateNegativeLookup()
6886 if (FLAG_debug_code) __ AbortIfNotString(name); in GeneratePositiveLookup()
6888 __ mov(r1, FieldOperand(elements, kCapacityOffset)); in GeneratePositiveLookup()
6889 __ shr(r1, kSmiTagSize); // convert smi to int in GeneratePositiveLookup()
6890 __ dec(r1); in GeneratePositiveLookup()
6897 __ mov(r0, FieldOperand(name, String::kHashFieldOffset)); in GeneratePositiveLookup()
6898 __ shr(r0, String::kHashShift); in GeneratePositiveLookup()
6900 __ add(r0, Immediate(StringDictionary::GetProbeOffset(i))); in GeneratePositiveLookup()
6902 __ and_(r0, r1); in GeneratePositiveLookup()
6906 __ lea(r0, Operand(r0, r0, times_2, 0)); // r0 = r0 * 3 in GeneratePositiveLookup()
6909 __ cmp(name, Operand(elements, in GeneratePositiveLookup()
6913 __ j(equal, done); in GeneratePositiveLookup()
6920 __ push(name); in GeneratePositiveLookup()
6921 __ mov(r0, FieldOperand(name, String::kHashFieldOffset)); in GeneratePositiveLookup()
6922 __ shr(r0, String::kHashShift); in GeneratePositiveLookup()
6923 __ push(r0); in GeneratePositiveLookup()
6924 __ CallStub(&stub); in GeneratePositiveLookup()
6926 __ test(r1, r1); in GeneratePositiveLookup()
6927 __ j(zero, miss); in GeneratePositiveLookup()
6928 __ jmp(done); in GeneratePositiveLookup()
6951 __ mov(scratch, FieldOperand(dictionary_, kCapacityOffset)); in Generate()
6952 __ dec(scratch); in Generate()
6953 __ SmiUntag(scratch); in Generate()
6954 __ push(scratch); in Generate()
6963 __ mov(scratch, Operand(esp, 2 * kPointerSize)); in Generate()
6965 __ add(scratch, Immediate(StringDictionary::GetProbeOffset(i))); in Generate()
6967 __ and_(scratch, Operand(esp, 0)); in Generate()
6971 __ lea(index_, Operand(scratch, scratch, times_2, 0)); // index *= 3. in Generate()
6975 __ mov(scratch, Operand(dictionary_, in Generate()
6979 __ cmp(scratch, masm->isolate()->factory()->undefined_value()); in Generate()
6980 __ j(equal, &not_in_dictionary); in Generate()
6983 __ cmp(scratch, Operand(esp, 3 * kPointerSize)); in Generate()
6984 __ j(equal, &in_dictionary); in Generate()
6992 __ mov(scratch, FieldOperand(scratch, HeapObject::kMapOffset)); in Generate()
6993 __ test_b(FieldOperand(scratch, Map::kInstanceTypeOffset), in Generate()
6995 __ j(zero, &maybe_in_dictionary); in Generate()
6999 __ bind(&maybe_in_dictionary); in Generate()
7004 __ mov(result_, Immediate(0)); in Generate()
7005 __ Drop(1); in Generate()
7006 __ ret(2 * kPointerSize); in Generate()
7009 __ bind(&in_dictionary); in Generate()
7010 __ mov(result_, Immediate(1)); in Generate()
7011 __ Drop(1); in Generate()
7012 __ ret(2 * kPointerSize); in Generate()
7014 __ bind(&not_in_dictionary); in Generate()
7015 __ mov(result_, Immediate(0)); in Generate()
7016 __ Drop(1); in Generate()
7017 __ ret(2 * kPointerSize); in Generate()
7120 __ jmp(&skip_to_incremental_noncompacting, Label::kNear); in Generate()
7121 __ jmp(&skip_to_incremental_compacting, Label::kFar); in Generate()
7124 __ RememberedSetHelper(object_, in Generate()
7130 __ ret(0); in Generate()
7133 __ bind(&skip_to_incremental_noncompacting); in Generate()
7136 __ bind(&skip_to_incremental_compacting); in Generate()
7152 __ mov(regs_.scratch0(), Operand(regs_.address(), 0)); in GenerateIncremental()
7153 __ JumpIfNotInNewSpace(regs_.scratch0(), // Value. in GenerateIncremental()
7157 __ CheckPageFlag(regs_.object(), in GenerateIncremental()
7171 __ RememberedSetHelper(object_, in GenerateIncremental()
7177 __ bind(&dont_need_remembered_set); in GenerateIncremental()
7186 __ ret(0); in GenerateIncremental()
7193 __ PrepareCallCFunction(argument_count, regs_.scratch0()); in InformIncrementalMarker()
7194 __ mov(Operand(esp, 0 * kPointerSize), regs_.object()); in InformIncrementalMarker()
7196 __ mov(Operand(esp, 1 * kPointerSize), regs_.address()); // Slot. in InformIncrementalMarker()
7199 __ mov(regs_.scratch0(), Operand(regs_.address(), 0)); in InformIncrementalMarker()
7200 __ mov(Operand(esp, 1 * kPointerSize), regs_.scratch0()); // Value. in InformIncrementalMarker()
7202 __ mov(Operand(esp, 2 * kPointerSize), in InformIncrementalMarker()
7207 __ CallCFunction( in InformIncrementalMarker()
7213 __ CallCFunction( in InformIncrementalMarker()
7230 __ JumpIfBlack(regs_.object(), in CheckNeedsToInformIncrementalMarker()
7238 __ RememberedSetHelper(object_, in CheckNeedsToInformIncrementalMarker()
7244 __ ret(0); in CheckNeedsToInformIncrementalMarker()
7247 __ bind(&object_is_black); in CheckNeedsToInformIncrementalMarker()
7250 __ mov(regs_.scratch0(), Operand(regs_.address(), 0)); in CheckNeedsToInformIncrementalMarker()
7255 __ CheckPageFlag(regs_.scratch0(), // Contains value. in CheckNeedsToInformIncrementalMarker()
7262 __ CheckPageFlag(regs_.object(), in CheckNeedsToInformIncrementalMarker()
7269 __ jmp(&need_incremental); in CheckNeedsToInformIncrementalMarker()
7271 __ bind(&ensure_not_white); in CheckNeedsToInformIncrementalMarker()
7276 __ push(regs_.object()); in CheckNeedsToInformIncrementalMarker()
7277 __ EnsureNotWhite(regs_.scratch0(), // The value. in CheckNeedsToInformIncrementalMarker()
7282 __ pop(regs_.object()); in CheckNeedsToInformIncrementalMarker()
7286 __ RememberedSetHelper(object_, in CheckNeedsToInformIncrementalMarker()
7292 __ ret(0); in CheckNeedsToInformIncrementalMarker()
7295 __ bind(&need_incremental_pop_object); in CheckNeedsToInformIncrementalMarker()
7296 __ pop(regs_.object()); in CheckNeedsToInformIncrementalMarker()
7298 __ bind(&need_incremental); in CheckNeedsToInformIncrementalMarker()
7321 __ CheckFastElements(edi, &double_elements); in Generate()
7324 __ JumpIfSmi(eax, &smi_element); in Generate()
7325 __ CheckFastSmiOnlyElements(edi, &fast_elements, Label::kNear); in Generate()
7330 __ bind(&slow_elements); in Generate()
7331 __ pop(edi); // Pop return address and remember to put back later for tail in Generate()
7333 __ push(ebx); in Generate()
7334 __ push(ecx); in Generate()
7335 __ push(eax); in Generate()
7336 __ mov(ebx, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); in Generate()
7337 __ push(FieldOperand(ebx, JSFunction::kLiteralsOffset)); in Generate()
7338 __ push(edx); in Generate()
7339 __ push(edi); // Return return address so that tail call returns to right in Generate()
7341 __ TailCallRuntime(Runtime::kStoreArrayLiteralElement, 5, 1); in Generate()
7343 __ bind(&slow_elements_from_double); in Generate()
7344 __ pop(edx); in Generate()
7345 __ jmp(&slow_elements); in Generate()
7348 __ bind(&fast_elements); in Generate()
7349 __ mov(ebx, FieldOperand(ebx, JSObject::kElementsOffset)); in Generate()
7350 __ lea(ecx, FieldOperand(ebx, ecx, times_half_pointer_size, in Generate()
7352 __ mov(Operand(ecx, 0), eax); in Generate()
7354 __ RecordWrite(ebx, ecx, eax, in Generate()
7358 __ ret(0); in Generate()
7362 __ bind(&smi_element); in Generate()
7363 __ mov(ebx, FieldOperand(ebx, JSObject::kElementsOffset)); in Generate()
7364 __ mov(FieldOperand(ebx, ecx, times_half_pointer_size, in Generate()
7366 __ ret(0); in Generate()
7369 __ bind(&double_elements); in Generate()
7371 __ push(edx); in Generate()
7372 __ mov(edx, FieldOperand(ebx, JSObject::kElementsOffset)); in Generate()
7373 __ StoreNumberToDoubleElements(eax, in Generate()
7380 __ pop(edx); in Generate()
7381 __ ret(0); in Generate()
7384 #undef __