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

Side by Side Diff: src/crankshaft/s390/lithium-codegen-s390.cc

Issue 2691893002: s390: use new mul instruction (Closed)
Patch Set: fix comment Created 3 years, 10 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
« no previous file with comments | « no previous file | src/full-codegen/s390/full-codegen-s390.cc » ('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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // 2 //
3 // Use of this source code is governed by a BSD-style license that can be 3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file. 4 // found in the LICENSE file.
5 5
6 #include "src/crankshaft/s390/lithium-codegen-s390.h" 6 #include "src/crankshaft/s390/lithium-codegen-s390.h"
7 7
8 #include "src/base/bits.h" 8 #include "src/base/bits.h"
9 #include "src/builtins/builtins-constructor.h" 9 #include "src/builtins/builtins-constructor.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 __ lr(result, r1); // Move quotient to result register 1280 __ lr(result, r1); // Move quotient to result register
1281 1281
1282 Label done; 1282 Label done;
1283 Register scratch = scratch0(); 1283 Register scratch = scratch0();
1284 // If both operands have the same sign then we are done. 1284 // If both operands have the same sign then we are done.
1285 __ Xor(scratch, dividend, divisor); 1285 __ Xor(scratch, dividend, divisor);
1286 __ ltr(scratch, scratch); // use 32 bit version LoadAndTestRR even in 64 bit 1286 __ ltr(scratch, scratch); // use 32 bit version LoadAndTestRR even in 64 bit
1287 __ bge(&done, Label::kNear); 1287 __ bge(&done, Label::kNear);
1288 1288
1289 // If there is no remainder then we are done. 1289 // If there is no remainder then we are done.
1290 __ lr(scratch, result); 1290 if (CpuFeatures::IsSupported(MISC_INSTR_EXT2)) {
1291 __ msr(scratch, divisor); 1291 __ msrkc(scratch, result, divisor);
1292 } else {
1293 __ lr(scratch, result);
1294 __ msr(scratch, divisor);
1295 }
1292 __ Cmp32(dividend, scratch); 1296 __ Cmp32(dividend, scratch);
1293 __ beq(&done, Label::kNear); 1297 __ beq(&done, Label::kNear);
1294 1298
1295 // We performed a truncating division. Correct the result. 1299 // We performed a truncating division. Correct the result.
1296 __ Sub32(result, result, Operand(1)); 1300 __ Sub32(result, result, Operand(1));
1297 __ bind(&done); 1301 __ bind(&done);
1298 } 1302 }
1299 1303
1300 void LCodeGen::DoMultiplyAddD(LMultiplyAddD* instr) { 1304 void LCodeGen::DoMultiplyAddD(LMultiplyAddD* instr) {
1301 DoubleRegister addend = ToDoubleRegister(instr->addend()); 1305 DoubleRegister addend = ToDoubleRegister(instr->addend());
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 __ Move(result, left); 1416 __ Move(result, left);
1413 __ MulP(result, Operand(constant)); 1417 __ MulP(result, Operand(constant));
1414 } 1418 }
1415 } 1419 }
1416 1420
1417 } else { 1421 } else {
1418 DCHECK(right_op->IsRegister()); 1422 DCHECK(right_op->IsRegister());
1419 Register right = ToRegister(right_op); 1423 Register right = ToRegister(right_op);
1420 1424
1421 if (can_overflow) { 1425 if (can_overflow) {
1426 if (CpuFeatures::IsSupported(MISC_INSTR_EXT2)) {
1427 // result = left * right.
1428 if (instr->hydrogen()->representation().IsSmi()) {
1429 __ SmiUntag(scratch, right);
1430 __ MulPWithCondition(result, left, scratch);
1431 } else {
1432 __ msrkc(result, left, right);
1433 __ LoadW(result, result);
1434 }
1435 DeoptimizeIf(overflow, instr, DeoptimizeReason::kOverflow);
1436 } else {
1422 #if V8_TARGET_ARCH_S390X 1437 #if V8_TARGET_ARCH_S390X
1423 // result = left * right. 1438 // result = left * right.
1424 if (instr->hydrogen()->representation().IsSmi()) { 1439 if (instr->hydrogen()->representation().IsSmi()) {
1425 __ SmiUntag(result, left); 1440 __ SmiUntag(result, left);
1426 __ SmiUntag(scratch, right); 1441 __ SmiUntag(scratch, right);
1427 __ msgr(result, scratch); 1442 __ msgr(result, scratch);
1428 } else { 1443 } else {
1429 __ LoadRR(result, left); 1444 __ LoadRR(result, left);
1430 __ msgr(result, right); 1445 __ msgr(result, right);
1446 }
1447 __ TestIfInt32(result, r0);
1448 DeoptimizeIf(ne, instr, DeoptimizeReason::kOverflow);
1449 if (instr->hydrogen()->representation().IsSmi()) {
1450 __ SmiTag(result);
1451 }
1452 #else
1453 // r0:scratch = scratch * right
1454 if (instr->hydrogen()->representation().IsSmi()) {
1455 __ SmiUntag(scratch, left);
1456 __ mr_z(r0, right);
1457 __ LoadRR(result, scratch);
1458 } else {
1459 // r0:scratch = scratch * right
1460 __ LoadRR(scratch, left);
1461 __ mr_z(r0, right);
1462 __ LoadRR(result, scratch);
1463 }
1464 __ TestIfInt32(r0, result, scratch);
1465 DeoptimizeIf(ne, instr, DeoptimizeReason::kOverflow);
1466 #endif
1431 } 1467 }
1432 __ TestIfInt32(result, r0);
1433 DeoptimizeIf(ne, instr, DeoptimizeReason::kOverflow);
1434 if (instr->hydrogen()->representation().IsSmi()) {
1435 __ SmiTag(result);
1436 }
1437 #else
1438 // r0:scratch = scratch * right
1439 if (instr->hydrogen()->representation().IsSmi()) {
1440 __ SmiUntag(scratch, left);
1441 __ mr_z(r0, right);
1442 __ LoadRR(result, scratch);
1443 } else {
1444 // r0:scratch = scratch * right
1445 __ LoadRR(scratch, left);
1446 __ mr_z(r0, right);
1447 __ LoadRR(result, scratch);
1448 }
1449 __ TestIfInt32(r0, result, scratch);
1450 DeoptimizeIf(ne, instr, DeoptimizeReason::kOverflow);
1451 #endif
1452 } else { 1468 } else {
1453 if (instr->hydrogen()->representation().IsSmi()) { 1469 if (instr->hydrogen()->representation().IsSmi()) {
1454 __ SmiUntag(result, left); 1470 __ SmiUntag(result, left);
1455 __ Mul(result, result, right); 1471 __ Mul(result, result, right);
1456 } else { 1472 } else {
1457 __ Mul(result, left, right); 1473 __ Mul(result, left, right);
1458 } 1474 }
1459 } 1475 }
1460 1476
1461 if (bailout_on_minus_zero) { 1477 if (bailout_on_minus_zero) {
(...skipping 4137 matching lines...) Expand 10 before | Expand all | Expand 10 after
5599 __ LoadP(result, 5615 __ LoadP(result,
5600 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); 5616 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize));
5601 __ bind(deferred->exit()); 5617 __ bind(deferred->exit());
5602 __ bind(&done); 5618 __ bind(&done);
5603 } 5619 }
5604 5620
5605 #undef __ 5621 #undef __
5606 5622
5607 } // namespace internal 5623 } // namespace internal
5608 } // namespace v8 5624 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/full-codegen/s390/full-codegen-s390.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698