| 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 2461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2472 LLoadKeyedSpecializedArrayElement* instr) { | 2472 LLoadKeyedSpecializedArrayElement* instr) { |
| 2473 Register external_pointer = ToRegister(instr->external_pointer()); | 2473 Register external_pointer = ToRegister(instr->external_pointer()); |
| 2474 Register key = ToRegister(instr->key()); | 2474 Register key = ToRegister(instr->key()); |
| 2475 ExternalArrayType array_type = instr->array_type(); | 2475 ExternalArrayType array_type = instr->array_type(); |
| 2476 if (array_type == kExternalFloatArray) { | 2476 if (array_type == kExternalFloatArray) { |
| 2477 CpuFeatures::Scope scope(VFP3); | 2477 CpuFeatures::Scope scope(VFP3); |
| 2478 DwVfpRegister result(ToDoubleRegister(instr->result())); | 2478 DwVfpRegister result(ToDoubleRegister(instr->result())); |
| 2479 __ add(scratch0(), external_pointer, Operand(key, LSL, 2)); | 2479 __ add(scratch0(), external_pointer, Operand(key, LSL, 2)); |
| 2480 __ vldr(result.low(), scratch0(), 0); | 2480 __ vldr(result.low(), scratch0(), 0); |
| 2481 __ vcvt_f64_f32(result, result.low()); | 2481 __ vcvt_f64_f32(result, result.low()); |
| 2482 } else if (array_type == kExternalDoubleArray) { |
| 2483 CpuFeatures::Scope scope(VFP3); |
| 2484 DwVfpRegister result(ToDoubleRegister(instr->result())); |
| 2485 __ add(scratch0(), external_pointer, Operand(key, LSL, 3)); |
| 2486 __ vldr(result, scratch0(), 0); |
| 2482 } else { | 2487 } else { |
| 2483 Register result(ToRegister(instr->result())); | 2488 Register result(ToRegister(instr->result())); |
| 2484 switch (array_type) { | 2489 switch (array_type) { |
| 2485 case kExternalByteArray: | 2490 case kExternalByteArray: |
| 2486 __ ldrsb(result, MemOperand(external_pointer, key)); | 2491 __ ldrsb(result, MemOperand(external_pointer, key)); |
| 2487 break; | 2492 break; |
| 2488 case kExternalUnsignedByteArray: | 2493 case kExternalUnsignedByteArray: |
| 2489 case kExternalPixelArray: | 2494 case kExternalPixelArray: |
| 2490 __ ldrb(result, MemOperand(external_pointer, key)); | 2495 __ ldrb(result, MemOperand(external_pointer, key)); |
| 2491 break; | 2496 break; |
| 2492 case kExternalShortArray: | 2497 case kExternalShortArray: |
| 2493 __ ldrsh(result, MemOperand(external_pointer, key, LSL, 1)); | 2498 __ ldrsh(result, MemOperand(external_pointer, key, LSL, 1)); |
| 2494 break; | 2499 break; |
| 2495 case kExternalUnsignedShortArray: | 2500 case kExternalUnsignedShortArray: |
| 2496 __ ldrh(result, MemOperand(external_pointer, key, LSL, 1)); | 2501 __ ldrh(result, MemOperand(external_pointer, key, LSL, 1)); |
| 2497 break; | 2502 break; |
| 2498 case kExternalIntArray: | 2503 case kExternalIntArray: |
| 2499 __ ldr(result, MemOperand(external_pointer, key, LSL, 2)); | 2504 __ ldr(result, MemOperand(external_pointer, key, LSL, 2)); |
| 2500 break; | 2505 break; |
| 2501 case kExternalUnsignedIntArray: | 2506 case kExternalUnsignedIntArray: |
| 2502 __ ldr(result, MemOperand(external_pointer, key, LSL, 2)); | 2507 __ ldr(result, MemOperand(external_pointer, key, LSL, 2)); |
| 2503 __ cmp(result, Operand(0x80000000)); | 2508 __ cmp(result, Operand(0x80000000)); |
| 2504 // TODO(danno): we could be more clever here, perhaps having a special | 2509 // TODO(danno): we could be more clever here, perhaps having a special |
| 2505 // version of the stub that detects if the overflow case actually | 2510 // version of the stub that detects if the overflow case actually |
| 2506 // happens, and generate code that returns a double rather than int. | 2511 // happens, and generate code that returns a double rather than int. |
| 2507 DeoptimizeIf(cs, instr->environment()); | 2512 DeoptimizeIf(cs, instr->environment()); |
| 2508 break; | 2513 break; |
| 2509 case kExternalFloatArray: | 2514 case kExternalFloatArray: |
| 2515 case kExternalDoubleArray: |
| 2510 UNREACHABLE(); | 2516 UNREACHABLE(); |
| 2511 break; | 2517 break; |
| 2512 } | 2518 } |
| 2513 } | 2519 } |
| 2514 } | 2520 } |
| 2515 | 2521 |
| 2516 | 2522 |
| 2517 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { | 2523 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { |
| 2518 ASSERT(ToRegister(instr->object()).is(r1)); | 2524 ASSERT(ToRegister(instr->object()).is(r1)); |
| 2519 ASSERT(ToRegister(instr->key()).is(r0)); | 2525 ASSERT(ToRegister(instr->key()).is(r0)); |
| (...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3225 } | 3231 } |
| 3226 } | 3232 } |
| 3227 | 3233 |
| 3228 | 3234 |
| 3229 void LCodeGen::DoStoreKeyedSpecializedArrayElement( | 3235 void LCodeGen::DoStoreKeyedSpecializedArrayElement( |
| 3230 LStoreKeyedSpecializedArrayElement* instr) { | 3236 LStoreKeyedSpecializedArrayElement* instr) { |
| 3231 | 3237 |
| 3232 Register external_pointer = ToRegister(instr->external_pointer()); | 3238 Register external_pointer = ToRegister(instr->external_pointer()); |
| 3233 Register key = ToRegister(instr->key()); | 3239 Register key = ToRegister(instr->key()); |
| 3234 ExternalArrayType array_type = instr->array_type(); | 3240 ExternalArrayType array_type = instr->array_type(); |
| 3241 |
| 3235 if (array_type == kExternalFloatArray) { | 3242 if (array_type == kExternalFloatArray) { |
| 3236 CpuFeatures::Scope scope(VFP3); | 3243 CpuFeatures::Scope scope(VFP3); |
| 3237 DwVfpRegister value(ToDoubleRegister(instr->value())); | 3244 DwVfpRegister value(ToDoubleRegister(instr->value())); |
| 3238 __ add(scratch0(), external_pointer, Operand(key, LSL, 2)); | 3245 __ add(scratch0(), external_pointer, Operand(key, LSL, 2)); |
| 3239 __ vcvt_f32_f64(double_scratch0().low(), value); | 3246 __ vcvt_f32_f64(double_scratch0().low(), value); |
| 3240 __ vstr(double_scratch0().low(), scratch0(), 0); | 3247 __ vstr(double_scratch0().low(), scratch0(), 0); |
| 3248 } else if (array_type == kExternalDoubleArray) { |
| 3249 CpuFeatures::Scope scope(VFP3); |
| 3250 DwVfpRegister value(ToDoubleRegister(instr->value())); |
| 3251 __ add(scratch0(), external_pointer, Operand(key, LSL, 3)); |
| 3252 __ vstr(value, scratch0(), 0); |
| 3241 } else { | 3253 } else { |
| 3242 Register value(ToRegister(instr->value())); | 3254 Register value(ToRegister(instr->value())); |
| 3243 switch (array_type) { | 3255 switch (array_type) { |
| 3244 case kExternalPixelArray: | 3256 case kExternalPixelArray: |
| 3245 // Clamp the value to [0..255]. | 3257 // Clamp the value to [0..255]. |
| 3246 __ Usat(value, 8, Operand(value)); | 3258 __ Usat(value, 8, Operand(value)); |
| 3247 __ strb(value, MemOperand(external_pointer, key)); | 3259 __ strb(value, MemOperand(external_pointer, key)); |
| 3248 break; | 3260 break; |
| 3249 case kExternalByteArray: | 3261 case kExternalByteArray: |
| 3250 case kExternalUnsignedByteArray: | 3262 case kExternalUnsignedByteArray: |
| 3251 __ strb(value, MemOperand(external_pointer, key)); | 3263 __ strb(value, MemOperand(external_pointer, key)); |
| 3252 break; | 3264 break; |
| 3253 case kExternalShortArray: | 3265 case kExternalShortArray: |
| 3254 case kExternalUnsignedShortArray: | 3266 case kExternalUnsignedShortArray: |
| 3255 __ strh(value, MemOperand(external_pointer, key, LSL, 1)); | 3267 __ strh(value, MemOperand(external_pointer, key, LSL, 1)); |
| 3256 break; | 3268 break; |
| 3257 case kExternalIntArray: | 3269 case kExternalIntArray: |
| 3258 case kExternalUnsignedIntArray: | 3270 case kExternalUnsignedIntArray: |
| 3259 __ str(value, MemOperand(external_pointer, key, LSL, 2)); | 3271 __ str(value, MemOperand(external_pointer, key, LSL, 2)); |
| 3260 break; | 3272 break; |
| 3261 case kExternalFloatArray: | 3273 case kExternalFloatArray: |
| 3274 case kExternalDoubleArray: |
| 3262 UNREACHABLE(); | 3275 UNREACHABLE(); |
| 3263 break; | 3276 break; |
| 3264 } | 3277 } |
| 3265 } | 3278 } |
| 3266 } | 3279 } |
| 3267 | 3280 |
| 3268 | 3281 |
| 3269 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 3282 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
| 3270 ASSERT(ToRegister(instr->object()).is(r2)); | 3283 ASSERT(ToRegister(instr->object()).is(r2)); |
| 3271 ASSERT(ToRegister(instr->key()).is(r1)); | 3284 ASSERT(ToRegister(instr->key()).is(r1)); |
| (...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4269 ASSERT(!environment->HasBeenRegistered()); | 4282 ASSERT(!environment->HasBeenRegistered()); |
| 4270 RegisterEnvironmentForDeoptimization(environment); | 4283 RegisterEnvironmentForDeoptimization(environment); |
| 4271 ASSERT(osr_pc_offset_ == -1); | 4284 ASSERT(osr_pc_offset_ == -1); |
| 4272 osr_pc_offset_ = masm()->pc_offset(); | 4285 osr_pc_offset_ = masm()->pc_offset(); |
| 4273 } | 4286 } |
| 4274 | 4287 |
| 4275 | 4288 |
| 4276 #undef __ | 4289 #undef __ |
| 4277 | 4290 |
| 4278 } } // namespace v8::internal | 4291 } } // namespace v8::internal |
| OLD | NEW |