1b1994897Sopenharmony_ci# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
2b1994897Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
3b1994897Sopenharmony_ci# you may not use this file except in compliance with the License.
4b1994897Sopenharmony_ci# You may obtain a copy of the License at
5b1994897Sopenharmony_ci#
6b1994897Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0
7b1994897Sopenharmony_ci#
8b1994897Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
9b1994897Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
10b1994897Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11b1994897Sopenharmony_ci# See the License for the specific language governing permissions and
12b1994897Sopenharmony_ci# limitations under the License.
13b1994897Sopenharmony_ci
14b1994897Sopenharmony_ci.function u1 main(){
15b1994897Sopenharmony_ci    movi v0, 3
16b1994897Sopenharmony_ci    movi v1, 9
17b1994897Sopenharmony_ci    movi v2, 504699
18b1994897Sopenharmony_ci    call test, v0, v1, v2, v0
19b1994897Sopenharmony_ci    return
20b1994897Sopenharmony_ci}
21b1994897Sopenharmony_ci
22b1994897Sopenharmony_ci.function i32 test(i32 a0, i32 a1, i32 a2){
23b1994897Sopenharmony_ci    movi v3, 0           #result
24b1994897Sopenharmony_ci    mov v4, a0           #loop_counter
25b1994897Sopenharmony_ci    lda a0
26b1994897Sopenharmony_ciloop:
27b1994897Sopenharmony_ci    jgt a1, loop_exit
28b1994897Sopenharmony_ci    movi v5, 3
29b1994897Sopenharmony_ci    call.short ack, v5, v4
30b1994897Sopenharmony_ci    add2 v3
31b1994897Sopenharmony_ci    sta v3
32b1994897Sopenharmony_ci    movi v5, 17
33b1994897Sopenharmony_ci    add v5, v4
34b1994897Sopenharmony_ci    sta v5
35b1994897Sopenharmony_ci    call.short fib, v5, v5
36b1994897Sopenharmony_ci    add2 v3
37b1994897Sopenharmony_ci    sta v3
38b1994897Sopenharmony_ci    lda v4
39b1994897Sopenharmony_ci    muli 3
40b1994897Sopenharmony_ci    addi 3
41b1994897Sopenharmony_ci    sta v5
42b1994897Sopenharmony_ci    lda v4
43b1994897Sopenharmony_ci    muli 2
44b1994897Sopenharmony_ci    addi 2
45b1994897Sopenharmony_ci    sta v6
46b1994897Sopenharmony_ci    lda v4
47b1994897Sopenharmony_ci    addi 1
48b1994897Sopenharmony_ci    sta v7
49b1994897Sopenharmony_ci    call tak, v5, v6, v7, v5
50b1994897Sopenharmony_ci    add2 v3
51b1994897Sopenharmony_ci    sta v3
52b1994897Sopenharmony_ci    inci v4, 1
53b1994897Sopenharmony_ci    lda v4
54b1994897Sopenharmony_ci    jmp loop
55b1994897Sopenharmony_ciloop_exit:
56b1994897Sopenharmony_ci    lda v3
57b1994897Sopenharmony_ci    jne a2, assert_err
58b1994897Sopenharmony_ci    ldai 0
59b1994897Sopenharmony_ci    return
60b1994897Sopenharmony_ciassert_err:
61b1994897Sopenharmony_ci    ldai 1
62b1994897Sopenharmony_ci    return
63b1994897Sopenharmony_ci}
64b1994897Sopenharmony_ci
65b1994897Sopenharmony_ci.function i32 ack(i32 a0, i32 a1){
66b1994897Sopenharmony_ci    lda a0
67b1994897Sopenharmony_ci    jeqz if1
68b1994897Sopenharmony_ci    lda a1
69b1994897Sopenharmony_ci    jeqz if2
70b1994897Sopenharmony_ci    lda a1
71b1994897Sopenharmony_ci    subi 1
72b1994897Sopenharmony_ci    sta v1
73b1994897Sopenharmony_ci    call.short ack, a0, v1
74b1994897Sopenharmony_ci    sta v2
75b1994897Sopenharmony_ci    lda a0
76b1994897Sopenharmony_ci    subi 1
77b1994897Sopenharmony_ci    sta v0
78b1994897Sopenharmony_ci    call.short ack, v0, v2
79b1994897Sopenharmony_ci    return
80b1994897Sopenharmony_ciif1:
81b1994897Sopenharmony_ci    lda a1
82b1994897Sopenharmony_ci    addi 1
83b1994897Sopenharmony_ci    return
84b1994897Sopenharmony_ciif2:
85b1994897Sopenharmony_ci    lda a0
86b1994897Sopenharmony_ci    subi 1
87b1994897Sopenharmony_ci    sta v0
88b1994897Sopenharmony_ci    movi v3, 1
89b1994897Sopenharmony_ci    call.short ack, v0, v3
90b1994897Sopenharmony_ci    return
91b1994897Sopenharmony_ci}
92b1994897Sopenharmony_ci
93b1994897Sopenharmony_ci.function i32 fib(i32 a0){
94b1994897Sopenharmony_ci    ldai 2
95b1994897Sopenharmony_ci    jgt a0, if
96b1994897Sopenharmony_ci    lda a0
97b1994897Sopenharmony_ci    subi 2
98b1994897Sopenharmony_ci    sta v0
99b1994897Sopenharmony_ci    call.short fib, v0, a0
100b1994897Sopenharmony_ci    sta v1
101b1994897Sopenharmony_ci    lda a0
102b1994897Sopenharmony_ci    subi 1
103b1994897Sopenharmony_ci    sta v0
104b1994897Sopenharmony_ci    call.short fib, v0, a0
105b1994897Sopenharmony_ci    sta v2
106b1994897Sopenharmony_ci    add v1, v2
107b1994897Sopenharmony_ci    return
108b1994897Sopenharmony_ciif:
109b1994897Sopenharmony_ci    ldai 1
110b1994897Sopenharmony_ci    return
111b1994897Sopenharmony_ci}
112b1994897Sopenharmony_ci
113b1994897Sopenharmony_ci.function i32 tak(i32 a0, i32 a1, i32 a2){
114b1994897Sopenharmony_ci    lda a1
115b1994897Sopenharmony_ci    jge a0, if
116b1994897Sopenharmony_ci    lda a0
117b1994897Sopenharmony_ci    subi 1
118b1994897Sopenharmony_ci    sta v0
119b1994897Sopenharmony_ci    call tak, v0, a1, a2, a0
120b1994897Sopenharmony_ci    sta v3
121b1994897Sopenharmony_ci    lda a1
122b1994897Sopenharmony_ci    subi 1
123b1994897Sopenharmony_ci    sta v1
124b1994897Sopenharmony_ci    call tak, v1, a2, a0, a0
125b1994897Sopenharmony_ci    sta v4
126b1994897Sopenharmony_ci    lda a2
127b1994897Sopenharmony_ci    subi 1
128b1994897Sopenharmony_ci    sta v2
129b1994897Sopenharmony_ci    call tak, v2, a0, a1, a0
130b1994897Sopenharmony_ci    sta v5
131b1994897Sopenharmony_ci    call tak, v3, v4, v5, a0
132b1994897Sopenharmony_ci    return
133b1994897Sopenharmony_ciif:
134b1994897Sopenharmony_ci    lda a2
135b1994897Sopenharmony_ci    return
136b1994897Sopenharmony_ci}
137