diff options
Diffstat (limited to 'gcc/testsuite/gcc.target/i386/pr39911.c')
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr39911.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/i386/pr39911.c b/gcc/testsuite/gcc.target/i386/pr39911.c new file mode 100644 index 000000000..fe63ff005 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39911.c @@ -0,0 +1,57 @@ +/* { dg-do assemble } */ +/* { dg-options "-O2" } */ + +void +bar1 () +{ + char foo; + asm volatile ("mov%z0 %1, %0": "=m" (foo): "iq" (-23)); + asm volatile ("add%z0 %1, %0": "+m" (foo): "iq" (23)); + asm volatile ("mov%z0 %1, %0": "=q" (foo): "iq" (-23)); + asm volatile ("add%z0 %1, %0": "+q" (foo): "iq" (23)); +} + +void +bar2 () +{ + short foo; + asm volatile ("mov%z0 %1, %0": "=m" (foo): "ir" (-23)); + asm volatile ("add%z0 %1, %0": "+m" (foo): "ir" (23)); + asm volatile ("mov%z0 %1, %0": "=r" (foo): "ir" (-23)); + asm volatile ("add%z0 %1, %0": "+r" (foo): "ir" (23)); + + asm volatile ("pop%z0 %0": "=m" (foo)); + asm volatile ("pop%z0 %0": "=r" (foo)); +} + +void +bar3 () +{ + int foo; + asm volatile ("mov%z0 %1, %0": "=m" (foo): "ir" (-23)); + asm volatile ("add%z0 %1, %0": "+m" (foo): "ir" (23)); + asm volatile ("mov%z0 %1, %0": "=r" (foo): "ir" (-23)); + asm volatile ("add%z0 %1, %0": "+r" (foo): "ir" (23)); + + if (sizeof (void *) == sizeof (int)) + { + asm volatile ("pop%z0 %0": "=m" (foo)); + asm volatile ("pop%z0 %0": "=r" (foo)); + } +} + +void +bar4 () +{ + if (sizeof (void *) == sizeof (long long)) + { + long long foo; + asm volatile ("mov%z0 %1, %0": "=m" (foo): "er" (-23)); + asm volatile ("add%z0 %1, %0": "+m" (foo): "er" (23)); + asm volatile ("mov%z0 %1, %0": "=r" (foo): "er" (-23)); + asm volatile ("add%z0 %1, %0": "+r" (foo): "er" (23)); + + asm volatile ("pop%z0 %0": "=m" (foo)); + asm volatile ("pop%z0 %0": "=r" (foo)); + } +} |