From: titzer Date: Mon, 1 Jun 2015 15:54:53 +0000 (-0700) Subject: [turbofan] Tester improvements; use CSignature and simplify ReturnValueTraits. X-Git-Tag: upstream/4.7.83~2307 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1a23f031e8d8a81eec670282539a2eae9868e307;p=platform%2Fupstream%2Fv8.git [turbofan] Tester improvements; use CSignature and simplify ReturnValueTraits. R=bmeurer@chromium.org,mstarzinger@chromium.org BUG= Review URL: https://codereview.chromium.org/1150083006 Cr-Commit-Position: refs/heads/master@{#28733} --- diff --git a/test/cctest/compiler/c-signature.h b/test/cctest/compiler/c-signature.h index 5d161db..fee8cb9 100644 --- a/test/cctest/compiler/c-signature.h +++ b/test/cctest/compiler/c-signature.h @@ -11,76 +11,74 @@ namespace v8 { namespace internal { namespace compiler { +#define FOREACH_CTYPE_MACHINE_TYPE_MAPPING(V) \ + V(void, kMachNone) \ + V(bool, kMachBool) \ + V(int8_t, kMachInt8) \ + V(uint8_t, kMachUint8) \ + V(int16_t, kMachInt16) \ + V(uint16_t, kMachUint16) \ + V(int32_t, kMachInt32) \ + V(uint32_t, kMachUint32) \ + V(int64_t, kMachInt64) \ + V(uint64_t, kMachUint64) \ + V(float, kMachFloat32) \ + V(double, kMachFloat64) \ + V(void*, kMachPtr) \ + V(int*, kMachPtr) + template inline MachineType MachineTypeForC() { - CHECK(false); // Instantiated with invalid type. - return kMachNone; -} - -template <> -inline MachineType MachineTypeForC() { - return kMachNone; -} - -template <> -inline MachineType MachineTypeForC() { - return kMachInt8; -} - -template <> -inline MachineType MachineTypeForC() { - return kMachUint8; -} - -template <> -inline MachineType MachineTypeForC() { - return kMachInt16; -} - -template <> -inline MachineType MachineTypeForC() { - return kMachUint16; -} - -template <> -inline MachineType MachineTypeForC() { - return kMachInt32; -} - -template <> -inline MachineType MachineTypeForC() { - return kMachUint32; + while (false) { + // All other types T must be assignable to Object* + *(static_cast(0)) = static_cast(0); + } + return kMachAnyTagged; } -template <> -inline MachineType MachineTypeForC() { - return kMachInt64; -} +#define DECLARE_TEMPLATE_SPECIALIZATION(ctype, mtype) \ + template <> \ + inline MachineType MachineTypeForC() { \ + return mtype; \ + } +FOREACH_CTYPE_MACHINE_TYPE_MAPPING(DECLARE_TEMPLATE_SPECIALIZATION) +#undef DECLARE_TEMPLATE_SPECIALIZATION -template <> -inline MachineType MachineTypeForC() { - return kMachUint64; -} +// Helper for building machine signatures from C types. +class CSignature : public MachineSignature { + protected: + CSignature(size_t return_count, size_t parameter_count, MachineType* reps) + : MachineSignature(return_count, parameter_count, reps) {} -template <> -inline MachineType MachineTypeForC() { - return kMachFloat64; -} + public: + template + void Verify() { + // Verifies the C signature against the machine types. Maximum {5} params. + CHECK_LT(parameter_count(), 6); + const int kMax = 5; + MachineType params[] = {MachineTypeForC(), MachineTypeForC(), + MachineTypeForC(), MachineTypeForC(), + MachineTypeForC()}; + for (int p = kMax - 1; p >= 0; p--) { + if (p < parameter_count()) { + CHECK_EQ(GetParam(p), params[p]); + } else { + CHECK_EQ(kMachNone, params[p]); + } + } + } +}; -template <> -inline MachineType MachineTypeForC() { - return kMachAnyTagged; -} template -class CSignatureOf : public MachineSignature { +class CSignatureOf : public CSignature { protected: MachineType storage_[1 + kParamCount]; CSignatureOf() - : MachineSignature(MachineTypeForC() != kMachNone ? 1 : 0, - kParamCount, - reinterpret_cast(&storage_)) { + : CSignature(MachineTypeForC() != kMachNone ? 1 : 0, kParamCount, + reinterpret_cast(&storage_)) { if (return_count_ == 1) storage_[0] = MachineTypeForC(); } void Set(int index, MachineType type) { @@ -123,9 +121,11 @@ class CSignature3 : public CSignatureOf { } }; -static const CSignature2 int32_int32_to_int32; -static const CSignature2 uint32_uint32_to_uint32; -static const CSignature2 float64_float64_to_float64; +typedef CSignature2 CSignature_i_ii; +typedef CSignature2 CSignature_u_uu; +typedef CSignature2 CSignature_f_ff; +typedef CSignature2 CSignature_d_dd; +typedef CSignature2 CSignature_o_oo; } } } // namespace v8::internal::compiler diff --git a/test/cctest/compiler/call-tester.h b/test/cctest/compiler/call-tester.h index 353ed3d..194af38 100644 --- a/test/cctest/compiler/call-tester.h +++ b/test/cctest/compiler/call-tester.h @@ -9,6 +9,8 @@ #include "src/simulator.h" +#include "test/cctest/compiler/c-signature.h" + #if V8_TARGET_ARCH_IA32 #if __GNUC__ #define V8_CDECL __attribute__((cdecl)) @@ -23,95 +25,64 @@ namespace v8 { namespace internal { namespace compiler { -// TODO(titzer): use c-signature.h instead of ReturnValueTraits template -struct ReturnValueTraits { - static R Cast(uintptr_t r) { return reinterpret_cast(r); } - static MachineType Representation() { - // TODO(dcarney): detect when R is of a subclass of Object* instead of this - // type check. - while (false) { - *(static_cast(0)) = static_cast(0); - } - return kMachAnyTagged; - } -}; - -template <> -struct ReturnValueTraits { - static int32_t* Cast(uintptr_t r) { return reinterpret_cast(r); } - static MachineType Representation() { return kMachPtr; } -}; +inline R CastReturnValue(uintptr_t r) { + return reinterpret_cast(r); +} template <> -struct ReturnValueTraits { - static void Cast(uintptr_t r) {} - static MachineType Representation() { return kMachPtr; } -}; +inline void CastReturnValue(uintptr_t r) {} template <> -struct ReturnValueTraits { - static bool Cast(uintptr_t r) { return static_cast(r); } - static MachineType Representation() { return kRepBit; } -}; +inline bool CastReturnValue(uintptr_t r) { + return static_cast(r); +} template <> -struct ReturnValueTraits { - static int32_t Cast(uintptr_t r) { return static_cast(r); } - static MachineType Representation() { return kMachInt32; } -}; +inline int32_t CastReturnValue(uintptr_t r) { + return static_cast(r); +} template <> -struct ReturnValueTraits { - static uint32_t Cast(uintptr_t r) { return static_cast(r); } - static MachineType Representation() { return kMachUint32; } -}; +inline uint32_t CastReturnValue(uintptr_t r) { + return static_cast(r); +} template <> -struct ReturnValueTraits { - static int64_t Cast(uintptr_t r) { return static_cast(r); } - static MachineType Representation() { return kMachInt64; } -}; +inline int64_t CastReturnValue(uintptr_t r) { + return static_cast(r); +} template <> -struct ReturnValueTraits { - static uint64_t Cast(uintptr_t r) { return static_cast(r); } - static MachineType Representation() { return kMachUint64; } -}; +inline uint64_t CastReturnValue(uintptr_t r) { + return static_cast(r); +} template <> -struct ReturnValueTraits { - static int16_t Cast(uintptr_t r) { return static_cast(r); } - static MachineType Representation() { return kMachInt16; } -}; +inline int16_t CastReturnValue(uintptr_t r) { + return static_cast(r); +} template <> -struct ReturnValueTraits { - static uint16_t Cast(uintptr_t r) { return static_cast(r); } - static MachineType Representation() { return kMachUint16; } -}; +inline uint16_t CastReturnValue(uintptr_t r) { + return static_cast(r); +} template <> -struct ReturnValueTraits { - static int8_t Cast(uintptr_t r) { return static_cast(r); } - static MachineType Representation() { return kMachInt8; } -}; +inline int8_t CastReturnValue(uintptr_t r) { + return static_cast(r); +} template <> -struct ReturnValueTraits { - static uint8_t Cast(uintptr_t r) { return static_cast(r); } - static MachineType Representation() { return kMachUint8; } -}; +inline uint8_t CastReturnValue(uintptr_t r) { + return static_cast(r); +} template <> -struct ReturnValueTraits { - static double Cast(uintptr_t r) { - UNREACHABLE(); - return 0.0; - } - static MachineType Representation() { return kMachFloat64; } -}; - +inline double CastReturnValue(uintptr_t r) { + UNREACHABLE(); + return 0.0; +} template struct ParameterTraits { @@ -213,27 +184,27 @@ class CallHelper { template R DoCall(F* f) { Simulator::CallArgument args[] = {Simulator::CallArgument::End()}; - return ReturnValueTraits::Cast(CallSimulator(FUNCTION_ADDR(f), args)); + return CastReturnValue(CallSimulator(FUNCTION_ADDR(f), args)); } template R DoCall(F* f, P1 p1) { Simulator::CallArgument args[] = {Simulator::CallArgument(p1), Simulator::CallArgument::End()}; - return ReturnValueTraits::Cast(CallSimulator(FUNCTION_ADDR(f), args)); + return CastReturnValue(CallSimulator(FUNCTION_ADDR(f), args)); } template R DoCall(F* f, P1 p1, P2 p2) { Simulator::CallArgument args[] = {Simulator::CallArgument(p1), Simulator::CallArgument(p2), Simulator::CallArgument::End()}; - return ReturnValueTraits::Cast(CallSimulator(FUNCTION_ADDR(f), args)); + return CastReturnValue(CallSimulator(FUNCTION_ADDR(f), args)); } template R DoCall(F* f, P1 p1, P2 p2, P3 p3) { Simulator::CallArgument args[] = { Simulator::CallArgument(p1), Simulator::CallArgument(p2), Simulator::CallArgument(p3), Simulator::CallArgument::End()}; - return ReturnValueTraits::Cast(CallSimulator(FUNCTION_ADDR(f), args)); + return CastReturnValue(CallSimulator(FUNCTION_ADDR(f), args)); } template R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { @@ -241,7 +212,7 @@ class CallHelper { Simulator::CallArgument(p1), Simulator::CallArgument(p2), Simulator::CallArgument(p3), Simulator::CallArgument(p4), Simulator::CallArgument::End()}; - return ReturnValueTraits::Cast(CallSimulator(FUNCTION_ADDR(f), args)); + return CastReturnValue(CallSimulator(FUNCTION_ADDR(f), args)); } #elif USE_SIMULATOR && (V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC64) uintptr_t CallSimulator(byte* f, int64_t p1 = 0, int64_t p2 = 0, @@ -253,28 +224,28 @@ class CallHelper { template R DoCall(F* f) { - return ReturnValueTraits::Cast(CallSimulator(FUNCTION_ADDR(f))); + return CastReturnValue(CallSimulator(FUNCTION_ADDR(f))); } template R DoCall(F* f, P1 p1) { - return ReturnValueTraits::Cast( + return CastReturnValue( CallSimulator(FUNCTION_ADDR(f), ParameterTraits::Cast(p1))); } template R DoCall(F* f, P1 p1, P2 p2) { - return ReturnValueTraits::Cast( - CallSimulator(FUNCTION_ADDR(f), ParameterTraits::Cast(p1), - ParameterTraits::Cast(p2))); + return CastReturnValue(CallSimulator(FUNCTION_ADDR(f), + ParameterTraits::Cast(p1), + ParameterTraits::Cast(p2))); } template R DoCall(F* f, P1 p1, P2 p2, P3 p3) { - return ReturnValueTraits::Cast(CallSimulator( + return CastReturnValue(CallSimulator( FUNCTION_ADDR(f), ParameterTraits::Cast(p1), ParameterTraits::Cast(p2), ParameterTraits::Cast(p3))); } template R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { - return ReturnValueTraits::Cast(CallSimulator( + return CastReturnValue(CallSimulator( FUNCTION_ADDR(f), ParameterTraits::Cast(p1), ParameterTraits::Cast(p2), ParameterTraits::Cast(p3), ParameterTraits::Cast(p4))); @@ -288,28 +259,28 @@ class CallHelper { } template R DoCall(F* f) { - return ReturnValueTraits::Cast(CallSimulator(FUNCTION_ADDR(f))); + return CastReturnValue(CallSimulator(FUNCTION_ADDR(f))); } template R DoCall(F* f, P1 p1) { - return ReturnValueTraits::Cast( + return CastReturnValue( CallSimulator(FUNCTION_ADDR(f), ParameterTraits::Cast(p1))); } template R DoCall(F* f, P1 p1, P2 p2) { - return ReturnValueTraits::Cast( - CallSimulator(FUNCTION_ADDR(f), ParameterTraits::Cast(p1), - ParameterTraits::Cast(p2))); + return CastReturnValue(CallSimulator(FUNCTION_ADDR(f), + ParameterTraits::Cast(p1), + ParameterTraits::Cast(p2))); } template R DoCall(F* f, P1 p1, P2 p2, P3 p3) { - return ReturnValueTraits::Cast(CallSimulator( + return CastReturnValue(CallSimulator( FUNCTION_ADDR(f), ParameterTraits::Cast(p1), ParameterTraits::Cast(p2), ParameterTraits::Cast(p3))); } template R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { - return ReturnValueTraits::Cast(CallSimulator( + return CastReturnValue(CallSimulator( FUNCTION_ADDR(f), ParameterTraits::Cast(p1), ParameterTraits::Cast(p2), ParameterTraits::Cast(p3), ParameterTraits::Cast(p4))); @@ -356,31 +327,27 @@ class CallHelper { template void VerifyParameters1() { - MachineType parameters[] = {ReturnValueTraits::Representation()}; + MachineType parameters[] = {MachineTypeForC()}; VerifyParameters(arraysize(parameters), parameters); } template void VerifyParameters2() { - MachineType parameters[] = {ReturnValueTraits::Representation(), - ReturnValueTraits::Representation()}; + MachineType parameters[] = {MachineTypeForC(), MachineTypeForC()}; VerifyParameters(arraysize(parameters), parameters); } template void VerifyParameters3() { - MachineType parameters[] = {ReturnValueTraits::Representation(), - ReturnValueTraits::Representation(), - ReturnValueTraits::Representation()}; + MachineType parameters[] = {MachineTypeForC(), MachineTypeForC(), + MachineTypeForC()}; VerifyParameters(arraysize(parameters), parameters); } template void VerifyParameters4() { - MachineType parameters[] = {ReturnValueTraits::Representation(), - ReturnValueTraits::Representation(), - ReturnValueTraits::Representation(), - ReturnValueTraits::Representation()}; + MachineType parameters[] = {MachineTypeForC(), MachineTypeForC(), + MachineTypeForC(), MachineTypeForC()}; VerifyParameters(arraysize(parameters), parameters); } #endif diff --git a/test/cctest/compiler/codegen-tester.h b/test/cctest/compiler/codegen-tester.h index 9272e50..35ea0b9 100644 --- a/test/cctest/compiler/codegen-tester.h +++ b/test/cctest/compiler/codegen-tester.h @@ -30,14 +30,12 @@ class RawMachineAssemblerTester : public HandleAndZoneScope, : HandleAndZoneScope(), CallHelper( main_isolate(), - MakeMachineSignature( - main_zone(), ReturnValueTraits::Representation(), - p0, p1, p2, p3, p4)), + MakeMachineSignature(main_zone(), MachineTypeForC(), p0, + p1, p2, p3, p4)), RawMachineAssembler( main_isolate(), new (main_zone()) Graph(main_zone()), - MakeMachineSignature( - main_zone(), ReturnValueTraits::Representation(), - p0, p1, p2, p3, p4), + MakeMachineSignature(main_zone(), MachineTypeForC(), p0, + p1, p2, p3, p4), kMachPtr, InstructionSelector::SupportedMachineOperatorFlags()) {} void CheckNumber(double expected, Object* number) { diff --git a/test/cctest/compiler/graph-builder-tester.h b/test/cctest/compiler/graph-builder-tester.h index 848f250..6557db4 100644 --- a/test/cctest/compiler/graph-builder-tester.h +++ b/test/cctest/compiler/graph-builder-tester.h @@ -52,9 +52,8 @@ class GraphBuilderTester : public HandleAndZoneScope, : GraphAndBuilders(main_zone()), CallHelper( main_isolate(), - MakeMachineSignature( - main_zone(), ReturnValueTraits::Representation(), - p0, p1, p2, p3, p4)), + MakeMachineSignature(main_zone(), MachineTypeForC(), p0, + p1, p2, p3, p4)), SimplifiedGraphBuilder(main_isolate(), main_graph_, &main_common_, &main_machine_, &main_simplified_), parameters_(main_zone()->template NewArray(parameter_count())) { diff --git a/test/cctest/compiler/test-run-machops.cc b/test/cctest/compiler/test-run-machops.cc index 66ac809..036c1fb 100644 --- a/test/cctest/compiler/test-run-machops.cc +++ b/test/cctest/compiler/test-run-machops.cc @@ -4412,7 +4412,7 @@ TEST(RunTestIntPtrArithmetic) { TEST(RunSpillLotsOfThings) { static const int kInputSize = 1000; - RawMachineAssemblerTester m; + RawMachineAssemblerTester m; Node* accs[kInputSize]; int32_t outputs[kInputSize]; Node* one = m.Int32Constant(1); diff --git a/test/cctest/compiler/test-simplified-lowering.cc b/test/cctest/compiler/test-simplified-lowering.cc index d1bc803..9b23469 100644 --- a/test/cctest/compiler/test-simplified-lowering.cc +++ b/test/cctest/compiler/test-simplified-lowering.cc @@ -33,11 +33,8 @@ template class SimplifiedLoweringTester : public GraphBuilderTester { public: SimplifiedLoweringTester(MachineType p0 = kMachNone, - MachineType p1 = kMachNone, - MachineType p2 = kMachNone, - MachineType p3 = kMachNone, - MachineType p4 = kMachNone) - : GraphBuilderTester(p0, p1, p2, p3, p4), + MachineType p1 = kMachNone) + : GraphBuilderTester(p0, p1), typer(this->isolate(), this->graph(), MaybeHandle()), javascript(this->zone()), jsgraph(this->isolate(), this->graph(), this->common(), &javascript,