Hi, this really helps! The two pointers may also help Mips. In Mips dest offset patches are in two instructions, no constant biase can be used as in X86. Currently I do check instruction syntax to determine the patch offset. thanks again! joe
--- On Wed, 3/4/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 - how patchOffset* > constant determined? > To: webkit-dev@lists.webkit.org > Date: Wednesday, March 4, 2009, 3:33 PM > Hi, > > they generate instructions, which size is known in advance. > > Think about the following sequence: > hotPathBegin: > mov regX, 32bit_const <- 6 bytes (*) (**) > add regX, regY <- 2 bytes > jo 32bit_addr <- 5 bytes (*) > > * (Note) : these instructions will be modified during > runtime. > > ** (Note) : there is a short form for "mov regX, > 8bit_const", which length > is only 3 bytes, but they force the longer version in such > cases to keep > the size of the instruction. > > As you can see, the address of "jo" is always > (hotPathBegin + 6 + 2). They > simply introduce a new constant: patchOffsetXXX = 8, and > use this constant > to access the "jo" instruction later. > > In ARM we can't rely on such constant, because the > constant pool can be > placed after any instruction. > > hotPathBegin: > ldr rX, [pc + const_pool_addr] ; 32 bit const > [...] <- the const pool can be placed here > add rX, rX, rY > [...] <- the const pool can be placed here > hotPath2: > ldr pc, [pc + const_pool_addr] ; 32 bit target address > > We need to store both pointers (hotPathBegin and hotPath2). > > Zoltan > > > Zoltan, > > Thanks for reply, I'm trying to understand your > example. But,X86 > > instruction size is from 1 to 17bytes, not constant. I > may misunderstand > > your comments? > > Many X86 instruction can have imm32 at the end, thus > this pointer can be > > used for patch as well as next address after call. > Does Arm have similar > > things? or else you still need to figure out why > > "patchOffsetOpCallCompareToJump = 9;"? may > be some instruction lengths > > relates to the 9? > > rgds > > joe > > > > > > --- On Wed, 3/4/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 > - how patchOffset* > >> constant determined? > >> To: webkit-dev@lists.webkit.org > >> Date: Wednesday, March 4, 2009, 3:45 AM > >> On x86, the size of the instructions are fixed. If > you want > >> to access > >> multiple instructions in the instruction stream, > you only > >> need to store > >> the address of the first one, and can access the > others by > >> their relative > >> address. This saves a little memory. > >> > >> Example (see JIT::linkCall): > >> instruction at callLinkInfo->hotPathBegin: > points to > >> callee comparison > >> instruction at > >> callLinkInfo->hotPathBegin + > >> patchOffsetOpCallCompareToJump: > >> points to the slow case entry jump > >> > >> Zoltan > >> > >> > in jit.h, for example: > >> > static const int > >> patchOffsetOpCallCompareToJump = 9; > >> > static const int > patchOffsetPutByIdStructure = > >> 7; > >> > static const int > >> patchOffsetPutByIdPropertyMapOffset = 22; > >> > static const int > >> patchOffsetGetByIdBranchToSlowCase = 13; > >> > thanks for help, I'm stucked here now. > >> > joe > >> > > >> > > >> > --- On Sat, 2/28/09, Gavin Barraclough > >> <barraclo...@apple.com> wrote: > >> > > >> >> From: Gavin Barraclough > >> <barraclo...@apple.com> > >> >> Subject: Re: [webkit-dev] want to port > JIT to MIPS > >> - JIT reg usage clean > >> >> up? > >> >> To: "WebKit Development" > >> <webkit-dev@lists.webkit.org> > >> >> Date: Saturday, February 28, 2009, 12:19 > PM > >> >> On Feb 27, 2009, at 4:55 PM, x yz wrote: > >> >> > >> >> > The regTx seems to be working > registers here, > >> yet > >> >> their definition are regparm(3) registers > for > >> function > >> >> arugments. Such usage would cause > conflict on > >> other > >> >> platforms. May I suggest that we use > individual > >> defined set > >> >> of regs for func i/o argument and > working? > >> >> > >> >> First up, I think you're getting > slightly > >> confused > >> >> about regparm(3). This is not used > anywhere in > >> the JS > >> >> language JIT, only in WREC. In some > >> configurations of the > >> >> JIT we use fastcall semantics on x86... > but none > >> of this is > >> >> really relevant to MIPS. Just ignore all > this. > >> Stick to > >> >> the default MIPS ABI for stub functions. > >> >> > >> >> Reading between the lines, I'm > guessing your > >> concern > >> >> here is that in setting up arguments for > a JIT > >> stub call you > >> >> may trample the JIT's temporary > registers? If > >> so, I > >> >> think you need to look at the argument > passing > >> more closely. > >> >> The mechanisms to pass arguments to stub > >> functions pass all > >> >> arguments in memory – typically passing > a single > >> pointer > >> >> to the stub functions, which can be used > to > >> retrieve the > >> >> arguments. This pointer argument can be > set up > >> immediately > >> >> prior to the call, so it does not > interfere with > >> the regT? > >> >> temporaries. We follow this pattern on > x86-64, > >> where the > >> >> ABI is typically to pass arguments in > registers. > >> You cannot > >> >> trivially change the way this works, > since the > >> argument > >> >> pointer is used for other purposes too > (e.g. > >> retrieving the > >> >> arguments passed into the JIT code from > within the > >> stubs). > >> >> > >> >> We strongly prefer small, simple, > incremental > >> changes. A > >> >> patch that tried to both port the JIT to > a new > >> platform and > >> >> to introduce a new argument passing > interface to > >> the JIT > >> >> stub functions sounds unlikely to get > anywhere (a > >> patch > >> >> porting the JIT to a new platform is on > its own > >> very likely > >> >> to be too much more than we'd want to > land in > >> one > >> >> chunk). I'd suggest that a port > would be wise > >> to > >> >> engineer it's initial solution to fit > one of > >> the > >> >> existing argument passing mechanisms > (these are > >> selected by > >> >> JIT_STUB_ARGUMENT_* switches, to help > find the > >> relevant > >> >> code). (Alternatively, you're > welcome to > >> attempt to > >> >> port x86-64 to make use of an in-register > argument > >> passing > >> >> solution, which could be hugely useful. > With this > >> landed > >> >> first and separately, a port could then > build on > >> top of > >> >> this.) > >> >> > >> >> As a more direct answer to your question, > you > >> could > >> >> endeavour to make the set of hardware > registers > >> used as JIT > >> >> temporaries non-overlapping with ABI > function > >> argument > >> >> registers on MIPS, but this is unlikely > to be a > >> general > >> >> solution to anything for all platforms, > due to > >> limited > >> >> register availability on some > architectures. > >> >> > >> >> > we would put all these definition in > a file > >> named > >> >> regMap.h, then we can remove all > "X86::" > >> from > >> >> other JIT files. > >> >> > >> >> I don't think we'll be keen on > taking > >> preemptive > >> >> changes so far ahead in preparation of a > port. > >> The first > >> >> logical step in porting to a new platform > is still > >> to start > >> >> with WREC, and this requires no changes > in the JIT > >> >> directory. Any refactoring of the > existing JIT > >> would make > >> >> more sense more directly prior to work in > that > >> area. > >> >> > >> >> cheers, > >> >> G. > >> >> > >> >> > > >> >> > I'd apperciate if sb can do it > or help me > >> to do > >> >> it. > >> >> > rgds > >> >> > joe > >> >> > > >> >> > > >> >> > > >> >> > > >> >> > --- On Sat, 2/28/09, x yz > >> <last...@yahoo.com> > >> >> wrote: > >> >> > > >> >> >> From: x yz > <last...@yahoo.com> > >> >> >> Subject: Re: [webkit-dev] want > to port > >> JIT to MIPS > >> >> - which calling convention is used here? > >> >> >> To: webkit-dev@lists.webkit.org, > >> "Zoltan > >> >> Herczeg" > <zherc...@inf.u-szeged.hu> > >> >> >> Date: Saturday, February 28, > 2009, 7:40 > >> AM > >> >> >> Hi, > >> >> >> Thanks for your help in > advance:) > >> >> >> in JITPropertyAccess.cpp: > >> >> >> if > >> >> > (transitionWillNeedStorageRealloc(oldStructure, > >> >> >> newStructure)) { > >> >> >> pop(X86::ebx); > ///pop return > >> address, > >> >> why? for > >> >> >> exception? > >> >> >> #if PLATFORM(X86_64) > ///which > >> convention is > >> >> this? > >> >> >> > >> >> >> > >> >> > >> > move(Imm32(newStructure->propertyStorageCapacity()), > >> >> >> regT1); //edx > >> >> >> > >> >> >> > >> >> > >> > move(Imm32(oldStructure->propertyStorageCapacity()), > >> >> >> X86::esi); > >> >> >> move(regT0, X86::edi); > >> >> >> callTarget = call(); > >> >> >> #else > ///__cdecl, > >> yet how > >> >> can I know > >> >> >> resizePropertyStorage() use > __cdecl? > >> >> >> > >> >> >> > >> >> > >> > push(Imm32(newStructure->propertyStorageCapacity())); > >> >> >> > >> >> >> > >> >> > >> > push(Imm32(oldStructure->propertyStorageCapacity())); > >> >> >> push(regT0); > >> >> >> callTarget = call(); > >> >> >> addPtr(Imm32(3 * > sizeof(void*)), > >> X86::esp); > >> >> >> ///clean stack > >> >> >> #endif > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> _______________________________________________ > >> >> >> webkit-dev mailing list > >> >> >> webkit-dev@lists.webkit.org > >> >> >> > >> >> > >> > http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev > >> >> > > >> >> > > >> >> > > >> >> > > >> _______________________________________________ > >> >> > webkit-dev mailing list > >> >> > webkit-dev@lists.webkit.org > >> >> > > >> >> > >> > http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev > >> >> > >> >> > _______________________________________________ > >> >> webkit-dev mailing list > >> >> webkit-dev@lists.webkit.org > >> >> > >> > http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev > >> > > >> > > >> > > >> > > _______________________________________________ > >> > webkit-dev mailing list > >> > webkit-dev@lists.webkit.org > >> > > >> > http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev > >> > > >> > >> _______________________________________________ > >> webkit-dev mailing list > >> webkit-dev@lists.webkit.org > >> > http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev > > > > > > > > _______________________________________________ > > webkit-dev mailing list > > webkit-dev@lists.webkit.org > > > http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev > > > > > _______________________________________________ > webkit-dev mailing list > webkit-dev@lists.webkit.org > http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev _______________________________________________ webkit-dev mailing list webkit-dev@lists.webkit.org http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev