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