1 typedef __INT_LEAST8_TYPE__ int8_t;
2 typedef __UINT_LEAST32_TYPE__ uint32_t;
3 typedef int ssize_t;
4 typedef struct { int8_t v1; int8_t v2; int8_t v3; int8_t v4; } neon_s8;
5 
6 uint32_t helper_neon_rshl_s8 (uint32_t arg1, uint32_t arg2);
7 
8 uint32_t
helper_neon_rshl_s8(uint32_t arg1,uint32_t arg2)9 helper_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 
163 extern void abort(void);
164 
main()165 int main()
166 {
167   uint32_t r = helper_neon_rshl_s8 (0x05050505, 0x01010101);
168   if (r != 0x0a0a0a0a)
169     abort ();
170   return 0;
171 }
172