JavaScript is a dynamically typed language. Therefore, we cannot know for sure 
what types of values may flow into an instruction at the time we compile it. a 
+ b may be an integer addition that produces an integer result, an integer 
addition that overflows and produces a double, an addition of a double to an 
integer, an addition of an integer to a double, a double addition, a string 
concatenation, or an "object-to-value" conversion followed by any of the 
previous.

But the common case is typically going to be an integer addition or a double 
addition.

Therefore, the baseline JIT (which you seem to be looking at) has a fast path 
for the common cases and a slow path for the uncommon ones.  The slow path 
almost always results in a C function call, which then does all of the magic 
necessary to satisfy JS semantics.

Similar things happen for almost all other JS instructions: there is a simple 
path for the cases we have found to be common and a slow-path C function call 
for the rare cases.

The slow paths are emitted as a separate piece of out-of-line code because that 
optimizes instruction cache locality for the main path, and helps a bit with 
branch prediction.

However, if you want to see how JSC actually makes JavaScript run fast, you 
should probably also look at either the LLInt (which enables very fast start-up 
by using a well-tuned threaded OSR-capable interpreter) or the DFG (which 
enables high throughput for longer-running code by leveraging value profiling 
to avoid having to deal with JS's dynamism in most cases). The baseline JIT is 
still probably important for performance, but this is becoming less and less 
true as the LLInt is likely to get faster and the DFG is likely to expand 
coverage to more kinds of code (DFG still cannot compile some functions at all 
due to missing opcode support).

-F



On Apr 18, 2012, at 1:39 AM, wingoog moon wrote:

> Hi!
> As I understand there are two passes to translate SFX bytecode to the native 
> code(functions privateCompileMainPass() and   privateCompileSlowCases()).
> So whats the purpose of privateCompileSlowCases(). Why we need slow cases for 
> each bytecodeInstruction? Is it needed when arguments of instruction not 
> integer or something else?
> 
> Thanks for attention! 
> _______________________________________________
> webkit-dev mailing list
> [email protected]
> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

_______________________________________________
webkit-dev mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

Reply via email to