Index: test/cctest/compiler/compiler/codegen-tester.h |
diff --git a/test/cctest/compiler/compiler/codegen-tester.h b/test/cctest/compiler/compiler/codegen-tester.h |
deleted file mode 100644 |
index 2cb9a4ef74fdd754590c05d36fa6b3eff11c12d9..0000000000000000000000000000000000000000 |
--- a/test/cctest/compiler/compiler/codegen-tester.h |
+++ /dev/null |
@@ -1,323 +0,0 @@ |
-// Copyright 2014 the V8 project authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef V8_CCTEST_COMPILER_CODEGEN_TESTER_H_ |
-#define V8_CCTEST_COMPILER_CODEGEN_TESTER_H_ |
- |
-#include "src/v8.h" |
- |
-#include "src/compiler/pipeline.h" |
-#include "src/compiler/raw-machine-assembler.h" |
-#include "src/compiler/structured-machine-assembler.h" |
-#include "src/simulator.h" |
-#include "test/cctest/compiler/call-tester.h" |
- |
-namespace v8 { |
-namespace internal { |
-namespace compiler { |
- |
-template <typename MachineAssembler> |
-class MachineAssemblerTester : public HandleAndZoneScope, |
- public CallHelper, |
- public MachineAssembler { |
- public: |
- MachineAssemblerTester(MachineRepresentation return_type, |
- MachineRepresentation p0, MachineRepresentation p1, |
- MachineRepresentation p2, MachineRepresentation p3, |
- MachineRepresentation p4) |
- : HandleAndZoneScope(), |
- CallHelper(main_isolate()), |
- MachineAssembler(new (main_zone()) Graph(main_zone()), |
- ToCallDescriptorBuilder(main_zone(), return_type, p0, |
- p1, p2, p3, p4), |
- MachineOperatorBuilder::pointer_rep()) {} |
- |
- Node* LoadFromPointer(void* address, MachineRepresentation rep, |
- int32_t offset = 0) { |
- return this->Load(rep, this->PointerConstant(address), |
- this->Int32Constant(offset)); |
- } |
- |
- void StoreToPointer(void* address, MachineRepresentation rep, Node* node) { |
- this->Store(rep, this->PointerConstant(address), node); |
- } |
- |
- Node* StringConstant(const char* string) { |
- return this->HeapConstant( |
- this->isolate()->factory()->InternalizeUtf8String(string)); |
- } |
- |
- void CheckNumber(double expected, Object* number) { |
- CHECK(this->isolate()->factory()->NewNumber(expected)->SameValue(number)); |
- } |
- |
- void CheckString(const char* expected, Object* string) { |
- CHECK( |
- this->isolate()->factory()->InternalizeUtf8String(expected)->SameValue( |
- string)); |
- } |
- |
- void GenerateCode() { Generate(); } |
- |
- protected: |
- virtual void VerifyParameters(int parameter_count, |
- MachineRepresentation* parameter_types) { |
- CHECK_EQ(this->parameter_count(), parameter_count); |
- const MachineRepresentation* expected_types = this->parameter_types(); |
- for (int i = 0; i < parameter_count; i++) { |
- CHECK_EQ(expected_types[i], parameter_types[i]); |
- } |
- } |
- |
- virtual byte* Generate() { |
- if (code_.is_null()) { |
- Schedule* schedule = this->Export(); |
- CallDescriptor* call_descriptor = this->call_descriptor(); |
- Graph* graph = this->graph(); |
- CompilationInfo info(graph->zone()->isolate(), graph->zone()); |
- Linkage linkage(&info, call_descriptor); |
- Pipeline pipeline(&info); |
- code_ = pipeline.GenerateCodeForMachineGraph(&linkage, graph, schedule); |
- } |
- return this->code_.ToHandleChecked()->entry(); |
- } |
- |
- private: |
- MaybeHandle<Code> code_; |
-}; |
- |
- |
-template <typename ReturnType> |
-class RawMachineAssemblerTester |
- : public MachineAssemblerTester<RawMachineAssembler>, |
- public CallHelper2<ReturnType, RawMachineAssemblerTester<ReturnType> > { |
- public: |
- RawMachineAssemblerTester(MachineRepresentation p0 = kMachineLast, |
- MachineRepresentation p1 = kMachineLast, |
- MachineRepresentation p2 = kMachineLast, |
- MachineRepresentation p3 = kMachineLast, |
- MachineRepresentation p4 = kMachineLast) |
- : MachineAssemblerTester(ReturnValueTraits<ReturnType>::Representation(), |
- p0, p1, p2, p3, p4) {} |
-}; |
- |
- |
-template <typename ReturnType> |
-class StructuredMachineAssemblerTester |
- : public MachineAssemblerTester<StructuredMachineAssembler>, |
- public CallHelper2<ReturnType, |
- StructuredMachineAssemblerTester<ReturnType> > { |
- public: |
- StructuredMachineAssemblerTester(MachineRepresentation p0 = kMachineLast, |
- MachineRepresentation p1 = kMachineLast, |
- MachineRepresentation p2 = kMachineLast, |
- MachineRepresentation p3 = kMachineLast, |
- MachineRepresentation p4 = kMachineLast) |
- : MachineAssemblerTester(ReturnValueTraits<ReturnType>::Representation(), |
- p0, p1, p2, p3, p4) {} |
-}; |
- |
- |
-static const bool USE_RESULT_BUFFER = true; |
-static const bool USE_RETURN_REGISTER = false; |
- |
-// TODO(titzer): use the C-style calling convention, or any register-based |
-// calling convention for binop tests. |
-template <typename CType, MachineRepresentation rep, bool use_result_buffer> |
-class BinopTester { |
- public: |
- static const int32_t CHECK_VALUE = 0x99BEEDCE; |
- |
- explicit BinopTester(RawMachineAssemblerTester<int32_t>* tester) |
- : T(tester), |
- param0(T->LoadFromPointer(&p0, rep)), |
- param1(T->LoadFromPointer(&p1, rep)), |
- p0(static_cast<CType>(0)), |
- p1(static_cast<CType>(0)), |
- result(static_cast<CType>(0)) {} |
- |
- RawMachineAssemblerTester<int32_t>* T; |
- Node* param0; |
- Node* param1; |
- |
- CType call(CType a0, CType a1) { |
- p0 = a0; |
- p1 = a1; |
- if (use_result_buffer) { |
- CHECK_EQ(CHECK_VALUE, T->Call()); |
- return result; |
- } else { |
- return T->Call(); |
- } |
- } |
- |
- void AddReturn(Node* val) { |
- if (use_result_buffer) { |
- T->Store(rep, T->PointerConstant(&result), T->Int32Constant(0), val); |
- T->Return(T->Int32Constant(CHECK_VALUE)); |
- } else { |
- T->Return(val); |
- } |
- } |
- |
- protected: |
- CType p0; |
- CType p1; |
- CType result; |
-}; |
- |
- |
-// A helper class for testing code sequences that take two int parameters and |
-// return an int value. |
-class Int32BinopTester |
- : public BinopTester<int32_t, kMachineWord32, USE_RETURN_REGISTER> { |
- public: |
- explicit Int32BinopTester(RawMachineAssemblerTester<int32_t>* tester) |
- : BinopTester<int32_t, kMachineWord32, USE_RETURN_REGISTER>(tester) {} |
- |
- int32_t call(uint32_t a0, uint32_t a1) { |
- p0 = static_cast<int32_t>(a0); |
- p1 = static_cast<int32_t>(a1); |
- return T->Call(); |
- } |
-}; |
- |
- |
-// A helper class for testing code sequences that take two double parameters and |
-// return a double value. |
-// TODO(titzer): figure out how to return doubles correctly on ia32. |
-class Float64BinopTester |
- : public BinopTester<double, kMachineFloat64, USE_RESULT_BUFFER> { |
- public: |
- explicit Float64BinopTester(RawMachineAssemblerTester<int32_t>* tester) |
- : BinopTester<double, kMachineFloat64, USE_RESULT_BUFFER>(tester) {} |
-}; |
- |
- |
-// A helper class for testing code sequences that take two pointer parameters |
-// and return a pointer value. |
-// TODO(titzer): pick word size of pointers based on V8_TARGET. |
-template <typename Type> |
-class PointerBinopTester |
- : public BinopTester<Type*, kMachineWord32, USE_RETURN_REGISTER> { |
- public: |
- explicit PointerBinopTester(RawMachineAssemblerTester<int32_t>* tester) |
- : BinopTester<Type*, kMachineWord32, USE_RETURN_REGISTER>(tester) {} |
-}; |
- |
- |
-// A helper class for testing code sequences that take two tagged parameters and |
-// return a tagged value. |
-template <typename Type> |
-class TaggedBinopTester |
- : public BinopTester<Type*, kMachineTagged, USE_RETURN_REGISTER> { |
- public: |
- explicit TaggedBinopTester(RawMachineAssemblerTester<int32_t>* tester) |
- : BinopTester<Type*, kMachineTagged, USE_RETURN_REGISTER>(tester) {} |
-}; |
- |
-// A helper class for testing compares. Wraps a machine opcode and provides |
-// evaluation routines and the operators. |
-class CompareWrapper { |
- public: |
- explicit CompareWrapper(IrOpcode::Value op) : opcode(op) {} |
- |
- Node* MakeNode(RawMachineAssemblerTester<int32_t>* m, Node* a, Node* b) { |
- return m->NewNode(op(m->machine()), a, b); |
- } |
- |
- Operator* op(MachineOperatorBuilder* machine) { |
- switch (opcode) { |
- case IrOpcode::kWord32Equal: |
- return machine->Word32Equal(); |
- case IrOpcode::kInt32LessThan: |
- return machine->Int32LessThan(); |
- case IrOpcode::kInt32LessThanOrEqual: |
- return machine->Int32LessThanOrEqual(); |
- case IrOpcode::kUint32LessThan: |
- return machine->Uint32LessThan(); |
- case IrOpcode::kUint32LessThanOrEqual: |
- return machine->Uint32LessThanOrEqual(); |
- case IrOpcode::kFloat64Equal: |
- return machine->Float64Equal(); |
- case IrOpcode::kFloat64LessThan: |
- return machine->Float64LessThan(); |
- case IrOpcode::kFloat64LessThanOrEqual: |
- return machine->Float64LessThanOrEqual(); |
- default: |
- UNREACHABLE(); |
- } |
- return NULL; |
- } |
- |
- bool Int32Compare(int32_t a, int32_t b) { |
- switch (opcode) { |
- case IrOpcode::kWord32Equal: |
- return a == b; |
- case IrOpcode::kInt32LessThan: |
- return a < b; |
- case IrOpcode::kInt32LessThanOrEqual: |
- return a <= b; |
- case IrOpcode::kUint32LessThan: |
- return static_cast<uint32_t>(a) < static_cast<uint32_t>(b); |
- case IrOpcode::kUint32LessThanOrEqual: |
- return static_cast<uint32_t>(a) <= static_cast<uint32_t>(b); |
- default: |
- UNREACHABLE(); |
- } |
- return false; |
- } |
- |
- bool Float64Compare(double a, double b) { |
- switch (opcode) { |
- case IrOpcode::kFloat64Equal: |
- return a == b; |
- case IrOpcode::kFloat64LessThan: |
- return a < b; |
- case IrOpcode::kFloat64LessThanOrEqual: |
- return a <= b; |
- default: |
- UNREACHABLE(); |
- } |
- return false; |
- } |
- |
- IrOpcode::Value opcode; |
-}; |
- |
- |
-// A small closure class to generate code for a function of two inputs that |
-// produces a single output so that it can be used in many different contexts. |
-// The {expected()} method should compute the expected output for a given |
-// pair of inputs. |
-template <typename T> |
-class BinopGen { |
- public: |
- virtual void gen(RawMachineAssemblerTester<int32_t>* m, Node* a, Node* b) = 0; |
- virtual T expected(T a, T b) = 0; |
- virtual ~BinopGen() {} |
-}; |
- |
-// A helper class to generate various combination of input shape combinations |
-// and run the generated code to ensure it produces the correct results. |
-class Int32BinopInputShapeTester { |
- public: |
- explicit Int32BinopInputShapeTester(BinopGen<int32_t>* g) : gen(g) {} |
- |
- void TestAllInputShapes(); |
- |
- private: |
- BinopGen<int32_t>* gen; |
- int32_t input_a; |
- int32_t input_b; |
- |
- void Run(RawMachineAssemblerTester<int32_t>* m); |
- void RunLeft(RawMachineAssemblerTester<int32_t>* m); |
- void RunRight(RawMachineAssemblerTester<int32_t>* m); |
-}; |
-} // namespace compiler |
-} // namespace internal |
-} // namespace v8 |
- |
-#endif // V8_CCTEST_COMPILER_CODEGEN_TESTER_H_ |