| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 2029 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2040   //  -- esp[0]              : return address | 2040   //  -- esp[0]              : return address | 
| 2041   //  -- esp[(argc - n) * 4] : arg[n] (zero-based) | 2041   //  -- esp[(argc - n) * 4] : arg[n] (zero-based) | 
| 2042   //  -- ... | 2042   //  -- ... | 
| 2043   //  -- esp[(argc + 1) * 4] : receiver | 2043   //  -- esp[(argc + 1) * 4] : receiver | 
| 2044   // ----------------------------------- | 2044   // ----------------------------------- | 
| 2045 | 2045 | 
| 2046   if (!CpuFeatures::IsSupported(SSE2)) { | 2046   if (!CpuFeatures::IsSupported(SSE2)) { | 
| 2047     return Handle<Code>::null(); | 2047     return Handle<Code>::null(); | 
| 2048   } | 2048   } | 
| 2049 | 2049 | 
| 2050   CpuFeatures::Scope use_sse2(SSE2); | 2050   CpuFeatureScope use_sse2(masm(), SSE2); | 
| 2051 | 2051 | 
| 2052   const int argc = arguments().immediate(); | 2052   const int argc = arguments().immediate(); | 
| 2053 | 2053 | 
| 2054   // If the object is not a JSObject or we got an unexpected number of | 2054   // If the object is not a JSObject or we got an unexpected number of | 
| 2055   // arguments, bail out to the regular call. | 2055   // arguments, bail out to the regular call. | 
| 2056   if (!object->IsJSObject() || argc != 1) { | 2056   if (!object->IsJSObject() || argc != 1) { | 
| 2057     return Handle<Code>::null(); | 2057     return Handle<Code>::null(); | 
| 2058   } | 2058   } | 
| 2059 | 2059 | 
| 2060   Label miss; | 2060   Label miss; | 
| (...skipping 1130 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3191   Handle<SharedFunctionInfo> shared(function->shared()); | 3191   Handle<SharedFunctionInfo> shared(function->shared()); | 
| 3192   for (int i = 0; i < shared->this_property_assignments_count(); i++) { | 3192   for (int i = 0; i < shared->this_property_assignments_count(); i++) { | 
| 3193     if (shared->IsThisPropertyAssignmentArgument(i)) { | 3193     if (shared->IsThisPropertyAssignmentArgument(i)) { | 
| 3194       // Check if the argument assigned to the property is actually passed. | 3194       // Check if the argument assigned to the property is actually passed. | 
| 3195       // If argument is not passed the property is set to undefined, | 3195       // If argument is not passed the property is set to undefined, | 
| 3196       // otherwise find it on the stack. | 3196       // otherwise find it on the stack. | 
| 3197       int arg_number = shared->GetThisPropertyAssignmentArgument(i); | 3197       int arg_number = shared->GetThisPropertyAssignmentArgument(i); | 
| 3198       __ mov(ebx, edi); | 3198       __ mov(ebx, edi); | 
| 3199       __ cmp(eax, arg_number); | 3199       __ cmp(eax, arg_number); | 
| 3200       if (CpuFeatures::IsSupported(CMOV)) { | 3200       if (CpuFeatures::IsSupported(CMOV)) { | 
| 3201         CpuFeatures::Scope use_cmov(CMOV); | 3201         CpuFeatureScope use_cmov(masm(), CMOV); | 
| 3202         __ cmov(above, ebx, Operand(ecx, arg_number * -kPointerSize)); | 3202         __ cmov(above, ebx, Operand(ecx, arg_number * -kPointerSize)); | 
| 3203       } else { | 3203       } else { | 
| 3204         Label not_passed; | 3204         Label not_passed; | 
| 3205         __ j(below_equal, ¬_passed); | 3205         __ j(below_equal, ¬_passed); | 
| 3206         __ mov(ebx, Operand(ecx, arg_number * -kPointerSize)); | 3206         __ mov(ebx, Operand(ecx, arg_number * -kPointerSize)); | 
| 3207         __ bind(¬_passed); | 3207         __ bind(¬_passed); | 
| 3208       } | 3208       } | 
| 3209       // Store value in the property. | 3209       // Store value in the property. | 
| 3210       __ mov(Operand(edx, i * kPointerSize), ebx); | 3210       __ mov(Operand(edx, i * kPointerSize), ebx); | 
| 3211     } else { | 3211     } else { | 
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3304 | 3304 | 
| 3305 static void GenerateSmiKeyCheck(MacroAssembler* masm, | 3305 static void GenerateSmiKeyCheck(MacroAssembler* masm, | 
| 3306                                 Register key, | 3306                                 Register key, | 
| 3307                                 Register scratch, | 3307                                 Register scratch, | 
| 3308                                 XMMRegister xmm_scratch0, | 3308                                 XMMRegister xmm_scratch0, | 
| 3309                                 XMMRegister xmm_scratch1, | 3309                                 XMMRegister xmm_scratch1, | 
| 3310                                 Label* fail) { | 3310                                 Label* fail) { | 
| 3311   // Check that key is a smi and if SSE2 is available a heap number | 3311   // Check that key is a smi and if SSE2 is available a heap number | 
| 3312   // containing a smi and branch if the check fails. | 3312   // containing a smi and branch if the check fails. | 
| 3313   if (CpuFeatures::IsSupported(SSE2)) { | 3313   if (CpuFeatures::IsSupported(SSE2)) { | 
| 3314     CpuFeatures::Scope use_sse2(SSE2); | 3314     CpuFeatureScope use_sse2(masm, SSE2); | 
| 3315     Label key_ok; | 3315     Label key_ok; | 
| 3316     __ JumpIfSmi(key, &key_ok); | 3316     __ JumpIfSmi(key, &key_ok); | 
| 3317     __ cmp(FieldOperand(key, HeapObject::kMapOffset), | 3317     __ cmp(FieldOperand(key, HeapObject::kMapOffset), | 
| 3318            Immediate(Handle<Map>(masm->isolate()->heap()->heap_number_map()))); | 3318            Immediate(Handle<Map>(masm->isolate()->heap()->heap_number_map()))); | 
| 3319     __ j(not_equal, fail); | 3319     __ j(not_equal, fail); | 
| 3320     __ movdbl(xmm_scratch0, FieldOperand(key, HeapNumber::kValueOffset)); | 3320     __ movdbl(xmm_scratch0, FieldOperand(key, HeapNumber::kValueOffset)); | 
| 3321     __ cvttsd2si(scratch, Operand(xmm_scratch0)); | 3321     __ cvttsd2si(scratch, Operand(xmm_scratch0)); | 
| 3322     __ cvtsi2sd(xmm_scratch1, scratch); | 3322     __ cvtsi2sd(xmm_scratch1, scratch); | 
| 3323     __ ucomisd(xmm_scratch1, xmm_scratch0); | 3323     __ ucomisd(xmm_scratch1, xmm_scratch0); | 
| 3324     __ j(not_equal, fail); | 3324     __ j(not_equal, fail); | 
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3441       // behavior. | 3441       // behavior. | 
| 3442 | 3442 | 
| 3443       // For the moment we make the slow call to the runtime on | 3443       // For the moment we make the slow call to the runtime on | 
| 3444       // processors that don't support SSE2. The code in IntegerConvert | 3444       // processors that don't support SSE2. The code in IntegerConvert | 
| 3445       // (code-stubs-ia32.cc) is roughly what is needed here though the | 3445       // (code-stubs-ia32.cc) is roughly what is needed here though the | 
| 3446       // conversion failure case does not need to be handled. | 3446       // conversion failure case does not need to be handled. | 
| 3447       if (CpuFeatures::IsSupported(SSE2)) { | 3447       if (CpuFeatures::IsSupported(SSE2)) { | 
| 3448         if ((elements_kind == EXTERNAL_INT_ELEMENTS || | 3448         if ((elements_kind == EXTERNAL_INT_ELEMENTS || | 
| 3449              elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) && | 3449              elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) && | 
| 3450             CpuFeatures::IsSupported(SSE3)) { | 3450             CpuFeatures::IsSupported(SSE3)) { | 
| 3451           CpuFeatures::Scope scope(SSE3); | 3451           CpuFeatureScope scope(masm, SSE3); | 
| 3452           // fisttp stores values as signed integers. To represent the | 3452           // fisttp stores values as signed integers. To represent the | 
| 3453           // entire range of int and unsigned int arrays, store as a | 3453           // entire range of int and unsigned int arrays, store as a | 
| 3454           // 64-bit int and discard the high 32 bits. | 3454           // 64-bit int and discard the high 32 bits. | 
| 3455           __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset)); | 3455           __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset)); | 
| 3456           __ sub(esp, Immediate(2 * kPointerSize)); | 3456           __ sub(esp, Immediate(2 * kPointerSize)); | 
| 3457           __ fisttp_d(Operand(esp, 0)); | 3457           __ fisttp_d(Operand(esp, 0)); | 
| 3458 | 3458 | 
| 3459           // If conversion failed (NaN, infinity, or a number outside | 3459           // If conversion failed (NaN, infinity, or a number outside | 
| 3460           // signed int64 range), the result is 0x8000000000000000, and | 3460           // signed int64 range), the result is 0x8000000000000000, and | 
| 3461           // we must handle this case in the runtime. | 3461           // we must handle this case in the runtime. | 
| 3462           Label ok; | 3462           Label ok; | 
| 3463           __ cmp(Operand(esp, kPointerSize), Immediate(0x80000000u)); | 3463           __ cmp(Operand(esp, kPointerSize), Immediate(0x80000000u)); | 
| 3464           __ j(not_equal, &ok); | 3464           __ j(not_equal, &ok); | 
| 3465           __ cmp(Operand(esp, 0), Immediate(0)); | 3465           __ cmp(Operand(esp, 0), Immediate(0)); | 
| 3466           __ j(not_equal, &ok); | 3466           __ j(not_equal, &ok); | 
| 3467           __ add(esp, Immediate(2 * kPointerSize));  // Restore the stack. | 3467           __ add(esp, Immediate(2 * kPointerSize));  // Restore the stack. | 
| 3468           __ jmp(&slow); | 3468           __ jmp(&slow); | 
| 3469 | 3469 | 
| 3470           __ bind(&ok); | 3470           __ bind(&ok); | 
| 3471           __ pop(ebx); | 3471           __ pop(ebx); | 
| 3472           __ add(esp, Immediate(kPointerSize)); | 3472           __ add(esp, Immediate(kPointerSize)); | 
| 3473           __ mov(Operand(edi, ecx, times_2, 0), ebx); | 3473           __ mov(Operand(edi, ecx, times_2, 0), ebx); | 
| 3474         } else { | 3474         } else { | 
| 3475           ASSERT(CpuFeatures::IsSupported(SSE2)); | 3475           ASSERT(CpuFeatures::IsSupported(SSE2)); | 
| 3476           CpuFeatures::Scope scope(SSE2); | 3476           CpuFeatureScope scope(masm, SSE2); | 
| 3477           __ cvttsd2si(ebx, FieldOperand(eax, HeapNumber::kValueOffset)); | 3477           __ cvttsd2si(ebx, FieldOperand(eax, HeapNumber::kValueOffset)); | 
| 3478           __ cmp(ebx, 0x80000000u); | 3478           __ cmp(ebx, 0x80000000u); | 
| 3479           __ j(equal, &slow); | 3479           __ j(equal, &slow); | 
| 3480           // ebx: untagged integer value | 3480           // ebx: untagged integer value | 
| 3481           switch (elements_kind) { | 3481           switch (elements_kind) { | 
| 3482             case EXTERNAL_PIXEL_ELEMENTS: | 3482             case EXTERNAL_PIXEL_ELEMENTS: | 
| 3483               __ ClampUint8(ebx); | 3483               __ ClampUint8(ebx); | 
| 3484               // Fall through. | 3484               // Fall through. | 
| 3485             case EXTERNAL_BYTE_ELEMENTS: | 3485             case EXTERNAL_BYTE_ELEMENTS: | 
| 3486             case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3486             case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3826     __ jmp(ic_slow, RelocInfo::CODE_TARGET); | 3826     __ jmp(ic_slow, RelocInfo::CODE_TARGET); | 
| 3827   } | 3827   } | 
| 3828 } | 3828 } | 
| 3829 | 3829 | 
| 3830 | 3830 | 
| 3831 #undef __ | 3831 #undef __ | 
| 3832 | 3832 | 
| 3833 } }  // namespace v8::internal | 3833 } }  // namespace v8::internal | 
| 3834 | 3834 | 
| 3835 #endif  // V8_TARGET_ARCH_IA32 | 3835 #endif  // V8_TARGET_ARCH_IA32 | 
| OLD | NEW | 
|---|