1# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6# http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14#
15# v1 = 0;
16# INT32_MAX = 2147483647  
17# for (int32 v0 = int32_max - 7, v0 > 0; v0++) { 
18#   v1++;
19# }
20# return v1 - 8;
21#
22.function i32 run_case1() <static> {    
23    movi v0, 2147483640
24    movi v1, 0
25loop:
26    lda v0
27    jlez loop_exit
28    inci v0, 1
29    inci v1, 1
30    jmp loop
31loop_exit:
32    lda v1
33    subi 8
34    return
35}
36
37#
38# v1 = 0
39# while (a0 < a1):
40#     a0++
41#     v1++
42# return v1
43#
44.function i32 run_case2(i32 a0, i32 a1) <static> {    
45    movi v1, 0
46loop:
47    lda a0
48    jge a1, loop_exit
49    inci a0, 1
50    inci v1, 1
51    jmp loop
52loop_exit:
53    lda v1
54    return
55}
56
57.function i32 run_case2a(i32 a0) <static> {  
58    movi v0, 0x80000002 
59    movi v1, 0
60loop:
61    lda a0
62    jge v0, loop_exit
63    inci a0, 1
64    inci v1, 1
65    jmp loop
66loop_exit:
67    lda v1
68    return
69}
70
71#
72# v1 = 0
73# while (a0 < a1):
74#     a0++
75#     v1++
76# return v1
77#
78.function i32 run_case3(i64 a0, i64 a1) <static> {    
79    movi v1, 0
80    movi.64 v2, 1
81loop:
82    lda.64 a0
83    cmp.64 a1
84    jgez loop_exit
85    lda.64 a0
86    add2.64 v2
87    sta.64 a0
88    inci v1, 1
89    jmp loop
90loop_exit:
91    lda v1
92    return
93}
94
95.function i32 run_case3a(i64 a0) <static> {    
96    movi.64 v0, 0x8000000000000002
97    movi v1, 0
98    movi.64 v2, 1
99loop:
100    lda.64 a0
101    cmp.64 v0
102    jgez loop_exit
103    lda.64 a0
104    add2.64 v2
105    sta.64 a0
106    inci v1, 1
107    jmp loop
108loop_exit:
109    lda v1
110    return
111}
112
113#
114# v1 = 0
115# while (a0 > a1):
116#     a0--
117#     v1++
118# return v1
119#
120.function i32 run_case4(i32 a0, i32 a1) <static> {    
121    movi v1, 0
122loop:
123    lda a0
124    jle a1, loop_exit
125    inci a0, -1
126    inci v1, 1
127    jmp loop
128loop_exit:
129    lda v1
130    return
131}
132
133.function i32 run_case4a(i32 a0) <static> { 
134    movi v0, 0x7ffffffd   
135    movi v1, 0
136loop:
137    lda a0
138    jle v0, loop_exit
139    inci a0, -1
140    inci v1, 1
141    jmp loop
142loop_exit:
143    lda v1
144    return
145}
146
147#
148# v1 = 0
149# while (a0 > a1):
150#     a0--
151#     v1++
152# return v1
153#
154.function i32 run_case5(i64 a0, i64 a1) <static> {    
155    movi v1, 0
156    movi.64 v2, 1
157loop:
158    lda.64 a0
159    cmp.64 a1
160    jlez loop_exit
161    lda.64 a0
162    sub2.64 v2
163    sta.64 a0
164    inci v1, 1
165    jmp loop
166loop_exit:
167    lda v1
168    return
169}
170
171.function i32 run_case5a(i64 a0) <static> {  
172    movi.64 v0, 0x7ffffffffffffffd  
173    movi v1, 0
174    movi.64 v2, 1
175loop:
176    lda.64 a0
177    cmp.64 v0
178    jlez loop_exit
179    lda.64 a0
180    sub2.64 v2
181    sta.64 a0
182    inci v1, 1
183    jmp loop
184loop_exit:
185    lda v1
186    return
187}
188
189.function i32 main() <static> {
190    call.short run_case1
191    jnez exit_failure
192    
193    movi v0, 0x7ffffff7
194    movi v1, 0x80000002
195    call.short run_case2, v0, v1
196    jnez exit_failure
197    
198    movi v0, 0x80000000
199    movi v1, 0x80000002
200    call.short run_case2, v0, v1
201    subi 2
202    jnez exit_failure
203
204    movi v0, 0x7ffffff7
205    call.short run_case2a, v0
206    jnez exit_failure
207    
208    movi v0, 0x80000000
209    call.short run_case2a, v0
210    subi 2
211    jnez exit_failure
212
213    movi.64 v0, 0x7ffffffffffffff7
214    movi.64 v1, 0x8000000000000002
215    call.short run_case3, v0, v1 
216    jnez exit_failure    
217
218    movi.64 v0, 0x8000000000000000
219    movi.64 v1, 0x8000000000000002
220    call.short run_case3, v0, v1
221    subi 2 
222    jnez exit_failure 
223
224    movi.64 v0, 0x7ffffffffffffff7
225    call.short run_case3a, v0 
226    jnez exit_failure    
227
228    movi.64 v0, 0x8000000000000000
229    call.short run_case3a, v0
230    subi 2 
231    jnez exit_failure 
232
233    movi v0, 0x8000000a
234    movi v1, 0x7ffffffd
235    call.short run_case4, v0, v1
236    jnez exit_failure
237
238    movi v0, 0x7fffffff
239    movi v1, 0x7ffffffd
240    call.short run_case4, v0, v1
241    subi 2 
242    jnez exit_failure 
243
244    movi v0, 0x8000000a
245    call.short run_case4a, v0
246    jnez exit_failure
247
248    movi v0, 0x7fffffff
249    call.short run_case4a, v0
250    subi 2 
251    jnez exit_failure 
252
253    movi.64 v0, 0x800000000000000a
254    movi.64 v1, 0x7ffffffffffffffd
255    call.short run_case5, v0, v1
256    jnez exit_failure 
257
258    movi.64 v0, 0x7fffffffffffffff
259    movi.64 v1, 0x7ffffffffffffffd
260    call.short run_case5, v0, v1
261    subi 2
262    jnez exit_failure 
263
264    movi.64 v0, 0x800000000000000a
265    call.short run_case5a, v0
266    jnez exit_failure 
267
268    movi.64 v0, 0x7fffffffffffffff
269    call.short run_case5a, v0
270    subi 2
271    jnez exit_failure 
272
273    ldai 0
274    return
275    
276exit_failure:
277    ldai 1
278    return    
279}
280