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

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

Issue 197873029: Tweaked FlooringDiv back to TruncatingDiv again. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased Created 6 years, 9 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/a64/macro-assembler-a64.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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 2661 matching lines...) Expand 10 before | Expand all | Expand 10 after
2672 Deoptimize(instr->environment()); 2672 Deoptimize(instr->environment());
2673 return; 2673 return;
2674 } 2674 }
2675 2675
2676 // Check for (0 / -x) that will produce negative zero. 2676 // Check for (0 / -x) that will produce negative zero.
2677 HDiv* hdiv = instr->hydrogen(); 2677 HDiv* hdiv = instr->hydrogen();
2678 if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) { 2678 if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) {
2679 DeoptimizeIfZero(dividend, instr->environment()); 2679 DeoptimizeIfZero(dividend, instr->environment());
2680 } 2680 }
2681 2681
2682 __ FlooringDiv(result, dividend, Abs(divisor)); 2682 __ TruncatingDiv(result, dividend, Abs(divisor));
2683 __ Add(result, result, Operand(dividend, LSR, 31));
2684 if (divisor < 0) __ Neg(result, result); 2683 if (divisor < 0) __ Neg(result, result);
2685 2684
2686 if (!hdiv->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 2685 if (!hdiv->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
2687 Register temp = ToRegister32(instr->temp()); 2686 Register temp = ToRegister32(instr->temp());
2688 ASSERT(!AreAliased(dividend, result, temp)); 2687 ASSERT(!AreAliased(dividend, result, temp));
2689 __ Sxtw(dividend.X(), dividend); 2688 __ Sxtw(dividend.X(), dividend);
2690 __ Mov(temp, divisor); 2689 __ Mov(temp, divisor);
2691 __ Smsubl(temp.X(), result, temp, dividend.X()); 2690 __ Smsubl(temp.X(), result, temp, dividend.X());
2692 DeoptimizeIfNotZero(temp, instr->environment()); 2691 DeoptimizeIfNotZero(temp, instr->environment());
2693 } 2692 }
(...skipping 1194 matching lines...) Expand 10 before | Expand all | Expand 10 after
3888 return; 3887 return;
3889 } 3888 }
3890 3889
3891 // Check for (0 / -x) that will produce negative zero. 3890 // Check for (0 / -x) that will produce negative zero.
3892 HMathFloorOfDiv* hdiv = instr->hydrogen(); 3891 HMathFloorOfDiv* hdiv = instr->hydrogen();
3893 if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) { 3892 if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) {
3894 __ Cmp(dividend, 0); 3893 __ Cmp(dividend, 0);
3895 DeoptimizeIf(eq, instr->environment()); 3894 DeoptimizeIf(eq, instr->environment());
3896 } 3895 }
3897 3896
3898 __ FlooringDiv(result, dividend, divisor); 3897 // TODO(svenpanne) Add correction terms.
3898 __ TruncatingDiv(result, dividend, divisor);
3899 } 3899 }
3900 3900
3901 3901
3902 void LCodeGen::DoFlooringDivI(LFlooringDivI* instr) { 3902 void LCodeGen::DoFlooringDivI(LFlooringDivI* instr) {
3903 Register dividend = ToRegister32(instr->dividend()); 3903 Register dividend = ToRegister32(instr->dividend());
3904 Register divisor = ToRegister32(instr->divisor()); 3904 Register divisor = ToRegister32(instr->divisor());
3905 Register remainder = ToRegister32(instr->temp()); 3905 Register remainder = ToRegister32(instr->temp());
3906 Register result = ToRegister32(instr->result()); 3906 Register result = ToRegister32(instr->result());
3907 3907
3908 // This can't cause an exception on ARM, so we can speculatively 3908 // This can't cause an exception on ARM, so we can speculatively
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
4161 int32_t divisor = instr->divisor(); 4161 int32_t divisor = instr->divisor();
4162 Register result = ToRegister32(instr->result()); 4162 Register result = ToRegister32(instr->result());
4163 Register temp = ToRegister32(instr->temp()); 4163 Register temp = ToRegister32(instr->temp());
4164 ASSERT(!AreAliased(dividend, result, temp)); 4164 ASSERT(!AreAliased(dividend, result, temp));
4165 4165
4166 if (divisor == 0) { 4166 if (divisor == 0) {
4167 Deoptimize(instr->environment()); 4167 Deoptimize(instr->environment());
4168 return; 4168 return;
4169 } 4169 }
4170 4170
4171 __ FlooringDiv(result, dividend, Abs(divisor)); 4171 __ TruncatingDiv(result, dividend, Abs(divisor));
4172 __ Add(result, result, Operand(dividend, LSR, 31));
4173 __ Sxtw(dividend.X(), dividend); 4172 __ Sxtw(dividend.X(), dividend);
4174 __ Mov(temp, Abs(divisor)); 4173 __ Mov(temp, Abs(divisor));
4175 __ Smsubl(result.X(), result, temp, dividend.X()); 4174 __ Smsubl(result.X(), result, temp, dividend.X());
4176 4175
4177 // Check for negative zero. 4176 // Check for negative zero.
4178 HMod* hmod = instr->hydrogen(); 4177 HMod* hmod = instr->hydrogen();
4179 if (hmod->CheckFlag(HValue::kBailoutOnMinusZero)) { 4178 if (hmod->CheckFlag(HValue::kBailoutOnMinusZero)) {
4180 Label remainder_not_zero; 4179 Label remainder_not_zero;
4181 __ Cbnz(result, &remainder_not_zero); 4180 __ Cbnz(result, &remainder_not_zero);
4182 DeoptimizeIfNegative(dividend, instr->environment()); 4181 DeoptimizeIfNegative(dividend, instr->environment());
(...skipping 1658 matching lines...) Expand 10 before | Expand all | Expand 10 after
5841 __ Bind(&out_of_object); 5840 __ Bind(&out_of_object);
5842 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); 5841 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset));
5843 // Index is equal to negated out of object property index plus 1. 5842 // Index is equal to negated out of object property index plus 1.
5844 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); 5843 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2));
5845 __ Ldr(result, FieldMemOperand(result, 5844 __ Ldr(result, FieldMemOperand(result,
5846 FixedArray::kHeaderSize - kPointerSize)); 5845 FixedArray::kHeaderSize - kPointerSize));
5847 __ Bind(&done); 5846 __ Bind(&done);
5848 } 5847 }
5849 5848
5850 } } // namespace v8::internal 5849 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/a64/macro-assembler-a64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698