1 /* The RTL loop optimizer used to replace the output register of the 2 inline assembly with a pseudo although the variable is declared as 3 register asm ("0"). */ 4 5 /* { dg-do run } */ 6 /* { dg-options "-O2 -Wno-attributes -Wno-implicit-function-declaration" } */ 7 8 extern void abort (void); 9 10 static unsigned char __attribute__ ((always_inline)) mytoupper(unsigned char c)11mytoupper (unsigned char c) 12 { 13 if (c >= 'a' && c <= 'z') 14 c -= 'a' - 'A'; 15 return c; 16 } 17 18 static unsigned long __attribute__ ((always_inline)) strlen(const char * s)19strlen (const char *s) 20 { 21 register unsigned long r0 asm ("0"); 22 const char *tmp = s; 23 24 asm ( 25 #ifdef __s390x__ 26 " lghi %0, 0\n" 27 #else 28 " lhi %0, 0\n" 29 #endif 30 "0:srst %0,%1\n" 31 " jo 0b" 32 : "=d" (r0), "+a" (tmp) 33 : 34 :"cc"); 35 return r0 - (unsigned long) s; 36 } 37 38 char boot_command_line[] = "this is a test"; 39 40 void __attribute__ ((noinline)) foo(char * str)41foo (char *str) 42 { 43 if (strcmp (str, "THIS IS A TEST") != 0) 44 abort (); 45 } 46 47 int main()48main () 49 { 50 char upper_command_line[1024]; 51 int i; 52 53 for (i = 0; i < strlen (boot_command_line); i++) 54 upper_command_line[i] = mytoupper (boot_command_line[i]); 55 56 upper_command_line[strlen (boot_command_line)] = 0; 57 foo (upper_command_line); 58 59 return 0; 60 } 61