| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 2320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2331 | 2331 |
| 2332 void LCodeGen::DoLoadKeyedSpecializedArrayElement( | 2332 void LCodeGen::DoLoadKeyedSpecializedArrayElement( |
| 2333 LLoadKeyedSpecializedArrayElement* instr) { | 2333 LLoadKeyedSpecializedArrayElement* instr) { |
| 2334 Register external_pointer = ToRegister(instr->external_pointer()); | 2334 Register external_pointer = ToRegister(instr->external_pointer()); |
| 2335 Register key = ToRegister(instr->key()); | 2335 Register key = ToRegister(instr->key()); |
| 2336 ExternalArrayType array_type = instr->array_type(); | 2336 ExternalArrayType array_type = instr->array_type(); |
| 2337 if (array_type == kExternalFloatArray) { | 2337 if (array_type == kExternalFloatArray) { |
| 2338 XMMRegister result(ToDoubleRegister(instr->result())); | 2338 XMMRegister result(ToDoubleRegister(instr->result())); |
| 2339 __ movss(result, Operand(external_pointer, key, times_4, 0)); | 2339 __ movss(result, Operand(external_pointer, key, times_4, 0)); |
| 2340 __ cvtss2sd(result, result); | 2340 __ cvtss2sd(result, result); |
| 2341 } else if (array_type == kExternalDoubleArray) { |
| 2342 __ movdbl(ToDoubleRegister(instr->result()), |
| 2343 Operand(external_pointer, key, times_8, 0)); |
| 2341 } else { | 2344 } else { |
| 2342 Register result(ToRegister(instr->result())); | 2345 Register result(ToRegister(instr->result())); |
| 2343 switch (array_type) { | 2346 switch (array_type) { |
| 2344 case kExternalByteArray: | 2347 case kExternalByteArray: |
| 2345 __ movsx_b(result, Operand(external_pointer, key, times_1, 0)); | 2348 __ movsx_b(result, Operand(external_pointer, key, times_1, 0)); |
| 2346 break; | 2349 break; |
| 2347 case kExternalUnsignedByteArray: | 2350 case kExternalUnsignedByteArray: |
| 2348 case kExternalPixelArray: | 2351 case kExternalPixelArray: |
| 2349 __ movzx_b(result, Operand(external_pointer, key, times_1, 0)); | 2352 __ movzx_b(result, Operand(external_pointer, key, times_1, 0)); |
| 2350 break; | 2353 break; |
| 2351 case kExternalShortArray: | 2354 case kExternalShortArray: |
| 2352 __ movsx_w(result, Operand(external_pointer, key, times_2, 0)); | 2355 __ movsx_w(result, Operand(external_pointer, key, times_2, 0)); |
| 2353 break; | 2356 break; |
| 2354 case kExternalUnsignedShortArray: | 2357 case kExternalUnsignedShortArray: |
| 2355 __ movzx_w(result, Operand(external_pointer, key, times_2, 0)); | 2358 __ movzx_w(result, Operand(external_pointer, key, times_2, 0)); |
| 2356 break; | 2359 break; |
| 2357 case kExternalIntArray: | 2360 case kExternalIntArray: |
| 2358 __ mov(result, Operand(external_pointer, key, times_4, 0)); | 2361 __ mov(result, Operand(external_pointer, key, times_4, 0)); |
| 2359 break; | 2362 break; |
| 2360 case kExternalUnsignedIntArray: | 2363 case kExternalUnsignedIntArray: |
| 2361 __ mov(result, Operand(external_pointer, key, times_4, 0)); | 2364 __ mov(result, Operand(external_pointer, key, times_4, 0)); |
| 2362 __ test(result, Operand(result)); | 2365 __ test(result, Operand(result)); |
| 2363 // TODO(danno): we could be more clever here, perhaps having a special | 2366 // TODO(danno): we could be more clever here, perhaps having a special |
| 2364 // version of the stub that detects if the overflow case actually | 2367 // version of the stub that detects if the overflow case actually |
| 2365 // happens, and generate code that returns a double rather than int. | 2368 // happens, and generate code that returns a double rather than int. |
| 2366 DeoptimizeIf(negative, instr->environment()); | 2369 DeoptimizeIf(negative, instr->environment()); |
| 2367 break; | 2370 break; |
| 2368 case kExternalFloatArray: | 2371 case kExternalFloatArray: |
| 2372 case kExternalDoubleArray: |
| 2369 UNREACHABLE(); | 2373 UNREACHABLE(); |
| 2370 break; | 2374 break; |
| 2371 } | 2375 } |
| 2372 } | 2376 } |
| 2373 } | 2377 } |
| 2374 | 2378 |
| 2375 | 2379 |
| 2376 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { | 2380 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { |
| 2377 ASSERT(ToRegister(instr->context()).is(esi)); | 2381 ASSERT(ToRegister(instr->context()).is(esi)); |
| 2378 ASSERT(ToRegister(instr->object()).is(edx)); | 2382 ASSERT(ToRegister(instr->object()).is(edx)); |
| (...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3040 | 3044 |
| 3041 | 3045 |
| 3042 void LCodeGen::DoStoreKeyedSpecializedArrayElement( | 3046 void LCodeGen::DoStoreKeyedSpecializedArrayElement( |
| 3043 LStoreKeyedSpecializedArrayElement* instr) { | 3047 LStoreKeyedSpecializedArrayElement* instr) { |
| 3044 Register external_pointer = ToRegister(instr->external_pointer()); | 3048 Register external_pointer = ToRegister(instr->external_pointer()); |
| 3045 Register key = ToRegister(instr->key()); | 3049 Register key = ToRegister(instr->key()); |
| 3046 ExternalArrayType array_type = instr->array_type(); | 3050 ExternalArrayType array_type = instr->array_type(); |
| 3047 if (array_type == kExternalFloatArray) { | 3051 if (array_type == kExternalFloatArray) { |
| 3048 __ cvtsd2ss(xmm0, ToDoubleRegister(instr->value())); | 3052 __ cvtsd2ss(xmm0, ToDoubleRegister(instr->value())); |
| 3049 __ movss(Operand(external_pointer, key, times_4, 0), xmm0); | 3053 __ movss(Operand(external_pointer, key, times_4, 0), xmm0); |
| 3054 } else if (array_type == kExternalDoubleArray) { |
| 3055 __ movdbl(Operand(external_pointer, key, times_8, 0), |
| 3056 ToDoubleRegister(instr->value())); |
| 3050 } else { | 3057 } else { |
| 3051 Register value = ToRegister(instr->value()); | 3058 Register value = ToRegister(instr->value()); |
| 3052 switch (array_type) { | 3059 switch (array_type) { |
| 3053 case kExternalPixelArray: { | 3060 case kExternalPixelArray: { |
| 3054 // Clamp the value to [0..255]. | 3061 // Clamp the value to [0..255]. |
| 3055 Register temp = ToRegister(instr->TempAt(0)); | 3062 Register temp = ToRegister(instr->TempAt(0)); |
| 3056 // The dec_b below requires that the clamped value is in a byte | 3063 // The dec_b below requires that the clamped value is in a byte |
| 3057 // register. eax is an arbitrary choice to satisfy this requirement, we | 3064 // register. eax is an arbitrary choice to satisfy this requirement, we |
| 3058 // hinted the register allocator to give us eax when building the | 3065 // hinted the register allocator to give us eax when building the |
| 3059 // instruction. | 3066 // instruction. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3074 break; | 3081 break; |
| 3075 case kExternalShortArray: | 3082 case kExternalShortArray: |
| 3076 case kExternalUnsignedShortArray: | 3083 case kExternalUnsignedShortArray: |
| 3077 __ mov_w(Operand(external_pointer, key, times_2, 0), value); | 3084 __ mov_w(Operand(external_pointer, key, times_2, 0), value); |
| 3078 break; | 3085 break; |
| 3079 case kExternalIntArray: | 3086 case kExternalIntArray: |
| 3080 case kExternalUnsignedIntArray: | 3087 case kExternalUnsignedIntArray: |
| 3081 __ mov(Operand(external_pointer, key, times_4, 0), value); | 3088 __ mov(Operand(external_pointer, key, times_4, 0), value); |
| 3082 break; | 3089 break; |
| 3083 case kExternalFloatArray: | 3090 case kExternalFloatArray: |
| 3091 case kExternalDoubleArray: |
| 3084 UNREACHABLE(); | 3092 UNREACHABLE(); |
| 3085 break; | 3093 break; |
| 3086 } | 3094 } |
| 3087 } | 3095 } |
| 3088 } | 3096 } |
| 3089 | 3097 |
| 3090 | 3098 |
| 3091 void LCodeGen::DoStoreKeyedFastElement(LStoreKeyedFastElement* instr) { | 3099 void LCodeGen::DoStoreKeyedFastElement(LStoreKeyedFastElement* instr) { |
| 3092 Register value = ToRegister(instr->value()); | 3100 Register value = ToRegister(instr->value()); |
| 3093 Register elements = ToRegister(instr->object()); | 3101 Register elements = ToRegister(instr->object()); |
| (...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4208 ASSERT(osr_pc_offset_ == -1); | 4216 ASSERT(osr_pc_offset_ == -1); |
| 4209 osr_pc_offset_ = masm()->pc_offset(); | 4217 osr_pc_offset_ = masm()->pc_offset(); |
| 4210 } | 4218 } |
| 4211 | 4219 |
| 4212 | 4220 |
| 4213 #undef __ | 4221 #undef __ |
| 4214 | 4222 |
| 4215 } } // namespace v8::internal | 4223 } } // namespace v8::internal |
| 4216 | 4224 |
| 4217 #endif // V8_TARGET_ARCH_IA32 | 4225 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |