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 2896 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2907 int constant_key = 0; | 2907 int constant_key = 0; |
2908 if (key_is_constant) { | 2908 if (key_is_constant) { |
2909 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); | 2909 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); |
2910 if (constant_key & 0xF0000000) { | 2910 if (constant_key & 0xF0000000) { |
2911 Abort("array index constant value too big."); | 2911 Abort("array index constant value too big."); |
2912 } | 2912 } |
2913 } else { | 2913 } else { |
2914 key = ToRegister(instr->key()); | 2914 key = ToRegister(instr->key()); |
2915 } | 2915 } |
2916 int element_size_shift = ElementsKindToShiftSize(elements_kind); | 2916 int element_size_shift = ElementsKindToShiftSize(elements_kind); |
2917 int shift_size = (instr->hydrogen()->key()->representation().IsTagged()) | 2917 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) |
2918 ? (element_size_shift - kSmiTagSize) : element_size_shift; | 2918 ? (element_size_shift - kSmiTagSize) : element_size_shift; |
2919 int additional_offset = instr->additional_index() << element_size_shift; | 2919 int additional_offset = instr->additional_index() << element_size_shift; |
2920 | 2920 |
2921 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || | 2921 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
2922 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { | 2922 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
2923 FPURegister result = ToDoubleRegister(instr->result()); | 2923 FPURegister result = ToDoubleRegister(instr->result()); |
2924 if (key_is_constant) { | 2924 if (key_is_constant) { |
2925 __ Addu(scratch0(), external_pointer, constant_key << element_size_shift); | 2925 __ Addu(scratch0(), external_pointer, constant_key << element_size_shift); |
2926 } else { | 2926 } else { |
2927 __ sll(scratch0(), key, shift_size); | 2927 __ sll(scratch0(), key, shift_size); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2981 | 2981 |
2982 | 2982 |
2983 void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) { | 2983 void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) { |
2984 Register elements = ToRegister(instr->elements()); | 2984 Register elements = ToRegister(instr->elements()); |
2985 bool key_is_constant = instr->key()->IsConstantOperand(); | 2985 bool key_is_constant = instr->key()->IsConstantOperand(); |
2986 Register key = no_reg; | 2986 Register key = no_reg; |
2987 DoubleRegister result = ToDoubleRegister(instr->result()); | 2987 DoubleRegister result = ToDoubleRegister(instr->result()); |
2988 Register scratch = scratch0(); | 2988 Register scratch = scratch0(); |
2989 | 2989 |
2990 int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS); | 2990 int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS); |
2991 int shift_size = (instr->hydrogen()->key()->representation().IsTagged()) | 2991 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) |
2992 ? (element_size_shift - kSmiTagSize) : element_size_shift; | 2992 ? (element_size_shift - kSmiTagSize) : element_size_shift; |
2993 int constant_key = 0; | 2993 int constant_key = 0; |
2994 if (key_is_constant) { | 2994 if (key_is_constant) { |
2995 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); | 2995 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); |
2996 if (constant_key & 0xF0000000) { | 2996 if (constant_key & 0xF0000000) { |
2997 Abort("array index constant value too big."); | 2997 Abort("array index constant value too big."); |
2998 } | 2998 } |
2999 } else { | 2999 } else { |
3000 key = ToRegister(instr->key()); | 3000 key = ToRegister(instr->key()); |
3001 } | 3001 } |
(...skipping 24 matching lines...) Expand all Loading... |
3026 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); | 3026 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); |
3027 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + | 3027 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + |
3028 instr->additional_index()); | 3028 instr->additional_index()); |
3029 store_base = elements; | 3029 store_base = elements; |
3030 } else { | 3030 } else { |
3031 Register key = EmitLoadRegister(instr->key(), scratch0()); | 3031 Register key = EmitLoadRegister(instr->key(), scratch0()); |
3032 // Even though the HLoadKeyed instruction forces the input | 3032 // Even though the HLoadKeyed instruction forces the input |
3033 // representation for the key to be an integer, the input gets replaced | 3033 // representation for the key to be an integer, the input gets replaced |
3034 // during bound check elimination with the index argument to the bounds | 3034 // during bound check elimination with the index argument to the bounds |
3035 // check, which can be tagged, so that case must be handled here, too. | 3035 // check, which can be tagged, so that case must be handled here, too. |
3036 if (instr->hydrogen()->key()->representation().IsTagged()) { | 3036 if (instr->hydrogen()->key()->representation().IsSmi()) { |
3037 __ sll(scratch, key, kPointerSizeLog2 - kSmiTagSize); | 3037 __ sll(scratch, key, kPointerSizeLog2 - kSmiTagSize); |
3038 __ addu(scratch, elements, scratch); | 3038 __ addu(scratch, elements, scratch); |
3039 } else { | 3039 } else { |
3040 __ sll(scratch, key, kPointerSizeLog2); | 3040 __ sll(scratch, key, kPointerSizeLog2); |
3041 __ addu(scratch, elements, scratch); | 3041 __ addu(scratch, elements, scratch); |
3042 } | 3042 } |
3043 offset = FixedArray::OffsetOfElementAt(instr->additional_index()); | 3043 offset = FixedArray::OffsetOfElementAt(instr->additional_index()); |
3044 } | 3044 } |
3045 __ lw(result, FieldMemOperand(store_base, offset)); | 3045 __ lw(result, FieldMemOperand(store_base, offset)); |
3046 | 3046 |
(...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4012 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 4012 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
4013 } | 4013 } |
4014 | 4014 |
4015 | 4015 |
4016 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { | 4016 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
4017 if (instr->hydrogen()->skip_check()) return; | 4017 if (instr->hydrogen()->skip_check()) return; |
4018 | 4018 |
4019 if (instr->index()->IsConstantOperand()) { | 4019 if (instr->index()->IsConstantOperand()) { |
4020 int constant_index = | 4020 int constant_index = |
4021 ToInteger32(LConstantOperand::cast(instr->index())); | 4021 ToInteger32(LConstantOperand::cast(instr->index())); |
4022 if (instr->hydrogen()->length()->representation().IsTagged()) { | 4022 if (instr->hydrogen()->length()->representation().IsSmi()) { |
4023 __ li(at, Operand(Smi::FromInt(constant_index))); | 4023 __ li(at, Operand(Smi::FromInt(constant_index))); |
4024 } else { | 4024 } else { |
4025 __ li(at, Operand(constant_index)); | 4025 __ li(at, Operand(constant_index)); |
4026 } | 4026 } |
4027 DeoptimizeIf(hs, | 4027 DeoptimizeIf(hs, |
4028 instr->environment(), | 4028 instr->environment(), |
4029 at, | 4029 at, |
4030 Operand(ToRegister(instr->length()))); | 4030 Operand(ToRegister(instr->length()))); |
4031 } else { | 4031 } else { |
4032 DeoptimizeIf(hs, | 4032 DeoptimizeIf(hs, |
(...skipping 12 matching lines...) Expand all Loading... |
4045 int constant_key = 0; | 4045 int constant_key = 0; |
4046 if (key_is_constant) { | 4046 if (key_is_constant) { |
4047 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); | 4047 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); |
4048 if (constant_key & 0xF0000000) { | 4048 if (constant_key & 0xF0000000) { |
4049 Abort("array index constant value too big."); | 4049 Abort("array index constant value too big."); |
4050 } | 4050 } |
4051 } else { | 4051 } else { |
4052 key = ToRegister(instr->key()); | 4052 key = ToRegister(instr->key()); |
4053 } | 4053 } |
4054 int element_size_shift = ElementsKindToShiftSize(elements_kind); | 4054 int element_size_shift = ElementsKindToShiftSize(elements_kind); |
4055 int shift_size = (instr->hydrogen()->key()->representation().IsTagged()) | 4055 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) |
4056 ? (element_size_shift - kSmiTagSize) : element_size_shift; | 4056 ? (element_size_shift - kSmiTagSize) : element_size_shift; |
4057 int additional_offset = instr->additional_index() << element_size_shift; | 4057 int additional_offset = instr->additional_index() << element_size_shift; |
4058 | 4058 |
4059 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || | 4059 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
4060 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { | 4060 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
4061 FPURegister value(ToDoubleRegister(instr->value())); | 4061 FPURegister value(ToDoubleRegister(instr->value())); |
4062 if (key_is_constant) { | 4062 if (key_is_constant) { |
4063 __ Addu(scratch0(), external_pointer, constant_key << | 4063 __ Addu(scratch0(), external_pointer, constant_key << |
4064 element_size_shift); | 4064 element_size_shift); |
4065 } else { | 4065 } else { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4123 // double value. | 4123 // double value. |
4124 if (key_is_constant) { | 4124 if (key_is_constant) { |
4125 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); | 4125 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); |
4126 if (constant_key & 0xF0000000) { | 4126 if (constant_key & 0xF0000000) { |
4127 Abort("array index constant value too big."); | 4127 Abort("array index constant value too big."); |
4128 } | 4128 } |
4129 } else { | 4129 } else { |
4130 key = ToRegister(instr->key()); | 4130 key = ToRegister(instr->key()); |
4131 } | 4131 } |
4132 int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS); | 4132 int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS); |
4133 int shift_size = (instr->hydrogen()->key()->representation().IsTagged()) | 4133 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) |
4134 ? (element_size_shift - kSmiTagSize) : element_size_shift; | 4134 ? (element_size_shift - kSmiTagSize) : element_size_shift; |
4135 if (key_is_constant) { | 4135 if (key_is_constant) { |
4136 __ Addu(scratch, elements, Operand((constant_key << element_size_shift) + | 4136 __ Addu(scratch, elements, Operand((constant_key << element_size_shift) + |
4137 FixedDoubleArray::kHeaderSize - kHeapObjectTag)); | 4137 FixedDoubleArray::kHeaderSize - kHeapObjectTag)); |
4138 } else { | 4138 } else { |
4139 __ sll(scratch, key, shift_size); | 4139 __ sll(scratch, key, shift_size); |
4140 __ Addu(scratch, elements, Operand(scratch)); | 4140 __ Addu(scratch, elements, Operand(scratch)); |
4141 __ Addu(scratch, scratch, | 4141 __ Addu(scratch, scratch, |
4142 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag)); | 4142 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag)); |
4143 } | 4143 } |
(...skipping 29 matching lines...) Expand all Loading... |
4173 ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); | 4173 ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); |
4174 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); | 4174 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); |
4175 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + | 4175 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + |
4176 instr->additional_index()); | 4176 instr->additional_index()); |
4177 store_base = elements; | 4177 store_base = elements; |
4178 } else { | 4178 } else { |
4179 // Even though the HLoadKeyed instruction forces the input | 4179 // Even though the HLoadKeyed instruction forces the input |
4180 // representation for the key to be an integer, the input gets replaced | 4180 // representation for the key to be an integer, the input gets replaced |
4181 // during bound check elimination with the index argument to the bounds | 4181 // during bound check elimination with the index argument to the bounds |
4182 // check, which can be tagged, so that case must be handled here, too. | 4182 // check, which can be tagged, so that case must be handled here, too. |
4183 if (instr->hydrogen()->key()->representation().IsTagged()) { | 4183 if (instr->hydrogen()->key()->representation().IsSmi()) { |
4184 __ sll(scratch, key, kPointerSizeLog2 - kSmiTagSize); | 4184 __ sll(scratch, key, kPointerSizeLog2 - kSmiTagSize); |
4185 __ addu(scratch, elements, scratch); | 4185 __ addu(scratch, elements, scratch); |
4186 } else { | 4186 } else { |
4187 __ sll(scratch, key, kPointerSizeLog2); | 4187 __ sll(scratch, key, kPointerSizeLog2); |
4188 __ addu(scratch, elements, scratch); | 4188 __ addu(scratch, elements, scratch); |
4189 } | 4189 } |
4190 offset = FixedArray::OffsetOfElementAt(instr->additional_index()); | 4190 offset = FixedArray::OffsetOfElementAt(instr->additional_index()); |
4191 } | 4191 } |
4192 __ sw(value, FieldMemOperand(store_base, offset)); | 4192 __ sw(value, FieldMemOperand(store_base, offset)); |
4193 | 4193 |
(...skipping 1571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5765 __ Subu(scratch, result, scratch); | 5765 __ Subu(scratch, result, scratch); |
5766 __ lw(result, FieldMemOperand(scratch, | 5766 __ lw(result, FieldMemOperand(scratch, |
5767 FixedArray::kHeaderSize - kPointerSize)); | 5767 FixedArray::kHeaderSize - kPointerSize)); |
5768 __ bind(&done); | 5768 __ bind(&done); |
5769 } | 5769 } |
5770 | 5770 |
5771 | 5771 |
5772 #undef __ | 5772 #undef __ |
5773 | 5773 |
5774 } } // namespace v8::internal | 5774 } } // namespace v8::internal |
OLD | NEW |