/* The RTL loop optimizer used to replace the output register of the
|
/* The RTL loop optimizer used to replace the output register of the
|
inline assembly with a pseudo although the variable is declared as
|
inline assembly with a pseudo although the variable is declared as
|
register asm ("0"). */
|
register asm ("0"). */
|
|
|
/* { dg-do run } */
|
/* { dg-do run } */
|
/* { dg-options "-O2" } */
|
/* { dg-options "-O2" } */
|
|
|
extern void abort (void);
|
extern void abort (void);
|
|
|
static unsigned char __attribute__ ((always_inline))
|
static unsigned char __attribute__ ((always_inline))
|
mytoupper (unsigned char c)
|
mytoupper (unsigned char c)
|
{
|
{
|
if (c >= 'a' && c <= 'z')
|
if (c >= 'a' && c <= 'z')
|
c -= 'a' - 'A';
|
c -= 'a' - 'A';
|
return c;
|
return c;
|
}
|
}
|
|
|
static unsigned long __attribute__ ((always_inline))
|
static unsigned long __attribute__ ((always_inline))
|
strlen (const char *s)
|
strlen (const char *s)
|
{
|
{
|
register unsigned long r0 asm ("0");
|
register unsigned long r0 asm ("0");
|
const char *tmp = s;
|
const char *tmp = s;
|
|
|
asm (
|
asm (
|
#ifdef __s390x__
|
#ifdef __s390x__
|
" lghi %0, 0\n"
|
" lghi %0, 0\n"
|
#else
|
#else
|
" lhi %0, 0\n"
|
" lhi %0, 0\n"
|
#endif
|
#endif
|
"0:srst %0,%1\n"
|
"0:srst %0,%1\n"
|
" jo 0b"
|
" jo 0b"
|
: "=d" (r0), "+a" (tmp)
|
: "=d" (r0), "+a" (tmp)
|
:
|
:
|
:"cc");
|
:"cc");
|
return r0 - (unsigned long) s;
|
return r0 - (unsigned long) s;
|
}
|
}
|
|
|
char boot_command_line[] = "this is a test";
|
char boot_command_line[] = "this is a test";
|
|
|
void __attribute__ ((noinline))
|
void __attribute__ ((noinline))
|
foo (char *str)
|
foo (char *str)
|
{
|
{
|
if (strcmp (str, "THIS IS A TEST") != 0)
|
if (strcmp (str, "THIS IS A TEST") != 0)
|
abort ();
|
abort ();
|
}
|
}
|
|
|
int
|
int
|
main ()
|
main ()
|
{
|
{
|
char upper_command_line[1024];
|
char upper_command_line[1024];
|
int i;
|
int i;
|
|
|
for (i = 0; i < strlen (boot_command_line); i++)
|
for (i = 0; i < strlen (boot_command_line); i++)
|
upper_command_line[i] = mytoupper (boot_command_line[i]);
|
upper_command_line[i] = mytoupper (boot_command_line[i]);
|
|
|
upper_command_line[strlen (boot_command_line)] = 0;
|
upper_command_line[strlen (boot_command_line)] = 0;
|
foo (upper_command_line);
|
foo (upper_command_line);
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|