| OLD | NEW |
| 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 1342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1353 case -1: | 1353 case -1: |
| 1354 if (can_overflow) { | 1354 if (can_overflow) { |
| 1355 #if V8_TARGET_ARCH_S390X | 1355 #if V8_TARGET_ARCH_S390X |
| 1356 if (instr->hydrogen()->representation().IsSmi()) { | 1356 if (instr->hydrogen()->representation().IsSmi()) { |
| 1357 #endif | 1357 #endif |
| 1358 __ LoadComplementRR(result, left); | 1358 __ LoadComplementRR(result, left); |
| 1359 DeoptimizeIf(overflow, instr, DeoptimizeReason::kOverflow); | 1359 DeoptimizeIf(overflow, instr, DeoptimizeReason::kOverflow); |
| 1360 #if V8_TARGET_ARCH_S390X | 1360 #if V8_TARGET_ARCH_S390X |
| 1361 } else { | 1361 } else { |
| 1362 __ LoadComplementRR(result, left); | 1362 __ LoadComplementRR(result, left); |
| 1363 __ TestIfInt32(result, r0); | 1363 __ TestIfInt32(result); |
| 1364 DeoptimizeIf(ne, instr, DeoptimizeReason::kOverflow); | 1364 DeoptimizeIf(ne, instr, DeoptimizeReason::kOverflow); |
| 1365 } | 1365 } |
| 1366 #endif | 1366 #endif |
| 1367 } else { | 1367 } else { |
| 1368 __ LoadComplementRR(result, left); | 1368 __ LoadComplementRR(result, left); |
| 1369 } | 1369 } |
| 1370 break; | 1370 break; |
| 1371 case 0: | 1371 case 0: |
| 1372 if (bailout_on_minus_zero) { | 1372 if (bailout_on_minus_zero) { |
| 1373 // If left is strictly negative and the constant is null, the | 1373 // If left is strictly negative and the constant is null, the |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1438 #if V8_TARGET_ARCH_S390X | 1438 #if V8_TARGET_ARCH_S390X |
| 1439 // result = left * right. | 1439 // result = left * right. |
| 1440 if (instr->hydrogen()->representation().IsSmi()) { | 1440 if (instr->hydrogen()->representation().IsSmi()) { |
| 1441 __ SmiUntag(result, left); | 1441 __ SmiUntag(result, left); |
| 1442 __ SmiUntag(scratch, right); | 1442 __ SmiUntag(scratch, right); |
| 1443 __ msgr(result, scratch); | 1443 __ msgr(result, scratch); |
| 1444 } else { | 1444 } else { |
| 1445 __ LoadRR(result, left); | 1445 __ LoadRR(result, left); |
| 1446 __ msgr(result, right); | 1446 __ msgr(result, right); |
| 1447 } | 1447 } |
| 1448 __ TestIfInt32(result, r0); | 1448 __ TestIfInt32(result); |
| 1449 DeoptimizeIf(ne, instr, DeoptimizeReason::kOverflow); | 1449 DeoptimizeIf(ne, instr, DeoptimizeReason::kOverflow); |
| 1450 if (instr->hydrogen()->representation().IsSmi()) { | 1450 if (instr->hydrogen()->representation().IsSmi()) { |
| 1451 __ SmiTag(result); | 1451 __ SmiTag(result); |
| 1452 } | 1452 } |
| 1453 #else | 1453 #else |
| 1454 // r0:scratch = scratch * right | 1454 // r0:scratch = scratch * right |
| 1455 if (instr->hydrogen()->representation().IsSmi()) { | 1455 if (instr->hydrogen()->representation().IsSmi()) { |
| 1456 __ SmiUntag(scratch, left); | 1456 __ SmiUntag(result, left); |
| 1457 __ mr_z(r0, right); | 1457 __ lgfr(result, result); |
| 1458 __ LoadRR(result, scratch); | 1458 __ msgfr(result, right); |
| 1459 } else { | 1459 } else { |
| 1460 // r0:scratch = scratch * right | 1460 // r0:scratch = scratch * right |
| 1461 __ LoadRR(scratch, left); | 1461 __ lgfr(result, left); |
| 1462 __ mr_z(r0, right); | 1462 __ msgfr(result, right); |
| 1463 __ LoadRR(result, scratch); | |
| 1464 } | 1463 } |
| 1465 __ TestIfInt32(r0, result, scratch); | 1464 __ TestIfInt32(result); |
| 1466 DeoptimizeIf(ne, instr, DeoptimizeReason::kOverflow); | 1465 DeoptimizeIf(ne, instr, DeoptimizeReason::kOverflow); |
| 1467 #endif | 1466 #endif |
| 1468 } | 1467 } |
| 1469 } else { | 1468 } else { |
| 1470 if (instr->hydrogen()->representation().IsSmi()) { | 1469 if (instr->hydrogen()->representation().IsSmi()) { |
| 1471 __ SmiUntag(result, left); | 1470 __ SmiUntag(result, left); |
| 1472 __ Mul(result, result, right); | 1471 __ Mul(result, result, right); |
| 1473 } else { | 1472 } else { |
| 1474 __ Mul(result, left, right); | 1473 __ Mul(result, left, right); |
| 1475 } | 1474 } |
| (...skipping 2944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4420 } | 4419 } |
| 4421 | 4420 |
| 4422 void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) { | 4421 void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) { |
| 4423 LOperand* input = instr->value(); | 4422 LOperand* input = instr->value(); |
| 4424 DCHECK(input->IsRegister() || input->IsStackSlot()); | 4423 DCHECK(input->IsRegister() || input->IsStackSlot()); |
| 4425 LOperand* output = instr->result(); | 4424 LOperand* output = instr->result(); |
| 4426 DCHECK(output->IsDoubleRegister()); | 4425 DCHECK(output->IsDoubleRegister()); |
| 4427 if (input->IsStackSlot()) { | 4426 if (input->IsStackSlot()) { |
| 4428 Register scratch = scratch0(); | 4427 Register scratch = scratch0(); |
| 4429 __ LoadP(scratch, ToMemOperand(input)); | 4428 __ LoadP(scratch, ToMemOperand(input)); |
| 4430 __ ConvertIntToDouble(scratch, ToDoubleRegister(output)); | 4429 __ ConvertIntToDouble(ToDoubleRegister(output), scratch); |
| 4431 } else { | 4430 } else { |
| 4432 __ ConvertIntToDouble(ToRegister(input), ToDoubleRegister(output)); | 4431 __ ConvertIntToDouble(ToDoubleRegister(output), ToRegister(input)); |
| 4433 } | 4432 } |
| 4434 } | 4433 } |
| 4435 | 4434 |
| 4436 void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) { | 4435 void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) { |
| 4437 LOperand* input = instr->value(); | 4436 LOperand* input = instr->value(); |
| 4438 LOperand* output = instr->result(); | 4437 LOperand* output = instr->result(); |
| 4439 __ ConvertUnsignedIntToDouble(ToRegister(input), ToDoubleRegister(output)); | 4438 __ ConvertUnsignedIntToDouble(ToDoubleRegister(output), ToRegister(input)); |
| 4440 } | 4439 } |
| 4441 | 4440 |
| 4442 void LCodeGen::DoNumberTagI(LNumberTagI* instr) { | 4441 void LCodeGen::DoNumberTagI(LNumberTagI* instr) { |
| 4443 class DeferredNumberTagI final : public LDeferredCode { | 4442 class DeferredNumberTagI final : public LDeferredCode { |
| 4444 public: | 4443 public: |
| 4445 DeferredNumberTagI(LCodeGen* codegen, LNumberTagI* instr) | 4444 DeferredNumberTagI(LCodeGen* codegen, LNumberTagI* instr) |
| 4446 : LDeferredCode(codegen), instr_(instr) {} | 4445 : LDeferredCode(codegen), instr_(instr) {} |
| 4447 void Generate() override { | 4446 void Generate() override { |
| 4448 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp1(), | 4447 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp1(), |
| 4449 instr_->temp2(), SIGNED_INT32); | 4448 instr_->temp2(), SIGNED_INT32); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4505 DoubleRegister dbl_scratch = double_scratch0(); | 4504 DoubleRegister dbl_scratch = double_scratch0(); |
| 4506 | 4505 |
| 4507 if (signedness == SIGNED_INT32) { | 4506 if (signedness == SIGNED_INT32) { |
| 4508 // There was overflow, so bits 30 and 31 of the original integer | 4507 // There was overflow, so bits 30 and 31 of the original integer |
| 4509 // disagree. Try to allocate a heap number in new space and store | 4508 // disagree. Try to allocate a heap number in new space and store |
| 4510 // the value in there. If that fails, call the runtime system. | 4509 // the value in there. If that fails, call the runtime system. |
| 4511 if (dst.is(src)) { | 4510 if (dst.is(src)) { |
| 4512 __ SmiUntag(src, dst); | 4511 __ SmiUntag(src, dst); |
| 4513 __ xilf(src, Operand(HeapNumber::kSignMask)); | 4512 __ xilf(src, Operand(HeapNumber::kSignMask)); |
| 4514 } | 4513 } |
| 4515 __ ConvertIntToDouble(src, dbl_scratch); | 4514 __ ConvertIntToDouble(dbl_scratch, src); |
| 4516 } else { | 4515 } else { |
| 4517 __ ConvertUnsignedIntToDouble(src, dbl_scratch); | 4516 __ ConvertUnsignedIntToDouble(dbl_scratch, src); |
| 4518 } | 4517 } |
| 4519 | 4518 |
| 4520 if (FLAG_inline_new) { | 4519 if (FLAG_inline_new) { |
| 4521 __ LoadRoot(tmp3, Heap::kHeapNumberMapRootIndex); | 4520 __ LoadRoot(tmp3, Heap::kHeapNumberMapRootIndex); |
| 4522 __ AllocateHeapNumber(dst, tmp1, tmp2, tmp3, &slow); | 4521 __ AllocateHeapNumber(dst, tmp1, tmp2, tmp3, &slow); |
| 4523 __ b(&done); | 4522 __ b(&done); |
| 4524 } | 4523 } |
| 4525 | 4524 |
| 4526 // Slow case: Call the runtime system to do the number allocation. | 4525 // Slow case: Call the runtime system to do the number allocation. |
| 4527 __ bind(&slow); | 4526 __ bind(&slow); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4672 FieldMemOperand(scratch, HeapNumber::kValueOffset)); | 4671 FieldMemOperand(scratch, HeapNumber::kValueOffset)); |
| 4673 __ b(&done, Label::kNear); | 4672 __ b(&done, Label::kNear); |
| 4674 } | 4673 } |
| 4675 } else { | 4674 } else { |
| 4676 __ SmiUntag(scratch, input_reg); | 4675 __ SmiUntag(scratch, input_reg); |
| 4677 DCHECK(mode == NUMBER_CANDIDATE_IS_SMI); | 4676 DCHECK(mode == NUMBER_CANDIDATE_IS_SMI); |
| 4678 } | 4677 } |
| 4679 // Smi to double register conversion | 4678 // Smi to double register conversion |
| 4680 __ bind(&load_smi); | 4679 __ bind(&load_smi); |
| 4681 // scratch: untagged value of input_reg | 4680 // scratch: untagged value of input_reg |
| 4682 __ ConvertIntToDouble(scratch, result_reg); | 4681 __ ConvertIntToDouble(result_reg, scratch); |
| 4683 __ bind(&done); | 4682 __ bind(&done); |
| 4684 } | 4683 } |
| 4685 | 4684 |
| 4686 void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) { | 4685 void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) { |
| 4687 Register input_reg = ToRegister(instr->value()); | 4686 Register input_reg = ToRegister(instr->value()); |
| 4688 Register scratch1 = scratch0(); | 4687 Register scratch1 = scratch0(); |
| 4689 Register scratch2 = ToRegister(instr->temp()); | 4688 Register scratch2 = ToRegister(instr->temp()); |
| 4690 DoubleRegister double_scratch = double_scratch0(); | 4689 DoubleRegister double_scratch = double_scratch0(); |
| 4691 DoubleRegister double_scratch2 = ToDoubleRegister(instr->temp2()); | 4690 DoubleRegister double_scratch2 = ToDoubleRegister(instr->temp2()); |
| 4692 | 4691 |
| (...skipping 857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5550 __ LoadP(result, | 5549 __ LoadP(result, |
| 5551 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); | 5550 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); |
| 5552 __ bind(deferred->exit()); | 5551 __ bind(deferred->exit()); |
| 5553 __ bind(&done); | 5552 __ bind(&done); |
| 5554 } | 5553 } |
| 5555 | 5554 |
| 5556 #undef __ | 5555 #undef __ |
| 5557 | 5556 |
| 5558 } // namespace internal | 5557 } // namespace internal |
| 5559 } // namespace v8 | 5558 } // namespace v8 |
| OLD | NEW |