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 4332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4343 } else { | 4343 } else { |
4344 key = ToRegister(instr->key()); | 4344 key = ToRegister(instr->key()); |
4345 } | 4345 } |
4346 int element_size_shift = ElementsKindToShiftSize(elements_kind); | 4346 int element_size_shift = ElementsKindToShiftSize(elements_kind); |
4347 int shift_size = (instr->hydrogen()->key()->representation().IsTagged()) | 4347 int shift_size = (instr->hydrogen()->key()->representation().IsTagged()) |
4348 ? (element_size_shift - kSmiTagSize) : element_size_shift; | 4348 ? (element_size_shift - kSmiTagSize) : element_size_shift; |
4349 int additional_offset = instr->additional_index() << element_size_shift; | 4349 int additional_offset = instr->additional_index() << element_size_shift; |
4350 | 4350 |
4351 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || | 4351 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
4352 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { | 4352 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
4353 CpuFeatureScope scope(masm(), VFP3); | |
4354 DwVfpRegister value(ToDoubleRegister(instr->value())); | 4353 DwVfpRegister value(ToDoubleRegister(instr->value())); |
4355 Operand operand(key_is_constant | 4354 Operand operand(key_is_constant |
4356 ? Operand(constant_key << element_size_shift) | 4355 ? Operand(constant_key << element_size_shift) |
4357 : Operand(key, LSL, shift_size)); | 4356 : Operand(key, LSL, shift_size)); |
4358 __ add(scratch0(), external_pointer, operand); | 4357 __ add(scratch0(), external_pointer, operand); |
4359 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { | 4358 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
4360 __ vcvt_f32_f64(double_scratch0().low(), value); | 4359 __ vcvt_f32_f64(double_scratch0().low(), value); |
4361 __ vstr(double_scratch0().low(), scratch0(), additional_offset); | 4360 __ vstr(double_scratch0().low(), scratch0(), additional_offset); |
4362 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS | 4361 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS |
4363 __ vstr(value, scratch0(), additional_offset); | 4362 __ vstr(value, scratch0(), additional_offset); |
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5035 __ b(&done); | 5034 __ b(&done); |
5036 | 5035 |
5037 __ bind(&heap_number); | 5036 __ bind(&heap_number); |
5038 __ sub(scratch1, input_reg, Operand(kHeapObjectTag)); | 5037 __ sub(scratch1, input_reg, Operand(kHeapObjectTag)); |
5039 __ vldr(double_scratch2, scratch1, HeapNumber::kValueOffset); | 5038 __ vldr(double_scratch2, scratch1, HeapNumber::kValueOffset); |
5040 | 5039 |
5041 __ ECMAToInt32(input_reg, double_scratch2, double_scratch, | 5040 __ ECMAToInt32(input_reg, double_scratch2, double_scratch, |
5042 scratch1, scratch2, scratch3); | 5041 scratch1, scratch2, scratch3); |
5043 | 5042 |
5044 } else { | 5043 } else { |
5045 CpuFeatureScope scope(masm(), VFP3); | |
5046 // Deoptimize if we don't have a heap number. | 5044 // Deoptimize if we don't have a heap number. |
5047 DeoptimizeIf(ne, instr->environment()); | 5045 DeoptimizeIf(ne, instr->environment()); |
5048 | 5046 |
5049 __ sub(ip, input_reg, Operand(kHeapObjectTag)); | 5047 __ sub(ip, input_reg, Operand(kHeapObjectTag)); |
5050 __ vldr(double_scratch, ip, HeapNumber::kValueOffset); | 5048 __ vldr(double_scratch, ip, HeapNumber::kValueOffset); |
5051 __ TryDoubleToInt32Exact(input_reg, double_scratch, double_scratch2); | 5049 __ TryDoubleToInt32Exact(input_reg, double_scratch, double_scratch2); |
5052 DeoptimizeIf(ne, instr->environment()); | 5050 DeoptimizeIf(ne, instr->environment()); |
5053 | 5051 |
5054 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { | 5052 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
5055 __ cmp(input_reg, Operand::Zero()); | 5053 __ cmp(input_reg, Operand::Zero()); |
(...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5996 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); | 5994 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); |
5997 __ ldr(result, FieldMemOperand(scratch, | 5995 __ ldr(result, FieldMemOperand(scratch, |
5998 FixedArray::kHeaderSize - kPointerSize)); | 5996 FixedArray::kHeaderSize - kPointerSize)); |
5999 __ bind(&done); | 5997 __ bind(&done); |
6000 } | 5998 } |
6001 | 5999 |
6002 | 6000 |
6003 #undef __ | 6001 #undef __ |
6004 | 6002 |
6005 } } // namespace v8::internal | 6003 } } // namespace v8::internal |
OLD | NEW |