I certainly can't duplicate what you are saying. The small code snippet:
void setup() {
PORTD |= _BV(0);
PORTD |= _BV(1);
PORTD &= ~(_BV(1));
}
void loop() {
}
compiles into:
000000a6 <setup>:
a6: 58 9a sbi 0x0b, 0 ; 11
a8: 59 9a sbi 0x0b, 1 ; 11
aa: 59 98 cbi 0x0b, 1 ; 11
ac: 08 95 ret
000000ae <loop>:
ae: 08 95 ret
That is clearly two separate bit sets followed by a bit clear.
I am using UECIDE that is set to use GCC 4.3.2
If I switch to GCC 4.8.1 instead, the code generated is identical.
Even turning on full -O3 optimization I still get the same results.
So how are you determining that it's happening at the same time?