Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Side by Side Diff: src/mips/lithium-codegen-mips.cc

Issue 141143003: MIPS: Implement in-heap backing store for typed arrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/mips/lithium-mips.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved.7 1 // Copyright 2012 the V8 project authors. All rights reserved.7
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 3064 matching lines...) Expand 10 before | Expand all | Expand 10 after
3075 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); 3075 constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
3076 if (constant_key & 0xF0000000) { 3076 if (constant_key & 0xF0000000) {
3077 Abort(kArrayIndexConstantValueTooBig); 3077 Abort(kArrayIndexConstantValueTooBig);
3078 } 3078 }
3079 } else { 3079 } else {
3080 key = ToRegister(instr->key()); 3080 key = ToRegister(instr->key());
3081 } 3081 }
3082 int element_size_shift = ElementsKindToShiftSize(elements_kind); 3082 int element_size_shift = ElementsKindToShiftSize(elements_kind);
3083 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) 3083 int shift_size = (instr->hydrogen()->key()->representation().IsSmi())
3084 ? (element_size_shift - kSmiTagSize) : element_size_shift; 3084 ? (element_size_shift - kSmiTagSize) : element_size_shift;
3085 int additional_offset = instr->additional_index() << element_size_shift; 3085 int additional_offset = IsFixedTypedArrayElementsKind(elements_kind)
3086 ? FixedTypedArrayBase::kDataOffset - kHeapObjectTag
3087 : 0;
3086 3088
3087 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || 3089 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
3088 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 3090 elements_kind == FLOAT32_ELEMENTS ||
3091 elements_kind == EXTERNAL_DOUBLE_ELEMENTS ||
3092 elements_kind == FLOAT64_ELEMENTS) {
3093 int base_offset =
3094 (instr->additional_index() << element_size_shift) + additional_offset;
3089 FPURegister result = ToDoubleRegister(instr->result()); 3095 FPURegister result = ToDoubleRegister(instr->result());
3090 if (key_is_constant) { 3096 if (key_is_constant) {
3091 __ Addu(scratch0(), external_pointer, constant_key << element_size_shift); 3097 __ Addu(scratch0(), external_pointer, constant_key << element_size_shift);
3092 } else { 3098 } else {
3093 __ sll(scratch0(), key, shift_size); 3099 __ sll(scratch0(), key, shift_size);
3094 __ Addu(scratch0(), scratch0(), external_pointer); 3100 __ Addu(scratch0(), scratch0(), external_pointer);
3095 } 3101 }
3096 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { 3102 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
3097 __ lwc1(result, MemOperand(scratch0(), additional_offset)); 3103 elements_kind == FLOAT32_ELEMENTS) {
3104 __ lwc1(result, MemOperand(scratch0(), base_offset));
3098 __ cvt_d_s(result, result); 3105 __ cvt_d_s(result, result);
3099 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS 3106 } else { // loading doubles, not floats.
3100 __ ldc1(result, MemOperand(scratch0(), additional_offset)); 3107 __ ldc1(result, MemOperand(scratch0(), base_offset));
3101 } 3108 }
3102 } else { 3109 } else {
3103 Register result = ToRegister(instr->result()); 3110 Register result = ToRegister(instr->result());
3104 MemOperand mem_operand = PrepareKeyedOperand( 3111 MemOperand mem_operand = PrepareKeyedOperand(
3105 key, external_pointer, key_is_constant, constant_key, 3112 key, external_pointer, key_is_constant, constant_key,
3106 element_size_shift, shift_size, 3113 element_size_shift, shift_size,
3107 instr->additional_index(), additional_offset); 3114 instr->additional_index(), additional_offset);
3108 switch (elements_kind) { 3115 switch (elements_kind) {
3109 case EXTERNAL_BYTE_ELEMENTS: 3116 case EXTERNAL_BYTE_ELEMENTS:
3117 case INT8_ELEMENTS:
3110 __ lb(result, mem_operand); 3118 __ lb(result, mem_operand);
3111 break; 3119 break;
3112 case EXTERNAL_PIXEL_ELEMENTS: 3120 case EXTERNAL_PIXEL_ELEMENTS:
3113 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 3121 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3122 case UINT8_ELEMENTS:
3123 case UINT8_CLAMPED_ELEMENTS:
3114 __ lbu(result, mem_operand); 3124 __ lbu(result, mem_operand);
3115 break; 3125 break;
3116 case EXTERNAL_SHORT_ELEMENTS: 3126 case EXTERNAL_SHORT_ELEMENTS:
3127 case INT16_ELEMENTS:
3117 __ lh(result, mem_operand); 3128 __ lh(result, mem_operand);
3118 break; 3129 break;
3119 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 3130 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3131 case UINT16_ELEMENTS:
3120 __ lhu(result, mem_operand); 3132 __ lhu(result, mem_operand);
3121 break; 3133 break;
3122 case EXTERNAL_INT_ELEMENTS: 3134 case EXTERNAL_INT_ELEMENTS:
3135 case INT32_ELEMENTS:
3123 __ lw(result, mem_operand); 3136 __ lw(result, mem_operand);
3124 break; 3137 break;
3125 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 3138 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
3139 case UINT32_ELEMENTS:
3126 __ lw(result, mem_operand); 3140 __ lw(result, mem_operand);
3127 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { 3141 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) {
3128 DeoptimizeIf(Ugreater_equal, instr->environment(), 3142 DeoptimizeIf(Ugreater_equal, instr->environment(),
3129 result, Operand(0x80000000)); 3143 result, Operand(0x80000000));
3130 } 3144 }
3131 break; 3145 break;
3146 case FLOAT32_ELEMENTS:
3147 case FLOAT64_ELEMENTS:
3132 case EXTERNAL_FLOAT_ELEMENTS: 3148 case EXTERNAL_FLOAT_ELEMENTS:
3133 case EXTERNAL_DOUBLE_ELEMENTS: 3149 case EXTERNAL_DOUBLE_ELEMENTS:
3134 case FAST_DOUBLE_ELEMENTS: 3150 case FAST_DOUBLE_ELEMENTS:
3135 case FAST_ELEMENTS: 3151 case FAST_ELEMENTS:
3136 case FAST_SMI_ELEMENTS: 3152 case FAST_SMI_ELEMENTS:
3137 case FAST_HOLEY_DOUBLE_ELEMENTS: 3153 case FAST_HOLEY_DOUBLE_ELEMENTS:
3138 case FAST_HOLEY_ELEMENTS: 3154 case FAST_HOLEY_ELEMENTS:
3139 case FAST_HOLEY_SMI_ELEMENTS: 3155 case FAST_HOLEY_SMI_ELEMENTS:
3140 case DICTIONARY_ELEMENTS: 3156 case DICTIONARY_ELEMENTS:
3141 case NON_STRICT_ARGUMENTS_ELEMENTS: 3157 case NON_STRICT_ARGUMENTS_ELEMENTS:
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
3220 DeoptimizeIf(ne, instr->environment(), scratch, Operand(zero_reg)); 3236 DeoptimizeIf(ne, instr->environment(), scratch, Operand(zero_reg));
3221 } else { 3237 } else {
3222 __ LoadRoot(scratch, Heap::kTheHoleValueRootIndex); 3238 __ LoadRoot(scratch, Heap::kTheHoleValueRootIndex);
3223 DeoptimizeIf(eq, instr->environment(), result, Operand(scratch)); 3239 DeoptimizeIf(eq, instr->environment(), result, Operand(scratch));
3224 } 3240 }
3225 } 3241 }
3226 } 3242 }
3227 3243
3228 3244
3229 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { 3245 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) {
3230 if (instr->is_external()) { 3246 if (instr->is_typed_elements()) {
3231 DoLoadKeyedExternalArray(instr); 3247 DoLoadKeyedExternalArray(instr);
3232 } else if (instr->hydrogen()->representation().IsDouble()) { 3248 } else if (instr->hydrogen()->representation().IsDouble()) {
3233 DoLoadKeyedFixedDoubleArray(instr); 3249 DoLoadKeyedFixedDoubleArray(instr);
3234 } else { 3250 } else {
3235 DoLoadKeyedFixedArray(instr); 3251 DoLoadKeyedFixedArray(instr);
3236 } 3252 }
3237 } 3253 }
3238 3254
3239 3255
3240 MemOperand LCodeGen::PrepareKeyedOperand(Register key, 3256 MemOperand LCodeGen::PrepareKeyedOperand(Register key,
3241 Register base, 3257 Register base,
3242 bool key_is_constant, 3258 bool key_is_constant,
3243 int constant_key, 3259 int constant_key,
3244 int element_size, 3260 int element_size,
3245 int shift_size, 3261 int shift_size,
3246 int additional_index, 3262 int additional_index,
3247 int additional_offset) { 3263 int additional_offset) {
3248 if (additional_index != 0 && !key_is_constant) { 3264 int base_offset = (additional_index << element_size) + additional_offset;
3265 if (key_is_constant) {
3266 return MemOperand(base,
3267 base_offset + (constant_key << element_size));
3268 }
3269
3270 if (additional_offset != 0) {
3271 if (shift_size >= 0) {
3272 __ sll(scratch0(), key, shift_size);
3273 __ Addu(scratch0(), scratch0(), Operand(base_offset));
3274 } else {
3275 ASSERT_EQ(-1, shift_size);
3276 __ srl(scratch0(), key, 1);
3277 __ Addu(scratch0(), scratch0(), Operand(base_offset));
3278 }
3279 __ Addu(scratch0(), base, scratch0());
3280 return MemOperand(scratch0());
3281 }
3282
3283 if (additional_index != 0) {
3249 additional_index *= 1 << (element_size - shift_size); 3284 additional_index *= 1 << (element_size - shift_size);
3250 __ Addu(scratch0(), key, Operand(additional_index)); 3285 __ Addu(scratch0(), key, Operand(additional_index));
3251 } 3286 }
3252 3287
3253 if (key_is_constant) {
3254 return MemOperand(base,
3255 (constant_key << element_size) + additional_offset);
3256 }
3257
3258 if (additional_index == 0) { 3288 if (additional_index == 0) {
3259 if (shift_size >= 0) { 3289 if (shift_size >= 0) {
3260 __ sll(scratch0(), key, shift_size); 3290 __ sll(scratch0(), key, shift_size);
3261 __ Addu(scratch0(), base, scratch0()); 3291 __ Addu(scratch0(), base, scratch0());
3262 return MemOperand(scratch0()); 3292 return MemOperand(scratch0());
3263 } else { 3293 } else {
3264 ASSERT_EQ(-1, shift_size); 3294 ASSERT_EQ(-1, shift_size);
3265 __ srl(scratch0(), key, 1); 3295 __ srl(scratch0(), key, 1);
3266 __ Addu(scratch0(), base, scratch0()); 3296 __ Addu(scratch0(), base, scratch0());
3267 return MemOperand(scratch0()); 3297 return MemOperand(scratch0());
(...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after
4171 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); 4201 constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
4172 if (constant_key & 0xF0000000) { 4202 if (constant_key & 0xF0000000) {
4173 Abort(kArrayIndexConstantValueTooBig); 4203 Abort(kArrayIndexConstantValueTooBig);
4174 } 4204 }
4175 } else { 4205 } else {
4176 key = ToRegister(instr->key()); 4206 key = ToRegister(instr->key());
4177 } 4207 }
4178 int element_size_shift = ElementsKindToShiftSize(elements_kind); 4208 int element_size_shift = ElementsKindToShiftSize(elements_kind);
4179 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) 4209 int shift_size = (instr->hydrogen()->key()->representation().IsSmi())
4180 ? (element_size_shift - kSmiTagSize) : element_size_shift; 4210 ? (element_size_shift - kSmiTagSize) : element_size_shift;
4181 int additional_offset = instr->additional_index() << element_size_shift; 4211 int additional_offset = IsFixedTypedArrayElementsKind(elements_kind)
4212 ? FixedTypedArrayBase::kDataOffset - kHeapObjectTag
4213 : 0;
4182 4214
4183 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || 4215 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
4184 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 4216 elements_kind == FLOAT32_ELEMENTS ||
4217 elements_kind == EXTERNAL_DOUBLE_ELEMENTS ||
4218 elements_kind == FLOAT64_ELEMENTS) {
4219 int base_offset =
4220 (instr->additional_index() << element_size_shift) + additional_offset;
4185 Register address = scratch0(); 4221 Register address = scratch0();
4186 FPURegister value(ToDoubleRegister(instr->value())); 4222 FPURegister value(ToDoubleRegister(instr->value()));
4187 if (key_is_constant) { 4223 if (key_is_constant) {
4188 if (constant_key != 0) { 4224 if (constant_key != 0) {
4189 __ Addu(address, external_pointer, 4225 __ Addu(address, external_pointer,
4190 Operand(constant_key << element_size_shift)); 4226 Operand(constant_key << element_size_shift));
4191 } else { 4227 } else {
4192 address = external_pointer; 4228 address = external_pointer;
4193 } 4229 }
4194 } else { 4230 } else {
4195 __ sll(address, key, shift_size); 4231 __ sll(address, key, shift_size);
4196 __ Addu(address, external_pointer, address); 4232 __ Addu(address, external_pointer, address);
4197 } 4233 }
4198 4234
4199 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { 4235 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
4236 elements_kind == FLOAT32_ELEMENTS) {
4200 __ cvt_s_d(double_scratch0(), value); 4237 __ cvt_s_d(double_scratch0(), value);
4201 __ swc1(double_scratch0(), MemOperand(address, additional_offset)); 4238 __ swc1(double_scratch0(), MemOperand(address, base_offset));
4202 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS 4239 } else { // Storing doubles, not floats.
4203 __ sdc1(value, MemOperand(address, additional_offset)); 4240 __ sdc1(value, MemOperand(address, base_offset));
4204 } 4241 }
4205 } else { 4242 } else {
4206 Register value(ToRegister(instr->value())); 4243 Register value(ToRegister(instr->value()));
4207 MemOperand mem_operand = PrepareKeyedOperand( 4244 MemOperand mem_operand = PrepareKeyedOperand(
4208 key, external_pointer, key_is_constant, constant_key, 4245 key, external_pointer, key_is_constant, constant_key,
4209 element_size_shift, shift_size, 4246 element_size_shift, shift_size,
4210 instr->additional_index(), additional_offset); 4247 instr->additional_index(), additional_offset);
4211 switch (elements_kind) { 4248 switch (elements_kind) {
4212 case EXTERNAL_PIXEL_ELEMENTS: 4249 case EXTERNAL_PIXEL_ELEMENTS:
4213 case EXTERNAL_BYTE_ELEMENTS: 4250 case EXTERNAL_BYTE_ELEMENTS:
4214 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 4251 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
4252 case UINT8_ELEMENTS:
4253 case UINT8_CLAMPED_ELEMENTS:
4254 case INT8_ELEMENTS:
4215 __ sb(value, mem_operand); 4255 __ sb(value, mem_operand);
4216 break; 4256 break;
4217 case EXTERNAL_SHORT_ELEMENTS: 4257 case EXTERNAL_SHORT_ELEMENTS:
4218 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 4258 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
4259 case INT16_ELEMENTS:
4260 case UINT16_ELEMENTS:
4219 __ sh(value, mem_operand); 4261 __ sh(value, mem_operand);
4220 break; 4262 break;
4221 case EXTERNAL_INT_ELEMENTS: 4263 case EXTERNAL_INT_ELEMENTS:
4222 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 4264 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
4265 case INT32_ELEMENTS:
4266 case UINT32_ELEMENTS:
4223 __ sw(value, mem_operand); 4267 __ sw(value, mem_operand);
4224 break; 4268 break;
4269 case FLOAT32_ELEMENTS:
4270 case FLOAT64_ELEMENTS:
4225 case EXTERNAL_FLOAT_ELEMENTS: 4271 case EXTERNAL_FLOAT_ELEMENTS:
4226 case EXTERNAL_DOUBLE_ELEMENTS: 4272 case EXTERNAL_DOUBLE_ELEMENTS:
4227 case FAST_DOUBLE_ELEMENTS: 4273 case FAST_DOUBLE_ELEMENTS:
4228 case FAST_ELEMENTS: 4274 case FAST_ELEMENTS:
4229 case FAST_SMI_ELEMENTS: 4275 case FAST_SMI_ELEMENTS:
4230 case FAST_HOLEY_DOUBLE_ELEMENTS: 4276 case FAST_HOLEY_DOUBLE_ELEMENTS:
4231 case FAST_HOLEY_ELEMENTS: 4277 case FAST_HOLEY_ELEMENTS:
4232 case FAST_HOLEY_SMI_ELEMENTS: 4278 case FAST_HOLEY_SMI_ELEMENTS:
4233 case DICTIONARY_ELEMENTS: 4279 case DICTIONARY_ELEMENTS:
4234 case NON_STRICT_ARGUMENTS_ELEMENTS: 4280 case NON_STRICT_ARGUMENTS_ELEMENTS:
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
4333 GetRAState(), 4379 GetRAState(),
4334 kSaveFPRegs, 4380 kSaveFPRegs,
4335 EMIT_REMEMBERED_SET, 4381 EMIT_REMEMBERED_SET,
4336 check_needed); 4382 check_needed);
4337 } 4383 }
4338 } 4384 }
4339 4385
4340 4386
4341 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { 4387 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) {
4342 // By cases: external, fast double 4388 // By cases: external, fast double
4343 if (instr->is_external()) { 4389 if (instr->is_typed_elements()) {
4344 DoStoreKeyedExternalArray(instr); 4390 DoStoreKeyedExternalArray(instr);
4345 } else if (instr->hydrogen()->value()->representation().IsDouble()) { 4391 } else if (instr->hydrogen()->value()->representation().IsDouble()) {
4346 DoStoreKeyedFixedDoubleArray(instr); 4392 DoStoreKeyedFixedDoubleArray(instr);
4347 } else { 4393 } else {
4348 DoStoreKeyedFixedArray(instr); 4394 DoStoreKeyedFixedArray(instr);
4349 } 4395 }
4350 } 4396 }
4351 4397
4352 4398
4353 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { 4399 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) {
(...skipping 1435 matching lines...) Expand 10 before | Expand all | Expand 10 after
5789 __ Subu(scratch, result, scratch); 5835 __ Subu(scratch, result, scratch);
5790 __ lw(result, FieldMemOperand(scratch, 5836 __ lw(result, FieldMemOperand(scratch,
5791 FixedArray::kHeaderSize - kPointerSize)); 5837 FixedArray::kHeaderSize - kPointerSize));
5792 __ bind(&done); 5838 __ bind(&done);
5793 } 5839 }
5794 5840
5795 5841
5796 #undef __ 5842 #undef __
5797 5843
5798 } } // namespace v8::internal 5844 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/mips/lithium-mips.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698