| Index: src/full-codegen.cc
|
| ===================================================================
|
| --- src/full-codegen.cc (revision 5457)
|
| +++ src/full-codegen.cc (working copy)
|
| @@ -324,15 +324,11 @@
|
|
|
|
|
| bool FullCodeGenerator::ShouldInlineSmiCase(Token::Value op) {
|
| - // TODO(kasperl): Once the compare stub allows leaving out the
|
| - // inlined smi case, we should get rid of this check.
|
| - if (Token::IsCompareOp(op)) return true;
|
| - // TODO(kasperl): Once the unary bit not stub allows leaving out
|
| - // the inlined smi case, we should get rid of this check.
|
| - if (op == Token::BIT_NOT) return true;
|
| // Inline smi case inside loops, but not division and modulo which
|
| // are too complicated and take up too much space.
|
| - return (op != Token::DIV) && (op != Token::MOD) && (loop_depth_ > 0);
|
| + if (op == Token::DIV ||op == Token::MOD) return false;
|
| + if (FLAG_always_inline_smi_code) return true;
|
| + return loop_depth_ > 0;
|
| }
|
|
|
|
|
| @@ -505,21 +501,39 @@
|
| }
|
|
|
|
|
| -void FullCodeGenerator::EmitInlineRuntimeCall(CallRuntime* expr) {
|
| - Handle<String> name = expr->name();
|
| - SmartPointer<char> cstring = name->ToCString();
|
| +// Lookup table for code generators for special runtime calls which are
|
| +// generated inline.
|
| +#define INLINE_FUNCTION_GENERATOR_ADDRESS(Name, argc, ressize) \
|
| + &FullCodeGenerator::Emit##Name,
|
|
|
| -#define CHECK_EMIT_INLINE_CALL(name, x, y) \
|
| - if (strcmp("_"#name, *cstring) == 0) { \
|
| - Emit##name(expr->arguments()); \
|
| - return; \
|
| - }
|
| - INLINE_RUNTIME_FUNCTION_LIST(CHECK_EMIT_INLINE_CALL)
|
| -#undef CHECK_EMIT_INLINE_CALL
|
| - UNREACHABLE();
|
| +const FullCodeGenerator::InlineFunctionGenerator
|
| + FullCodeGenerator::kInlineFunctionGenerators[] = {
|
| + INLINE_FUNCTION_LIST(INLINE_FUNCTION_GENERATOR_ADDRESS)
|
| + INLINE_RUNTIME_FUNCTION_LIST(INLINE_FUNCTION_GENERATOR_ADDRESS)
|
| + };
|
| +#undef INLINE_FUNCTION_GENERATOR_ADDRESS
|
| +
|
| +
|
| +FullCodeGenerator::InlineFunctionGenerator
|
| + FullCodeGenerator::FindInlineFunctionGenerator(Runtime::FunctionId id) {
|
| + return kInlineFunctionGenerators[
|
| + static_cast<int>(id) - static_cast<int>(Runtime::kFirstInlineFunction)];
|
| }
|
|
|
|
|
| +void FullCodeGenerator::EmitInlineRuntimeCall(CallRuntime* node) {
|
| + ZoneList<Expression*>* args = node->arguments();
|
| + Handle<String> name = node->name();
|
| + Runtime::Function* function = node->function();
|
| + ASSERT(function != NULL);
|
| + ASSERT(function->intrinsic_type == Runtime::INLINE);
|
| + InlineFunctionGenerator generator =
|
| + FindInlineFunctionGenerator(function->function_id);
|
| + ASSERT(generator != NULL);
|
| + ((*this).*(generator))(args);
|
| +}
|
| +
|
| +
|
| void FullCodeGenerator::VisitBinaryOperation(BinaryOperation* expr) {
|
| Comment cmnt(masm_, "[ BinaryOperation");
|
| Token::Value op = expr->op();
|
|
|