| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/assembler.h" | 5 #include "src/assembler.h" |
| 6 #include "src/codegen.h" | 6 #include "src/codegen.h" |
| 7 #include "src/compiler/linkage.h" | 7 #include "src/compiler/linkage.h" |
| 8 #include "src/compiler/raw-machine-assembler.h" | 8 #include "src/compiler/raw-machine-assembler.h" |
| 9 #include "src/machine-type.h" | 9 #include "src/machine-type.h" |
| 10 #include "src/register-configuration.h" | 10 #include "src/register-configuration.h" |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 if (FLAG_print_opt_code) { | 263 if (FLAG_print_opt_code) { |
| 264 OFStream os(stdout); | 264 OFStream os(stdout); |
| 265 code->Disassemble(name, os); | 265 code->Disassemble(name, os); |
| 266 } | 266 } |
| 267 #endif | 267 #endif |
| 268 return code; | 268 return code; |
| 269 } | 269 } |
| 270 | 270 |
| 271 | 271 |
| 272 Handle<Code> WrapWithCFunction(Handle<Code> inner, CallDescriptor* desc) { | 272 Handle<Code> WrapWithCFunction(Handle<Code> inner, CallDescriptor* desc) { |
| 273 Zone zone; | 273 ZoneForTesting zone; |
| 274 MachineSignature* msig = | 274 MachineSignature* msig = |
| 275 const_cast<MachineSignature*>(desc->GetMachineSignature()); | 275 const_cast<MachineSignature*>(desc->GetMachineSignature()); |
| 276 int param_count = static_cast<int>(msig->parameter_count()); | 276 int param_count = static_cast<int>(msig->parameter_count()); |
| 277 GraphAndBuilders caller(&zone); | 277 GraphAndBuilders caller(&zone); |
| 278 { | 278 { |
| 279 GraphAndBuilders& b = caller; | 279 GraphAndBuilders& b = caller; |
| 280 Node* start = b.graph()->NewNode(b.common()->Start(param_count + 3)); | 280 Node* start = b.graph()->NewNode(b.common()->Start(param_count + 3)); |
| 281 b.graph()->SetStart(start); | 281 b.graph()->SetStart(start); |
| 282 Node* target = b.graph()->NewNode(b.common()->HeapConstant(inner)); | 282 Node* target = b.graph()->NewNode(b.common()->HeapConstant(inner)); |
| 283 | 283 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 void (*build)(CallDescriptor*, RawMachineAssembler&), | 430 void (*build)(CallDescriptor*, RawMachineAssembler&), |
| 431 CType (*compute)(CallDescriptor*, CType* inputs), | 431 CType (*compute)(CallDescriptor*, CType* inputs), |
| 432 int seed = 1) { | 432 int seed = 1) { |
| 433 int num_params = ParamCount(desc); | 433 int num_params = ParamCount(desc); |
| 434 CHECK_LE(num_params, kMaxParamCount); | 434 CHECK_LE(num_params, kMaxParamCount); |
| 435 Isolate* isolate = CcTest::InitIsolateOnce(); | 435 Isolate* isolate = CcTest::InitIsolateOnce(); |
| 436 HandleScope scope(isolate); | 436 HandleScope scope(isolate); |
| 437 Handle<Code> inner = Handle<Code>::null(); | 437 Handle<Code> inner = Handle<Code>::null(); |
| 438 { | 438 { |
| 439 // Build the graph for the computation. | 439 // Build the graph for the computation. |
| 440 Zone zone; | 440 ZoneForTesting zone; |
| 441 Graph graph(&zone); | 441 Graph graph(&zone); |
| 442 RawMachineAssembler raw(isolate, &graph, desc); | 442 RawMachineAssembler raw(isolate, &graph, desc); |
| 443 build(desc, raw); | 443 build(desc, raw); |
| 444 inner = CompileGraph("Compute", desc, &graph, raw.Export()); | 444 inner = CompileGraph("Compute", desc, &graph, raw.Export()); |
| 445 } | 445 } |
| 446 | 446 |
| 447 CSignature0<int32_t> csig; | 447 CSignature0<int32_t> csig; |
| 448 ArgsBuffer<CType> io(num_params, seed); | 448 ArgsBuffer<CType> io(num_params, seed); |
| 449 | 449 |
| 450 { | 450 { |
| 451 // constant mode. | 451 // constant mode. |
| 452 Handle<Code> wrapper = Handle<Code>::null(); | 452 Handle<Code> wrapper = Handle<Code>::null(); |
| 453 { | 453 { |
| 454 // Wrap the above code with a callable function that passes constants. | 454 // Wrap the above code with a callable function that passes constants. |
| 455 Zone zone; | 455 ZoneForTesting zone; |
| 456 Graph graph(&zone); | 456 Graph graph(&zone); |
| 457 CallDescriptor* cdesc = Linkage::GetSimplifiedCDescriptor(&zone, &csig); | 457 CallDescriptor* cdesc = Linkage::GetSimplifiedCDescriptor(&zone, &csig); |
| 458 RawMachineAssembler raw(isolate, &graph, cdesc); | 458 RawMachineAssembler raw(isolate, &graph, cdesc); |
| 459 Node* target = raw.HeapConstant(inner); | 459 Node* target = raw.HeapConstant(inner); |
| 460 Node** args = zone.NewArray<Node*>(num_params); | 460 Node** args = zone.NewArray<Node*>(num_params); |
| 461 for (int i = 0; i < num_params; i++) { | 461 for (int i = 0; i < num_params; i++) { |
| 462 args[i] = io.MakeConstant(raw, io.input[i]); | 462 args[i] = io.MakeConstant(raw, io.input[i]); |
| 463 } | 463 } |
| 464 | 464 |
| 465 Node* call = raw.CallN(desc, target, args); | 465 Node* call = raw.CallN(desc, target, args); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 477 int32_t check_seed = runnable.Call(); | 477 int32_t check_seed = runnable.Call(); |
| 478 CHECK_EQ(seed, check_seed); | 478 CHECK_EQ(seed, check_seed); |
| 479 CHECK_EQ(expected, io.output); | 479 CHECK_EQ(expected, io.output); |
| 480 } | 480 } |
| 481 | 481 |
| 482 { | 482 { |
| 483 // buffer mode. | 483 // buffer mode. |
| 484 Handle<Code> wrapper = Handle<Code>::null(); | 484 Handle<Code> wrapper = Handle<Code>::null(); |
| 485 { | 485 { |
| 486 // Wrap the above code with a callable function that loads from {input}. | 486 // Wrap the above code with a callable function that loads from {input}. |
| 487 Zone zone; | 487 ZoneForTesting zone; |
| 488 Graph graph(&zone); | 488 Graph graph(&zone); |
| 489 CallDescriptor* cdesc = Linkage::GetSimplifiedCDescriptor(&zone, &csig); | 489 CallDescriptor* cdesc = Linkage::GetSimplifiedCDescriptor(&zone, &csig); |
| 490 RawMachineAssembler raw(isolate, &graph, cdesc); | 490 RawMachineAssembler raw(isolate, &graph, cdesc); |
| 491 Node* base = raw.PointerConstant(io.input); | 491 Node* base = raw.PointerConstant(io.input); |
| 492 Node* target = raw.HeapConstant(inner); | 492 Node* target = raw.HeapConstant(inner); |
| 493 Node** args = zone.NewArray<Node*>(kMaxParamCount); | 493 Node** args = zone.NewArray<Node*>(kMaxParamCount); |
| 494 for (int i = 0; i < num_params; i++) { | 494 for (int i = 0; i < num_params; i++) { |
| 495 args[i] = io.LoadInput(raw, base, i); | 495 args[i] = io.LoadInput(raw, base, i); |
| 496 } | 496 } |
| 497 | 497 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 515 } | 515 } |
| 516 } | 516 } |
| 517 }; | 517 }; |
| 518 | 518 |
| 519 } // namespace | 519 } // namespace |
| 520 | 520 |
| 521 | 521 |
| 522 static void TestInt32Sub(CallDescriptor* desc) { | 522 static void TestInt32Sub(CallDescriptor* desc) { |
| 523 Isolate* isolate = CcTest::InitIsolateOnce(); | 523 Isolate* isolate = CcTest::InitIsolateOnce(); |
| 524 HandleScope scope(isolate); | 524 HandleScope scope(isolate); |
| 525 Zone zone; | 525 ZoneForTesting zone; |
| 526 GraphAndBuilders inner(&zone); | 526 GraphAndBuilders inner(&zone); |
| 527 { | 527 { |
| 528 // Build the add function. | 528 // Build the add function. |
| 529 GraphAndBuilders& b = inner; | 529 GraphAndBuilders& b = inner; |
| 530 Node* start = b.graph()->NewNode(b.common()->Start(5)); | 530 Node* start = b.graph()->NewNode(b.common()->Start(5)); |
| 531 b.graph()->SetStart(start); | 531 b.graph()->SetStart(start); |
| 532 Node* p0 = b.graph()->NewNode(b.common()->Parameter(0), start); | 532 Node* p0 = b.graph()->NewNode(b.common()->Parameter(0), start); |
| 533 Node* p1 = b.graph()->NewNode(b.common()->Parameter(1), start); | 533 Node* p1 = b.graph()->NewNode(b.common()->Parameter(1), start); |
| 534 Node* add = b.graph()->NewNode(b.machine()->Int32Sub(), p0, p1); | 534 Node* add = b.graph()->NewNode(b.machine()->Int32Sub(), p0, p1); |
| 535 Node* ret = b.graph()->NewNode(b.common()->Return(), add, start, start); | 535 Node* ret = b.graph()->NewNode(b.common()->Return(), add, start, start); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 556 | 556 |
| 557 static void CopyTwentyInt32(CallDescriptor* desc) { | 557 static void CopyTwentyInt32(CallDescriptor* desc) { |
| 558 const int kNumParams = 20; | 558 const int kNumParams = 20; |
| 559 int32_t input[kNumParams]; | 559 int32_t input[kNumParams]; |
| 560 int32_t output[kNumParams]; | 560 int32_t output[kNumParams]; |
| 561 Isolate* isolate = CcTest::InitIsolateOnce(); | 561 Isolate* isolate = CcTest::InitIsolateOnce(); |
| 562 HandleScope scope(isolate); | 562 HandleScope scope(isolate); |
| 563 Handle<Code> inner = Handle<Code>::null(); | 563 Handle<Code> inner = Handle<Code>::null(); |
| 564 { | 564 { |
| 565 // Writes all parameters into the output buffer. | 565 // Writes all parameters into the output buffer. |
| 566 Zone zone; | 566 ZoneForTesting zone; |
| 567 Graph graph(&zone); | 567 Graph graph(&zone); |
| 568 RawMachineAssembler raw(isolate, &graph, desc); | 568 RawMachineAssembler raw(isolate, &graph, desc); |
| 569 Node* base = raw.PointerConstant(output); | 569 Node* base = raw.PointerConstant(output); |
| 570 for (int i = 0; i < kNumParams; i++) { | 570 for (int i = 0; i < kNumParams; i++) { |
| 571 Node* offset = raw.Int32Constant(i * sizeof(int32_t)); | 571 Node* offset = raw.Int32Constant(i * sizeof(int32_t)); |
| 572 raw.Store(MachineRepresentation::kWord32, base, offset, raw.Parameter(i), | 572 raw.Store(MachineRepresentation::kWord32, base, offset, raw.Parameter(i), |
| 573 kNoWriteBarrier); | 573 kNoWriteBarrier); |
| 574 } | 574 } |
| 575 raw.Return(raw.Int32Constant(42)); | 575 raw.Return(raw.Int32Constant(42)); |
| 576 inner = CompileGraph("CopyTwentyInt32", desc, &graph, raw.Export()); | 576 inner = CompileGraph("CopyTwentyInt32", desc, &graph, raw.Export()); |
| 577 } | 577 } |
| 578 | 578 |
| 579 CSignature0<int32_t> csig; | 579 CSignature0<int32_t> csig; |
| 580 Handle<Code> wrapper = Handle<Code>::null(); | 580 Handle<Code> wrapper = Handle<Code>::null(); |
| 581 { | 581 { |
| 582 // Loads parameters from the input buffer and calls the above code. | 582 // Loads parameters from the input buffer and calls the above code. |
| 583 Zone zone; | 583 ZoneForTesting zone; |
| 584 Graph graph(&zone); | 584 Graph graph(&zone); |
| 585 CallDescriptor* cdesc = Linkage::GetSimplifiedCDescriptor(&zone, &csig); | 585 CallDescriptor* cdesc = Linkage::GetSimplifiedCDescriptor(&zone, &csig); |
| 586 RawMachineAssembler raw(isolate, &graph, cdesc); | 586 RawMachineAssembler raw(isolate, &graph, cdesc); |
| 587 Node* base = raw.PointerConstant(input); | 587 Node* base = raw.PointerConstant(input); |
| 588 Node* target = raw.HeapConstant(inner); | 588 Node* target = raw.HeapConstant(inner); |
| 589 Node** args = zone.NewArray<Node*>(kNumParams); | 589 Node** args = zone.NewArray<Node*>(kNumParams); |
| 590 for (int i = 0; i < kNumParams; i++) { | 590 for (int i = 0; i < kNumParams; i++) { |
| 591 Node* offset = raw.Int32Constant(i * sizeof(int32_t)); | 591 Node* offset = raw.Int32Constant(i * sizeof(int32_t)); |
| 592 args[i] = raw.Load(MachineType::Int32(), base, offset); | 592 args[i] = raw.Load(MachineType::Int32(), base, offset); |
| 593 } | 593 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 612 | 612 |
| 613 for (int j = 0; j < kNumParams; j++) { | 613 for (int j = 0; j < kNumParams; j++) { |
| 614 CHECK_EQ(input[j], output[j]); | 614 CHECK_EQ(input[j], output[j]); |
| 615 } | 615 } |
| 616 } | 616 } |
| 617 } | 617 } |
| 618 | 618 |
| 619 | 619 |
| 620 static void Test_RunInt32SubWithRet(int retreg) { | 620 static void Test_RunInt32SubWithRet(int retreg) { |
| 621 Int32Signature sig(2); | 621 Int32Signature sig(2); |
| 622 Zone zone; | 622 ZoneForTesting zone; |
| 623 RegisterPairs pairs; | 623 RegisterPairs pairs; |
| 624 while (pairs.More()) { | 624 while (pairs.More()) { |
| 625 int parray[2]; | 625 int parray[2]; |
| 626 int rarray[] = {retreg}; | 626 int rarray[] = {retreg}; |
| 627 pairs.Next(&parray[0], &parray[1], false); | 627 pairs.Next(&parray[0], &parray[1], false); |
| 628 Allocator params(parray, 2, nullptr, 0); | 628 Allocator params(parray, 2, nullptr, 0); |
| 629 Allocator rets(rarray, 1, nullptr, 0); | 629 Allocator rets(rarray, 1, nullptr, 0); |
| 630 RegisterConfig config(params, rets); | 630 RegisterConfig config(params, rets); |
| 631 CallDescriptor* desc = config.Create(&zone, &sig); | 631 CallDescriptor* desc = config.Create(&zone, &sig); |
| 632 TestInt32Sub(desc); | 632 TestInt32Sub(desc); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 663 TEST_INT32_SUB_WITH_RET(16) | 663 TEST_INT32_SUB_WITH_RET(16) |
| 664 TEST_INT32_SUB_WITH_RET(17) | 664 TEST_INT32_SUB_WITH_RET(17) |
| 665 TEST_INT32_SUB_WITH_RET(18) | 665 TEST_INT32_SUB_WITH_RET(18) |
| 666 TEST_INT32_SUB_WITH_RET(19) | 666 TEST_INT32_SUB_WITH_RET(19) |
| 667 | 667 |
| 668 | 668 |
| 669 TEST(Run_Int32Sub_all_allocatable_single) { | 669 TEST(Run_Int32Sub_all_allocatable_single) { |
| 670 Int32Signature sig(2); | 670 Int32Signature sig(2); |
| 671 RegisterPairs pairs; | 671 RegisterPairs pairs; |
| 672 while (pairs.More()) { | 672 while (pairs.More()) { |
| 673 Zone zone; | 673 ZoneForTesting zone; |
| 674 int parray[1]; | 674 int parray[1]; |
| 675 int rarray[1]; | 675 int rarray[1]; |
| 676 pairs.Next(&rarray[0], &parray[0], true); | 676 pairs.Next(&rarray[0], &parray[0], true); |
| 677 Allocator params(parray, 1, nullptr, 0); | 677 Allocator params(parray, 1, nullptr, 0); |
| 678 Allocator rets(rarray, 1, nullptr, 0); | 678 Allocator rets(rarray, 1, nullptr, 0); |
| 679 RegisterConfig config(params, rets); | 679 RegisterConfig config(params, rets); |
| 680 CallDescriptor* desc = config.Create(&zone, &sig); | 680 CallDescriptor* desc = config.Create(&zone, &sig); |
| 681 TestInt32Sub(desc); | 681 TestInt32Sub(desc); |
| 682 } | 682 } |
| 683 } | 683 } |
| 684 | 684 |
| 685 | 685 |
| 686 TEST(Run_CopyTwentyInt32_all_allocatable_pairs) { | 686 TEST(Run_CopyTwentyInt32_all_allocatable_pairs) { |
| 687 Int32Signature sig(20); | 687 Int32Signature sig(20); |
| 688 RegisterPairs pairs; | 688 RegisterPairs pairs; |
| 689 while (pairs.More()) { | 689 while (pairs.More()) { |
| 690 Zone zone; | 690 ZoneForTesting zone; |
| 691 int parray[2]; | 691 int parray[2]; |
| 692 int rarray[] = { | 692 int rarray[] = { |
| 693 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 693 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 694 ->GetAllocatableGeneralCode(0)}; | 694 ->GetAllocatableGeneralCode(0)}; |
| 695 pairs.Next(&parray[0], &parray[1], false); | 695 pairs.Next(&parray[0], &parray[1], false); |
| 696 Allocator params(parray, 2, nullptr, 0); | 696 Allocator params(parray, 2, nullptr, 0); |
| 697 Allocator rets(rarray, 1, nullptr, 0); | 697 Allocator rets(rarray, 1, nullptr, 0); |
| 698 RegisterConfig config(params, rets); | 698 RegisterConfig config(params, rets); |
| 699 CallDescriptor* desc = config.Create(&zone, &sig); | 699 CallDescriptor* desc = config.Create(&zone, &sig); |
| 700 CopyTwentyInt32(desc); | 700 CopyTwentyInt32(desc); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 732 result += static_cast<uint32_t>(input[i]) * coeff[i]; | 732 result += static_cast<uint32_t>(input[i]) * coeff[i]; |
| 733 } | 733 } |
| 734 return static_cast<int32_t>(result); | 734 return static_cast<int32_t>(result); |
| 735 } | 735 } |
| 736 | 736 |
| 737 | 737 |
| 738 static void Test_Int32_WeightedSum_of_size(int count) { | 738 static void Test_Int32_WeightedSum_of_size(int count) { |
| 739 Int32Signature sig(count); | 739 Int32Signature sig(count); |
| 740 for (int p0 = 0; p0 < Register::kNumRegisters; p0++) { | 740 for (int p0 = 0; p0 < Register::kNumRegisters; p0++) { |
| 741 if (Register::from_code(p0).IsAllocatable()) { | 741 if (Register::from_code(p0).IsAllocatable()) { |
| 742 Zone zone; | 742 ZoneForTesting zone; |
| 743 | 743 |
| 744 int parray[] = {p0}; | 744 int parray[] = {p0}; |
| 745 int rarray[] = { | 745 int rarray[] = { |
| 746 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 746 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 747 ->GetAllocatableGeneralCode(0)}; | 747 ->GetAllocatableGeneralCode(0)}; |
| 748 Allocator params(parray, 1, nullptr, 0); | 748 Allocator params(parray, 1, nullptr, 0); |
| 749 Allocator rets(rarray, 1, nullptr, 0); | 749 Allocator rets(rarray, 1, nullptr, 0); |
| 750 RegisterConfig config(params, rets); | 750 RegisterConfig config(params, rets); |
| 751 CallDescriptor* desc = config.Create(&zone, &sig); | 751 CallDescriptor* desc = config.Create(&zone, &sig); |
| 752 Run_Computation<int32_t>(desc, Build_Int32_WeightedSum, | 752 Run_Computation<int32_t>(desc, Build_Int32_WeightedSum, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 800 int parray[] = { | 800 int parray[] = { |
| 801 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 801 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 802 ->GetAllocatableGeneralCode(0)}; | 802 ->GetAllocatableGeneralCode(0)}; |
| 803 int rarray[] = { | 803 int rarray[] = { |
| 804 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 804 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 805 ->GetAllocatableGeneralCode(0)}; | 805 ->GetAllocatableGeneralCode(0)}; |
| 806 Allocator params(parray, 1, nullptr, 0); | 806 Allocator params(parray, 1, nullptr, 0); |
| 807 Allocator rets(rarray, 1, nullptr, 0); | 807 Allocator rets(rarray, 1, nullptr, 0); |
| 808 RegisterConfig config(params, rets); | 808 RegisterConfig config(params, rets); |
| 809 | 809 |
| 810 Zone zone; | 810 ZoneForTesting zone; |
| 811 | 811 |
| 812 for (int i = which + 1; i <= 64; i++) { | 812 for (int i = which + 1; i <= 64; i++) { |
| 813 Int32Signature sig(i); | 813 Int32Signature sig(i); |
| 814 CallDescriptor* desc = config.Create(&zone, &sig); | 814 CallDescriptor* desc = config.Create(&zone, &sig); |
| 815 RunSelect<int32_t, which>(desc); | 815 RunSelect<int32_t, which>(desc); |
| 816 } | 816 } |
| 817 } | 817 } |
| 818 | 818 |
| 819 | 819 |
| 820 // Separate tests for parallelization. | 820 // Separate tests for parallelization. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 842 ->num_allocatable_general_registers() < 2) | 842 ->num_allocatable_general_registers() < 2) |
| 843 return; | 843 return; |
| 844 if (kPointerSize < 8) return; // TODO(titzer): int64 on 32-bit platforms | 844 if (kPointerSize < 8) return; // TODO(titzer): int64 on 32-bit platforms |
| 845 | 845 |
| 846 int rarray[] = { | 846 int rarray[] = { |
| 847 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 847 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 848 ->GetAllocatableGeneralCode(0)}; | 848 ->GetAllocatableGeneralCode(0)}; |
| 849 ArgsBuffer<int64_t>::Sig sig(2); | 849 ArgsBuffer<int64_t>::Sig sig(2); |
| 850 | 850 |
| 851 RegisterPairs pairs; | 851 RegisterPairs pairs; |
| 852 Zone zone; | 852 ZoneForTesting zone; |
| 853 while (pairs.More()) { | 853 while (pairs.More()) { |
| 854 int parray[2]; | 854 int parray[2]; |
| 855 pairs.Next(&parray[0], &parray[1], false); | 855 pairs.Next(&parray[0], &parray[1], false); |
| 856 Allocator params(parray, 2, nullptr, 0); | 856 Allocator params(parray, 2, nullptr, 0); |
| 857 Allocator rets(rarray, 1, nullptr, 0); | 857 Allocator rets(rarray, 1, nullptr, 0); |
| 858 RegisterConfig config(params, rets); | 858 RegisterConfig config(params, rets); |
| 859 | 859 |
| 860 CallDescriptor* desc = config.Create(&zone, &sig); | 860 CallDescriptor* desc = config.Create(&zone, &sig); |
| 861 RunSelect<int64_t, 0>(desc); | 861 RunSelect<int64_t, 0>(desc); |
| 862 RunSelect<int64_t, 1>(desc); | 862 RunSelect<int64_t, 1>(desc); |
| 863 } | 863 } |
| 864 } | 864 } |
| 865 | 865 |
| 866 | 866 |
| 867 TEST(Float32Select_registers) { | 867 TEST(Float32Select_registers) { |
| 868 if (RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 868 if (RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 869 ->num_allocatable_double_registers() < 2) { | 869 ->num_allocatable_double_registers() < 2) { |
| 870 return; | 870 return; |
| 871 } | 871 } |
| 872 | 872 |
| 873 int rarray[] = { | 873 int rarray[] = { |
| 874 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 874 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 875 ->GetAllocatableDoubleCode(0)}; | 875 ->GetAllocatableDoubleCode(0)}; |
| 876 ArgsBuffer<float32>::Sig sig(2); | 876 ArgsBuffer<float32>::Sig sig(2); |
| 877 | 877 |
| 878 Float32RegisterPairs pairs; | 878 Float32RegisterPairs pairs; |
| 879 Zone zone; | 879 ZoneForTesting zone; |
| 880 while (pairs.More()) { | 880 while (pairs.More()) { |
| 881 int parray[2]; | 881 int parray[2]; |
| 882 pairs.Next(&parray[0], &parray[1], false); | 882 pairs.Next(&parray[0], &parray[1], false); |
| 883 Allocator params(nullptr, 0, parray, 2); | 883 Allocator params(nullptr, 0, parray, 2); |
| 884 Allocator rets(nullptr, 0, rarray, 1); | 884 Allocator rets(nullptr, 0, rarray, 1); |
| 885 RegisterConfig config(params, rets); | 885 RegisterConfig config(params, rets); |
| 886 | 886 |
| 887 CallDescriptor* desc = config.Create(&zone, &sig); | 887 CallDescriptor* desc = config.Create(&zone, &sig); |
| 888 RunSelect<float32, 0>(desc); | 888 RunSelect<float32, 0>(desc); |
| 889 RunSelect<float32, 1>(desc); | 889 RunSelect<float32, 1>(desc); |
| 890 } | 890 } |
| 891 } | 891 } |
| 892 | 892 |
| 893 | 893 |
| 894 TEST(Float64Select_registers) { | 894 TEST(Float64Select_registers) { |
| 895 if (RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 895 if (RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 896 ->num_allocatable_double_registers() < 2) | 896 ->num_allocatable_double_registers() < 2) |
| 897 return; | 897 return; |
| 898 if (RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 898 if (RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 899 ->num_allocatable_general_registers() < 2) | 899 ->num_allocatable_general_registers() < 2) |
| 900 return; | 900 return; |
| 901 int rarray[] = { | 901 int rarray[] = { |
| 902 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 902 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 903 ->GetAllocatableDoubleCode(0)}; | 903 ->GetAllocatableDoubleCode(0)}; |
| 904 ArgsBuffer<float64>::Sig sig(2); | 904 ArgsBuffer<float64>::Sig sig(2); |
| 905 | 905 |
| 906 Float64RegisterPairs pairs; | 906 Float64RegisterPairs pairs; |
| 907 Zone zone; | 907 ZoneForTesting zone; |
| 908 while (pairs.More()) { | 908 while (pairs.More()) { |
| 909 int parray[2]; | 909 int parray[2]; |
| 910 pairs.Next(&parray[0], &parray[1], false); | 910 pairs.Next(&parray[0], &parray[1], false); |
| 911 Allocator params(nullptr, 0, parray, 2); | 911 Allocator params(nullptr, 0, parray, 2); |
| 912 Allocator rets(nullptr, 0, rarray, 1); | 912 Allocator rets(nullptr, 0, rarray, 1); |
| 913 RegisterConfig config(params, rets); | 913 RegisterConfig config(params, rets); |
| 914 | 914 |
| 915 CallDescriptor* desc = config.Create(&zone, &sig); | 915 CallDescriptor* desc = config.Create(&zone, &sig); |
| 916 RunSelect<float64, 0>(desc); | 916 RunSelect<float64, 0>(desc); |
| 917 RunSelect<float64, 1>(desc); | 917 RunSelect<float64, 1>(desc); |
| 918 } | 918 } |
| 919 } | 919 } |
| 920 | 920 |
| 921 | 921 |
| 922 TEST(Float32Select_stack_params_return_reg) { | 922 TEST(Float32Select_stack_params_return_reg) { |
| 923 int rarray[] = { | 923 int rarray[] = { |
| 924 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 924 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 925 ->GetAllocatableDoubleCode(0)}; | 925 ->GetAllocatableDoubleCode(0)}; |
| 926 Allocator params(nullptr, 0, nullptr, 0); | 926 Allocator params(nullptr, 0, nullptr, 0); |
| 927 Allocator rets(nullptr, 0, rarray, 1); | 927 Allocator rets(nullptr, 0, rarray, 1); |
| 928 RegisterConfig config(params, rets); | 928 RegisterConfig config(params, rets); |
| 929 | 929 |
| 930 Zone zone; | 930 ZoneForTesting zone; |
| 931 for (int count = 1; count < 6; count++) { | 931 for (int count = 1; count < 6; count++) { |
| 932 ArgsBuffer<float32>::Sig sig(count); | 932 ArgsBuffer<float32>::Sig sig(count); |
| 933 CallDescriptor* desc = config.Create(&zone, &sig); | 933 CallDescriptor* desc = config.Create(&zone, &sig); |
| 934 RunSelect<float32, 0>(desc); | 934 RunSelect<float32, 0>(desc); |
| 935 RunSelect<float32, 1>(desc); | 935 RunSelect<float32, 1>(desc); |
| 936 RunSelect<float32, 2>(desc); | 936 RunSelect<float32, 2>(desc); |
| 937 RunSelect<float32, 3>(desc); | 937 RunSelect<float32, 3>(desc); |
| 938 RunSelect<float32, 4>(desc); | 938 RunSelect<float32, 4>(desc); |
| 939 RunSelect<float32, 5>(desc); | 939 RunSelect<float32, 5>(desc); |
| 940 } | 940 } |
| 941 } | 941 } |
| 942 | 942 |
| 943 | 943 |
| 944 TEST(Float64Select_stack_params_return_reg) { | 944 TEST(Float64Select_stack_params_return_reg) { |
| 945 int rarray[] = { | 945 int rarray[] = { |
| 946 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 946 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 947 ->GetAllocatableDoubleCode(0)}; | 947 ->GetAllocatableDoubleCode(0)}; |
| 948 Allocator params(nullptr, 0, nullptr, 0); | 948 Allocator params(nullptr, 0, nullptr, 0); |
| 949 Allocator rets(nullptr, 0, rarray, 1); | 949 Allocator rets(nullptr, 0, rarray, 1); |
| 950 RegisterConfig config(params, rets); | 950 RegisterConfig config(params, rets); |
| 951 | 951 |
| 952 Zone zone; | 952 ZoneForTesting zone; |
| 953 for (int count = 1; count < 6; count++) { | 953 for (int count = 1; count < 6; count++) { |
| 954 ArgsBuffer<float64>::Sig sig(count); | 954 ArgsBuffer<float64>::Sig sig(count); |
| 955 CallDescriptor* desc = config.Create(&zone, &sig); | 955 CallDescriptor* desc = config.Create(&zone, &sig); |
| 956 RunSelect<float64, 0>(desc); | 956 RunSelect<float64, 0>(desc); |
| 957 RunSelect<float64, 1>(desc); | 957 RunSelect<float64, 1>(desc); |
| 958 RunSelect<float64, 2>(desc); | 958 RunSelect<float64, 2>(desc); |
| 959 RunSelect<float64, 3>(desc); | 959 RunSelect<float64, 3>(desc); |
| 960 RunSelect<float64, 4>(desc); | 960 RunSelect<float64, 4>(desc); |
| 961 RunSelect<float64, 5>(desc); | 961 RunSelect<float64, 5>(desc); |
| 962 } | 962 } |
| 963 } | 963 } |
| 964 | 964 |
| 965 | 965 |
| 966 template <typename CType, int which> | 966 template <typename CType, int which> |
| 967 static void Build_Select_With_Call(CallDescriptor* desc, | 967 static void Build_Select_With_Call(CallDescriptor* desc, |
| 968 RawMachineAssembler& raw) { | 968 RawMachineAssembler& raw) { |
| 969 Handle<Code> inner = Handle<Code>::null(); | 969 Handle<Code> inner = Handle<Code>::null(); |
| 970 int num_params = ParamCount(desc); | 970 int num_params = ParamCount(desc); |
| 971 CHECK_LE(num_params, kMaxParamCount); | 971 CHECK_LE(num_params, kMaxParamCount); |
| 972 { | 972 { |
| 973 Isolate* isolate = CcTest::InitIsolateOnce(); | 973 Isolate* isolate = CcTest::InitIsolateOnce(); |
| 974 // Build the actual select. | 974 // Build the actual select. |
| 975 Zone zone; | 975 ZoneForTesting zone; |
| 976 Graph graph(&zone); | 976 Graph graph(&zone); |
| 977 RawMachineAssembler raw(isolate, &graph, desc); | 977 RawMachineAssembler raw(isolate, &graph, desc); |
| 978 raw.Return(raw.Parameter(which)); | 978 raw.Return(raw.Parameter(which)); |
| 979 inner = CompileGraph("Select-indirection", desc, &graph, raw.Export()); | 979 inner = CompileGraph("Select-indirection", desc, &graph, raw.Export()); |
| 980 CHECK(!inner.is_null()); | 980 CHECK(!inner.is_null()); |
| 981 CHECK(inner->IsCode()); | 981 CHECK(inner->IsCode()); |
| 982 } | 982 } |
| 983 | 983 |
| 984 { | 984 { |
| 985 // Build a call to the function that does the select. | 985 // Build a call to the function that does the select. |
| 986 Node* target = raw.HeapConstant(inner); | 986 Node* target = raw.HeapConstant(inner); |
| 987 Node** args = raw.zone()->NewArray<Node*>(num_params); | 987 Node** args = raw.zone()->NewArray<Node*>(num_params); |
| 988 for (int i = 0; i < num_params; i++) { | 988 for (int i = 0; i < num_params; i++) { |
| 989 args[i] = raw.Parameter(i); | 989 args[i] = raw.Parameter(i); |
| 990 } | 990 } |
| 991 | 991 |
| 992 Node* call = raw.CallN(desc, target, args); | 992 Node* call = raw.CallN(desc, target, args); |
| 993 raw.Return(call); | 993 raw.Return(call); |
| 994 } | 994 } |
| 995 } | 995 } |
| 996 | 996 |
| 997 | 997 |
| 998 TEST(Float64StackParamsToStackParams) { | 998 TEST(Float64StackParamsToStackParams) { |
| 999 int rarray[] = { | 999 int rarray[] = { |
| 1000 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 1000 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 1001 ->GetAllocatableDoubleCode(0)}; | 1001 ->GetAllocatableDoubleCode(0)}; |
| 1002 Allocator params(nullptr, 0, nullptr, 0); | 1002 Allocator params(nullptr, 0, nullptr, 0); |
| 1003 Allocator rets(nullptr, 0, rarray, 1); | 1003 Allocator rets(nullptr, 0, rarray, 1); |
| 1004 | 1004 |
| 1005 Zone zone; | 1005 ZoneForTesting zone; |
| 1006 ArgsBuffer<float64>::Sig sig(2); | 1006 ArgsBuffer<float64>::Sig sig(2); |
| 1007 RegisterConfig config(params, rets); | 1007 RegisterConfig config(params, rets); |
| 1008 CallDescriptor* desc = config.Create(&zone, &sig); | 1008 CallDescriptor* desc = config.Create(&zone, &sig); |
| 1009 | 1009 |
| 1010 Run_Computation<float64>(desc, Build_Select_With_Call<float64, 0>, | 1010 Run_Computation<float64>(desc, Build_Select_With_Call<float64, 0>, |
| 1011 Compute_Select<float64, 0>, 1098); | 1011 Compute_Select<float64, 0>, 1098); |
| 1012 | 1012 |
| 1013 Run_Computation<float64>(desc, Build_Select_With_Call<float64, 1>, | 1013 Run_Computation<float64>(desc, Build_Select_With_Call<float64, 1>, |
| 1014 Compute_Select<float64, 1>, 1099); | 1014 Compute_Select<float64, 1>, 1099); |
| 1015 } | 1015 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1061 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 1061 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 1062 ->GetAllocatableDoubleCode(1)}; | 1062 ->GetAllocatableDoubleCode(1)}; |
| 1063 int rarray_fp[] = { | 1063 int rarray_fp[] = { |
| 1064 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 1064 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 1065 ->GetAllocatableDoubleCode(0)}; | 1065 ->GetAllocatableDoubleCode(0)}; |
| 1066 Allocator palloc(parray_gp, 2, parray_fp, 2); | 1066 Allocator palloc(parray_gp, 2, parray_fp, 2); |
| 1067 Allocator ralloc(rarray_gp, 1, rarray_fp, 1); | 1067 Allocator ralloc(rarray_gp, 1, rarray_fp, 1); |
| 1068 RegisterConfig config(palloc, ralloc); | 1068 RegisterConfig config(palloc, ralloc); |
| 1069 | 1069 |
| 1070 for (int which = 0; which < num_params; which++) { | 1070 for (int which = 0; which < num_params; which++) { |
| 1071 Zone zone; | 1071 ZoneForTesting zone; |
| 1072 HandleScope scope(isolate); | 1072 HandleScope scope(isolate); |
| 1073 MachineSignature::Builder builder(&zone, 1, num_params); | 1073 MachineSignature::Builder builder(&zone, 1, num_params); |
| 1074 builder.AddReturn(params[which]); | 1074 builder.AddReturn(params[which]); |
| 1075 for (int j = 0; j < num_params; j++) builder.AddParam(params[j]); | 1075 for (int j = 0; j < num_params; j++) builder.AddParam(params[j]); |
| 1076 MachineSignature* sig = builder.Build(); | 1076 MachineSignature* sig = builder.Build(); |
| 1077 CallDescriptor* desc = config.Create(&zone, sig); | 1077 CallDescriptor* desc = config.Create(&zone, sig); |
| 1078 | 1078 |
| 1079 Handle<Code> select; | 1079 Handle<Code> select; |
| 1080 { | 1080 { |
| 1081 // build the select. | 1081 // build the select. |
| 1082 Zone zone; | 1082 ZoneForTesting zone; |
| 1083 Graph graph(&zone); | 1083 Graph graph(&zone); |
| 1084 RawMachineAssembler raw(isolate, &graph, desc); | 1084 RawMachineAssembler raw(isolate, &graph, desc); |
| 1085 raw.Return(raw.Parameter(which)); | 1085 raw.Return(raw.Parameter(which)); |
| 1086 select = CompileGraph("Compute", desc, &graph, raw.Export()); | 1086 select = CompileGraph("Compute", desc, &graph, raw.Export()); |
| 1087 } | 1087 } |
| 1088 | 1088 |
| 1089 { | 1089 { |
| 1090 // call the select. | 1090 // call the select. |
| 1091 Handle<Code> wrapper = Handle<Code>::null(); | 1091 Handle<Code> wrapper = Handle<Code>::null(); |
| 1092 int32_t expected_ret; | 1092 int32_t expected_ret; |
| 1093 char bytes[kDoubleSize]; | 1093 char bytes[kDoubleSize]; |
| 1094 V8_ALIGNED(8) char output[kDoubleSize]; | 1094 V8_ALIGNED(8) char output[kDoubleSize]; |
| 1095 int expected_size = 0; | 1095 int expected_size = 0; |
| 1096 CSignature0<int32_t> csig; | 1096 CSignature0<int32_t> csig; |
| 1097 { | 1097 { |
| 1098 // Wrap the select code with a callable function that passes constants. | 1098 // Wrap the select code with a callable function that passes constants. |
| 1099 Zone zone; | 1099 ZoneForTesting zone; |
| 1100 Graph graph(&zone); | 1100 Graph graph(&zone); |
| 1101 CallDescriptor* cdesc = Linkage::GetSimplifiedCDescriptor(&zone, &csig); | 1101 CallDescriptor* cdesc = Linkage::GetSimplifiedCDescriptor(&zone, &csig); |
| 1102 RawMachineAssembler raw(isolate, &graph, cdesc); | 1102 RawMachineAssembler raw(isolate, &graph, cdesc); |
| 1103 Node* target = raw.HeapConstant(select); | 1103 Node* target = raw.HeapConstant(select); |
| 1104 Node** args = zone.NewArray<Node*>(num_params); | 1104 Node** args = zone.NewArray<Node*>(num_params); |
| 1105 int64_t constant = 0x0102030405060708; | 1105 int64_t constant = 0x0102030405060708; |
| 1106 for (int i = 0; i < num_params; i++) { | 1106 for (int i = 0; i < num_params; i++) { |
| 1107 MachineType param_type = sig->GetParam(i); | 1107 MachineType param_type = sig->GetParam(i); |
| 1108 Node* konst = nullptr; | 1108 Node* konst = nullptr; |
| 1109 if (param_type == MachineType::Int32()) { | 1109 if (param_type == MachineType::Int32()) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1182 ->GetAllocatableDoubleCode(0), | 1182 ->GetAllocatableDoubleCode(0), |
| 1183 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 1183 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 1184 ->GetAllocatableDoubleCode(1)}; | 1184 ->GetAllocatableDoubleCode(1)}; |
| 1185 int rarray_fp[] = { | 1185 int rarray_fp[] = { |
| 1186 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) | 1186 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
| 1187 ->GetAllocatableDoubleCode(0)}; | 1187 ->GetAllocatableDoubleCode(0)}; |
| 1188 Allocator palloc(parray_gp, 2, parray_fp, 2); | 1188 Allocator palloc(parray_gp, 2, parray_fp, 2); |
| 1189 Allocator ralloc(rarray_gp, 1, rarray_fp, 1); | 1189 Allocator ralloc(rarray_gp, 1, rarray_fp, 1); |
| 1190 RegisterConfig config(palloc, ralloc); | 1190 RegisterConfig config(palloc, ralloc); |
| 1191 | 1191 |
| 1192 Zone zone; | 1192 ZoneForTesting zone; |
| 1193 HandleScope scope(isolate); | 1193 HandleScope scope(isolate); |
| 1194 MachineSignature::Builder builder(&zone, 1, 12); | 1194 MachineSignature::Builder builder(&zone, 1, 12); |
| 1195 builder.AddReturn(MachineType::Int32()); | 1195 builder.AddReturn(MachineType::Int32()); |
| 1196 for (int i = 0; i < 10; i++) { | 1196 for (int i = 0; i < 10; i++) { |
| 1197 builder.AddParam(MachineType::Int32()); | 1197 builder.AddParam(MachineType::Int32()); |
| 1198 } | 1198 } |
| 1199 builder.AddParam(slot_type); | 1199 builder.AddParam(slot_type); |
| 1200 builder.AddParam(MachineType::Pointer()); | 1200 builder.AddParam(MachineType::Pointer()); |
| 1201 MachineSignature* sig = builder.Build(); | 1201 MachineSignature* sig = builder.Build(); |
| 1202 CallDescriptor* desc = config.Create(&zone, sig); | 1202 CallDescriptor* desc = config.Create(&zone, sig); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1246 TestStackSlot(MachineType::Float32(), magic); | 1246 TestStackSlot(MachineType::Float32(), magic); |
| 1247 } | 1247 } |
| 1248 | 1248 |
| 1249 TEST(RunStackSlotFloat64) { | 1249 TEST(RunStackSlotFloat64) { |
| 1250 double magic = 3456.375; | 1250 double magic = 3456.375; |
| 1251 TestStackSlot(MachineType::Float64(), magic); | 1251 TestStackSlot(MachineType::Float64(), magic); |
| 1252 } | 1252 } |
| 1253 } // namespace compiler | 1253 } // namespace compiler |
| 1254 } // namespace internal | 1254 } // namespace internal |
| 1255 } // namespace v8 | 1255 } // namespace v8 |
| OLD | NEW |