Re: [webkit-dev] want to port JIT to MIPS - stack/code segment alignment

2009-02-27 Thread x yz

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

2009-02-26 Thread Zoltan Herczeg
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

2009-02-26 Thread x yz

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

2009-02-26 Thread Zoltan Herczeg
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