Re: [webkit-dev] want to port JIT to MIPS - stack/code segment alignment
Zoltan, you are right, thanks a lot! joe --- On Fri, 2/27/09, Zoltan Herczeg zherc...@inf.u-szeged.hu wrote: From: Zoltan Herczeg zherc...@inf.u-szeged.hu Subject: Re: [webkit-dev] want to port JIT to MIPS - stack/code segment alignment To: webkit-dev@lists.webkit.org Date: Friday, February 27, 2009, 3:41 PM Hi, in ARM, we have a rule set called EABI (Embedded Application Binary Interface). It says the stack must always be word aligned, and must be 2 words (8 bytes) aligned if you call other functions. The WebKit interpreter callbacks returns either a single pointer (sometimes an int contains a boolean value) or double pointers. These return values can be passed through registers, no need to pre-allocate stack space for them. The functions generated by g++ are also EABI compilant, so we don't need worry about the stack at all. I think AssemblerBuffer is only temporary hold the generated machine instructions. When the compilation phase is done, you need to call AssemblerBuffer::executableCopy, which allocates a new executable memory space and that space is aligned by ExecutableAllocator. Cheers, Zoltan Zoltan, thanks a lot! yeah the issue is just JIT related. Do I need to take care of stack in JIT code, say before emit asm call I align the stack? I guess no need because Mips always aligned to 32bits, and the only double functions in webkit return result in registers not memory. For AssemblerBuffer.h I think it is different because the initial 256bytes buffer may be not aligned to 32bit. I'll add __attribute__ ((aligned (4))) or 8. rgds joe --- On Fri, 2/27/09, Zoltan Herczeg zherc...@inf.u-szeged.hu wrote: From: Zoltan Herczeg zherc...@inf.u-szeged.hu Subject: Re: [webkit-dev] want to port JIT to MIPS - stack/code segment alignment To: webkit-dev@lists.webkit.org Date: Friday, February 27, 2009, 6:16 AM Hi, I am not sure I understand your questions. The code blocks are allocated by mmap() or VirtualAlloc(), thus they are aligned to 4K. Smaller chunks are aligned by roundUpAllocationSize() function. Now the alignemt is sizeof(void*) in both x86 and ARM. See ExecutableAllocator.h The current jit implementations don't store temporary variables on the stack, they allocate a fixed size buffer after the entry, and only free that when you leave the jit. This approach is much easier than keep tracking of the stack. Cheers, Zoltan gcc handles it well for X86. now on Mips I need to do followings right? 1. make sure (re)allocated code buffer aligned to 64bits and gcc malloc() only guarantee 32bits 2. before any call instruction in JIT code, make sure stack is aligned to 64bit also. PPC no JIT thus no problem right? rgds joe --- On Sun, 2/22/09, x yz last...@yahoo.com wrote: From: x yz last...@yahoo.com Subject: Re: [webkit-dev] want to port JIT to MIPS To: WebKit Development webkit-dev@lists.webkit.org, Gavin Barraclough barraclo...@apple.com Date: Sunday, February 22, 2009, 4:34 PM Thanks a lot otherwise I have misunderstanding. Yes I'll do wrec first. I just want to clean up possible blocking issues. I see wrec uses regparm(3) and jit always use fastcall for X86? In JIT.cpp ctiTrampoline put CallFrame in edi, but how about other arguments - where are they be fetched/poped from stack? when deal with caller/callee saved regs, gcc MIPS just preserves them when necesasary. The problem is after JIT used gcc may not have enough knowledge on necessary, do we have a way to force gcc always preserve them? how to identify a patch (patchimm/patchptr/patchaddr) relates to a data field in an instruction or relates to an element in a data array? In Mips the former means the 32bit needs to be separated into two 16bits and patched into two instructions. But if a 32bit is a pointer in a pointer array, we can save it directly. rgds joe --- On Fri, 2/20/09, Gavin Barraclough barraclo...@apple.com wrote: From: Gavin Barraclough barraclo...@apple.com Subject: Re: [webkit-dev] want to port JIT to MIPS To: WebKit Development webkit-dev@lists.webkit.org Date: Friday, February 20, 2009, 2:01 PM On Feb 19, 2009, at 8:27 PM, x yz wrote: I'd appreaciate your help to clarify the problem I faced: 1.In JIT.cpp I roughly understand ctiTrampoline() except for sp-0x1C, I guess the 1C includes 6 argument yet the 7th or 1st may be the hidden C++ pointer? And the reserved 1C stack space seems not used? why esi is forced to be 512 rather than use input argument? The JIT allocates a fixed frame on the stack which is used to pass arguments into stub functions. The 0x1C contains a spare word or two
Re: [webkit-dev] want to port JIT to MIPS - stack/code segment alignment
Hi, I am not sure I understand your questions. The code blocks are allocated by mmap() or VirtualAlloc(), thus they are aligned to 4K. Smaller chunks are aligned by roundUpAllocationSize() function. Now the alignemt is sizeof(void*) in both x86 and ARM. See ExecutableAllocator.h The current jit implementations don't store temporary variables on the stack, they allocate a fixed size buffer after the entry, and only free that when you leave the jit. This approach is much easier than keep tracking of the stack. Cheers, Zoltan gcc handles it well for X86. now on Mips I need to do followings right? 1. make sure (re)allocated code buffer aligned to 64bits and gcc malloc() only guarantee 32bits 2. before any call instruction in JIT code, make sure stack is aligned to 64bit also. PPC no JIT thus no problem right? rgds joe --- On Sun, 2/22/09, x yz last...@yahoo.com wrote: From: x yz last...@yahoo.com Subject: Re: [webkit-dev] want to port JIT to MIPS To: WebKit Development webkit-dev@lists.webkit.org, Gavin Barraclough barraclo...@apple.com Date: Sunday, February 22, 2009, 4:34 PM Thanks a lot otherwise I have misunderstanding. Yes I'll do wrec first. I just want to clean up possible blocking issues. I see wrec uses regparm(3) and jit always use fastcall for X86? In JIT.cpp ctiTrampoline put CallFrame in edi, but how about other arguments - where are they be fetched/poped from stack? when deal with caller/callee saved regs, gcc MIPS just preserves them when necesasary. The problem is after JIT used gcc may not have enough knowledge on necessary, do we have a way to force gcc always preserve them? how to identify a patch (patchimm/patchptr/patchaddr) relates to a data field in an instruction or relates to an element in a data array? In Mips the former means the 32bit needs to be separated into two 16bits and patched into two instructions. But if a 32bit is a pointer in a pointer array, we can save it directly. rgds joe --- On Fri, 2/20/09, Gavin Barraclough barraclo...@apple.com wrote: From: Gavin Barraclough barraclo...@apple.com Subject: Re: [webkit-dev] want to port JIT to MIPS To: WebKit Development webkit-dev@lists.webkit.org Date: Friday, February 20, 2009, 2:01 PM On Feb 19, 2009, at 8:27 PM, x yz wrote: I'd appreaciate your help to clarify the problem I faced: 1.In JIT.cpp I roughly understand ctiTrampoline() except for sp-0x1C, I guess the 1C includes 6 argument yet the 7th or 1st may be the hidden C++ pointer? And the reserved 1C stack space seems not used? why esi is forced to be 512 rather than use input argument? The JIT allocates a fixed frame on the stack which is used to pass arguments into stub functions. The 0x1C contains a spare word or two to maintain stack alignment. %esi is used in the timeout check mechanism. 2.How to understand the stack balance in ctiVMThrowTrampoline()? why after calling we still add 1C w/o sub 1C before calling? where comes _ZN3JSC11Interpreter12cti_vm_throwEPPv and how do I know which name for Mips? does this one relates to variable argument function call? ctiVMThrowTrampoline is never called as a function (it is declared as a function only to provide a symbol that can be manipulated from C code). ctiVMThrowTrampoline is used in returning back from JIT generated code, in the case of an exception. 3.I know how to handle jump in Mips, but not sure how/when to handle patchAddress/patchImm/patchPointer because I'm not sure the instructions related. I guess all patches are for last 32bit IMM field of instructions. Mips can't load 32bit in one instruction, thus I need to know the instruction before I can patch/add in the 32bit data. 4.I'm kind of want no asm code outside assembler folder, any plan for that? No. The assembler is intended to be independent of JavaScript types - it's just an assembler. The asm trampolines are specific to the JIT. It is currently the intention that architecture specific parts of the JIT implementation will remain in the jit folder. I'd suggest that in attempting to port the jit, WREC would be a good place to start. cheers, G. rgds joe --- On Mon, 2/16/09, x yz last...@yahoo.com wrote: From: x yz last...@yahoo.com Subject: Re: [webkit-dev] want to port JIT to MIPS - when WREC/JIT enabled? To: Gavin Barraclough barraclo...@apple.com Cc: WebKit Development webkit-dev@lists.webkit.org Date: Monday, February 16, 2009, 5:25 AM Hi, from paltform.h it is enabled only on X86 MAC/WIN; from javaScriptCore.pri it is also enabled for (QT_ARCH,i386). But, from config.log I see them are enabled! how can I run WREC/JIT test so I can trace in X86 asm coce generated? thanks a lot. joe --- On Sat, 2/7/09, Gavin Barraclough barraclo...@apple.com wrote: From: Gavin
Re: [webkit-dev] want to port JIT to MIPS - stack/code segment alignment
Zoltan, thanks a lot! yeah the issue is just JIT related. Do I need to take care of stack in JIT code, say before emit asm call I align the stack? I guess no need because Mips always aligned to 32bits, and the only double functions in webkit return result in registers not memory. For AssemblerBuffer.h I think it is different because the initial 256bytes buffer may be not aligned to 32bit. I'll add __attribute__ ((aligned (4))) or 8. rgds joe --- On Fri, 2/27/09, Zoltan Herczeg zherc...@inf.u-szeged.hu wrote: From: Zoltan Herczeg zherc...@inf.u-szeged.hu Subject: Re: [webkit-dev] want to port JIT to MIPS - stack/code segment alignment To: webkit-dev@lists.webkit.org Date: Friday, February 27, 2009, 6:16 AM Hi, I am not sure I understand your questions. The code blocks are allocated by mmap() or VirtualAlloc(), thus they are aligned to 4K. Smaller chunks are aligned by roundUpAllocationSize() function. Now the alignemt is sizeof(void*) in both x86 and ARM. See ExecutableAllocator.h The current jit implementations don't store temporary variables on the stack, they allocate a fixed size buffer after the entry, and only free that when you leave the jit. This approach is much easier than keep tracking of the stack. Cheers, Zoltan gcc handles it well for X86. now on Mips I need to do followings right? 1. make sure (re)allocated code buffer aligned to 64bits and gcc malloc() only guarantee 32bits 2. before any call instruction in JIT code, make sure stack is aligned to 64bit also. PPC no JIT thus no problem right? rgds joe --- On Sun, 2/22/09, x yz last...@yahoo.com wrote: From: x yz last...@yahoo.com Subject: Re: [webkit-dev] want to port JIT to MIPS To: WebKit Development webkit-dev@lists.webkit.org, Gavin Barraclough barraclo...@apple.com Date: Sunday, February 22, 2009, 4:34 PM Thanks a lot otherwise I have misunderstanding. Yes I'll do wrec first. I just want to clean up possible blocking issues. I see wrec uses regparm(3) and jit always use fastcall for X86? In JIT.cpp ctiTrampoline put CallFrame in edi, but how about other arguments - where are they be fetched/poped from stack? when deal with caller/callee saved regs, gcc MIPS just preserves them when necesasary. The problem is after JIT used gcc may not have enough knowledge on necessary, do we have a way to force gcc always preserve them? how to identify a patch (patchimm/patchptr/patchaddr) relates to a data field in an instruction or relates to an element in a data array? In Mips the former means the 32bit needs to be separated into two 16bits and patched into two instructions. But if a 32bit is a pointer in a pointer array, we can save it directly. rgds joe --- On Fri, 2/20/09, Gavin Barraclough barraclo...@apple.com wrote: From: Gavin Barraclough barraclo...@apple.com Subject: Re: [webkit-dev] want to port JIT to MIPS To: WebKit Development webkit-dev@lists.webkit.org Date: Friday, February 20, 2009, 2:01 PM On Feb 19, 2009, at 8:27 PM, x yz wrote: I'd appreaciate your help to clarify the problem I faced: 1.In JIT.cpp I roughly understand ctiTrampoline() except for sp-0x1C, I guess the 1C includes 6 argument yet the 7th or 1st may be the hidden C++ pointer? And the reserved 1C stack space seems not used? why esi is forced to be 512 rather than use input argument? The JIT allocates a fixed frame on the stack which is used to pass arguments into stub functions. The 0x1C contains a spare word or two to maintain stack alignment. %esi is used in the timeout check mechanism. 2.How to understand the stack balance in ctiVMThrowTrampoline()? why after calling we still add 1C w/o sub 1C before calling? where comes _ZN3JSC11Interpreter12cti_vm_throwEPPv and how do I know which name for Mips? does this one relates to variable argument function call? ctiVMThrowTrampoline is never called as a function (it is declared as a function only to provide a symbol that can be manipulated from C code). ctiVMThrowTrampoline is used in returning back from JIT generated code, in the case of an exception. 3.I know how to handle jump in Mips, but not sure how/when to handle patchAddress/patchImm/patchPointer because I'm not sure the instructions related. I guess all patches are for last 32bit IMM field of instructions. Mips can't load 32bit in one instruction, thus I need to know the instruction before I can patch/add in the 32bit data. 4.I'm kind of want no asm code outside assembler folder, any plan for that? No. The assembler is intended to be independent of JavaScript types - it's just an assembler. The asm trampolines are specific to the JIT. It is currently the intention that architecture specific parts
Re: [webkit-dev] want to port JIT to MIPS - stack/code segment alignment
Hi, in ARM, we have a rule set called EABI (Embedded Application Binary Interface). It says the stack must always be word aligned, and must be 2 words (8 bytes) aligned if you call other functions. The WebKit interpreter callbacks returns either a single pointer (sometimes an int contains a boolean value) or double pointers. These return values can be passed through registers, no need to pre-allocate stack space for them. The functions generated by g++ are also EABI compilant, so we don't need worry about the stack at all. I think AssemblerBuffer is only temporary hold the generated machine instructions. When the compilation phase is done, you need to call AssemblerBuffer::executableCopy, which allocates a new executable memory space and that space is aligned by ExecutableAllocator. Cheers, Zoltan Zoltan, thanks a lot! yeah the issue is just JIT related. Do I need to take care of stack in JIT code, say before emit asm call I align the stack? I guess no need because Mips always aligned to 32bits, and the only double functions in webkit return result in registers not memory. For AssemblerBuffer.h I think it is different because the initial 256bytes buffer may be not aligned to 32bit. I'll add __attribute__ ((aligned (4))) or 8. rgds joe --- On Fri, 2/27/09, Zoltan Herczeg zherc...@inf.u-szeged.hu wrote: From: Zoltan Herczeg zherc...@inf.u-szeged.hu Subject: Re: [webkit-dev] want to port JIT to MIPS - stack/code segment alignment To: webkit-dev@lists.webkit.org Date: Friday, February 27, 2009, 6:16 AM Hi, I am not sure I understand your questions. The code blocks are allocated by mmap() or VirtualAlloc(), thus they are aligned to 4K. Smaller chunks are aligned by roundUpAllocationSize() function. Now the alignemt is sizeof(void*) in both x86 and ARM. See ExecutableAllocator.h The current jit implementations don't store temporary variables on the stack, they allocate a fixed size buffer after the entry, and only free that when you leave the jit. This approach is much easier than keep tracking of the stack. Cheers, Zoltan gcc handles it well for X86. now on Mips I need to do followings right? 1. make sure (re)allocated code buffer aligned to 64bits and gcc malloc() only guarantee 32bits 2. before any call instruction in JIT code, make sure stack is aligned to 64bit also. PPC no JIT thus no problem right? rgds joe --- On Sun, 2/22/09, x yz last...@yahoo.com wrote: From: x yz last...@yahoo.com Subject: Re: [webkit-dev] want to port JIT to MIPS To: WebKit Development webkit-dev@lists.webkit.org, Gavin Barraclough barraclo...@apple.com Date: Sunday, February 22, 2009, 4:34 PM Thanks a lot otherwise I have misunderstanding. Yes I'll do wrec first. I just want to clean up possible blocking issues. I see wrec uses regparm(3) and jit always use fastcall for X86? In JIT.cpp ctiTrampoline put CallFrame in edi, but how about other arguments - where are they be fetched/poped from stack? when deal with caller/callee saved regs, gcc MIPS just preserves them when necesasary. The problem is after JIT used gcc may not have enough knowledge on necessary, do we have a way to force gcc always preserve them? how to identify a patch (patchimm/patchptr/patchaddr) relates to a data field in an instruction or relates to an element in a data array? In Mips the former means the 32bit needs to be separated into two 16bits and patched into two instructions. But if a 32bit is a pointer in a pointer array, we can save it directly. rgds joe --- On Fri, 2/20/09, Gavin Barraclough barraclo...@apple.com wrote: From: Gavin Barraclough barraclo...@apple.com Subject: Re: [webkit-dev] want to port JIT to MIPS To: WebKit Development webkit-dev@lists.webkit.org Date: Friday, February 20, 2009, 2:01 PM On Feb 19, 2009, at 8:27 PM, x yz wrote: I'd appreaciate your help to clarify the problem I faced: 1.In JIT.cpp I roughly understand ctiTrampoline() except for sp-0x1C, I guess the 1C includes 6 argument yet the 7th or 1st may be the hidden C++ pointer? And the reserved 1C stack space seems not used? why esi is forced to be 512 rather than use input argument? The JIT allocates a fixed frame on the stack which is used to pass arguments into stub functions. The 0x1C contains a spare word or two to maintain stack alignment. %esi is used in the timeout check mechanism. 2.How to understand the stack balance in ctiVMThrowTrampoline()? why after calling we still add 1C w/o sub 1C before calling? where comes _ZN3JSC11Interpreter12cti_vm_throwEPPv and how do I know which name for Mips? does this one relates to variable argument function call? ctiVMThrowTrampoline is never called as a function (it is declared as a function only to provide a symbol that can be manipulated from