As part of an effort to simplify future development, the JSC team is
deprecating the classic C++ interpreter (and will delete it shortly on Sept
24). In its place, we will use the LLINT (low level interpreter) with the C++
back-end (see https://bugs.webkit.org/show_bug.cgi?id=91052) to generate a
llint C++ interpreter for new ports that do not support the JITs yet.
In order to deprecate the classic C++ interpreter, we will need your help to
convert your ports to use the llint (if you are using JSC for your port). I
will lay out some details below on how this conversion works:
Why deprecate the classic C++ interpreter?
=================================
The llint is where active development will take place as we add new JIT and
runtime enhancements. Having the classic C++ interpreter around only slows
down the development effort. The classic C++ interpreter is also prone to
experience bit-rot, and hence will easily get buggy over time.
How will you bring up a new platform without the classic C++ interpreter?
========================================================
You will have to add the llint offline ASM build phase to generate the llint
C++ interpreter (see below for details on the llint offline build phase).
Alternatively, you can generate the llint C++ interpreter on a port that
already supports it, and use the generated LLIntAssembly.h from there to
bootstrap your port. It is preferred that every port supports the llint
natively because this will enable you to get the latest bug fixes and
performance enhancements.
What is the performance of the llint C++ interpreter?
========================================
The performance of the new llint C++ interpreter is currently slower than the
classic C++ interpreter, but within approximately 10% on average. The goal of
the llint C++ interpreter is not to achieve the highest performance, but to
provide a functional C++ interpreter to help bootstrap new ports. As such, we
don't plan to spend a lot of time on optimizing it.
sunspider results:
classic C++ interpreter llint C++ interpreter
<arithmetic> * 18.3123+-0.1593 ! 18.6551+-0.1095 !
definitely 1.0187x slower
v8-real results:
classic C++ interpreter llint C++ interpreter
<geometric> * 15.31772+-0.22338 ! 16.92580+-0.09735 !
definitely 1.1050x slower
How is the llint built?
================
Here's a summary of the steps:
Step 1: Generate LLIntDesiredOffsets.h
mkdir -p "${BUILT_PRODUCTS_DIR}/LLIntOffsets/"
/usr/bin/env ruby "${SRCROOT}/offlineasm/generate_offset_extractor.rb"
"${SRCROOT}/llint/LowLevelInterpreter.asm"
"${BUILT_PRODUCTS_DIR}/LLIntOffsets/LLIntDesiredOffsets.h"
Step 2: Build LLIntOffsetsExtractor from LLIntDesiredOffsets.h (from step 1)
and Source/JavaScriptCore/llint/LLIntOffsetsExtrator.cpp using the
cross-compiler for your target.
LLIntOffsetsExtractor is supposed to be an executable binary for your target
port. However, we will only be using it to extract offsets that we need for
the next step, and won't be running it.
Step 3: Generate LLIntAssembly.h
/usr/bin/env ruby JavaScriptCore/offlineasm/asm.rb
JavaScriptCore/llint/LowLevelInterpreter.asm
${BUILT_PRODUCTS_DIR}/JSCLLIntOffsetsExtractor LLIntAssembly.h || exit 1
LLIntAssembly.h provides the body of the interpreter, and will be #included in
Source/JavaScriptCore/llint/LowLevelInterpreter.cpp to be built into JSC.
How to get JSC to build with the llint C++ interpreter?
========================================
In Platform.h (or equivalent), set the following settings:
#define ENABLE_JIT 0
#define ENABLE_LLINT 1
#define ENABLE_CLASSIC_INTERPRETER 0
This combination of settings will ENABLE(LLINT_C_LOOP) which builds the llint
C++ interpreter. Eventually, ENABLE_CLASSIC_INTERPRETER won't be needed when
the classic C++ interpreter gets deprecated and deleted.
What do you need to do for your port?
=============================
The Mac port already works with the llint. I'm planning to fix the Windows
port to also work with the llint. On Sept 24, we plan to delete the classic
C++ interpreter. This means your port will cease to build if you are still
relying on the classic C++ interpreter then.
Please look into migrating your port to use the llint C++ interpreter (if not
the Assembly one) within the next few weeks. If you encounter issues and need
some help getting the llint to work for your port, please feel free to contact
me. I will do my best to help you out.
Thanks.
Regards,
Mark
_______________________________________________
webkit-dev mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-dev