aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/avr/pr67839.c
blob: 604ab4b7592faa17b5cc8a1b6f15a9ff1993770c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* { dg-do compile } */
/* { dg-options "-Os" } */
/* { dg-final { scan-assembler "sbi 0x1f,0" } } */
/* { dg-final { scan-assembler "cbi 0x1f,0" } } */
/* { dg-final { scan-assembler-not "sbi 0x20,0" } } */
/* { dg-final { scan-assembler-not "cbi 0x20,0" } } */
/* { dg-final { scan-assembler "in r\\d+,__SREG__" } } */
/* { dg-final { scan-assembler "out __SREG__,r\\d+" } } */
/* { dg-final { scan-assembler-not "in r\\d+,0x40" } } */
/* { dg-final { scan-assembler-not "out 0x40, r\\d+" } } */

/* This testcase verifies that SBI/CBI/SBIS/SBIC
   and IN/OUT instructions are not generated for
   an IO addresses outside the valid range.
*/
#define IO_ADDR(x) (*((volatile char *)x + __AVR_SFR_OFFSET__))
int main ()
{
  IO_ADDR(0x1f) |= 1;
  IO_ADDR(0x1f) &= 0xFE;

  IO_ADDR(0x20) |= 1;
  IO_ADDR(0x20) &= 0xFE;

  IO_ADDR(0x3f) = IO_ADDR(0x3f);

  IO_ADDR(0x40) = IO_ADDR(0x40);
  return 0;
}