1de1c2680SYonghong Song // SPDX-License-Identifier: GPL-2.0
2de1c2680SYonghong Song 
3de1c2680SYonghong Song #include <linux/bpf.h>
4de1c2680SYonghong Song #include <bpf/bpf_helpers.h>
5de1c2680SYonghong Song #include "bpf_misc.h"
6de1c2680SYonghong Song 
7*0209fd51SPu Lehui #if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \
8*0209fd51SPu Lehui      (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64)) && __clang_major__ >= 18
9de1c2680SYonghong Song 
10de1c2680SYonghong Song SEC("socket")
11de1c2680SYonghong Song __description("SDIV32, non-zero imm divisor, check 1")
12de1c2680SYonghong Song __success __success_unpriv __retval(-20)
sdiv32_non_zero_imm_1(void)13de1c2680SYonghong Song __naked void sdiv32_non_zero_imm_1(void)
14de1c2680SYonghong Song {
15de1c2680SYonghong Song 	asm volatile ("					\
16de1c2680SYonghong Song 	w0 = -41;					\
17de1c2680SYonghong Song 	w0 s/= 2;					\
18de1c2680SYonghong Song 	exit;						\
19de1c2680SYonghong Song "	::: __clobber_all);
20de1c2680SYonghong Song }
21de1c2680SYonghong Song 
22de1c2680SYonghong Song SEC("socket")
23de1c2680SYonghong Song __description("SDIV32, non-zero imm divisor, check 2")
24de1c2680SYonghong Song __success __success_unpriv __retval(-20)
sdiv32_non_zero_imm_2(void)25de1c2680SYonghong Song __naked void sdiv32_non_zero_imm_2(void)
26de1c2680SYonghong Song {
27de1c2680SYonghong Song 	asm volatile ("					\
28de1c2680SYonghong Song 	w0 = 41;					\
29de1c2680SYonghong Song 	w0 s/= -2;					\
30de1c2680SYonghong Song 	exit;						\
31de1c2680SYonghong Song "	::: __clobber_all);
32de1c2680SYonghong Song }
33de1c2680SYonghong Song 
34de1c2680SYonghong Song SEC("socket")
35de1c2680SYonghong Song __description("SDIV32, non-zero imm divisor, check 3")
36de1c2680SYonghong Song __success __success_unpriv __retval(20)
sdiv32_non_zero_imm_3(void)37de1c2680SYonghong Song __naked void sdiv32_non_zero_imm_3(void)
38de1c2680SYonghong Song {
39de1c2680SYonghong Song 	asm volatile ("					\
40de1c2680SYonghong Song 	w0 = -41;					\
41de1c2680SYonghong Song 	w0 s/= -2;					\
42de1c2680SYonghong Song 	exit;						\
43de1c2680SYonghong Song "	::: __clobber_all);
44de1c2680SYonghong Song }
45de1c2680SYonghong Song 
46de1c2680SYonghong Song SEC("socket")
47de1c2680SYonghong Song __description("SDIV32, non-zero imm divisor, check 4")
48de1c2680SYonghong Song __success __success_unpriv __retval(-21)
sdiv32_non_zero_imm_4(void)49de1c2680SYonghong Song __naked void sdiv32_non_zero_imm_4(void)
50de1c2680SYonghong Song {
51de1c2680SYonghong Song 	asm volatile ("					\
52de1c2680SYonghong Song 	w0 = -42;					\
53de1c2680SYonghong Song 	w0 s/= 2;					\
54de1c2680SYonghong Song 	exit;						\
55de1c2680SYonghong Song "	::: __clobber_all);
56de1c2680SYonghong Song }
57de1c2680SYonghong Song 
58de1c2680SYonghong Song SEC("socket")
59de1c2680SYonghong Song __description("SDIV32, non-zero imm divisor, check 5")
60de1c2680SYonghong Song __success __success_unpriv __retval(-21)
sdiv32_non_zero_imm_5(void)61de1c2680SYonghong Song __naked void sdiv32_non_zero_imm_5(void)
62de1c2680SYonghong Song {
63de1c2680SYonghong Song 	asm volatile ("					\
64de1c2680SYonghong Song 	w0 = 42;					\
65de1c2680SYonghong Song 	w0 s/= -2;					\
66de1c2680SYonghong Song 	exit;						\
67de1c2680SYonghong Song "	::: __clobber_all);
68de1c2680SYonghong Song }
69de1c2680SYonghong Song 
70de1c2680SYonghong Song SEC("socket")
71de1c2680SYonghong Song __description("SDIV32, non-zero imm divisor, check 6")
72de1c2680SYonghong Song __success __success_unpriv __retval(21)
sdiv32_non_zero_imm_6(void)73de1c2680SYonghong Song __naked void sdiv32_non_zero_imm_6(void)
74de1c2680SYonghong Song {
75de1c2680SYonghong Song 	asm volatile ("					\
76de1c2680SYonghong Song 	w0 = -42;					\
77de1c2680SYonghong Song 	w0 s/= -2;					\
78de1c2680SYonghong Song 	exit;						\
79de1c2680SYonghong Song "	::: __clobber_all);
80de1c2680SYonghong Song }
81de1c2680SYonghong Song 
82de1c2680SYonghong Song SEC("socket")
83de1c2680SYonghong Song __description("SDIV32, non-zero imm divisor, check 7")
84de1c2680SYonghong Song __success __success_unpriv __retval(21)
sdiv32_non_zero_imm_7(void)85de1c2680SYonghong Song __naked void sdiv32_non_zero_imm_7(void)
86de1c2680SYonghong Song {
87de1c2680SYonghong Song 	asm volatile ("					\
88de1c2680SYonghong Song 	w0 = 42;					\
89de1c2680SYonghong Song 	w0 s/= 2;					\
90de1c2680SYonghong Song 	exit;						\
91de1c2680SYonghong Song "	::: __clobber_all);
92de1c2680SYonghong Song }
93de1c2680SYonghong Song 
94de1c2680SYonghong Song SEC("socket")
95de1c2680SYonghong Song __description("SDIV32, non-zero imm divisor, check 8")
96de1c2680SYonghong Song __success __success_unpriv __retval(20)
sdiv32_non_zero_imm_8(void)97de1c2680SYonghong Song __naked void sdiv32_non_zero_imm_8(void)
98de1c2680SYonghong Song {
99de1c2680SYonghong Song 	asm volatile ("					\
100de1c2680SYonghong Song 	w0 = 41;					\
101de1c2680SYonghong Song 	w0 s/= 2;					\
102de1c2680SYonghong Song 	exit;						\
103de1c2680SYonghong Song "	::: __clobber_all);
104de1c2680SYonghong Song }
105de1c2680SYonghong Song 
106de1c2680SYonghong Song SEC("socket")
107de1c2680SYonghong Song __description("SDIV32, non-zero reg divisor, check 1")
108de1c2680SYonghong Song __success __success_unpriv __retval(-20)
sdiv32_non_zero_reg_1(void)109de1c2680SYonghong Song __naked void sdiv32_non_zero_reg_1(void)
110de1c2680SYonghong Song {
111de1c2680SYonghong Song 	asm volatile ("					\
112de1c2680SYonghong Song 	w0 = -41;					\
113de1c2680SYonghong Song 	w1 = 2;						\
114de1c2680SYonghong Song 	w0 s/= w1;					\
115de1c2680SYonghong Song 	exit;						\
116de1c2680SYonghong Song "	::: __clobber_all);
117de1c2680SYonghong Song }
118de1c2680SYonghong Song 
119de1c2680SYonghong Song SEC("socket")
120de1c2680SYonghong Song __description("SDIV32, non-zero reg divisor, check 2")
121de1c2680SYonghong Song __success __success_unpriv __retval(-20)
sdiv32_non_zero_reg_2(void)122de1c2680SYonghong Song __naked void sdiv32_non_zero_reg_2(void)
123de1c2680SYonghong Song {
124de1c2680SYonghong Song 	asm volatile ("					\
125de1c2680SYonghong Song 	w0 = 41;					\
126de1c2680SYonghong Song 	w1 = -2;					\
127de1c2680SYonghong Song 	w0 s/= w1;					\
128de1c2680SYonghong Song 	exit;						\
129de1c2680SYonghong Song "	::: __clobber_all);
130de1c2680SYonghong Song }
131de1c2680SYonghong Song 
132de1c2680SYonghong Song SEC("socket")
133de1c2680SYonghong Song __description("SDIV32, non-zero reg divisor, check 3")
134de1c2680SYonghong Song __success __success_unpriv __retval(20)
sdiv32_non_zero_reg_3(void)135de1c2680SYonghong Song __naked void sdiv32_non_zero_reg_3(void)
136de1c2680SYonghong Song {
137de1c2680SYonghong Song 	asm volatile ("					\
138de1c2680SYonghong Song 	w0 = -41;					\
139de1c2680SYonghong Song 	w1 = -2;					\
140de1c2680SYonghong Song 	w0 s/= w1;					\
141de1c2680SYonghong Song 	exit;						\
142de1c2680SYonghong Song "	::: __clobber_all);
143de1c2680SYonghong Song }
144de1c2680SYonghong Song 
145de1c2680SYonghong Song SEC("socket")
146de1c2680SYonghong Song __description("SDIV32, non-zero reg divisor, check 4")
147de1c2680SYonghong Song __success __success_unpriv __retval(-21)
sdiv32_non_zero_reg_4(void)148de1c2680SYonghong Song __naked void sdiv32_non_zero_reg_4(void)
149de1c2680SYonghong Song {
150de1c2680SYonghong Song 	asm volatile ("					\
151de1c2680SYonghong Song 	w0 = -42;					\
152de1c2680SYonghong Song 	w1 = 2;						\
153de1c2680SYonghong Song 	w0 s/= w1;					\
154de1c2680SYonghong Song 	exit;						\
155de1c2680SYonghong Song "	::: __clobber_all);
156de1c2680SYonghong Song }
157de1c2680SYonghong Song 
158de1c2680SYonghong Song SEC("socket")
159de1c2680SYonghong Song __description("SDIV32, non-zero reg divisor, check 5")
160de1c2680SYonghong Song __success __success_unpriv __retval(-21)
sdiv32_non_zero_reg_5(void)161de1c2680SYonghong Song __naked void sdiv32_non_zero_reg_5(void)
162de1c2680SYonghong Song {
163de1c2680SYonghong Song 	asm volatile ("					\
164de1c2680SYonghong Song 	w0 = 42;					\
165de1c2680SYonghong Song 	w1 = -2;					\
166de1c2680SYonghong Song 	w0 s/= w1;					\
167de1c2680SYonghong Song 	exit;						\
168de1c2680SYonghong Song "	::: __clobber_all);
169de1c2680SYonghong Song }
170de1c2680SYonghong Song 
171de1c2680SYonghong Song SEC("socket")
172de1c2680SYonghong Song __description("SDIV32, non-zero reg divisor, check 6")
173de1c2680SYonghong Song __success __success_unpriv __retval(21)
sdiv32_non_zero_reg_6(void)174de1c2680SYonghong Song __naked void sdiv32_non_zero_reg_6(void)
175de1c2680SYonghong Song {
176de1c2680SYonghong Song 	asm volatile ("					\
177de1c2680SYonghong Song 	w0 = -42;					\
178de1c2680SYonghong Song 	w1 = -2;					\
179de1c2680SYonghong Song 	w0 s/= w1;					\
180de1c2680SYonghong Song 	exit;						\
181de1c2680SYonghong Song "	::: __clobber_all);
182de1c2680SYonghong Song }
183de1c2680SYonghong Song 
184de1c2680SYonghong Song SEC("socket")
185de1c2680SYonghong Song __description("SDIV32, non-zero reg divisor, check 7")
186de1c2680SYonghong Song __success __success_unpriv __retval(21)
sdiv32_non_zero_reg_7(void)187de1c2680SYonghong Song __naked void sdiv32_non_zero_reg_7(void)
188de1c2680SYonghong Song {
189de1c2680SYonghong Song 	asm volatile ("					\
190de1c2680SYonghong Song 	w0 = 42;					\
191de1c2680SYonghong Song 	w1 = 2;						\
192de1c2680SYonghong Song 	w0 s/= w1;					\
193de1c2680SYonghong Song 	exit;						\
194de1c2680SYonghong Song "	::: __clobber_all);
195de1c2680SYonghong Song }
196de1c2680SYonghong Song 
197de1c2680SYonghong Song SEC("socket")
198de1c2680SYonghong Song __description("SDIV32, non-zero reg divisor, check 8")
199de1c2680SYonghong Song __success __success_unpriv __retval(20)
sdiv32_non_zero_reg_8(void)200de1c2680SYonghong Song __naked void sdiv32_non_zero_reg_8(void)
201de1c2680SYonghong Song {
202de1c2680SYonghong Song 	asm volatile ("					\
203de1c2680SYonghong Song 	w0 = 41;					\
204de1c2680SYonghong Song 	w1 = 2;						\
205de1c2680SYonghong Song 	w0 s/= w1;					\
206de1c2680SYonghong Song 	exit;						\
207de1c2680SYonghong Song "	::: __clobber_all);
208de1c2680SYonghong Song }
209de1c2680SYonghong Song 
210de1c2680SYonghong Song SEC("socket")
211de1c2680SYonghong Song __description("SDIV64, non-zero imm divisor, check 1")
212de1c2680SYonghong Song __success __success_unpriv __retval(-20)
sdiv64_non_zero_imm_1(void)213de1c2680SYonghong Song __naked void sdiv64_non_zero_imm_1(void)
214de1c2680SYonghong Song {
215de1c2680SYonghong Song 	asm volatile ("					\
216de1c2680SYonghong Song 	r0 = -41;					\
217de1c2680SYonghong Song 	r0 s/= 2;					\
218de1c2680SYonghong Song 	exit;						\
219de1c2680SYonghong Song "	::: __clobber_all);
220de1c2680SYonghong Song }
221de1c2680SYonghong Song 
222de1c2680SYonghong Song SEC("socket")
223de1c2680SYonghong Song __description("SDIV64, non-zero imm divisor, check 2")
224de1c2680SYonghong Song __success __success_unpriv __retval(-20)
sdiv64_non_zero_imm_2(void)225de1c2680SYonghong Song __naked void sdiv64_non_zero_imm_2(void)
226de1c2680SYonghong Song {
227de1c2680SYonghong Song 	asm volatile ("					\
228de1c2680SYonghong Song 	r0 = 41;					\
229de1c2680SYonghong Song 	r0 s/= -2;					\
230de1c2680SYonghong Song 	exit;						\
231de1c2680SYonghong Song "	::: __clobber_all);
232de1c2680SYonghong Song }
233de1c2680SYonghong Song 
234de1c2680SYonghong Song SEC("socket")
235de1c2680SYonghong Song __description("SDIV64, non-zero imm divisor, check 3")
236de1c2680SYonghong Song __success __success_unpriv __retval(20)
sdiv64_non_zero_imm_3(void)237de1c2680SYonghong Song __naked void sdiv64_non_zero_imm_3(void)
238de1c2680SYonghong Song {
239de1c2680SYonghong Song 	asm volatile ("					\
240de1c2680SYonghong Song 	r0 = -41;					\
241de1c2680SYonghong Song 	r0 s/= -2;					\
242de1c2680SYonghong Song 	exit;						\
243de1c2680SYonghong Song "	::: __clobber_all);
244de1c2680SYonghong Song }
245de1c2680SYonghong Song 
246de1c2680SYonghong Song SEC("socket")
247de1c2680SYonghong Song __description("SDIV64, non-zero imm divisor, check 4")
248de1c2680SYonghong Song __success __success_unpriv __retval(-21)
sdiv64_non_zero_imm_4(void)249de1c2680SYonghong Song __naked void sdiv64_non_zero_imm_4(void)
250de1c2680SYonghong Song {
251de1c2680SYonghong Song 	asm volatile ("					\
252de1c2680SYonghong Song 	r0 = -42;					\
253de1c2680SYonghong Song 	r0 s/= 2;					\
254de1c2680SYonghong Song 	exit;						\
255de1c2680SYonghong Song "	::: __clobber_all);
256de1c2680SYonghong Song }
257de1c2680SYonghong Song 
258de1c2680SYonghong Song SEC("socket")
259de1c2680SYonghong Song __description("SDIV64, non-zero imm divisor, check 5")
260de1c2680SYonghong Song __success __success_unpriv __retval(-21)
sdiv64_non_zero_imm_5(void)261de1c2680SYonghong Song __naked void sdiv64_non_zero_imm_5(void)
262de1c2680SYonghong Song {
263de1c2680SYonghong Song 	asm volatile ("					\
264de1c2680SYonghong Song 	r0 = 42;					\
265de1c2680SYonghong Song 	r0 s/= -2;					\
266de1c2680SYonghong Song 	exit;						\
267de1c2680SYonghong Song "	::: __clobber_all);
268de1c2680SYonghong Song }
269de1c2680SYonghong Song 
270de1c2680SYonghong Song SEC("socket")
271de1c2680SYonghong Song __description("SDIV64, non-zero imm divisor, check 6")
272de1c2680SYonghong Song __success __success_unpriv __retval(21)
sdiv64_non_zero_imm_6(void)273de1c2680SYonghong Song __naked void sdiv64_non_zero_imm_6(void)
274de1c2680SYonghong Song {
275de1c2680SYonghong Song 	asm volatile ("					\
276de1c2680SYonghong Song 	r0 = -42;					\
277de1c2680SYonghong Song 	r0 s/= -2;					\
278de1c2680SYonghong Song 	exit;						\
279de1c2680SYonghong Song "	::: __clobber_all);
280de1c2680SYonghong Song }
281de1c2680SYonghong Song 
282de1c2680SYonghong Song SEC("socket")
283de1c2680SYonghong Song __description("SDIV64, non-zero reg divisor, check 1")
284de1c2680SYonghong Song __success __success_unpriv __retval(-20)
sdiv64_non_zero_reg_1(void)285de1c2680SYonghong Song __naked void sdiv64_non_zero_reg_1(void)
286de1c2680SYonghong Song {
287de1c2680SYonghong Song 	asm volatile ("					\
288de1c2680SYonghong Song 	r0 = -41;					\
289de1c2680SYonghong Song 	r1 = 2;						\
290de1c2680SYonghong Song 	r0 s/= r1;					\
291de1c2680SYonghong Song 	exit;						\
292de1c2680SYonghong Song "	::: __clobber_all);
293de1c2680SYonghong Song }
294de1c2680SYonghong Song 
295de1c2680SYonghong Song SEC("socket")
296de1c2680SYonghong Song __description("SDIV64, non-zero reg divisor, check 2")
297de1c2680SYonghong Song __success __success_unpriv __retval(-20)
sdiv64_non_zero_reg_2(void)298de1c2680SYonghong Song __naked void sdiv64_non_zero_reg_2(void)
299de1c2680SYonghong Song {
300de1c2680SYonghong Song 	asm volatile ("					\
301de1c2680SYonghong Song 	r0 = 41;					\
302de1c2680SYonghong Song 	r1 = -2;					\
303de1c2680SYonghong Song 	r0 s/= r1;					\
304de1c2680SYonghong Song 	exit;						\
305de1c2680SYonghong Song "	::: __clobber_all);
306de1c2680SYonghong Song }
307de1c2680SYonghong Song 
308de1c2680SYonghong Song SEC("socket")
309de1c2680SYonghong Song __description("SDIV64, non-zero reg divisor, check 3")
310de1c2680SYonghong Song __success __success_unpriv __retval(20)
sdiv64_non_zero_reg_3(void)311de1c2680SYonghong Song __naked void sdiv64_non_zero_reg_3(void)
312de1c2680SYonghong Song {
313de1c2680SYonghong Song 	asm volatile ("					\
314de1c2680SYonghong Song 	r0 = -41;					\
315de1c2680SYonghong Song 	r1 = -2;					\
316de1c2680SYonghong Song 	r0 s/= r1;					\
317de1c2680SYonghong Song 	exit;						\
318de1c2680SYonghong Song "	::: __clobber_all);
319de1c2680SYonghong Song }
320de1c2680SYonghong Song 
321de1c2680SYonghong Song SEC("socket")
322de1c2680SYonghong Song __description("SDIV64, non-zero reg divisor, check 4")
323de1c2680SYonghong Song __success __success_unpriv __retval(-21)
sdiv64_non_zero_reg_4(void)324de1c2680SYonghong Song __naked void sdiv64_non_zero_reg_4(void)
325de1c2680SYonghong Song {
326de1c2680SYonghong Song 	asm volatile ("					\
327de1c2680SYonghong Song 	r0 = -42;					\
328de1c2680SYonghong Song 	r1 = 2;						\
329de1c2680SYonghong Song 	r0 s/= r1;					\
330de1c2680SYonghong Song 	exit;						\
331de1c2680SYonghong Song "	::: __clobber_all);
332de1c2680SYonghong Song }
333de1c2680SYonghong Song 
334de1c2680SYonghong Song SEC("socket")
335de1c2680SYonghong Song __description("SDIV64, non-zero reg divisor, check 5")
336de1c2680SYonghong Song __success __success_unpriv __retval(-21)
sdiv64_non_zero_reg_5(void)337de1c2680SYonghong Song __naked void sdiv64_non_zero_reg_5(void)
338de1c2680SYonghong Song {
339de1c2680SYonghong Song 	asm volatile ("					\
340de1c2680SYonghong Song 	r0 = 42;					\
341de1c2680SYonghong Song 	r1 = -2;					\
342de1c2680SYonghong Song 	r0 s/= r1;					\
343de1c2680SYonghong Song 	exit;						\
344de1c2680SYonghong Song "	::: __clobber_all);
345de1c2680SYonghong Song }
346de1c2680SYonghong Song 
347de1c2680SYonghong Song SEC("socket")
348de1c2680SYonghong Song __description("SDIV64, non-zero reg divisor, check 6")
349de1c2680SYonghong Song __success __success_unpriv __retval(21)
sdiv64_non_zero_reg_6(void)350de1c2680SYonghong Song __naked void sdiv64_non_zero_reg_6(void)
351de1c2680SYonghong Song {
352de1c2680SYonghong Song 	asm volatile ("					\
353de1c2680SYonghong Song 	r0 = -42;					\
354de1c2680SYonghong Song 	r1 = -2;					\
355de1c2680SYonghong Song 	r0 s/= r1;					\
356de1c2680SYonghong Song 	exit;						\
357de1c2680SYonghong Song "	::: __clobber_all);
358de1c2680SYonghong Song }
359de1c2680SYonghong Song 
360de1c2680SYonghong Song SEC("socket")
361de1c2680SYonghong Song __description("SMOD32, non-zero imm divisor, check 1")
362de1c2680SYonghong Song __success __success_unpriv __retval(-1)
smod32_non_zero_imm_1(void)363de1c2680SYonghong Song __naked void smod32_non_zero_imm_1(void)
364de1c2680SYonghong Song {
365de1c2680SYonghong Song 	asm volatile ("					\
366de1c2680SYonghong Song 	w0 = -41;					\
367de1c2680SYonghong Song 	w0 s%%= 2;					\
368de1c2680SYonghong Song 	exit;						\
369de1c2680SYonghong Song "	::: __clobber_all);
370de1c2680SYonghong Song }
371de1c2680SYonghong Song 
372de1c2680SYonghong Song SEC("socket")
373de1c2680SYonghong Song __description("SMOD32, non-zero imm divisor, check 2")
374de1c2680SYonghong Song __success __success_unpriv __retval(1)
smod32_non_zero_imm_2(void)375de1c2680SYonghong Song __naked void smod32_non_zero_imm_2(void)
376de1c2680SYonghong Song {
377de1c2680SYonghong Song 	asm volatile ("					\
378de1c2680SYonghong Song 	w0 = 41;					\
379de1c2680SYonghong Song 	w0 s%%= -2;					\
380de1c2680SYonghong Song 	exit;						\
381de1c2680SYonghong Song "	::: __clobber_all);
382de1c2680SYonghong Song }
383de1c2680SYonghong Song 
384de1c2680SYonghong Song SEC("socket")
385de1c2680SYonghong Song __description("SMOD32, non-zero imm divisor, check 3")
386de1c2680SYonghong Song __success __success_unpriv __retval(-1)
smod32_non_zero_imm_3(void)387de1c2680SYonghong Song __naked void smod32_non_zero_imm_3(void)
388de1c2680SYonghong Song {
389de1c2680SYonghong Song 	asm volatile ("					\
390de1c2680SYonghong Song 	w0 = -41;					\
391de1c2680SYonghong Song 	w0 s%%= -2;					\
392de1c2680SYonghong Song 	exit;						\
393de1c2680SYonghong Song "	::: __clobber_all);
394de1c2680SYonghong Song }
395de1c2680SYonghong Song 
396de1c2680SYonghong Song SEC("socket")
397de1c2680SYonghong Song __description("SMOD32, non-zero imm divisor, check 4")
398de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod32_non_zero_imm_4(void)399de1c2680SYonghong Song __naked void smod32_non_zero_imm_4(void)
400de1c2680SYonghong Song {
401de1c2680SYonghong Song 	asm volatile ("					\
402de1c2680SYonghong Song 	w0 = -42;					\
403de1c2680SYonghong Song 	w0 s%%= 2;					\
404de1c2680SYonghong Song 	exit;						\
405de1c2680SYonghong Song "	::: __clobber_all);
406de1c2680SYonghong Song }
407de1c2680SYonghong Song 
408de1c2680SYonghong Song SEC("socket")
409de1c2680SYonghong Song __description("SMOD32, non-zero imm divisor, check 5")
410de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod32_non_zero_imm_5(void)411de1c2680SYonghong Song __naked void smod32_non_zero_imm_5(void)
412de1c2680SYonghong Song {
413de1c2680SYonghong Song 	asm volatile ("					\
414de1c2680SYonghong Song 	w0 = 42;					\
415de1c2680SYonghong Song 	w0 s%%= -2;					\
416de1c2680SYonghong Song 	exit;						\
417de1c2680SYonghong Song "	::: __clobber_all);
418de1c2680SYonghong Song }
419de1c2680SYonghong Song 
420de1c2680SYonghong Song SEC("socket")
421de1c2680SYonghong Song __description("SMOD32, non-zero imm divisor, check 6")
422de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod32_non_zero_imm_6(void)423de1c2680SYonghong Song __naked void smod32_non_zero_imm_6(void)
424de1c2680SYonghong Song {
425de1c2680SYonghong Song 	asm volatile ("					\
426de1c2680SYonghong Song 	w0 = -42;					\
427de1c2680SYonghong Song 	w0 s%%= -2;					\
428de1c2680SYonghong Song 	exit;						\
429de1c2680SYonghong Song "	::: __clobber_all);
430de1c2680SYonghong Song }
431de1c2680SYonghong Song 
432de1c2680SYonghong Song SEC("socket")
433de1c2680SYonghong Song __description("SMOD32, non-zero reg divisor, check 1")
434de1c2680SYonghong Song __success __success_unpriv __retval(-1)
smod32_non_zero_reg_1(void)435de1c2680SYonghong Song __naked void smod32_non_zero_reg_1(void)
436de1c2680SYonghong Song {
437de1c2680SYonghong Song 	asm volatile ("					\
438de1c2680SYonghong Song 	w0 = -41;					\
439de1c2680SYonghong Song 	w1 = 2;						\
440de1c2680SYonghong Song 	w0 s%%= w1;					\
441de1c2680SYonghong Song 	exit;						\
442de1c2680SYonghong Song "	::: __clobber_all);
443de1c2680SYonghong Song }
444de1c2680SYonghong Song 
445de1c2680SYonghong Song SEC("socket")
446de1c2680SYonghong Song __description("SMOD32, non-zero reg divisor, check 2")
447de1c2680SYonghong Song __success __success_unpriv __retval(1)
smod32_non_zero_reg_2(void)448de1c2680SYonghong Song __naked void smod32_non_zero_reg_2(void)
449de1c2680SYonghong Song {
450de1c2680SYonghong Song 	asm volatile ("					\
451de1c2680SYonghong Song 	w0 = 41;					\
452de1c2680SYonghong Song 	w1 = -2;					\
453de1c2680SYonghong Song 	w0 s%%= w1;					\
454de1c2680SYonghong Song 	exit;						\
455de1c2680SYonghong Song "	::: __clobber_all);
456de1c2680SYonghong Song }
457de1c2680SYonghong Song 
458de1c2680SYonghong Song SEC("socket")
459de1c2680SYonghong Song __description("SMOD32, non-zero reg divisor, check 3")
460de1c2680SYonghong Song __success __success_unpriv __retval(-1)
smod32_non_zero_reg_3(void)461de1c2680SYonghong Song __naked void smod32_non_zero_reg_3(void)
462de1c2680SYonghong Song {
463de1c2680SYonghong Song 	asm volatile ("					\
464de1c2680SYonghong Song 	w0 = -41;					\
465de1c2680SYonghong Song 	w1 = -2;					\
466de1c2680SYonghong Song 	w0 s%%= w1;					\
467de1c2680SYonghong Song 	exit;						\
468de1c2680SYonghong Song "	::: __clobber_all);
469de1c2680SYonghong Song }
470de1c2680SYonghong Song 
471de1c2680SYonghong Song SEC("socket")
472de1c2680SYonghong Song __description("SMOD32, non-zero reg divisor, check 4")
473de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod32_non_zero_reg_4(void)474de1c2680SYonghong Song __naked void smod32_non_zero_reg_4(void)
475de1c2680SYonghong Song {
476de1c2680SYonghong Song 	asm volatile ("					\
477de1c2680SYonghong Song 	w0 = -42;					\
478de1c2680SYonghong Song 	w1 = 2;						\
479de1c2680SYonghong Song 	w0 s%%= w1;					\
480de1c2680SYonghong Song 	exit;						\
481de1c2680SYonghong Song "	::: __clobber_all);
482de1c2680SYonghong Song }
483de1c2680SYonghong Song 
484de1c2680SYonghong Song SEC("socket")
485de1c2680SYonghong Song __description("SMOD32, non-zero reg divisor, check 5")
486de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod32_non_zero_reg_5(void)487de1c2680SYonghong Song __naked void smod32_non_zero_reg_5(void)
488de1c2680SYonghong Song {
489de1c2680SYonghong Song 	asm volatile ("					\
490de1c2680SYonghong Song 	w0 = 42;					\
491de1c2680SYonghong Song 	w1 = -2;					\
492de1c2680SYonghong Song 	w0 s%%= w1;					\
493de1c2680SYonghong Song 	exit;						\
494de1c2680SYonghong Song "	::: __clobber_all);
495de1c2680SYonghong Song }
496de1c2680SYonghong Song 
497de1c2680SYonghong Song SEC("socket")
498de1c2680SYonghong Song __description("SMOD32, non-zero reg divisor, check 6")
499de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod32_non_zero_reg_6(void)500de1c2680SYonghong Song __naked void smod32_non_zero_reg_6(void)
501de1c2680SYonghong Song {
502de1c2680SYonghong Song 	asm volatile ("					\
503de1c2680SYonghong Song 	w0 = -42;					\
504de1c2680SYonghong Song 	w1 = -2;					\
505de1c2680SYonghong Song 	w0 s%%= w1;					\
506de1c2680SYonghong Song 	exit;						\
507de1c2680SYonghong Song "	::: __clobber_all);
508de1c2680SYonghong Song }
509de1c2680SYonghong Song 
510de1c2680SYonghong Song SEC("socket")
511de1c2680SYonghong Song __description("SMOD64, non-zero imm divisor, check 1")
512de1c2680SYonghong Song __success __success_unpriv __retval(-1)
smod64_non_zero_imm_1(void)513de1c2680SYonghong Song __naked void smod64_non_zero_imm_1(void)
514de1c2680SYonghong Song {
515de1c2680SYonghong Song 	asm volatile ("					\
516de1c2680SYonghong Song 	r0 = -41;					\
517de1c2680SYonghong Song 	r0 s%%= 2;					\
518de1c2680SYonghong Song 	exit;						\
519de1c2680SYonghong Song "	::: __clobber_all);
520de1c2680SYonghong Song }
521de1c2680SYonghong Song 
522de1c2680SYonghong Song SEC("socket")
523de1c2680SYonghong Song __description("SMOD64, non-zero imm divisor, check 2")
524de1c2680SYonghong Song __success __success_unpriv __retval(1)
smod64_non_zero_imm_2(void)525de1c2680SYonghong Song __naked void smod64_non_zero_imm_2(void)
526de1c2680SYonghong Song {
527de1c2680SYonghong Song 	asm volatile ("					\
528de1c2680SYonghong Song 	r0 = 41;					\
529de1c2680SYonghong Song 	r0 s%%= -2;					\
530de1c2680SYonghong Song 	exit;						\
531de1c2680SYonghong Song "	::: __clobber_all);
532de1c2680SYonghong Song }
533de1c2680SYonghong Song 
534de1c2680SYonghong Song SEC("socket")
535de1c2680SYonghong Song __description("SMOD64, non-zero imm divisor, check 3")
536de1c2680SYonghong Song __success __success_unpriv __retval(-1)
smod64_non_zero_imm_3(void)537de1c2680SYonghong Song __naked void smod64_non_zero_imm_3(void)
538de1c2680SYonghong Song {
539de1c2680SYonghong Song 	asm volatile ("					\
540de1c2680SYonghong Song 	r0 = -41;					\
541de1c2680SYonghong Song 	r0 s%%= -2;					\
542de1c2680SYonghong Song 	exit;						\
543de1c2680SYonghong Song "	::: __clobber_all);
544de1c2680SYonghong Song }
545de1c2680SYonghong Song 
546de1c2680SYonghong Song SEC("socket")
547de1c2680SYonghong Song __description("SMOD64, non-zero imm divisor, check 4")
548de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod64_non_zero_imm_4(void)549de1c2680SYonghong Song __naked void smod64_non_zero_imm_4(void)
550de1c2680SYonghong Song {
551de1c2680SYonghong Song 	asm volatile ("					\
552de1c2680SYonghong Song 	r0 = -42;					\
553de1c2680SYonghong Song 	r0 s%%= 2;					\
554de1c2680SYonghong Song 	exit;						\
555de1c2680SYonghong Song "	::: __clobber_all);
556de1c2680SYonghong Song }
557de1c2680SYonghong Song 
558de1c2680SYonghong Song SEC("socket")
559de1c2680SYonghong Song __description("SMOD64, non-zero imm divisor, check 5")
560de1c2680SYonghong Song __success __success_unpriv __retval(-0)
smod64_non_zero_imm_5(void)561de1c2680SYonghong Song __naked void smod64_non_zero_imm_5(void)
562de1c2680SYonghong Song {
563de1c2680SYonghong Song 	asm volatile ("					\
564de1c2680SYonghong Song 	r0 = 42;					\
565de1c2680SYonghong Song 	r0 s%%= -2;					\
566de1c2680SYonghong Song 	exit;						\
567de1c2680SYonghong Song "	::: __clobber_all);
568de1c2680SYonghong Song }
569de1c2680SYonghong Song 
570de1c2680SYonghong Song SEC("socket")
571de1c2680SYonghong Song __description("SMOD64, non-zero imm divisor, check 6")
572de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod64_non_zero_imm_6(void)573de1c2680SYonghong Song __naked void smod64_non_zero_imm_6(void)
574de1c2680SYonghong Song {
575de1c2680SYonghong Song 	asm volatile ("					\
576de1c2680SYonghong Song 	r0 = -42;					\
577de1c2680SYonghong Song 	r0 s%%= -2;					\
578de1c2680SYonghong Song 	exit;						\
579de1c2680SYonghong Song "	::: __clobber_all);
580de1c2680SYonghong Song }
581de1c2680SYonghong Song 
582de1c2680SYonghong Song SEC("socket")
583de1c2680SYonghong Song __description("SMOD64, non-zero imm divisor, check 7")
584de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod64_non_zero_imm_7(void)585de1c2680SYonghong Song __naked void smod64_non_zero_imm_7(void)
586de1c2680SYonghong Song {
587de1c2680SYonghong Song 	asm volatile ("					\
588de1c2680SYonghong Song 	r0 = 42;					\
589de1c2680SYonghong Song 	r0 s%%= 2;					\
590de1c2680SYonghong Song 	exit;						\
591de1c2680SYonghong Song "	::: __clobber_all);
592de1c2680SYonghong Song }
593de1c2680SYonghong Song 
594de1c2680SYonghong Song SEC("socket")
595de1c2680SYonghong Song __description("SMOD64, non-zero imm divisor, check 8")
596de1c2680SYonghong Song __success __success_unpriv __retval(1)
smod64_non_zero_imm_8(void)597de1c2680SYonghong Song __naked void smod64_non_zero_imm_8(void)
598de1c2680SYonghong Song {
599de1c2680SYonghong Song 	asm volatile ("					\
600de1c2680SYonghong Song 	r0 = 41;					\
601de1c2680SYonghong Song 	r0 s%%= 2;					\
602de1c2680SYonghong Song 	exit;						\
603de1c2680SYonghong Song "	::: __clobber_all);
604de1c2680SYonghong Song }
605de1c2680SYonghong Song 
606de1c2680SYonghong Song SEC("socket")
607de1c2680SYonghong Song __description("SMOD64, non-zero reg divisor, check 1")
608de1c2680SYonghong Song __success __success_unpriv __retval(-1)
smod64_non_zero_reg_1(void)609de1c2680SYonghong Song __naked void smod64_non_zero_reg_1(void)
610de1c2680SYonghong Song {
611de1c2680SYonghong Song 	asm volatile ("					\
612de1c2680SYonghong Song 	r0 = -41;					\
613de1c2680SYonghong Song 	r1 = 2;						\
614de1c2680SYonghong Song 	r0 s%%= r1;					\
615de1c2680SYonghong Song 	exit;						\
616de1c2680SYonghong Song "	::: __clobber_all);
617de1c2680SYonghong Song }
618de1c2680SYonghong Song 
619de1c2680SYonghong Song SEC("socket")
620de1c2680SYonghong Song __description("SMOD64, non-zero reg divisor, check 2")
621de1c2680SYonghong Song __success __success_unpriv __retval(1)
smod64_non_zero_reg_2(void)622de1c2680SYonghong Song __naked void smod64_non_zero_reg_2(void)
623de1c2680SYonghong Song {
624de1c2680SYonghong Song 	asm volatile ("					\
625de1c2680SYonghong Song 	r0 = 41;					\
626de1c2680SYonghong Song 	r1 = -2;					\
627de1c2680SYonghong Song 	r0 s%%= r1;					\
628de1c2680SYonghong Song 	exit;						\
629de1c2680SYonghong Song "	::: __clobber_all);
630de1c2680SYonghong Song }
631de1c2680SYonghong Song 
632de1c2680SYonghong Song SEC("socket")
633de1c2680SYonghong Song __description("SMOD64, non-zero reg divisor, check 3")
634de1c2680SYonghong Song __success __success_unpriv __retval(-1)
smod64_non_zero_reg_3(void)635de1c2680SYonghong Song __naked void smod64_non_zero_reg_3(void)
636de1c2680SYonghong Song {
637de1c2680SYonghong Song 	asm volatile ("					\
638de1c2680SYonghong Song 	r0 = -41;					\
639de1c2680SYonghong Song 	r1 = -2;					\
640de1c2680SYonghong Song 	r0 s%%= r1;					\
641de1c2680SYonghong Song 	exit;						\
642de1c2680SYonghong Song "	::: __clobber_all);
643de1c2680SYonghong Song }
644de1c2680SYonghong Song 
645de1c2680SYonghong Song SEC("socket")
646de1c2680SYonghong Song __description("SMOD64, non-zero reg divisor, check 4")
647de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod64_non_zero_reg_4(void)648de1c2680SYonghong Song __naked void smod64_non_zero_reg_4(void)
649de1c2680SYonghong Song {
650de1c2680SYonghong Song 	asm volatile ("					\
651de1c2680SYonghong Song 	r0 = -42;					\
652de1c2680SYonghong Song 	r1 = 2;						\
653de1c2680SYonghong Song 	r0 s%%= r1;					\
654de1c2680SYonghong Song 	exit;						\
655de1c2680SYonghong Song "	::: __clobber_all);
656de1c2680SYonghong Song }
657de1c2680SYonghong Song 
658de1c2680SYonghong Song SEC("socket")
659de1c2680SYonghong Song __description("SMOD64, non-zero reg divisor, check 5")
660de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod64_non_zero_reg_5(void)661de1c2680SYonghong Song __naked void smod64_non_zero_reg_5(void)
662de1c2680SYonghong Song {
663de1c2680SYonghong Song 	asm volatile ("					\
664de1c2680SYonghong Song 	r0 = 42;					\
665de1c2680SYonghong Song 	r1 = -2;					\
666de1c2680SYonghong Song 	r0 s%%= r1;					\
667de1c2680SYonghong Song 	exit;						\
668de1c2680SYonghong Song "	::: __clobber_all);
669de1c2680SYonghong Song }
670de1c2680SYonghong Song 
671de1c2680SYonghong Song SEC("socket")
672de1c2680SYonghong Song __description("SMOD64, non-zero reg divisor, check 6")
673de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod64_non_zero_reg_6(void)674de1c2680SYonghong Song __naked void smod64_non_zero_reg_6(void)
675de1c2680SYonghong Song {
676de1c2680SYonghong Song 	asm volatile ("					\
677de1c2680SYonghong Song 	r0 = -42;					\
678de1c2680SYonghong Song 	r1 = -2;					\
679de1c2680SYonghong Song 	r0 s%%= r1;					\
680de1c2680SYonghong Song 	exit;						\
681de1c2680SYonghong Song "	::: __clobber_all);
682de1c2680SYonghong Song }
683de1c2680SYonghong Song 
684de1c2680SYonghong Song SEC("socket")
685de1c2680SYonghong Song __description("SMOD64, non-zero reg divisor, check 7")
686de1c2680SYonghong Song __success __success_unpriv __retval(0)
smod64_non_zero_reg_7(void)687de1c2680SYonghong Song __naked void smod64_non_zero_reg_7(void)
688de1c2680SYonghong Song {
689de1c2680SYonghong Song 	asm volatile ("					\
690de1c2680SYonghong Song 	r0 = 42;					\
691de1c2680SYonghong Song 	r1 = 2;						\
692de1c2680SYonghong Song 	r0 s%%= r1;					\
693de1c2680SYonghong Song 	exit;						\
694de1c2680SYonghong Song "	::: __clobber_all);
695de1c2680SYonghong Song }
696de1c2680SYonghong Song 
697de1c2680SYonghong Song SEC("socket")
698de1c2680SYonghong Song __description("SMOD64, non-zero reg divisor, check 8")
699de1c2680SYonghong Song __success __success_unpriv __retval(1)
smod64_non_zero_reg_8(void)700de1c2680SYonghong Song __naked void smod64_non_zero_reg_8(void)
701de1c2680SYonghong Song {
702de1c2680SYonghong Song 	asm volatile ("					\
703de1c2680SYonghong Song 	r0 = 41;					\
704de1c2680SYonghong Song 	r1 = 2;						\
705de1c2680SYonghong Song 	r0 s%%= r1;					\
706de1c2680SYonghong Song 	exit;						\
707de1c2680SYonghong Song "	::: __clobber_all);
708de1c2680SYonghong Song }
709de1c2680SYonghong Song 
710de1c2680SYonghong Song SEC("socket")
711de1c2680SYonghong Song __description("SDIV32, zero divisor")
712de1c2680SYonghong Song __success __success_unpriv __retval(0)
sdiv32_zero_divisor(void)713de1c2680SYonghong Song __naked void sdiv32_zero_divisor(void)
714de1c2680SYonghong Song {
715de1c2680SYonghong Song 	asm volatile ("					\
716de1c2680SYonghong Song 	w0 = 42;					\
717de1c2680SYonghong Song 	w1 = 0;						\
718de1c2680SYonghong Song 	w2 = -1;					\
719de1c2680SYonghong Song 	w2 s/= w1;					\
720de1c2680SYonghong Song 	w0 = w2;					\
721de1c2680SYonghong Song 	exit;						\
722de1c2680SYonghong Song "	::: __clobber_all);
723de1c2680SYonghong Song }
724de1c2680SYonghong Song 
725de1c2680SYonghong Song SEC("socket")
726de1c2680SYonghong Song __description("SDIV64, zero divisor")
727de1c2680SYonghong Song __success __success_unpriv __retval(0)
sdiv64_zero_divisor(void)728de1c2680SYonghong Song __naked void sdiv64_zero_divisor(void)
729de1c2680SYonghong Song {
730de1c2680SYonghong Song 	asm volatile ("					\
731de1c2680SYonghong Song 	r0 = 42;					\
732de1c2680SYonghong Song 	r1 = 0;						\
733de1c2680SYonghong Song 	r2 = -1;					\
734de1c2680SYonghong Song 	r2 s/= r1;					\
735de1c2680SYonghong Song 	r0 = r2;					\
736de1c2680SYonghong Song 	exit;						\
737de1c2680SYonghong Song "	::: __clobber_all);
738de1c2680SYonghong Song }
739de1c2680SYonghong Song 
740de1c2680SYonghong Song SEC("socket")
741de1c2680SYonghong Song __description("SMOD32, zero divisor")
742de1c2680SYonghong Song __success __success_unpriv __retval(-1)
smod32_zero_divisor(void)743de1c2680SYonghong Song __naked void smod32_zero_divisor(void)
744de1c2680SYonghong Song {
745de1c2680SYonghong Song 	asm volatile ("					\
746de1c2680SYonghong Song 	w0 = 42;					\
747de1c2680SYonghong Song 	w1 = 0;						\
748de1c2680SYonghong Song 	w2 = -1;					\
749de1c2680SYonghong Song 	w2 s%%= w1;					\
750de1c2680SYonghong Song 	w0 = w2;					\
751de1c2680SYonghong Song 	exit;						\
752de1c2680SYonghong Song "	::: __clobber_all);
753de1c2680SYonghong Song }
754de1c2680SYonghong Song 
755de1c2680SYonghong Song SEC("socket")
756de1c2680SYonghong Song __description("SMOD64, zero divisor")
757de1c2680SYonghong Song __success __success_unpriv __retval(-1)
smod64_zero_divisor(void)758de1c2680SYonghong Song __naked void smod64_zero_divisor(void)
759de1c2680SYonghong Song {
760de1c2680SYonghong Song 	asm volatile ("					\
761de1c2680SYonghong Song 	r0 = 42;					\
762de1c2680SYonghong Song 	r1 = 0;						\
763de1c2680SYonghong Song 	r2 = -1;					\
764de1c2680SYonghong Song 	r2 s%%= r1;					\
765de1c2680SYonghong Song 	r0 = r2;					\
766de1c2680SYonghong Song 	exit;						\
767de1c2680SYonghong Song "	::: __clobber_all);
768de1c2680SYonghong Song }
769de1c2680SYonghong Song 
770de1c2680SYonghong Song #else
771de1c2680SYonghong Song 
772de1c2680SYonghong Song SEC("socket")
773de1c2680SYonghong Song __description("cpuv4 is not supported by compiler or jit, use a dummy test")
774de1c2680SYonghong Song __success
dummy_test(void)775de1c2680SYonghong Song int dummy_test(void)
776de1c2680SYonghong Song {
777de1c2680SYonghong Song 	return 0;
778de1c2680SYonghong Song }
779de1c2680SYonghong Song 
780de1c2680SYonghong Song #endif
781de1c2680SYonghong Song 
782de1c2680SYonghong Song char _license[] SEC("license") = "GPL";
783