Fast wake up from sleep with interrupt

Hi,
I am trying to make ATTiny13A Roomba controller, mainly virtual wall. To save power as much as possible I would like to use sleep modes extensively. ATTiny13A has only one timer/counter I use both for generating 38kHz signal modulation and for timing of the signal. The timer generates interrupt about every 26 us or 126 CPU cycles. I want to count the interrupts (38 are 1 ms) and put processor to idle in meantime (active state is about 1mA but idle only 0.2mA according to the datasheet). The problem is how to use the the interrupts.

ISR (TIM0_COMPA_vect) { 
}

generates quite long code according to Atmel studio's disassembly even with maximum optimization:

00000006  RJMP PC+0x0013		Relative jump
...
00000019  PUSH R1		Push register on stack 
0000001A  PUSH R0		Push register on stack 
0000001B  IN R0,0x3F		In from I/O location 
0000001C  PUSH R0		Push register on stack 
0000001D  CLR R1		Clear Register 
0000001E  POP R0		Pop register from stack 
0000001F  OUT 0x3F,R0		Out to I/O location 
00000020  POP R0		Pop register from stack 
00000021  POP R1		Pop register from stack 
00000022  RETI 		Interrupt return

It saves registers R1 and R0 and SREG (system register) on stack, clears R1(why?) and then restores them all from the stack. I think it is quite pointless and it takes 17 out of 126 cycles when the CPU should be sleeping. I think the RETI instruction could be in place of the Relative jump instruction at address 0x00006 saving another time spend for unnecessary jump to 0x00019.
But I don't know how to force the Atmel studio to generate output this way. Or does it have a good reason to make so much more code?
Thanks

EDIT: EMPTY_INTERRUPT(TIM0_COMPA_vect) generates

00000006  RJMP PC+0x0013		Relative jump
...
00000019 RETI 		Interrupt return

But how could I get

00000006  RETI 		Interrupt return

this code?

(deleted)

spycatcher2k:
Nope - not an Arduino question.

Why do you think this is not an Arduino question? Arduino runs on ATMega with very similar AVR core as ATTiny. You may want to sleep Arduino as well and you would use exactly the same code. Atmel studio has support for Arduino and it can do many things Arduino IDE cannot (such as disassembly). This is section about (other) microcontrollers. Where is your problem?

@Smajdalf
You can write your code in ASM if you want to bypass the overhead, however C copmpiler have to keep consistency of the result in any case. In the example R0,R1 are saved to stack to prevent their data loss, because both are "used" in the ISR. Next, the R0 is used to save the status register SREG - it is required in ISR prolog. Then clear R1 - it should be zero and in any case of R1 use, it should be zeroed immediately after. Next - there is a room for ISR code but there is nothing because ISR is empty. Next, ISR epilog - restore SREG, R0 and R1 from the stack to ensure data consistency and RETI for returning back to the main code and it also enables interrupts which were disabled before enter to ISR.

Another thing crossed my mind, ISR can be defined with attribute (2nd parameter) ISR_NAKED or use attribute((naked)) statement. The compiler shoud create ISR with no prologue and epilogue code. In this case you have to nurse everything include the return from ISR.