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.record TreeNode {
15b1994897Sopenharmony_ci    TreeNode left
16b1994897Sopenharmony_ci    TreeNode right
17b1994897Sopenharmony_ci    i32 item
18b1994897Sopenharmony_ci}
19b1994897Sopenharmony_ci
20b1994897Sopenharmony_ci.function void TreeNode.Construct(TreeNode a0, TreeNode a1, TreeNode a2, i32 a3) {
21b1994897Sopenharmony_ci    lda.obj a1
22b1994897Sopenharmony_ci    stobj.obj a0, TreeNode.left
23b1994897Sopenharmony_ci    lda.obj a2
24b1994897Sopenharmony_ci    stobj.obj a0, TreeNode.right
25b1994897Sopenharmony_ci    lda a3
26b1994897Sopenharmony_ci    stobj a0, TreeNode.item
27b1994897Sopenharmony_ci    return.void
28b1994897Sopenharmony_ci}
29b1994897Sopenharmony_ci
30b1994897Sopenharmony_ci.function i32 TreeNode.itemCheck(TreeNode a0) <static> {
31b1994897Sopenharmony_ci    mov.null v0
32b1994897Sopenharmony_ci    ldobj.obj a0, TreeNode.left
33b1994897Sopenharmony_ci    jeq.obj v0, if
34b1994897Sopenharmony_ci    ldobj.obj a0, TreeNode.left
35b1994897Sopenharmony_ci    sta.obj v1
36b1994897Sopenharmony_ci    call.short TreeNode.itemCheck, v1
37b1994897Sopenharmony_ci    sta v2
38b1994897Sopenharmony_ci    ldobj.obj a0, TreeNode.right
39b1994897Sopenharmony_ci    sta.obj v1
40b1994897Sopenharmony_ci    call.short TreeNode.itemCheck, v1
41b1994897Sopenharmony_ci    neg
42b1994897Sopenharmony_ci    add2 v2
43b1994897Sopenharmony_ci    sta v2
44b1994897Sopenharmony_ci    ldobj a0, TreeNode.item
45b1994897Sopenharmony_ci    add2 v2
46b1994897Sopenharmony_ci    return
47b1994897Sopenharmony_ciif:
48b1994897Sopenharmony_ci    ldobj a0, TreeNode.item
49b1994897Sopenharmony_ci    return
50b1994897Sopenharmony_ci}
51b1994897Sopenharmony_ci
52b1994897Sopenharmony_ci.function TreeNode bottomUpTree(i32 a0, i32 a1){
53b1994897Sopenharmony_ci    lda a1
54b1994897Sopenharmony_ci    jgtz if
55b1994897Sopenharmony_ci    newobj v0, TreeNode
56b1994897Sopenharmony_ci    lda a0
57b1994897Sopenharmony_ci    stobj v0, TreeNode.item
58b1994897Sopenharmony_ci    lda.obj v0
59b1994897Sopenharmony_ci    return.obj
60b1994897Sopenharmony_ciif:
61b1994897Sopenharmony_ci    lda a0
62b1994897Sopenharmony_ci    muli 2
63b1994897Sopenharmony_ci    subi 1
64b1994897Sopenharmony_ci    sta v2
65b1994897Sopenharmony_ci    lda a1
66b1994897Sopenharmony_ci    subi 1
67b1994897Sopenharmony_ci    sta v3
68b1994897Sopenharmony_ci    call.short bottomUpTree, v2, v3
69b1994897Sopenharmony_ci    sta.obj v4
70b1994897Sopenharmony_ci    lda a0
71b1994897Sopenharmony_ci    muli 2
72b1994897Sopenharmony_ci    sta v2
73b1994897Sopenharmony_ci    lda a1
74b1994897Sopenharmony_ci    subi 1
75b1994897Sopenharmony_ci    sta v3
76b1994897Sopenharmony_ci    call.short bottomUpTree, v2, v3
77b1994897Sopenharmony_ci    sta.obj v5
78b1994897Sopenharmony_ci    newobj v6, TreeNode
79b1994897Sopenharmony_ci    call TreeNode.Construct, v6, v4, v5, a0
80b1994897Sopenharmony_ci    lda.obj v6
81b1994897Sopenharmony_ci    return.obj
82b1994897Sopenharmony_ci}
83b1994897Sopenharmony_ci
84b1994897Sopenharmony_ci.function i32 max(i32 a0, i32 a1){
85b1994897Sopenharmony_ci    lda a0
86b1994897Sopenharmony_ci    jlt a1, label
87b1994897Sopenharmony_ci    return
88b1994897Sopenharmony_cilabel:
89b1994897Sopenharmony_ci    lda a1
90b1994897Sopenharmony_ci    return
91b1994897Sopenharmony_ci}
92b1994897Sopenharmony_ci
93b1994897Sopenharmony_ci.function u1 test(i32 a0, i32 a1, i32 a2){
94b1994897Sopenharmony_ci    movi v25, 0          #ret
95b1994897Sopenharmony_ci    mov v1, a0          #loop_counter
96b1994897Sopenharmony_ci    movi v5, 0
97b1994897Sopenharmony_ciloop:
98b1994897Sopenharmony_ci    lda v1
99b1994897Sopenharmony_ci    jgt a1, loop_exit
100b1994897Sopenharmony_ci    mov v2, a0          #minDepth
101b1994897Sopenharmony_ci    lda v2
102b1994897Sopenharmony_ci    addi 2
103b1994897Sopenharmony_ci    sta v0
104b1994897Sopenharmony_ci    call.short max, v0, v1
105b1994897Sopenharmony_ci    sta v3              #maxDepth
106b1994897Sopenharmony_ci    addi 1
107b1994897Sopenharmony_ci    sta v4              #stretchDepth
108b1994897Sopenharmony_ci    call.short bottomUpTree, v5, v4
109b1994897Sopenharmony_ci    sta.obj v6
110b1994897Sopenharmony_ci    call.short TreeNode.itemCheck, v6
111b1994897Sopenharmony_ci    sta v7              #check
112b1994897Sopenharmony_ci    call.short bottomUpTree, v5, v3
113b1994897Sopenharmony_ci    sta.obj v11             #LongLivedTree
114b1994897Sopenharmony_ci    mov v8, v2          #depth
115b1994897Sopenharmony_ciloop2:
116b1994897Sopenharmony_ci    lda v8
117b1994897Sopenharmony_ci    jgt v3, loop2_exit
118b1994897Sopenharmony_ci    lda v3
119b1994897Sopenharmony_ci    sub2 v8
120b1994897Sopenharmony_ci    add2 v2
121b1994897Sopenharmony_ci    sta v9
122b1994897Sopenharmony_ci    ldai 1
123b1994897Sopenharmony_ci    shl2 v9
124b1994897Sopenharmony_ci    sta v9                #iterations
125b1994897Sopenharmony_ci    movi v7, 0
126b1994897Sopenharmony_ci    movi v10, 1
127b1994897Sopenharmony_ciloop3:
128b1994897Sopenharmony_ci    lda v10
129b1994897Sopenharmony_ci    jgt v9, loop3_exit
130b1994897Sopenharmony_ci    call.short bottomUpTree, v10, v8
131b1994897Sopenharmony_ci    sta.obj v12
132b1994897Sopenharmony_ci    call.short TreeNode.itemCheck, v12
133b1994897Sopenharmony_ci    add2 v7
134b1994897Sopenharmony_ci    sta v7
135b1994897Sopenharmony_ci    lda v10
136b1994897Sopenharmony_ci    neg
137b1994897Sopenharmony_ci    sta v0
138b1994897Sopenharmony_ci    call.short bottomUpTree, v0, v8
139b1994897Sopenharmony_ci    sta.obj v12
140b1994897Sopenharmony_ci    call.short TreeNode.itemCheck, v12
141b1994897Sopenharmony_ci    add2 v7
142b1994897Sopenharmony_ci    sta v7
143b1994897Sopenharmony_ci    inci v10, 1
144b1994897Sopenharmony_ci    jmp loop3
145b1994897Sopenharmony_ciloop3_exit:
146b1994897Sopenharmony_ci    inci v8, 2
147b1994897Sopenharmony_ci    jmp loop2
148b1994897Sopenharmony_ciloop2_exit:
149b1994897Sopenharmony_ci    lda.obj v11
150b1994897Sopenharmony_ci    call.short TreeNode.itemCheck, v11
151b1994897Sopenharmony_ci    add2 v25
152b1994897Sopenharmony_ci    sta v25
153b1994897Sopenharmony_ci    inci v1, 1
154b1994897Sopenharmony_ci    jmp loop
155b1994897Sopenharmony_ciloop_exit:
156b1994897Sopenharmony_ci    lda v25
157b1994897Sopenharmony_ci    jne a2, exit_failure
158b1994897Sopenharmony_ci    ldai 0
159b1994897Sopenharmony_ci    return
160b1994897Sopenharmony_ciexit_failure:
161b1994897Sopenharmony_ci    ldai 1
162b1994897Sopenharmony_ci    return
163b1994897Sopenharmony_ci}
164b1994897Sopenharmony_ci
165b1994897Sopenharmony_ci.function u1 main(){
166b1994897Sopenharmony_ci    movi v0, 4
167b1994897Sopenharmony_ci    movi v1, 15
168b1994897Sopenharmony_ci    movi v2, -12
169b1994897Sopenharmony_ci    call test, v0, v1, v2
170b1994897Sopenharmony_ci    return
171b1994897Sopenharmony_ci}
172