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

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

Issue 12052032: Improve integer division on ARM in favor of power of 2 constant divisor (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 7 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 | « src/arm/lithium-arm.cc ('k') | test/mjsunit/math-floor-of-div.js » ('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. 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 1380 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 codegen()->DoDeferredBinaryOpStub(instr_->pointer_map(), 1391 codegen()->DoDeferredBinaryOpStub(instr_->pointer_map(),
1392 instr_->left(), 1392 instr_->left(),
1393 instr_->right(), 1393 instr_->right(),
1394 Token::DIV); 1394 Token::DIV);
1395 } 1395 }
1396 virtual LInstruction* instr() { return instr_; } 1396 virtual LInstruction* instr() { return instr_; }
1397 private: 1397 private:
1398 LDivI* instr_; 1398 LDivI* instr_;
1399 }; 1399 };
1400 1400
1401 if (instr->hydrogen()->HasPowerOf2Divisor()) {
1402 Register dividend = ToRegister(instr->left());
1403 int32_t divisor =
1404 HConstant::cast(instr->hydrogen()->right())->Integer32Value();
1405 int32_t test_value = 0;
1406 int32_t power = 0;
1407
1408 if (divisor > 0) {
1409 test_value = divisor - 1;
1410 power = WhichPowerOf2(divisor);
1411 } else {
1412 // Check for (0 / -x) that will produce negative zero.
1413 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) {
1414 __ tst(dividend, Operand(dividend));
1415 DeoptimizeIf(eq, instr->environment());
1416 }
1417 // Check for (kMinInt / -1).
1418 if (divisor == -1 && instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) {
1419 __ cmp(dividend, Operand(kMinInt));
1420 DeoptimizeIf(eq, instr->environment());
1421 }
1422 test_value = - divisor - 1;
1423 power = WhichPowerOf2(-divisor);
1424 }
1425
1426 if (test_value != 0) {
1427 // Deoptimize if remainder is not 0.
1428 __ tst(dividend, Operand(test_value));
1429 DeoptimizeIf(ne, instr->environment());
1430 __ mov(dividend, Operand(dividend, ASR, power));
1431 }
1432 if (divisor < 0) __ rsb(dividend, dividend, Operand(0));
1433
1434 return;
1435 }
1436
1401 const Register left = ToRegister(instr->left()); 1437 const Register left = ToRegister(instr->left());
1402 const Register right = ToRegister(instr->right()); 1438 const Register right = ToRegister(instr->right());
1403 const Register scratch = scratch0(); 1439 const Register scratch = scratch0();
1404 const Register result = ToRegister(instr->result()); 1440 const Register result = ToRegister(instr->result());
1405 1441
1406 // Check for x / 0. 1442 // Check for x / 0.
1407 if (instr->hydrogen()->CheckFlag(HValue::kCanBeDivByZero)) { 1443 if (instr->hydrogen()->CheckFlag(HValue::kCanBeDivByZero)) {
1408 __ cmp(right, Operand::Zero()); 1444 __ cmp(right, Operand::Zero());
1409 DeoptimizeIf(eq, instr->environment()); 1445 DeoptimizeIf(eq, instr->environment());
1410 } 1446 }
(...skipping 4914 matching lines...) Expand 10 before | Expand all | Expand 10 after
6325 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); 6361 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize));
6326 __ ldr(result, FieldMemOperand(scratch, 6362 __ ldr(result, FieldMemOperand(scratch,
6327 FixedArray::kHeaderSize - kPointerSize)); 6363 FixedArray::kHeaderSize - kPointerSize));
6328 __ bind(&done); 6364 __ bind(&done);
6329 } 6365 }
6330 6366
6331 6367
6332 #undef __ 6368 #undef __
6333 6369
6334 } } // namespace v8::internal 6370 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/lithium-arm.cc ('k') | test/mjsunit/math-floor-of-div.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698