Commit e2ce4567 authored by svenpanne's avatar svenpanne Committed by Commit bot

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}
parent 5de20c05
......@@ -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()));
......
......@@ -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;
......
......@@ -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
......
......@@ -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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment