| 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 | 
|---|