1typedef __INT_LEAST8_TYPE__ int8_t;
2typedef __UINT_LEAST32_TYPE__ uint32_t;
3typedef int ssize_t;
4typedef struct { int8_t v1; int8_t v2; int8_t v3; int8_t v4; } neon_s8;
5
6uint32_t helper_neon_rshl_s8 (uint32_t arg1, uint32_t arg2);
7
8uint32_t
9helper_neon_rshl_s8 (uint32_t arg1, uint32_t arg2)
10{
11  uint32_t res;
12  neon_s8 vsrc1;
13  neon_s8 vsrc2;
14  neon_s8 vdest;
15  do
16    {
17      union
18      {
19	neon_s8 v;
20	uint32_t i;
21      } conv_u;
22      conv_u.i = (arg1);
23      vsrc1 = conv_u.v;
24    }
25  while (0);
26  do
27    {
28      union
29      {
30	neon_s8 v;
31	uint32_t i;
32      } conv_u;
33      conv_u.i = (arg2);
34      vsrc2 = conv_u.v;
35    }
36  while (0);
37  do
38    {
39      int8_t tmp;
40      tmp = (int8_t) vsrc2.v1;
41      if (tmp >= (ssize_t) sizeof (vsrc1.v1) * 8)
42	{
43	  vdest.v1 = 0;
44	}
45      else if (tmp < -(ssize_t) sizeof (vsrc1.v1) * 8)
46	{
47	  vdest.v1 = vsrc1.v1 >> (sizeof (vsrc1.v1) * 8 - 1);
48	}
49      else if (tmp == -(ssize_t) sizeof (vsrc1.v1) * 8)
50	{
51	  vdest.v1 = vsrc1.v1 >> (tmp - 1);
52	  vdest.v1++;
53	  vdest.v1 >>= 1;
54	}
55      else if (tmp < 0)
56	{
57	  vdest.v1 = (vsrc1.v1 + (1 << (-1 - tmp))) >> -tmp;
58	}
59      else
60	{
61	  vdest.v1 = vsrc1.v1 << tmp;
62	}
63    }
64  while (0);
65  do
66    {
67      int8_t tmp;
68      tmp = (int8_t) vsrc2.v2;
69      if (tmp >= (ssize_t) sizeof (vsrc1.v2) * 8)
70	{
71	  vdest.v2 = 0;
72	}
73      else if (tmp < -(ssize_t) sizeof (vsrc1.v2) * 8)
74	{
75	  vdest.v2 = vsrc1.v2 >> (sizeof (vsrc1.v2) * 8 - 1);
76	}
77      else if (tmp == -(ssize_t) sizeof (vsrc1.v2) * 8)
78	{
79	  vdest.v2 = vsrc1.v2 >> (tmp - 1);
80	  vdest.v2++;
81	  vdest.v2 >>= 1;
82	}
83      else if (tmp < 0)
84	{
85	  vdest.v2 = (vsrc1.v2 + (1 << (-1 - tmp))) >> -tmp;
86	}
87      else
88	{
89	  vdest.v2 = vsrc1.v2 << tmp;
90	}
91    }
92  while (0);
93  do
94    {
95      int8_t tmp;
96      tmp = (int8_t) vsrc2.v3;
97      if (tmp >= (ssize_t) sizeof (vsrc1.v3) * 8)
98	{
99	  vdest.v3 = 0;
100	}
101      else if (tmp < -(ssize_t) sizeof (vsrc1.v3) * 8)
102	{
103	  vdest.v3 = vsrc1.v3 >> (sizeof (vsrc1.v3) * 8 - 1);
104	}
105      else if (tmp == -(ssize_t) sizeof (vsrc1.v3) * 8)
106	{
107	  vdest.v3 = vsrc1.v3 >> (tmp - 1);
108	  vdest.v3++;
109	  vdest.v3 >>= 1;
110	}
111      else if (tmp < 0)
112	{
113	  vdest.v3 = (vsrc1.v3 + (1 << (-1 - tmp))) >> -tmp;
114	}
115      else
116	{
117	  vdest.v3 = vsrc1.v3 << tmp;
118	}
119    }
120  while (0);
121  do
122    {
123      int8_t tmp;
124      tmp = (int8_t) vsrc2.v4;
125      if (tmp >= (ssize_t) sizeof (vsrc1.v4) * 8)
126	{
127	  vdest.v4 = 0;
128	}
129      else if (tmp < -(ssize_t) sizeof (vsrc1.v4) * 8)
130	{
131	  vdest.v4 = vsrc1.v4 >> (sizeof (vsrc1.v4) * 8 - 1);
132	}
133      else if (tmp == -(ssize_t) sizeof (vsrc1.v4) * 8)
134	{
135	  vdest.v4 = vsrc1.v4 >> (tmp - 1);
136	  vdest.v4++;
137	  vdest.v4 >>= 1;
138	}
139      else if (tmp < 0)
140	{
141	  vdest.v4 = (vsrc1.v4 + (1 << (-1 - tmp))) >> -tmp;
142	}
143      else
144	{
145	  vdest.v4 = vsrc1.v4 << tmp;
146	}
147    }
148  while (0);;
149  do
150    {
151      union
152      {
153	neon_s8 v;
154	uint32_t i;
155      } conv_u;
156      conv_u.v = (vdest);
157      res = conv_u.i;
158    }
159  while (0);
160  return res;
161}
162
163extern void abort(void);
164
165int main()
166{
167  uint32_t r = helper_neon_rshl_s8 (0x05050505, 0x01010101);
168  if (r != 0x0a0a0a0a)
169    abort ();
170  return 0;
171}
172