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