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

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

Issue 11412272: [v8-dev] ARM: Improve double to integer truncation on ARM. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 8 years 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/arm/macro-assembler-arm.h » ('j') | src/arm/macro-assembler-arm.h » ('J')
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. 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 4708 matching lines...) Expand 10 before | Expand all | Expand 10 after
4719 STATIC_ASSERT(kHeapObjectTag == 1); 4719 STATIC_ASSERT(kHeapObjectTag == 1);
4720 __ adc(input_reg, input_reg, Operand(input_reg)); 4720 __ adc(input_reg, input_reg, Operand(input_reg));
4721 4721
4722 // Heap number map check. 4722 // Heap number map check.
4723 __ ldr(scratch1, FieldMemOperand(input_reg, HeapObject::kMapOffset)); 4723 __ ldr(scratch1, FieldMemOperand(input_reg, HeapObject::kMapOffset));
4724 __ LoadRoot(ip, Heap::kHeapNumberMapRootIndex); 4724 __ LoadRoot(ip, Heap::kHeapNumberMapRootIndex);
4725 __ cmp(scratch1, Operand(ip)); 4725 __ cmp(scratch1, Operand(ip));
4726 4726
4727 if (instr->truncating()) { 4727 if (instr->truncating()) {
4728 Register scratch3 = ToRegister(instr->temp2()); 4728 Register scratch3 = ToRegister(instr->temp2());
4729 SwVfpRegister single_scratch = double_scratch.low();
4730 ASSERT(!scratch3.is(input_reg) && 4729 ASSERT(!scratch3.is(input_reg) &&
4731 !scratch3.is(scratch1) && 4730 !scratch3.is(scratch1) &&
4732 !scratch3.is(scratch2)); 4731 !scratch3.is(scratch2));
4733 // Performs a truncating conversion of a floating point number as used by 4732 // Performs a truncating conversion of a floating point number as used by
4734 // the JS bitwise operations. 4733 // the JS bitwise operations.
4735 Label heap_number; 4734 Label heap_number;
4736 __ b(eq, &heap_number); 4735 __ b(eq, &heap_number);
4737 // Check for undefined. Undefined is converted to zero for truncating 4736 // Check for undefined. Undefined is converted to zero for truncating
4738 // conversions. 4737 // conversions.
4739 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); 4738 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
4740 __ cmp(input_reg, Operand(ip)); 4739 __ cmp(input_reg, Operand(ip));
4741 DeoptimizeIf(ne, instr->environment()); 4740 DeoptimizeIf(ne, instr->environment());
4742 __ mov(input_reg, Operand(0)); 4741 __ mov(input_reg, Operand(0));
4743 __ b(&done); 4742 __ b(&done);
4744 4743
4745 __ bind(&heap_number); 4744 __ bind(&heap_number);
4746 __ sub(scratch1, input_reg, Operand(kHeapObjectTag)); 4745 __ sub(scratch1, input_reg, Operand(kHeapObjectTag));
4747 __ vldr(double_scratch2, scratch1, HeapNumber::kValueOffset); 4746 __ vldr(double_scratch2, scratch1, HeapNumber::kValueOffset);
4748 4747
4749 __ EmitECMATruncate(input_reg, 4748 __ EmitECMATruncate(input_reg,
4750 double_scratch2, 4749 double_scratch2,
4751 single_scratch, 4750 double_scratch,
4752 scratch1, 4751 scratch1,
4753 scratch2, 4752 scratch2,
4754 scratch3); 4753 scratch3);
4755 4754
4756 } else { 4755 } else {
4757 CpuFeatures::Scope scope(VFP3); 4756 CpuFeatures::Scope scope(VFP3);
4758 // Deoptimize if we don't have a heap number. 4757 // Deoptimize if we don't have a heap number.
4759 DeoptimizeIf(ne, instr->environment()); 4758 DeoptimizeIf(ne, instr->environment());
4760 4759
4761 __ sub(ip, input_reg, Operand(kHeapObjectTag)); 4760 __ sub(ip, input_reg, Operand(kHeapObjectTag));
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
4823 instr->hydrogen()->deoptimize_on_minus_zero(), 4822 instr->hydrogen()->deoptimize_on_minus_zero(),
4824 instr->environment()); 4823 instr->environment());
4825 } 4824 }
4826 4825
4827 4826
4828 void LCodeGen::DoDoubleToI(LDoubleToI* instr) { 4827 void LCodeGen::DoDoubleToI(LDoubleToI* instr) {
4829 Register result_reg = ToRegister(instr->result()); 4828 Register result_reg = ToRegister(instr->result());
4830 Register scratch1 = scratch0(); 4829 Register scratch1 = scratch0();
4831 Register scratch2 = ToRegister(instr->temp()); 4830 Register scratch2 = ToRegister(instr->temp());
4832 DwVfpRegister double_input = ToDoubleRegister(instr->value()); 4831 DwVfpRegister double_input = ToDoubleRegister(instr->value());
4832 DwVfpRegister double_scratch = double_scratch0();
4833 4833
4834 Label done; 4834 Label done;
4835 4835
4836 if (instr->truncating()) { 4836 if (instr->truncating()) {
4837 Register scratch3 = ToRegister(instr->temp2()); 4837 Register scratch3 = ToRegister(instr->temp2());
4838 SwVfpRegister single_scratch = double_scratch0().low();
4839 __ EmitECMATruncate(result_reg, 4838 __ EmitECMATruncate(result_reg,
4840 double_input, 4839 double_input,
4841 single_scratch, 4840 double_scratch,
4842 scratch1, 4841 scratch1,
4843 scratch2, 4842 scratch2,
4844 scratch3); 4843 scratch3);
4845 } else { 4844 } else {
4846 DwVfpRegister double_scratch = double_scratch0();
4847 __ EmitVFPTruncate(kRoundToMinusInf, 4845 __ EmitVFPTruncate(kRoundToMinusInf,
4848 result_reg, 4846 result_reg,
4849 double_input, 4847 double_input,
4850 scratch1, 4848 scratch1,
4851 double_scratch, 4849 double_scratch,
4852 kCheckForInexactConversion); 4850 kCheckForInexactConversion);
4853 4851
4854 // Deoptimize if we had a vfp invalid exception, 4852 // Deoptimize if we had a vfp invalid exception,
4855 // including inexact operation. 4853 // including inexact operation.
4856 DeoptimizeIf(ne, instr->environment()); 4854 DeoptimizeIf(ne, instr->environment());
(...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after
5784 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); 5782 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize));
5785 __ ldr(result, FieldMemOperand(scratch, 5783 __ ldr(result, FieldMemOperand(scratch,
5786 FixedArray::kHeaderSize - kPointerSize)); 5784 FixedArray::kHeaderSize - kPointerSize));
5787 __ bind(&done); 5785 __ bind(&done);
5788 } 5786 }
5789 5787
5790 5788
5791 #undef __ 5789 #undef __
5792 5790
5793 } } // namespace v8::internal 5791 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/arm/macro-assembler-arm.h » ('j') | src/arm/macro-assembler-arm.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698