Intrinsics in the RUNTIME_FUNCTION_LIST are now available with '_', too.

Now the three intrinsic lists only differ in their compiler
support. Unifying the lists and making the logic what is supported in
which compiler local to the compilers themselves is handled in a
follow-up CL.

BUG=v8:3947
LOG=n

Review URL: https://codereview.chromium.org/983183002

Cr-Commit-Position: refs/heads/master@{#27046}
This commit is contained in:
svenpanne 2015-03-06 06:58:35 -08:00 committed by Commit bot
parent 5de20c05d5
commit e2ce456754
4 changed files with 24 additions and 14 deletions

View File

@ -9535,6 +9535,22 @@ const HOptimizedGraphBuilder::InlineFunctionGenerator
#undef INLINE_FUNCTION_GENERATOR_ADDRESS
HOptimizedGraphBuilder::InlineFunctionGenerator
HOptimizedGraphBuilder::FindInlineFunctionGenerator(CallRuntime* expr) {
const Runtime::Function* function = expr->function();
if (function == nullptr || function->intrinsic_type != Runtime::INLINE) {
return nullptr;
}
Runtime::FunctionId id = function->function_id;
if (id < Runtime::kFirstInlineFunction) return nullptr;
int lookup_index =
static_cast<int>(id) - static_cast<int>(Runtime::kFirstInlineFunction);
DCHECK(static_cast<size_t>(lookup_index) <
arraysize(kInlineFunctionGenerators));
return kInlineFunctionGenerators[lookup_index];
}
template <class ViewClass>
void HGraphBuilder::BuildArrayBufferViewInitialization(
HValue* obj,
@ -9914,21 +9930,13 @@ void HOptimizedGraphBuilder::VisitCallRuntime(CallRuntime* expr) {
const Runtime::Function* function = expr->function();
DCHECK(function != NULL);
if (function->intrinsic_type == Runtime::INLINE) {
InlineFunctionGenerator generator = FindInlineFunctionGenerator(expr);
if (generator != nullptr) {
DCHECK(expr->name()->length() > 0);
DCHECK(expr->name()->Get(0) == '_');
// Call to an inline function.
int lookup_index = static_cast<int>(function->function_id) -
static_cast<int>(Runtime::kFirstInlineFunction);
DCHECK(lookup_index >= 0);
DCHECK(static_cast<size_t>(lookup_index) <
arraysize(kInlineFunctionGenerators));
InlineFunctionGenerator generator = kInlineFunctionGenerators[lookup_index];
// Call the inline code generator using the pointer-to-member.
(this->*generator)(expr);
} else {
DCHECK(function->intrinsic_type == Runtime::RUNTIME);
Handle<String> name = expr->name();
int argument_count = expr->arguments()->length();
CHECK_ALIVE(VisitExpressions(expr->arguments()));

View File

@ -2122,6 +2122,8 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
typedef void (HOptimizedGraphBuilder::*InlineFunctionGenerator)
(CallRuntime* call);
InlineFunctionGenerator FindInlineFunctionGenerator(CallRuntime* expr);
// Forward declarations for inner scope classes.
class SubgraphScope;

View File

@ -49,8 +49,8 @@ INLINE_FUNCTION_LIST(F)
static const Runtime::Function kIntrinsicFunctions[] = {
RUNTIME_FUNCTION_LIST(F) INLINE_FUNCTION_LIST(F)
INLINE_OPTIMIZED_FUNCTION_LIST(F) INLINE_FUNCTION_LIST(I)
INLINE_OPTIMIZED_FUNCTION_LIST(I)};
INLINE_OPTIMIZED_FUNCTION_LIST(F) RUNTIME_FUNCTION_LIST(I)
INLINE_FUNCTION_LIST(I) INLINE_OPTIMIZED_FUNCTION_LIST(I)};
#undef I
#undef F

View File

@ -771,8 +771,8 @@ class Runtime : public AllStatic {
#define F(name, nargs, ressize) k##name,
#define I(name, nargs, ressize) kInline##name,
RUNTIME_FUNCTION_LIST(F) INLINE_FUNCTION_LIST(F)
INLINE_OPTIMIZED_FUNCTION_LIST(F) INLINE_FUNCTION_LIST(I)
INLINE_OPTIMIZED_FUNCTION_LIST(I)
INLINE_OPTIMIZED_FUNCTION_LIST(F) RUNTIME_FUNCTION_LIST(I)
INLINE_FUNCTION_LIST(I) INLINE_OPTIMIZED_FUNCTION_LIST(I)
#undef I
#undef F
kNumFunctions,