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 5228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5239 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); | 5239 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); |
5240 __ cmp(input_reg, Operand(ip)); | 5240 __ cmp(input_reg, Operand(ip)); |
5241 DeoptimizeIf(ne, instr->environment()); | 5241 DeoptimizeIf(ne, instr->environment()); |
5242 __ mov(input_reg, Operand::Zero()); | 5242 __ mov(input_reg, Operand::Zero()); |
5243 __ b(&done); | 5243 __ b(&done); |
5244 | 5244 |
5245 __ bind(&heap_number); | 5245 __ bind(&heap_number); |
5246 __ sub(scratch1, input_reg, Operand(kHeapObjectTag)); | 5246 __ sub(scratch1, input_reg, Operand(kHeapObjectTag)); |
5247 __ vldr(double_scratch2, scratch1, HeapNumber::kValueOffset); | 5247 __ vldr(double_scratch2, scratch1, HeapNumber::kValueOffset); |
5248 | 5248 |
5249 __ EmitECMATruncate(input_reg, | 5249 __ ECMAToInt32VFP(input_reg, double_scratch2, double_scratch, |
5250 double_scratch2, | 5250 scratch1, scratch2, scratch3); |
5251 double_scratch, | |
5252 scratch1, | |
5253 scratch2, | |
5254 scratch3); | |
5255 | 5251 |
5256 } else { | 5252 } else { |
5257 CpuFeatureScope scope(masm(), VFP3); | 5253 CpuFeatureScope scope(masm(), VFP3); |
5258 // Deoptimize if we don't have a heap number. | 5254 // Deoptimize if we don't have a heap number. |
5259 DeoptimizeIf(ne, instr->environment()); | 5255 DeoptimizeIf(ne, instr->environment()); |
5260 | 5256 |
5261 __ sub(ip, input_reg, Operand(kHeapObjectTag)); | 5257 __ sub(ip, input_reg, Operand(kHeapObjectTag)); |
5262 __ vldr(double_scratch, ip, HeapNumber::kValueOffset); | 5258 __ vldr(double_scratch, ip, HeapNumber::kValueOffset); |
5263 __ TryDoubleToInt32Exact(input_reg, double_scratch, double_scratch2); | 5259 __ TryDoubleToInt32Exact(input_reg, double_scratch, double_scratch2); |
5264 DeoptimizeIf(ne, instr->environment()); | 5260 DeoptimizeIf(ne, instr->environment()); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5342 Register result_reg = ToRegister(instr->result()); | 5338 Register result_reg = ToRegister(instr->result()); |
5343 Register scratch1 = scratch0(); | 5339 Register scratch1 = scratch0(); |
5344 Register scratch2 = ToRegister(instr->temp()); | 5340 Register scratch2 = ToRegister(instr->temp()); |
5345 DwVfpRegister double_input = ToDoubleRegister(instr->value()); | 5341 DwVfpRegister double_input = ToDoubleRegister(instr->value()); |
5346 DwVfpRegister double_scratch = double_scratch0(); | 5342 DwVfpRegister double_scratch = double_scratch0(); |
5347 | 5343 |
5348 Label done; | 5344 Label done; |
5349 | 5345 |
5350 if (instr->truncating()) { | 5346 if (instr->truncating()) { |
5351 Register scratch3 = ToRegister(instr->temp2()); | 5347 Register scratch3 = ToRegister(instr->temp2()); |
5352 __ EmitECMATruncate(result_reg, | 5348 __ ECMAToInt32VFP(result_reg, double_input, double_scratch, |
5353 double_input, | 5349 scratch1, scratch2, scratch3); |
5354 double_scratch, | |
5355 scratch1, | |
5356 scratch2, | |
5357 scratch3); | |
5358 } else { | 5350 } else { |
5359 __ TryDoubleToInt32Exact(result_reg, double_input, double_scratch); | 5351 __ TryDoubleToInt32Exact(result_reg, double_input, double_scratch); |
5360 // Deoptimize if the input wasn't a int32 (inside a double). | 5352 // Deoptimize if the input wasn't a int32 (inside a double). |
5361 DeoptimizeIf(ne, instr->environment()); | 5353 DeoptimizeIf(ne, instr->environment()); |
5362 } | 5354 } |
5363 __ bind(&done); | 5355 __ bind(&done); |
5364 } | 5356 } |
5365 | 5357 |
5366 | 5358 |
5367 void LCodeGen::DoCheckSmi(LCheckSmi* instr) { | 5359 void LCodeGen::DoCheckSmi(LCheckSmi* instr) { |
(...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6391 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); | 6383 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); |
6392 __ ldr(result, FieldMemOperand(scratch, | 6384 __ ldr(result, FieldMemOperand(scratch, |
6393 FixedArray::kHeaderSize - kPointerSize)); | 6385 FixedArray::kHeaderSize - kPointerSize)); |
6394 __ bind(&done); | 6386 __ bind(&done); |
6395 } | 6387 } |
6396 | 6388 |
6397 | 6389 |
6398 #undef __ | 6390 #undef __ |
6399 | 6391 |
6400 } } // namespace v8::internal | 6392 } } // namespace v8::internal |
OLD | NEW |