diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2003-02-22 03:21:27 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2003-02-22 03:21:27 +0000 |
commit | 182c2078bca13829deba82c7ce6d999d122cd18b (patch) | |
tree | 4eb895363b4f8819140db155998cc325d2b8588e /gcc | |
parent | 5192890754c0137c9a0786630a8f68b60956bcc5 (diff) | |
download | gcc-182c2078bca13829deba82c7ce6d999d122cd18b.zip gcc-182c2078bca13829deba82c7ce6d999d122cd18b.tar.gz gcc-182c2078bca13829deba82c7ce6d999d122cd18b.tar.bz2 |
* gcc.dg/asmreg-1.c: New test.
From-SVN: r63271
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/asmreg-1.c | 73 |
2 files changed, 77 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b015a6e..7251223 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-02-22 Hans-Peter Nilsson <hp@axis.com> + + * gcc.dg/asmreg-1.c: New test. + 2003-02-21 Mark Mitchell <mark@codesourcery.com> PR c++/9749 diff --git a/gcc/testsuite/gcc.dg/asmreg-1.c b/gcc/testsuite/gcc.dg/asmreg-1.c new file mode 100644 index 0000000..a779766 --- /dev/null +++ b/gcc/testsuite/gcc.dg/asmreg-1.c @@ -0,0 +1,73 @@ +/* { dg-do compile { target cris-*-* } } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler "\\\.ifnc \\\$r9-\\\$r10-\\\$r11-\\\$r12" } } */ + +/* Sanity check for asm register operands in syscall failed for + cris-axis-linux-gnu due to regmove bug. + Hans-Peter Nilsson <hp@axis.com>. */ + +extern void lseek64 (int, long long, int); +extern int *__errno_location (void); +struct dirent64 +{ + long long d_off; + unsigned short int d_reclen; + char d_name[256]; +}; +struct kernel_dirent64 +{ + long long d_off; + unsigned short d_reclen; + char d_name[256]; +}; + +static inline int __attribute__ ((__always_inline__)) +__syscall_getdents64 (int fd, unsigned char * dirp, unsigned count) +{ + register unsigned long __sys_res asm ("r10"); + register unsigned long __r10 __asm__ ("r10") = (unsigned long) fd; + register unsigned long __r11 __asm__ ("r11") = (unsigned long) dirp; + register unsigned long __r12 __asm__ ("r12") = (unsigned long) count; + register unsigned long __callno asm ("r9") = (220); + asm volatile (".ifnc %1-%0-%3-%4,$r9-$r10-$r11-$r12\n\t" + ".err\n\t" + ".endif\n\t" + "break 13" + : "=r" (__sys_res) + : "r" (__callno), "0" (__r10), "r" (__r11), "r" (__r12) + : "memory"); + if (__sys_res >= (unsigned long) -4096) + { + (*__errno_location ()) = - __sys_res; + __sys_res = -1; + } + return __sys_res; +} + +int +__getdents64 (int fd, char *buf, unsigned nbytes) +{ + struct dirent64 *dp; + long long last_offset = -1; + int retval; + struct kernel_dirent64 *skdp, *kdp; + dp = (struct dirent64 *) buf; + skdp = kdp = __builtin_alloca (nbytes); + retval = __syscall_getdents64(fd, (char *)kdp, nbytes); + if (retval == -1) + return -1; + while ((char *) kdp < (char *) skdp + retval) + { + if ((char *) dp > buf + nbytes) + { + lseek64(fd, last_offset, 0); + break; + } + last_offset = kdp->d_off; + __builtin_memcpy (dp->d_name, kdp->d_name, kdp->d_reclen - 10); + dp = (struct dirent64 *) ((char *) dp + sizeof (*dp)); + kdp = (struct kernel_dirent64 *) (((char *) kdp) + kdp->d_reclen); + } + + return (char *) dp - buf; +} |