From: Borja F. <bor...@gm...> - 2012-01-12 21:16:25
|
Haha, well in avr asm it would be something like: in r30, 0x3d in r31, 0x3e sbiw r30, 0x08 in r0, 0x3f cli out 0x3e, r30 out 0x3f, r0 out 0x3d, r31 <--- 8 instructions to allocate 8 bytes of stack space! std Z+1, reg1 <-- move 8 regs into the stack std Z+2, reg2 .... std Z+8, reg8 call foo instead of: push reg1 push reg2 ... push reg8 call foo You still have 8 instructions to copy the data into the stack for both cases, but in the 2nd you've saved 8 instructions that manipulate SP. Does it make more sense now? 2012/1/12 Weddington, Eric <Eri...@at...> > > > > -----Original Message----- > > From: Borja Ferrer [mailto:bor...@gm...] > > Sent: Thursday, January 12, 2012 1:25 PM > > To: Weddington, Eric > > Cc: Sherard Dames; avr...@li... > > Subject: Re: [avr-llvm-devel] Current Status? > > > > For now I've implemented it the same way as gcc, but it's something > that > > popped to me when i was coding it. > > I don't see how it saves space :) what I think is that you get the > same > > amount of pushes and std's when moving data into the stack no matter > what > > method is used. The difference I see is that when using std, you have > to > > adjust the SP pointer which creates an additional overhead. Just to > > clarify I'm talking about the case when you want to pass function > > arguments before a function call, not in a function prologue which is > a > > different story. > > > > In x86 it would be something like: > > > > sub esp, 8 > > mov DWORD PTR [esp], reg1 > > mov DWORD PTR [esp+4], reg 2 > > call foo > > ... > > > > instead of > > > > push reg1 > > push reg2 > > call foo > > ... > > > > which saves 1 instruction, but in our case doing "sub esp, 8" means > adding > > 5 or 6 more instructions. > > > > My x86 assembly is extremely rusty. ;-) > > Maybe we should work with a real test case... Do you have something that > shows the issue? > > Eric > > > |