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 |