- 27 Oct, 2009 4 commits
-
-
fschneider@chromium.org authored
The generated code is similar to the existing code, but we never inline any IC code in the fast compiler. Review URL: http://codereview.chromium.org/337045 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3152 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
whesse@chromium.org authored
Review URL: http://codereview.chromium.org/334041 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3148 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
kmillikin@chromium.org authored
top-level code generator backend. Introduce function to move one location to another (source cannot be nowhere); to move registers, slots, and literals into a location; and to move a location to a register or slot. Review URL: http://codereview.chromium.org/338043 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3146 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
kmillikin@chromium.org authored
Literals now have a location of temporary by default and are responsible for moving themselves into their location like all other expressions. The constant location turned out not to allow us to avoid checking subexpressions in AST interior nodes, and it turned out to require checking after some normal calls to Visit (like for the arguments to a call). With this change do not have to check after a call to Visit that we got our result in the expected location. Review URL: http://codereview.chromium.org/339004 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3137 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
- 26 Oct, 2009 1 commit
-
-
fschneider@chromium.org authored
I also added more unit tests for literals. Right now, the fast compiler produces code very similar to the existing code generator. We may consider different ways to further compact the generated code for top-level code. ARM always goes through a runtime function to initialize computed properties in an object literal whereas IA32 and x64 use StoreIC. Review URL: http://codereview.chromium.org/316009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3129 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
- 23 Oct, 2009 1 commit
-
-
kmillikin@chromium.org authored
in a non-test (ie, value or effect) context. (It is implicitly not in a test context because the code generator does not support expressions in a test context yet.) Compilation is essentially the same as in the optimized code generator. The expression (e0 || e1) is compiled as if it were (let (temp = e0) temp ? temp : e1). On ia32 and x64 a single shared ToBoolean stub is used to convert a value to a flag. The inlined checks assumed by the stub are reordered to compare to undefined (the common case in toplevel code?) first. On ARM a call to the runtime is used. In the interest of code size no checks are yet inlined on ARM. Review URL: http://codereview.chromium.org/334006 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3118 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
- 22 Oct, 2009 2 commits
-
-
kmillikin@chromium.org authored
currently compiled the same as with the optimizing compiler: they are cloned from a boilerplate object and the boilerplate objects are lazily constructed. Also changed argument pushing on ARM to use stm (store multiple), which required changing the order of arguments to the runtime functions DeclareGlobals and NewClosure. They were only used from generated code. Finally, changed the toplevel code generator so that stack pops to discard a temporary became addition to the stack pointer on ia32 and x64. Review URL: http://codereview.chromium.org/303021 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3110 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
fschneider@chromium.org authored
For .result = /abc.*/g we generate the following IA-32 code: ... mov ebx,[edi+0x17] mov eax,[ebx+0xb] cmp eax, 0xf5d0e135 ;; object: 0xf5d0e135 <undefined> jnz done push ebx push 0x2 push 0xf5d13805 ;; object: 0xf5d13805 <String[5]: abc.*> push 0xf5d13815 ;; object: 0xf5d13815 <String[1]: g> call RuntimeStub_MaterializeRegExpLiteral done: push eax pop [ebp+0xf4] ... This is very similar to the code previously generated except we do not generate deferred code for the case where we call the runtime. On ARM we use the stm instruction to make pushing the arguments more compact. Review URL: http://codereview.chromium.org/300037 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3109 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
- 21 Oct, 2009 2 commits
-
-
fschneider@chromium.org authored
Review URL: http://codereview.chromium.org/313003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3102 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
fschneider@chromium.org authored
Adding calls to global functions to the new compiler. Review URL: http://codereview.chromium.org/302002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3099 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
- 19 Oct, 2009 1 commit
-
-
kmillikin@chromium.org authored
constant known at compile time. Do not ever use the stack to materialize (non-function-argument) constants. Currently, constants are only the non-materialized, non-function literals in the AST. It is a known issue that there is no test coverage for the cases of assigning a non-literal to a variable and returning a literal. Those code paths are unreachable and tests will be added when they become reachable. For the code '.result = true', we had previously on ia32: 27 push 0xf5c28161 ;; object: 0xf5c28161 <true> 32 pop [ebp+0xf4] Now: 27 mov eax,0xf5c26161 ;; object: 0xf5c26161 <true> 32 mov [ebp+0xf4],eax ======== We had previously on x64: 25 movq r10,0x7fb8c2f78199 ;; object: 0x7fb8c2f78199 <true> 35 push r10 37 pop [rbp-0x18] Now: 25 movq r10,0x7fb131386199 ;; object: 0x7fb131386199 <true> 35 movq [rbp-0x18],r10 The generated code for ARM did not include the extra memory traffic. It was already eliminated by the ARM assembler's push/pop elimination. Review URL: http://codereview.chromium.org/300003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3088 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
- 16 Oct, 2009 1 commit
-
-
kmillikin@chromium.org authored
Slots appear only indirectly in the AST (through variables linked to variable proxies). Slots are shared among variable references, so putting compilation-time state on them is potentially a source of bugs. Avoid it for now. Review URL: http://codereview.chromium.org/284009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3079 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
- 15 Oct, 2009 3 commits
-
-
kmillikin@chromium.org authored
fast-mode code generator. AST expression nodes are annotated with a location when doing the initial syntactic check of the AST. In the current implementation, expression locations are 'temporary' (ie, allocated to the stack) or 'nowhere' (ie, the expression's value is not needed though it must be evaluated for side effects). For the assignment '.result = true' on IA32, we had before (with the true value already on top of the stack): 32 mov eax,[esp] 35 mov [ebp+0xf4],eax 38 pop eax Now: 32 pop [ebp+0xf4] ======== On x64, before: 37 movq rax,[rsp] 41 movq [rbp-0x18],rax 45 pop rax Now: 37 pop [rbp-0x18] ======== On ARM, before (with the true value in register ip): 36 str ip, [sp, #-4]! 40 ldr ip, [sp, #+0] 44 str ip, [fp, #-12] 48 add sp, sp, #4 Now: 36 str ip, [fp, #-12] Review URL: http://codereview.chromium.org/267118 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3076 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
fschneider@chromium.org authored
Review URL: http://codereview.chromium.org/271102 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3075 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
kmillikin@chromium.org authored
top-level code we generate: 0 push rbp 1 movq rbp,rsp 4 push rsi 5 push rdi 6 push [r13+0x8] 10 cmpq rsp,[r13+0x0] 14 jnc 25 (0x7ff2c378ff19) 20 call 0x7ff2c377d260 ;; code: STUB, StackCheck, minor: 0 25 movq r10,0x7ff2e8608199 ;; object: 0x7ff2e8608199 <true> 35 push r10 37 movq rax,[rsp] 41 movq [rbp-0x18],rax 45 pop rax 46 push [rbp-0x18] 50 pop rax 51 movq rsp,rbp ;; js return 54 pop rbp 55 ret 0x8 58 int3 59 int3 60 int3 61 int3 62 int3 63 int3 64 movq rax,[r13+0x8] 68 movq rsp,rbp ;; js return 71 pop rbp 72 ret 0x8 75 int3 76 int3 77 int3 78 int3 79 int3 80 int3 Review URL: http://codereview.chromium.org/264066 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3071 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-
- 14 Oct, 2009 1 commit
-
-
kmillikin@chromium.org authored
fast code generator is optimized for compilation time and code size. Currently it is only implemented on IA32. It is potentially triggered for any code in the global scope (including code eval'd in the global scope). It performs a syntactic check and chooses to compile in fast mode if the AST contains only supported constructs and matches some other constraints. Initially supported constructs are * ExpressionStatement, * ReturnStatement, * VariableProxy (variable references) to parameters and stack-allocated locals, * Assignment with lhs a parameter or stack-allocated local, and * Literal This allows compilation of literals at the top level and not much else. All intermediate values are allocated to temporaries and the stack is used for all temporaries. The extra memory traffic is a known issue. The code generated for 'true' is: 0 push ebp 1 mov ebp,esp 3 push esi 4 push edi 5 push 0xf5cca135 ;; object: 0xf5cca135 <undefined> 10 cmp esp,[0x8277efc] 16 jnc 27 (0xf5cbbb1b) 22 call 0xf5cac960 ;; code: STUB, StackCheck, minor: 0 27 push 0xf5cca161 ;; object: 0xf5cca161 <true> 32 mov eax,[esp] 35 mov [ebp+0xf4],eax 38 pop eax 39 mov eax,[ebp+0xf4] 42 mov esp,ebp ;; js return 44 pop ebp 45 ret 0x4 48 mov eax,0xf5cca135 ;; object: 0xf5cca135 <undefined> 53 mov esp,ebp ;; js return 55 pop ebp 56 ret 0x4 Review URL: http://codereview.chromium.org/273050 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3067 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
-