1/* { dg-do assemble } */
2/* { dg-options "-O2" } */
3
4void
5bar1 ()
6{
7  char foo;
8  asm volatile ("mov%z0 %1, %0": "=m" (foo): "iq" (-23));
9  asm volatile ("add%z0 %1, %0": "+m" (foo): "iq" (23));
10  asm volatile ("mov%z0 %1, %0": "=q" (foo): "iq" (-23));
11  asm volatile ("add%z0 %1, %0": "+q" (foo): "iq" (23));
12}
13
14void
15bar2 ()
16{
17  short foo;
18  asm volatile ("mov%z0 %1, %0": "=m" (foo): "ir" (-23));
19  asm volatile ("add%z0 %1, %0": "+m" (foo): "ir" (23));
20  asm volatile ("mov%z0 %1, %0": "=r" (foo): "ir" (-23));
21  asm volatile ("add%z0 %1, %0": "+r" (foo): "ir" (23));
22
23  asm volatile ("pop%z0 %0": "=m" (foo));
24  asm volatile ("pop%z0 %0": "=r" (foo));
25}
26
27void
28bar3 ()
29{
30  int foo;
31  asm volatile ("mov%z0 %1, %0": "=m" (foo): "ir" (-23));
32  asm volatile ("add%z0 %1, %0": "+m" (foo): "ir" (23));
33  asm volatile ("mov%z0 %1, %0": "=r" (foo): "ir" (-23));
34  asm volatile ("add%z0 %1, %0": "+r" (foo): "ir" (23));
35
36  if (sizeof (void *) == sizeof (int))
37    {
38      asm volatile ("pop%z0 %0": "=m" (foo));
39      asm volatile ("pop%z0 %0": "=r" (foo));
40    }
41}
42
43void
44bar4 ()
45{
46  if (sizeof (void *) == sizeof (long long))
47    {
48      long long foo;
49      asm volatile ("mov%z0 %1, %0": "=m" (foo): "er" (-23));
50      asm volatile ("add%z0 %1, %0": "+m" (foo): "er" (23));
51      asm volatile ("mov%z0 %1, %0": "=r" (foo): "er" (-23));
52      asm volatile ("add%z0 %1, %0": "+r" (foo): "er" (23));
53
54      asm volatile ("pop%z0 %0": "=m" (foo));
55      asm volatile ("pop%z0 %0": "=r" (foo));
56    }
57}
58