1/* { dg-do run } */
2/* { dg-options { -fno-peephole2 } } */
3
4#include <stdlib.h>
5
6typedef __UINT16_TYPE__ uint16_t;
7typedef __INT16_TYPE__  int16_t;
8typedef __UINT8_TYPE__  uint8_t;
9
10uint8_t __attribute__((noinline,noclone))
11fun_inc (uint8_t c0)
12{
13  register uint8_t c asm ("r15") = c0;
14
15  /* Force target value into R15 (lower register)  */
16  asm ("" : "+l" (c));
17
18  c++;
19  if (c >= 0x80)
20    c = 0;
21
22  asm ("" : "+l" (c));
23
24  return c;
25}
26
27uint8_t __attribute__((noinline,noclone))
28fun_dec (uint8_t c0)
29{
30  register uint8_t c asm ("r15") = c0;
31
32  /* Force target value into R15 (lower register)  */
33  asm ("" : "+l" (c));
34
35  c--;
36  if (c < 0x80)
37    c = 0;
38
39  asm ("" : "+l" (c));
40
41  return c;
42}
43
44
45uint8_t __attribute__((noinline,noclone))
46fun_neg (uint8_t c0)
47{
48  register uint8_t c asm ("r15") = c0;
49
50  c = -c;
51  if (c >= 0x80)
52    c = 0;
53
54  return c;
55}
56
57uint16_t __attribute__((noinline,noclone))
58fun_adiw (uint16_t c0)
59{
60  register uint16_t c asm ("r24") = c0;
61
62  /* Force target value into R24 (for ADIW) */
63  asm ("" : "+r" (c));
64
65  c += 2;
66  if (c >= 0x8000)
67    c = 0;
68
69  asm ("" : "+r" (c));
70
71  return c;
72}
73
74
75int main()
76{
77  if (fun_inc (0x7f) != 0)
78    abort();
79
80  if (fun_neg (0x80) != 0)
81    abort();
82
83  if (fun_adiw (0x7ffe) != 0)
84    abort();
85
86  exit (0);
87  return 0;
88}
89