I tried compiling the following code with -mmcu=attiny13a -Os -flto
using 4.8 and 5.1:
#define NOT_A_REG 0
#define digitalPinToPortReg(PIN) \
( ((PIN) >= 0 && (PIN) <= 7) ? &PORTB : NOT_A_REG)
#define digitalPinToBit(P) ((P) & 7)
#define HIGH 1
#define LOW 0
inline void digitalWrite(int pin, int state)
{
if ( state & 1 ) {
// set pin
*(digitalPinToPortReg(pin)) |= (1 << digitalPinToBit(pin));
}
if ( !(state & 1 ) ) {
// clear pin
*(digitalPinToPortReg(pin)) &= ~(1 << digitalPinToBit(pin));
}
}
void main()
{
digitalWrite(3,SREG);
}
Both compiled to the same assembler code:
22: 0f b6 in r0, 0x3f ; 63
24: 00 fe sbrs r0, 0
26: 02 c0 rjmp .+4 ; 0x2c <main+0xa>
28: c3 9a sbi 0x18, 3 ; 24
2a: 08 95 ret
2c: c3 98 cbi 0x18, 3 ; 24
2e: 08 95 ret
However the following code is 1 instruction shorter (and 1 cycle
faster when other code follows that would require rjmp +2 at 2a):
in r0, 0x3f
sbrs r0, 0
cbi 0x13, 3
sbrc r0, 0
sbi 0x13, 3
ret